diff --git a/.gitignore b/.gitignore index 2d81de06cd278008e753974fba3b290cc502fd86..eae4d9c591c03b82293c9b31f8bfdfbab1796f70 100644 --- a/.gitignore +++ b/.gitignore @@ -28,3 +28,9 @@ externals/*/ plugins/processing/matlab/share/OV_stimulations.m toolkit/include/toolkit/ovtk_stimulations.h toolkit/src/ovtk_stimulations.cpp + +# test files +plugins/processing/classification/test/shrinkageLDA/alg1.cfg +plugins/processing/classification/test/shrinkageLDA/alg2.cfg +plugins/processing/simple-visualization/test/scenarios-tests/ERP-plot-output0_0.png +plugins/processing/stimulation/test/run-command-with-spaces.txt diff --git a/CMakeLists.txt b/CMakeLists.txt index 0c87a63b4e4d584421aed688b417aea72d373707..6c7ad0987e1f5989186026a9e117a2c0824edfcf 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -7,8 +7,6 @@ set(CMAKE_MODULE_PATH # ${CMAKE_MODULE_PATH} ) -set(OV_GLOBAL_VERSION_STRING "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${PROJECT_VERSION_PATCH}") - set(OV_LAUNCHER_SOURCE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake-modules/launchers") # OpenViBE-specific helper functions that are used by the CMakeLists of the subprojects. #include("OvAddSingleProject") @@ -68,17 +66,17 @@ if(WIN32) set(OV_WIN32_BOOST_VERSION "1_58") elseif(UNIX) - # If OpenMP is available, using it will allow Eigen to use multiple cores in matrix math. - include("FindOpenMP") - if(OPENMP_FOUND) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") - endif() - + # If OpenMP is available, using it will allow Eigen to use multiple cores in matrix math. + find_package(OpenMP) # REQUIRED) + +# include("FindOpenMP") + if(OpenMP_CXX_INCLUDE_DIRS) + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") + include_directories("${OpenMP_CXX_INCLUDE_DIRS}") + endif() # Switch -msse2 enables vectorization. Remove if your CPU/compiler doesn't support it. set(OV_EIGEN_FLAGS "-msse2") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall ${OV_EIGEN_FLAGS}") - # This ENV var is needed to locate our custom IT++ on Linux - set(ENV{PKG_CONFIG_PATH} "${LIST_DEPENDENCIES_PATH}/lib/pkgconfig") if (${CMAKE_SYSTEM_PROCESSOR} MATCHES i386|i586|i686) set ( BIT_MODE "32") @@ -95,6 +93,7 @@ elseif(UNIX) set (PLATFORM "Fedora") add_definitions("-DTARGET_OS_Linux_Fedora") endif(EXISTS "/etc/fedora-release") + else() message(WARNING "Warning: unknown platform") endif() @@ -206,28 +205,6 @@ add_subdirectory("applications/") add_subdirectory("externals/") add_subdirectory("contrib/") -# make a copy of the dependency script, this is done so we can use the same launch scripts both in win install and win devel situations. -if(WIN32) - find_path(OV_DEPENDENCY_CMD_PATH windows-dependencies.cmd PATHS ${LIST_DEPENDENCIES_PATH} NO_DEFAULT_PATH) - if(NOT OV_DEPENDENCY_CMD_PATH) - message(FATAL_ERROR "Dependency installer should have generated 'windows-dependencies.cmd'. Looked from ${LIST_DEPENDENCIES_PATH}.") - endif() - install(PROGRAMS ${OV_DEPENDENCY_CMD_PATH}/windows-dependencies.cmd DESTINATION ${DIST_BINDIR} RENAME "openvibe-set-env.cmd") -endif(WIN32) - - -# ---------------------- -# Generate 'external application launcher' script -# ---------------------- -if(WIN32) - set(OV_EXT_CMD_FILE "openvibe-external-application-launcher.cmd") -elseif(UNIX) - set(OV_EXT_CMD_FILE "openvibe-external-application-launcher") -endif() - -configure_file("${OV_LAUNCHER_SOURCE_PATH}/${OV_EXT_CMD_FILE}-base" "${CMAKE_CURRENT_BINARY_DIR}/${OV_EXT_CMD_FILE}") -install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${OV_EXT_CMD_FILE} DESTINATION ${DIST_BINDIR}) - configure_file(test/CTestTestfile.cmake . @ONLY) if(WIN32) @@ -249,4 +226,5 @@ endif() # ----------------------------- # Install files # ----------------------------- +file(COPY signals DESTINATION ${BUILD_DATADIR}/scenarios) install(DIRECTORY signals DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) diff --git a/INSTALL b/INSTALL deleted file mode 100644 index ad0b3a519160fdce171c4d54bf0898d6d9986969..0000000000000000000000000000000000000000 --- a/INSTALL +++ /dev/null @@ -1,160 +0,0 @@ -This document is outdated. While some informations in this document may still be relevant, you should exert caution while reading it. -You can find an up to date version of this document in the meta repo, see https://gitlab.inria.fr/openvibe/meta/blob/master/README.md - - *========================================* - |OpenViBE| |INSTALL| - *========================================* - -|Introduction| - -This document explains how to build the OpenViBE platform from the sources. -More up-to-date information may be available at - -http://openvibe.inria.fr/build-instructions/ - -|Repository.organisation| - -Please refer to the README file to have information on the repository -organisation. - -|Build.target| - -Windows: OpenViBE should compile on x86 / x86_64 architecture running Microsoft -Windows 2k/XP/Vista/7 with Visual C++ 2008 or 2010 Express Edition (take care -of having the up-to-date platform SDK from Microsoft installed). - -Linux: OpenViBE should compile on x86 / x86_64 architectures running Linux with gcc 4.* - -Please consider that trying to compile OpenViBE on other hardware/OS/compiler -is experimental and has not been tested. If you wish to try and get OpenViBE -to run on other hardware/OS/compilers, your efforts are welcome -but you should not expect to get support on the short term. - -|Building.on.Windows| - -1. Short story: - -For command line -style building using NMake, double-click: - -# win32-install_dependencies -# win32-build - -For IDE style building using Visual Studio, double-click: - -# win32-install_dependencies -# win32-generate-vcproj -# win32-launch-vc - -You may have to tweak the last script to find your particular version of Visual Studio. - -The built openvibe should now be in "dist\" folder. If it didn't work, read the longer description for hints. - -|Detailed.building.instructions.for.Windows| - -1. Install dependencies - -In order to build the software, you must install several dependencies. -This may be done using the provided installation scripts which will automatically -set up your environment. Run the following *inside* the scripts/ directory: - -<win32-install_dependencies> installs the dependencies under Windows. - -The Windows installer uses prebuilt packages and is quite fast. - -2. Prepare the environment - -The 'scripts' directory contains the necessary files to build the whole platform and plugins. -The <win32-init_env_command> sets the build environment. You may have to tune this -and other scripts by hand due to installation specifics such as Visual Studio paths. - -3a. Build using NMake - -If you want to build all projects without an IDE, you can use the <win32-build> script. -The script calls <win32-init_env_command>, which must be able to set the development -environment correctly. - -3b. Build using Visual Studio - -Use <win32-generate-vc-proj> in scripts\ directory to generate a Visual Studio -solution to "local-tmp\visual\". The script calls <win32-init_env_command>, -which must be able to set up the development environment correctly. - -Script <win32-launch-vc> can then be used to launch Visual Studio 2010 Express -while taking care that all the environment variables have been set. To use other -version of Visual Studio, change the path on the last line of the script to -point to your version. - -Note the following when using Visual Studio with OpenViBE: - -- When launching Visual Studio, the OpenViBE environment variables must have -already been set (as done by <win32-launch-vc>) -- Always compile the INSTALL target to get everything copied under "dist\". This -is required so that the compiled OpenViBE applications can find the DLL files. -- When debugging an OpenViBE executable in Visual Studio, you may have to set the -correct Properties->Debugging->Working Directory by finding "dist\bin\" with browse. -- All Visual Studio projects are created by CMake, so any changes to the project -configurations should be made to the CMake scripts. -- If you want to add any files to the build tree, delete "local-tmp\visual\CMakeCache.txt" -and run the <win32-generate-vc-proj> again. - -4. If you made it this far, congratulations : you should now have OpenViBE working, -and the freshly built OpenViBE in "dist\". - - -|Building.on.Linux| - -1. Short story - -# cd scripts -# ./linux-install_dependencies -# ./linux-build - -The built OpenViBE should be in "dist/". If not, please read the longer description for hints. - -|Detailed.building.instructions.on.Linux| - -1. Install dependencies - -In order to build the software, you must install several dependencies. This may be -done using a provided script. Run the following *inside* the scripts/ directory: - -<linux-install_dependencies> installs dependencies under Linux. - -The Linux installer processes a few source packages and builds them from scratch. Most -of the packages are installed from your Linux distribution. Hence this script requires -root access. If you don't have one, please ask your IT support to install the OpenViBE -dependencies for you as listed in the script. - -2. Build the platform - -To build OpenViBE, you can use the <linux-build> script while in the scripts/ directory. - -Finally, the <linux-test> script will launch the most interesting applications for you. - -If you want to build only some specific subtree, first build the whole OpenViBE -and then change to the appropriate subtree under local-tmp/. There you can call -"make" and "make install" to build only that component. - -3. If you made it this far, congratulations : you should now have OpenViBE freshly -built to "dist/". - -|Elementary Linux packaging| - -To build an elementary Debian/Ubuntu/Mint package from the official tarball (>= 0.16.0) -using debhelper, do the following: - -# mv openvibe-X.Y.Z.tar.gz openvibe_X.Y.Z.orig.tar.gz -# tar xzvf openvibe_X.Y.Z.orig.tar.gz -# cd openvibe-X.Y.Z -# debuild -uc -us - -|Contribution.rules| - -Please see - -http://openvibe.inria.fr/contribution-rules/ - - -|End.of.file| - - vim:tw=78:ts=8:ft=help:norl: diff --git a/applications/demos/erp-recording/CMakeLists.txt b/applications/demos/erp-recording/CMakeLists.txt index 720b0830be975a6b6a30b1080b624a56d37f725f..5793ae5fbf40330fe994fed7390271d520937c12 100644 --- a/applications/demos/erp-recording/CMakeLists.txt +++ b/applications/demos/erp-recording/CMakeLists.txt @@ -1,2 +1,3 @@ +file(COPY bci-examples DESTINATION ${BUILD_DATADIR}/scenarios) install(DIRECTORY bci-examples DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) diff --git a/applications/demos/motor-imagery/CMakeLists.txt b/applications/demos/motor-imagery/CMakeLists.txt index a979abada2485d151ebd1ac4cf07a0d7826347ed..90db03e6033be01d46fb03f94a3742ca76e1bd21 100644 --- a/applications/demos/motor-imagery/CMakeLists.txt +++ b/applications/demos/motor-imagery/CMakeLists.txt @@ -1,5 +1,5 @@ -# install(DIRECTORY signals DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) +file(COPY bci-examples DESTINATION ${BUILD_DATADIR}/scenarios) install(DIRECTORY bci-examples DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) diff --git a/applications/demos/motor-imagery/bci-examples/motor-imagery-CSP/mi-csp-3-classifier-trainer.xml b/applications/demos/motor-imagery/bci-examples/motor-imagery-CSP/mi-csp-3-classifier-trainer.xml index e4efb381a830405c2bf93ff2f4a46aff6c2cc185..34606e95343299e99285a740314b81237ea57d5b 100644 --- a/applications/demos/motor-imagery/bci-examples/motor-imagery-CSP/mi-csp-3-classifier-trainer.xml +++ b/applications/demos/motor-imagery/bci-examples/motor-imagery-CSP/mi-csp-3-classifier-trainer.xml @@ -1,11 +1,152 @@ <OpenViBE-Scenario> <FormatVersion>2</FormatVersion> <Creator>OpenViBE Designer</Creator> - <CreatorVersion>3.2.0</CreatorVersion> + <CreatorVersion>3.6.0</CreatorVersion> <Settings></Settings> <Inputs></Inputs> <Outputs></Outputs> <Boxes> + <Box> + <Identifier>(0x0000187e, 0x00001ce4)</Identifier> + <Name>Classifier trainer</Name> + <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Stimulations</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 1</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 2</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Train-completed Flag</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Train trigger</Name> + <DefaultValue>OVTK_StimulationId_Train</DefaultValue> + <Value>OVTK_StimulationId_Train</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> + <Name>Filename to save configuration to</Name> + <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> + <Value>${Player_ScenarioDirectory}/motor-imagery-bci-config-classifier.cfg</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> + <Name>Multiclass strategy to apply</Name> + <DefaultValue>Native</DefaultValue> + <Value>Native</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 1 label</Name> + <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> + <Value>OVTK_GDF_Left</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 2 label</Name> + <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> + <Value>OVTK_GDF_Right</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> + <Name>Algorithm to use</Name> + <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> + <Value>Linear Discrimimant Analysis (LDA)</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Number of partitions for k-fold cross-validation test</Name> + <DefaultValue>10</DefaultValue> + <Value>5</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Use shrinkage</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Shrinkage coefficient (-1 == auto)</Name> + <DefaultValue>-1.000000</DefaultValue> + <Value>-1.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Shrinkage: Force diagonal cov (DDA)</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Randomize k-fold cross-validation test data</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Balance classes</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>416</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>864</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0xac393893, 0x25854082)</Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>7</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>3</Value> + </Attribute> + <Attribute> + <Identifier>(0xfba64161, 0x65304e21)</Identifier> + <Value></Value> + </Attribute> + </Attributes> + </Box> <Box> <Identifier>(0x000046bc, 0x00003f08)</Identifier> <Name>Temporal Filter</Name> @@ -328,144 +469,6 @@ </Attribute> </Attributes> </Box> - <Box> - <Identifier>(0x0a5a6a4a, 0x1d92a778)</Identifier> - <Name>Classifier trainer</Name> - <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> - <Inputs> - <Input> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Stimulations</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 1</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 2</Name> - </Input> - </Inputs> - <Outputs> - <Output> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Train-completed Flag</Name> - </Output> - </Outputs> - <Settings> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Train trigger</Name> - <DefaultValue>OVTK_StimulationId_Train</DefaultValue> - <Value>OVTK_StimulationId_Train</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> - <Name>Filename to save configuration to</Name> - <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> - <Value>${Player_ScenarioDirectory}/motor-imagery-bci-config-classifier.cfg</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> - <Name>Multiclass strategy to apply</Name> - <DefaultValue>Native</DefaultValue> - <Value>Native</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 1 label</Name> - <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> - <Value>OVTK_GDF_Left</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 2 label</Name> - <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> - <Value>OVTK_GDF_Right</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> - <Name>Algorithm to use</Name> - <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> - <Value>Linear Discrimimant Analysis (LDA)</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Use shrinkage</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Shrinkage coefficient (-1 == auto)</Name> - <DefaultValue>-1.000000</DefaultValue> - <Value>-1</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Shrinkage: Force diagonal cov (DDA)</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of partitions for k-fold cross-validation test</Name> - <DefaultValue>10</DefaultValue> - <Value>5</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Balance classes</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - </Settings> - <Attributes> - <Attribute> - <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>416</Value> - </Attribute> - <Attribute> - <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>864</Value> - </Attribute> - <Attribute> - <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x9de21779, 0x37776c89)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier> - <Value>false</Value> - </Attribute> - <Attribute> - <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> - <Value>1</Value> - </Attribute> - <Attribute> - <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>6</Value> - </Attribute> - <Attribute> - <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> - <Value>3</Value> - </Attribute> - <Attribute> - <Identifier>(0xfba64161, 0x65304e21)</Identifier> - <Value></Value> - </Attribute> - </Attributes> - </Box> <Box> <Identifier>(0x122ee495, 0x1815b528)</Identifier> <Name>Identity</Name> @@ -896,6 +899,17 @@ </Box> </Boxes> <Links> + <Link> + <Identifier>(0x00000be8, 0x000000b2)</Identifier> + <Source> + <BoxIdentifier>(0x0000187e, 0x00001ce4)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x24757b65, 0x29027b6f)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x0000111a, 0x000058a4)</Identifier> <Source> @@ -907,6 +921,28 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x00002c05, 0x0000417d)</Identifier> + <Source> + <BoxIdentifier>(0x5bdc6ef9, 0x5aa3869a)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x0000187e, 0x00001ce4)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> + </Target> + </Link> + <Link> + <Identifier>(0x00003d79, 0x0000617f)</Identifier> + <Source> + <BoxIdentifier>(0x588d7801, 0x046ccfd0)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x0000187e, 0x00001ce4)</BoxIdentifier> + <BoxInputIndex>2</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00004a0a, 0x0000045b)</Identifier> <Source> @@ -940,6 +976,17 @@ <BoxInputIdentifier>(0x4a942408, 0x0f60530d)</BoxInputIdentifier> </Target> </Link> + <Link> + <Identifier>(0x00005528, 0x0000790c)</Identifier> + <Source> + <BoxIdentifier>(0x122ee495, 0x1815b528)</BoxIdentifier> + <BoxOutputIndex>1</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x0000187e, 0x00001ce4)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00006601, 0x00002716)</Identifier> <Source> @@ -962,17 +1009,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x15759e10, 0x340cf814)</Identifier> - <Source> - <BoxIdentifier>(0x122ee495, 0x1815b528)</BoxIdentifier> - <BoxOutputIndex>1</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x0a5a6a4a, 0x1d92a778)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x28100d7e, 0x160f0e08)</Identifier> <Source> @@ -1017,17 +1053,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x44cb5f82, 0x735c7482)</Identifier> - <Source> - <BoxIdentifier>(0x5bdc6ef9, 0x5aa3869a)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x0a5a6a4a, 0x1d92a778)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x514389a6, 0x441cd26b)</Identifier> <Source> @@ -1072,28 +1097,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x621ab2f1, 0x729e8025)</Identifier> - <Source> - <BoxIdentifier>(0x588d7801, 0x046ccfd0)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x0a5a6a4a, 0x1d92a778)</BoxIdentifier> - <BoxInputIndex>2</BoxInputIndex> - </Target> - </Link> - <Link> - <Identifier>(0x75fc2227, 0x282c4631)</Identifier> - <Source> - <BoxIdentifier>(0x0a5a6a4a, 0x1d92a778)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x24757b65, 0x29027b6f)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> </Links> <Comments> <Comment> diff --git a/applications/demos/motor-imagery/bci-examples/motor-imagery/motor-imagery-bci-2-classifier-trainer.xml b/applications/demos/motor-imagery/bci-examples/motor-imagery/motor-imagery-bci-2-classifier-trainer.xml index cdc21b34f99361f6e33aa71292e416cac045d4a7..806467d4fad1f03c37252937484ff4148572d823 100644 --- a/applications/demos/motor-imagery/bci-examples/motor-imagery/motor-imagery-bci-2-classifier-trainer.xml +++ b/applications/demos/motor-imagery/bci-examples/motor-imagery/motor-imagery-bci-2-classifier-trainer.xml @@ -1,7 +1,7 @@ <OpenViBE-Scenario> <FormatVersion>2</FormatVersion> <Creator>OpenViBE Designer</Creator> - <CreatorVersion>3.2.0</CreatorVersion> + <CreatorVersion>3.6.0</CreatorVersion> <Settings></Settings> <Inputs></Inputs> <Outputs></Outputs> @@ -97,84 +97,7 @@ </Attributes> </Box> <Box> - <Identifier>(0x000068f8, 0x00001003)</Identifier> - <Name>Temporal Filter</Name> - <AlgorithmClassIdentifier>(0xb4f9d042, 0x9d79f2e5)</AlgorithmClassIdentifier> - <Inputs> - <Input> - <TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier> - <Name>Input signal</Name> - </Input> - </Inputs> - <Outputs> - <Output> - <TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier> - <Name>Output signal</Name> - </Output> - </Outputs> - <Settings> - <Setting> - <TypeIdentifier>(0xfa20178e, 0x4cba62e9)</TypeIdentifier> - <Name>Filter Type</Name> - <DefaultValue>Band Pass</DefaultValue> - <Value>Band Pass</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Filter Order</Name> - <DefaultValue>4</DefaultValue> - <Value>4</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Low Cut-off Frequency (Hz)</Name> - <DefaultValue>1</DefaultValue> - <Value>8</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>High Cut-off Frequency (Hz)</Name> - <DefaultValue>40</DefaultValue> - <Value>24</Value> - <Modifiability>false</Modifiability> - </Setting> - </Settings> - <Attributes> - <Attribute> - <Identifier>(0x17ee7c08, 0x94c14893)</Identifier> - <Value></Value> - </Attribute> - <Attribute> - <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>144</Value> - </Attribute> - <Attribute> - <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>256</Value> - </Attribute> - <Attribute> - <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x6a7c1e9b, 0x6b00b5c5)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> - <Value>1</Value> - </Attribute> - <Attribute> - <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>4</Value> - </Attribute> - <Attribute> - <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> - <Value>1</Value> - </Attribute> - </Attributes> - </Box> - <Box> - <Identifier>(0x02e67945, 0x5ea8d309)</Identifier> + <Identifier>(0x0000187e, 0x00001ce4)</Identifier> <Name>Classifier trainer</Name> <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> <Inputs> @@ -240,6 +163,13 @@ <Value>Linear Discrimimant Analysis (LDA)</Value> <Modifiability>false</Modifiability> </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Number of partitions for k-fold cross-validation test</Name> + <DefaultValue>10</DefaultValue> + <Value>7</Value> + <Modifiability>false</Modifiability> + </Setting> <Setting> <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> <Name>Use shrinkage</Name> @@ -251,7 +181,7 @@ <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> <Name>Shrinkage coefficient (-1 == auto)</Name> <DefaultValue>-1.000000</DefaultValue> - <Value>-1</Value> + <Value>-1.000000</Value> <Modifiability>false</Modifiability> </Setting> <Setting> @@ -262,10 +192,10 @@ <Modifiability>false</Modifiability> </Setting> <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of partitions for k-fold cross-validation test</Name> - <DefaultValue>10</DefaultValue> - <Value>7</Value> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Randomize k-fold cross-validation test data</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> <Modifiability>false</Modifiability> </Setting> <Setting> @@ -287,11 +217,7 @@ </Attribute> <Attribute> <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x9de21779, 0x37776c89)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier> - <Value>false</Value> + <Value>(0xac393893, 0x25854082)</Value> </Attribute> <Attribute> <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> @@ -299,7 +225,7 @@ </Attribute> <Attribute> <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>6</Value> + <Value>7</Value> </Attribute> <Attribute> <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> @@ -311,6 +237,83 @@ </Attribute> </Attributes> </Box> + <Box> + <Identifier>(0x000068f8, 0x00001003)</Identifier> + <Name>Temporal Filter</Name> + <AlgorithmClassIdentifier>(0xb4f9d042, 0x9d79f2e5)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier> + <Name>Input signal</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier> + <Name>Output signal</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0xfa20178e, 0x4cba62e9)</TypeIdentifier> + <Name>Filter Type</Name> + <DefaultValue>Band Pass</DefaultValue> + <Value>Band Pass</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Filter Order</Name> + <DefaultValue>4</DefaultValue> + <Value>4</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Low Cut-off Frequency (Hz)</Name> + <DefaultValue>1</DefaultValue> + <Value>8</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>High Cut-off Frequency (Hz)</Name> + <DefaultValue>40</DefaultValue> + <Value>24</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x17ee7c08, 0x94c14893)</Identifier> + <Value></Value> + </Attribute> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>144</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>256</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0x6a7c1e9b, 0x6b00b5c5)</Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>4</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>1</Value> + </Attribute> + </Attributes> + </Box> <Box> <Identifier>(0x0841694e, 0x28e40f42)</Identifier> <Name>Stimulation based epoching</Name> @@ -1125,6 +1128,17 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x00000f2b, 0x00000f26)</Identifier> + <Source> + <BoxIdentifier>(0x4cd78e38, 0x35301f84)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x0000187e, 0x00001ce4)</BoxIdentifier> + <BoxInputIndex>2</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00002c46, 0x0000606f)</Identifier> <Source> @@ -1159,14 +1173,14 @@ </Target> </Link> <Link> - <Identifier>(0x000045ca, 0x00002f8b)</Identifier> + <Identifier>(0x000043d7, 0x00002dcc)</Identifier> <Source> - <BoxIdentifier>(0x1f046833, 0x21a8a876)</BoxIdentifier> - <BoxOutputIndex>1</BoxOutputIndex> + <BoxIdentifier>(0x75e5990a, 0x59c95a67)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x02e67945, 0x5ea8d309)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> + <BoxIdentifier>(0x0000187e, 0x00001ce4)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> </Target> </Link> <Link> @@ -1191,6 +1205,17 @@ <BoxInputIdentifier>(0x4a942408, 0x0f60530d)</BoxInputIdentifier> </Target> </Link> + <Link> + <Identifier>(0x0000699c, 0x0000735f)</Identifier> + <Source> + <BoxIdentifier>(0x0000187e, 0x00001ce4)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x5045ebd9, 0x67325c0b)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00006bef, 0x000055e9)</Identifier> <Source> @@ -1202,6 +1227,17 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x00006db8, 0x00002b5c)</Identifier> + <Source> + <BoxIdentifier>(0x1f046833, 0x21a8a876)</BoxIdentifier> + <BoxOutputIndex>1</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x0000187e, 0x00001ce4)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x000070b6, 0x00000551)</Identifier> <Source> @@ -1246,17 +1282,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x17c7ef69, 0x6457db07)</Identifier> - <Source> - <BoxIdentifier>(0x75e5990a, 0x59c95a67)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x02e67945, 0x5ea8d309)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x1e23e99e, 0x6b3cf5e0)</Identifier> <Source> @@ -1290,28 +1315,6 @@ <BoxInputIndex>1</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x51d497fe, 0x51620de7)</Identifier> - <Source> - <BoxIdentifier>(0x4cd78e38, 0x35301f84)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x02e67945, 0x5ea8d309)</BoxIdentifier> - <BoxInputIndex>2</BoxInputIndex> - </Target> - </Link> - <Link> - <Identifier>(0x539c3289, 0x4a4821c9)</Identifier> - <Source> - <BoxIdentifier>(0x02e67945, 0x5ea8d309)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x5045ebd9, 0x67325c0b)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x63796305, 0x4f357282)</Identifier> <Source> diff --git a/applications/demos/motor-imagery/bci-examples/motor-imagery/motor-imagery-bci-3-online-incremental.xml b/applications/demos/motor-imagery/bci-examples/motor-imagery/motor-imagery-bci-3-online-incremental.xml index b7e052181f4989d9cce8d7ba9e35623c8e787cb2..daf7ee319d1c7b5590adb86b76fb7f101a0f19dc 100644 --- a/applications/demos/motor-imagery/bci-examples/motor-imagery/motor-imagery-bci-3-online-incremental.xml +++ b/applications/demos/motor-imagery/bci-examples/motor-imagery/motor-imagery-bci-3-online-incremental.xml @@ -1,7 +1,7 @@ <OpenViBE-Scenario> <FormatVersion>2</FormatVersion> <Creator>OpenViBE Designer</Creator> - <CreatorVersion>3.2.0</CreatorVersion> + <CreatorVersion>3.6.0</CreatorVersion> <Settings></Settings> <Inputs></Inputs> <Outputs></Outputs> @@ -268,7 +268,7 @@ </Attributes> </Box> <Box> - <Identifier>(0x00003ed2, 0x000000ab)</Identifier> + <Identifier>(0x00006b0b, 0x00002d94)</Identifier> <Name>Classifier trainer</Name> <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> <Inputs> @@ -334,6 +334,13 @@ <Value>Linear Discrimimant Analysis (LDA)</Value> <Modifiability>false</Modifiability> </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Number of partitions for k-fold cross-validation test</Name> + <DefaultValue>10</DefaultValue> + <Value>0</Value> + <Modifiability>false</Modifiability> + </Setting> <Setting> <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> <Name>Use shrinkage</Name> @@ -345,7 +352,7 @@ <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> <Name>Shrinkage coefficient (-1 == auto)</Name> <DefaultValue>-1.000000</DefaultValue> - <Value>-1</Value> + <Value>-1.000000</Value> <Modifiability>false</Modifiability> </Setting> <Setting> @@ -356,36 +363,32 @@ <Modifiability>false</Modifiability> </Setting> <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of partitions for k-fold cross-validation test</Name> - <DefaultValue>10</DefaultValue> - <Value>0</Value> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Randomize k-fold cross-validation test data</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> <Modifiability>false</Modifiability> </Setting> <Setting> <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> <Name>Balance classes</Name> <DefaultValue>false</DefaultValue> - <Value>true</Value> + <Value>false</Value> <Modifiability>false</Modifiability> </Setting> </Settings> <Attributes> <Attribute> <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>560</Value> + <Value>544</Value> </Attribute> <Attribute> <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>752</Value> + <Value>768</Value> </Attribute> <Attribute> <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x9de21779, 0x37776c89)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier> - <Value>false</Value> + <Value>(0xac393893, 0x25854082)</Value> </Attribute> <Attribute> <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> @@ -393,7 +396,7 @@ </Attribute> <Attribute> <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>6</Value> + <Value>7</Value> </Attribute> <Attribute> <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> @@ -1655,25 +1658,25 @@ </Target> </Link> <Link> - <Identifier>(0x00000d58, 0x00006444)</Identifier> + <Identifier>(0x000006fd, 0x00003f1c)</Identifier> <Source> - <BoxIdentifier>(0x00007b66, 0x0000049e)</BoxIdentifier> + <BoxIdentifier>(0x4cd78e38, 0x35301f84)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x1a0ac1f5, 0x2780b3ba)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> + <BoxIdentifier>(0x00006b0b, 0x00002d94)</BoxIdentifier> + <BoxInputIndex>2</BoxInputIndex> </Target> </Link> <Link> - <Identifier>(0x00000ee2, 0x00001ff5)</Identifier> + <Identifier>(0x00000d58, 0x00006444)</Identifier> <Source> - <BoxIdentifier>(0x75e5990a, 0x59c95a67)</BoxIdentifier> + <BoxIdentifier>(0x00007b66, 0x0000049e)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x00003ed2, 0x000000ab)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> + <BoxIdentifier>(0x1a0ac1f5, 0x2780b3ba)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> </Target> </Link> <Link> @@ -1721,14 +1724,14 @@ </Target> </Link> <Link> - <Identifier>(0x00001c7b, 0x00007564)</Identifier> + <Identifier>(0x00002201, 0x0000323e)</Identifier> <Source> - <BoxIdentifier>(0x000009e5, 0x0000326e)</BoxIdentifier> + <BoxIdentifier>(0x00006b0b, 0x00002d94)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x00003ed2, 0x000000ab)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> + <BoxIdentifier>(0x0000705e, 0x00005604)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> </Target> </Link> <Link> @@ -1742,17 +1745,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x00002625, 0x00002ca4)</Identifier> - <Source> - <BoxIdentifier>(0x00003ed2, 0x000000ab)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x0000705e, 0x00005604)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x000027b7, 0x0000545b)</Identifier> <Source> @@ -1797,17 +1789,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x00002e85, 0x00001180)</Identifier> - <Source> - <BoxIdentifier>(0x4cd78e38, 0x35301f84)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x00003ed2, 0x000000ab)</BoxIdentifier> - <BoxInputIndex>2</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x00003607, 0x00005c1b)</Identifier> <Source> @@ -1830,6 +1811,17 @@ <BoxInputIndex>2</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x00003d43, 0x000049be)</Identifier> + <Source> + <BoxIdentifier>(0x000009e5, 0x0000326e)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x00006b0b, 0x00002d94)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00004655, 0x00003a6d)</Identifier> <Source> @@ -1841,6 +1833,17 @@ <BoxInputIdentifier>(0x4a942408, 0x0f60530d)</BoxInputIdentifier> </Target> </Link> + <Link> + <Identifier>(0x00004ff6, 0x00005774)</Identifier> + <Source> + <BoxIdentifier>(0x75e5990a, 0x59c95a67)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x00006b0b, 0x00002d94)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00005093, 0x0000246d)</Identifier> <Source> diff --git a/applications/demos/neurofeedback/CMakeLists.txt b/applications/demos/neurofeedback/CMakeLists.txt index 17637d5fa7cb521a7b80f3904992b41f0010cbf0..9f0c717e1b4c62429811896e4c14404ae9b7b52f 100755 --- a/applications/demos/neurofeedback/CMakeLists.txt +++ b/applications/demos/neurofeedback/CMakeLists.txt @@ -1,3 +1,4 @@ - +file(COPY signals DESTINATION ${BUILD_DATADIR}/scenarios) +file(COPY bci-examples DESTINATION ${BUILD_DATADIR}/scenarios) install(DIRECTORY signals DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) install(DIRECTORY bci-examples DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) diff --git a/applications/demos/p300/CMakeLists.txt b/applications/demos/p300/CMakeLists.txt index 9b79a80cb7d8edc325e48668cca73a27f767c070..59c19e5034ce773198219a90b8a067f4abcc55b2 100644 --- a/applications/demos/p300/CMakeLists.txt +++ b/applications/demos/p300/CMakeLists.txt @@ -1,26 +1,2 @@ - -# file(GLOB FILENAMES "bci-examples/*") -# foreach(FULLPATH ${FILENAMES}) -# if(IS_DIRECTORY ${FULLPATH} AND NOT ${FULLPATH} MATCHES ".*\\.svn") -# GET_FILENAME_COMPONENT(DIRNAME ${FULLPATH} NAME) -# if(${DIRNAME} != "signals") -# # message(STATUS "HEP ${DIRNAME}") -# install(DIRECTORY ${DIRNAME} DESTINATION ${DIST_DATADIR}/openvibe/scenarios/bci-examples/) -# endif(${DIRNAME} != sig -# endif(IS_DIRECTORY ${FULLPATH} AND NOT ${FULLPATH} MATCHES ".*\\.svn") -#endforeach(FULLPATH ${FILENAMES}) - -# install(DIRECTORY p300-speller/ DESTINATION ${DIST_DATADIR}/openvibe/bci-examples) -# install(DIRECTORY p300-speller-xDAWN/ DESTINATION ${DIST_DATADIR}/openvibe/bci-examples) - -# install(DIRECTORY signals DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) +file(COPY bci-examples DESTINATION ${BUILD_DATADIR}/scenarios/) install(DIRECTORY bci-examples DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) - -# file(GLOB FILENAMES "*") -# foreach(FULLPATH ${FILENAMES}) -# if(IS_DIRECTORY ${FULLPATH} AND NOT ${FULLPATH} MATCHES ".*\\.svn") -# GET_FILENAME_COMPONENT(DIRNAME ${FULLPATH} NAME) -# install(DIRECTORY ${DIRNAME} DESTINATION ${DIST_DATADIR}/openvibe/scenarios) -# endif(IS_DIRECTORY ${FULLPATH} AND NOT ${FULLPATH} MATCHES ".*\\.svn") -#endforeach(FULLPATH ${FILENAMES}) - diff --git a/applications/demos/p300/bci-examples/p300-magic-card/p300-magic-card-2-train-classifier.xml b/applications/demos/p300/bci-examples/p300-magic-card/p300-magic-card-2-train-classifier.xml index bd366b560d2a1b9248bb222f9a1095dd4fa4e6cd..f90daa6492331040c1a824c244dde20377c824f4 100644 --- a/applications/demos/p300/bci-examples/p300-magic-card/p300-magic-card-2-train-classifier.xml +++ b/applications/demos/p300/bci-examples/p300-magic-card/p300-magic-card-2-train-classifier.xml @@ -1,7 +1,7 @@ <OpenViBE-Scenario> <FormatVersion>2</FormatVersion> <Creator>OpenViBE Designer</Creator> - <CreatorVersion>3.2.0</CreatorVersion> + <CreatorVersion>3.6.0</CreatorVersion> <Settings></Settings> <Inputs></Inputs> <Outputs></Outputs> @@ -60,6 +60,147 @@ </Attribute> </Attributes> </Box> + <Box> + <Identifier>(0x00002585, 0x00003c1b)</Identifier> + <Name>Classifier trainer</Name> + <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Stimulations</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 1</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 2</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Train-completed Flag</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Train trigger</Name> + <DefaultValue>OVTK_StimulationId_Train</DefaultValue> + <Value>OVTK_StimulationId_ExperimentStop</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> + <Name>Filename to save configuration to</Name> + <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> + <Value>${Player_ScenarioDirectory}/p300-classifier.cfg</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> + <Name>Multiclass strategy to apply</Name> + <DefaultValue>Native</DefaultValue> + <Value>Native</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 1 label</Name> + <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> + <Value>OVTK_StimulationId_Target</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 2 label</Name> + <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> + <Value>OVTK_StimulationId_NonTarget</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> + <Name>Algorithm to use</Name> + <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> + <Value>Linear Discrimimant Analysis (LDA)</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Number of partitions for k-fold cross-validation test</Name> + <DefaultValue>10</DefaultValue> + <Value>5</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Use shrinkage</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Shrinkage coefficient (-1 == auto)</Name> + <DefaultValue>-1.000000</DefaultValue> + <Value>-1.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Shrinkage: Force diagonal cov (DDA)</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Randomize k-fold cross-validation test data</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Balance classes</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>384</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>512</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0xac393893, 0x25854082)</Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>7</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>3</Value> + </Attribute> + <Attribute> + <Identifier>(0xfba64161, 0x65304e21)</Identifier> + <Value></Value> + </Attribute> + </Attributes> + </Box> <Box> <Identifier>(0x00004375, 0x000055be)</Identifier> <Name>Signal Decimation</Name> @@ -861,148 +1002,6 @@ </Attribute> </Attributes> </Box> - <Box> - <Identifier>(0x1a538d37, 0x06b8561f)</Identifier> - <Name>Classifier trainer</Name> - <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> - <Inputs> - <Input> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Stimulations</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 1</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 2</Name> - </Input> - </Inputs> - <Outputs> - <Output> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Train-completed Flag</Name> - </Output> - </Outputs> - <Settings> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Train trigger</Name> - <DefaultValue>OVTK_StimulationId_Train</DefaultValue> - <Value>OVTK_StimulationId_ExperimentStop</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> - <Name>Filename to save configuration to</Name> - <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> - <Value>${Player_ScenarioDirectory}/p300-classifier.cfg</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> - <Name>Multiclass strategy to apply</Name> - <DefaultValue>Native</DefaultValue> - <Value>Native</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 1 label</Name> - <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> - <Value>OVTK_StimulationId_Target</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 2 label</Name> - <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> - <Value>OVTK_StimulationId_NonTarget</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> - <Name>Algorithm to use</Name> - <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> - <Value>Linear Discrimimant Analysis (LDA)</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Use shrinkage</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Shrinkage coefficient (-1 == auto)</Name> - <DefaultValue>-1.000000</DefaultValue> - <Value>-1</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Shrinkage: Force diagonal cov (DDA)</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of partitions for k-fold cross-validation test</Name> - <DefaultValue>10</DefaultValue> - <Value>5</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Balance classes</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - </Settings> - <Attributes> - <Attribute> - <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>400</Value> - </Attribute> - <Attribute> - <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>512</Value> - </Attribute> - <Attribute> - <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x9de21779, 0x37776c89)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier> - <Value>(0x00000000, 0x016b441d)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier> - <Value>false</Value> - </Attribute> - <Attribute> - <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> - <Value>1</Value> - </Attribute> - <Attribute> - <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>6</Value> - </Attribute> - <Attribute> - <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> - <Value>3</Value> - </Attribute> - <Attribute> - <Identifier>(0xfba64161, 0x65304e21)</Identifier> - <Value></Value> - </Attribute> - </Attributes> - </Box> </Boxes> <Links> <Link> @@ -1016,17 +1015,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x00000f98, 0x00000815)</Identifier> - <Source> - <BoxIdentifier>(0x0000554a, 0x000038d8)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x1a538d37, 0x06b8561f)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x000010ec, 0x000039e6)</Identifier> <Source> @@ -1050,9 +1038,9 @@ </Target> </Link> <Link> - <Identifier>(0x00001c81, 0x00001a2e)</Identifier> + <Identifier>(0x0000165c, 0x00000be8)</Identifier> <Source> - <BoxIdentifier>(0x1a538d37, 0x06b8561f)</BoxIdentifier> + <BoxIdentifier>(0x00002585, 0x00003c1b)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> @@ -1071,6 +1059,17 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x000025e8, 0x0000788c)</Identifier> + <Source> + <BoxIdentifier>(0x0000554a, 0x000038d8)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x00002585, 0x00003c1b)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00002898, 0x00000eeb)</Identifier> <Source> @@ -1182,25 +1181,25 @@ </Target> </Link> <Link> - <Identifier>(0x02a1b5cd, 0x3034ab1a)</Identifier> + <Identifier>(0x00007634, 0x00001642)</Identifier> <Source> - <BoxIdentifier>(0x0000777a, 0x00001cfd)</BoxIdentifier> + <BoxIdentifier>(0x00006a0d, 0x00006861)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x1a538d37, 0x06b8561f)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> + <BoxIdentifier>(0x00002585, 0x00003c1b)</BoxIdentifier> + <BoxInputIndex>2</BoxInputIndex> </Target> </Link> <Link> - <Identifier>(0x7ca548f4, 0x590c35f5)</Identifier> + <Identifier>(0x00007884, 0x00001c0d)</Identifier> <Source> - <BoxIdentifier>(0x00006a0d, 0x00006861)</BoxIdentifier> + <BoxIdentifier>(0x0000777a, 0x00001cfd)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x1a538d37, 0x06b8561f)</BoxIdentifier> - <BoxInputIndex>2</BoxInputIndex> + <BoxIdentifier>(0x00002585, 0x00003c1b)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> </Target> </Link> </Links> diff --git a/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-xdawn-3-train-classifier.xml b/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-xdawn-3-train-classifier.xml index 40bd4fd62c42fbf7329f184ef33e90eb063230bf..0236541bc566a9d12facf203aa7b8e8041c40396 100644 --- a/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-xdawn-3-train-classifier.xml +++ b/applications/demos/p300/bci-examples/p300-speller-xDAWN/p300-xdawn-3-train-classifier.xml @@ -1,7 +1,7 @@ <OpenViBE-Scenario> <FormatVersion>2</FormatVersion> <Creator>OpenViBE Designer</Creator> - <CreatorVersion>3.2.0</CreatorVersion> + <CreatorVersion>3.6.0</CreatorVersion> <Settings></Settings> <Inputs></Inputs> <Outputs></Outputs> @@ -213,6 +213,147 @@ </Attribute> </Attributes> </Box> + <Box> + <Identifier>(0x00002585, 0x00003c1b)</Identifier> + <Name>Classifier trainer</Name> + <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Stimulations</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 1</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 2</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Train-completed Flag</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Train trigger</Name> + <DefaultValue>OVTK_StimulationId_Train</DefaultValue> + <Value>OVTK_StimulationId_ExperimentStop</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> + <Name>Filename to save configuration to</Name> + <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> + <Value>${Player_ScenarioDirectory}/p300-classifier.cfg</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> + <Name>Multiclass strategy to apply</Name> + <DefaultValue>Native</DefaultValue> + <Value>Native</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 1 label</Name> + <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> + <Value>OVTK_StimulationId_Target</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 2 label</Name> + <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> + <Value>OVTK_StimulationId_NonTarget</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> + <Name>Algorithm to use</Name> + <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> + <Value>Linear Discrimimant Analysis (LDA)</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Number of partitions for k-fold cross-validation test</Name> + <DefaultValue>10</DefaultValue> + <Value>5</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Use shrinkage</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Shrinkage coefficient (-1 == auto)</Name> + <DefaultValue>-1.000000</DefaultValue> + <Value>-1.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Shrinkage: Force diagonal cov (DDA)</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Randomize k-fold cross-validation test data</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Balance classes</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>432</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>448</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0xac393893, 0x25854082)</Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>7</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>3</Value> + </Attribute> + <Attribute> + <Identifier>(0xfba64161, 0x65304e21)</Identifier> + <Value></Value> + </Attribute> + </Attributes> + </Box> <Box> <Identifier>(0x00002c8b, 0x000001d5)</Identifier> <Name>Player Controller</Name> @@ -730,144 +871,6 @@ </Attribute> </Attributes> </Box> - <Box> - <Identifier>(0x0a5a6a4a, 0x1d92a778)</Identifier> - <Name>Classifier trainer</Name> - <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> - <Inputs> - <Input> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Stimulations</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 1</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 2</Name> - </Input> - </Inputs> - <Outputs> - <Output> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Train-completed Flag</Name> - </Output> - </Outputs> - <Settings> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Train trigger</Name> - <DefaultValue>OVTK_StimulationId_Train</DefaultValue> - <Value>OVTK_StimulationId_ExperimentStop</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> - <Name>Filename to save configuration to</Name> - <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> - <Value>${Player_ScenarioDirectory}/p300-classifier.cfg</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> - <Name>Multiclass strategy to apply</Name> - <DefaultValue>Native</DefaultValue> - <Value>Native</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 1 label</Name> - <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> - <Value>OVTK_StimulationId_Target</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 2 label</Name> - <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> - <Value>OVTK_StimulationId_NonTarget</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> - <Name>Algorithm to use</Name> - <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> - <Value>Linear Discrimimant Analysis (LDA)</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Use shrinkage</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Shrinkage coefficient (-1 == auto)</Name> - <DefaultValue>-1.000000</DefaultValue> - <Value>-1</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Shrinkage: Force diagonal cov (DDA)</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of partitions for k-fold cross-validation test</Name> - <DefaultValue>10</DefaultValue> - <Value>5</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Balance classes</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - </Settings> - <Attributes> - <Attribute> - <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>416</Value> - </Attribute> - <Attribute> - <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>448</Value> - </Attribute> - <Attribute> - <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x9de21779, 0x37776c89)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier> - <Value>false</Value> - </Attribute> - <Attribute> - <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> - <Value>1</Value> - </Attribute> - <Attribute> - <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>6</Value> - </Attribute> - <Attribute> - <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> - <Value>3</Value> - </Attribute> - <Attribute> - <Identifier>(0xfba64161, 0x65304e21)</Identifier> - <Value></Value> - </Attribute> - </Attributes> - </Box> </Boxes> <Links> <Link> @@ -881,17 +884,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x000002a8, 0x00003c81)</Identifier> - <Source> - <BoxIdentifier>(0x00001700, 0x00003f4f)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x0a5a6a4a, 0x1d92a778)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x00000aca, 0x000037d3)</Identifier> <Source> @@ -947,6 +939,17 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x00002865, 0x00001190)</Identifier> + <Source> + <BoxIdentifier>(0x00000b2d, 0x00006d61)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x00002585, 0x00003c1b)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00004098, 0x00007e81)</Identifier> <Source> @@ -958,6 +961,17 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x0000411e, 0x00006033)</Identifier> + <Source> + <BoxIdentifier>(0x00002585, 0x00003c1b)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x00002c8b, 0x000001d5)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00004674, 0x000061af)</Identifier> <Source> @@ -980,6 +994,17 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x00006aad, 0x000070b3)</Identifier> + <Source> + <BoxIdentifier>(0x00001700, 0x00003f4f)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x00002585, 0x00003c1b)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x000073a2, 0x00003928)</Identifier> <Source> @@ -1014,38 +1039,16 @@ </Target> </Link> <Link> - <Identifier>(0x175e412c, 0x0692f4ee)</Identifier> + <Identifier>(0x0000751d, 0x0000439f)</Identifier> <Source> <BoxIdentifier>(0x00000d41, 0x000013b7)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x0a5a6a4a, 0x1d92a778)</BoxIdentifier> + <BoxIdentifier>(0x00002585, 0x00003c1b)</BoxIdentifier> <BoxInputIndex>2</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x616495af, 0x5c020b32)</Identifier> - <Source> - <BoxIdentifier>(0x0a5a6a4a, 0x1d92a778)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x00002c8b, 0x000001d5)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> - <Link> - <Identifier>(0x63fa63da, 0x0e447c5b)</Identifier> - <Source> - <BoxIdentifier>(0x00000b2d, 0x00006d61)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x0a5a6a4a, 0x1d92a778)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> - </Target> - </Link> </Links> <Comments> <Comment> diff --git a/applications/demos/p300/bci-examples/p300-speller/p300-speller-2-train-classifier.xml b/applications/demos/p300/bci-examples/p300-speller/p300-speller-2-train-classifier.xml index e57f147f338b7638584e16c8aadf0caf08404c8f..f01873614dc72c540e53c63ec5c4df4118629180 100644 --- a/applications/demos/p300/bci-examples/p300-speller/p300-speller-2-train-classifier.xml +++ b/applications/demos/p300/bci-examples/p300-speller/p300-speller-2-train-classifier.xml @@ -1,7 +1,7 @@ <OpenViBE-Scenario> <FormatVersion>2</FormatVersion> <Creator>OpenViBE Designer</Creator> - <CreatorVersion>3.2.0</CreatorVersion> + <CreatorVersion>3.6.0</CreatorVersion> <Settings></Settings> <Inputs></Inputs> <Outputs></Outputs> @@ -195,6 +195,147 @@ </Attribute> </Attributes> </Box> + <Box> + <Identifier>(0x00002585, 0x00003c1b)</Identifier> + <Name>Classifier trainer</Name> + <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Stimulations</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 1</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 2</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Train-completed Flag</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Train trigger</Name> + <DefaultValue>OVTK_StimulationId_Train</DefaultValue> + <Value>OVTK_StimulationId_ExperimentStop</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> + <Name>Filename to save configuration to</Name> + <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> + <Value>${Player_ScenarioDirectory}/p300-classifier.cfg</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> + <Name>Multiclass strategy to apply</Name> + <DefaultValue>Native</DefaultValue> + <Value>Native</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 1 label</Name> + <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> + <Value>OVTK_StimulationId_Target</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 2 label</Name> + <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> + <Value>OVTK_StimulationId_NonTarget</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> + <Name>Algorithm to use</Name> + <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> + <Value>Linear Discrimimant Analysis (LDA)</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Number of partitions for k-fold cross-validation test</Name> + <DefaultValue>10</DefaultValue> + <Value>5</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Use shrinkage</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Shrinkage coefficient (-1 == auto)</Name> + <DefaultValue>-1.000000</DefaultValue> + <Value>-1.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Shrinkage: Force diagonal cov (DDA)</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Randomize k-fold cross-validation test data</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Balance classes</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>384</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>464</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0xac393893, 0x25854082)</Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>7</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>3</Value> + </Attribute> + <Attribute> + <Identifier>(0xfba64161, 0x65304e21)</Identifier> + <Value></Value> + </Attribute> + </Attributes> + </Box> <Box> <Identifier>(0x000046bc, 0x00003f08)</Identifier> <Name>Temporal Filter</Name> @@ -411,144 +552,6 @@ </Attribute> </Attributes> </Box> - <Box> - <Identifier>(0x0a5a6a4a, 0x1d92a778)</Identifier> - <Name>Classifier trainer</Name> - <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> - <Inputs> - <Input> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Stimulations</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 1</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 2</Name> - </Input> - </Inputs> - <Outputs> - <Output> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Train-completed Flag</Name> - </Output> - </Outputs> - <Settings> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Train trigger</Name> - <DefaultValue>OVTK_StimulationId_Train</DefaultValue> - <Value>OVTK_StimulationId_ExperimentStop</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> - <Name>Filename to save configuration to</Name> - <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> - <Value>${Player_ScenarioDirectory}/p300-classifier.cfg</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> - <Name>Multiclass strategy to apply</Name> - <DefaultValue>Native</DefaultValue> - <Value>Native</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 1 label</Name> - <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> - <Value>OVTK_StimulationId_Target</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 2 label</Name> - <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> - <Value>OVTK_StimulationId_NonTarget</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> - <Name>Algorithm to use</Name> - <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> - <Value>Linear Discrimimant Analysis (LDA)</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Use shrinkage</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Shrinkage coefficient (-1 == auto)</Name> - <DefaultValue>-1.000000</DefaultValue> - <Value>-1</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Shrinkage: Force diagonal cov (DDA)</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of partitions for k-fold cross-validation test</Name> - <DefaultValue>10</DefaultValue> - <Value>5</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Balance classes</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - </Settings> - <Attributes> - <Attribute> - <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>384</Value> - </Attribute> - <Attribute> - <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>464</Value> - </Attribute> - <Attribute> - <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x9de21779, 0x37776c89)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier> - <Value>false</Value> - </Attribute> - <Attribute> - <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> - <Value>1</Value> - </Attribute> - <Attribute> - <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>6</Value> - </Attribute> - <Attribute> - <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> - <Value>3</Value> - </Attribute> - <Attribute> - <Identifier>(0xfba64161, 0x65304e21)</Identifier> - <Value></Value> - </Attribute> - </Attributes> - </Box> <Box> <Identifier>(0x14295e6a, 0x23ec1ce1)</Identifier> <Name>Feature aggregator</Name> @@ -993,6 +996,17 @@ </Box> </Boxes> <Links> + <Link> + <Identifier>(0x000002f6, 0x0000232f)</Identifier> + <Source> + <BoxIdentifier>(0x3db25003, 0x05792630)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x00002585, 0x00003c1b)</BoxIdentifier> + <BoxInputIndex>2</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00000d4f, 0x0000247e)</Identifier> <Source> @@ -1004,6 +1018,17 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x00002539, 0x00004eb8)</Identifier> + <Source> + <BoxIdentifier>(0x0000018f, 0x00000cf9)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x00002585, 0x00003c1b)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00003322, 0x00003233)</Identifier> <Source> @@ -1026,6 +1051,17 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x0000357d, 0x0000272d)</Identifier> + <Source> + <BoxIdentifier>(0x00002585, 0x00003c1b)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x00006dc8, 0x00007bff)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00003826, 0x00006ced)</Identifier> <Source> @@ -1037,6 +1073,17 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x00005494, 0x00005072)</Identifier> + <Source> + <BoxIdentifier>(0x14295e6a, 0x23ec1ce1)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x00002585, 0x00003c1b)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00005c28, 0x00001a49)</Identifier> <Source> @@ -1092,17 +1139,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x08651bdc, 0x51a071b6)</Identifier> - <Source> - <BoxIdentifier>(0x3db25003, 0x05792630)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x0a5a6a4a, 0x1d92a778)</BoxIdentifier> - <BoxInputIndex>2</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x09194257, 0x1fd9f895)</Identifier> <Source> @@ -1114,17 +1150,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x2b6c192a, 0x27af69e6)</Identifier> - <Source> - <BoxIdentifier>(0x14295e6a, 0x23ec1ce1)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x0a5a6a4a, 0x1d92a778)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x356b2cb6, 0x68a27a94)</Identifier> <Source> @@ -1136,17 +1161,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x43d99f84, 0x5d797f5b)</Identifier> - <Source> - <BoxIdentifier>(0x0000018f, 0x00000cf9)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x0a5a6a4a, 0x1d92a778)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x559011c8, 0x5a65b9d9)</Identifier> <Source> @@ -1180,17 +1194,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x771fba05, 0x1de25d1f)</Identifier> - <Source> - <BoxIdentifier>(0x0a5a6a4a, 0x1d92a778)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x00006dc8, 0x00007bff)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> </Links> <Comments> <Comment> diff --git a/applications/developer-tools/plugin-inspector/CMakeLists.txt b/applications/developer-tools/plugin-inspector/CMakeLists.txt index 1ac25a083ced23b975dfdd5933a9965cf286b7b3..307613cfa4ebca749b8cbd7952ed72aa14ebf3fb 100644 --- a/applications/developer-tools/plugin-inspector/CMakeLists.txt +++ b/applications/developer-tools/plugin-inspector/CMakeLists.txt @@ -12,18 +12,22 @@ target_link_libraries(${PROJECT_NAME} openvibe openvibe-common openvibe-toolkit - openvibe-module-system) + openvibe-module-system + gtk2 +) set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER}) add_definitions(-DTARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines) -include("FindThirdPartyGTK") +file(COPY share/ DESTINATION ${BUILD_DATADIR}/applications/plugin-inspector) -# ---------------------- -# Generate launch script -# ---------------------- -OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "${PROJECT_NAME}" EXECUTABLE_NAME "${PROJECT_NAME}") +install(CODE "execute_process( \ + COMMAND ${CMAKE_COMMAND} -E create_symlink \ + ${DIST_BINDIR}/$<TARGET_FILE_NAME:${PROJECT_NAME}> \ + ${DIST_ROOT}/$<TARGET_FILE_NAME:${PROJECT_NAME}> \ + )" +) # ----------------------------- # Install files diff --git a/applications/developer-tools/plugin-inspector/src/main.cpp b/applications/developer-tools/plugin-inspector/src/main.cpp index 731f930270981ebf62f95d849bc364b2f9a5959d..0271b426b9d7ebd5fc904d44b5a3df008f397c46 100644 --- a/applications/developer-tools/plugin-inspector/src/main.cpp +++ b/applications/developer-tools/plugin-inspector/src/main.cpp @@ -98,8 +98,10 @@ int main(int argc, char** argv) std::cout << "[ INF ] Created kernel loader, trying to load kernel module" << std::endl; #if defined TARGET_OS_Windows std::string kernelFile = "/openvibe-kernel.dll"; -#else +#elif defined TARGET_OS_Linux std::string kernelFile = "/libopenvibe-kernel.so"; +#elif defined TARGET_OS_MacOS + std::string kernelFile = "/libopenvibe-kernel.dylib"; #endif if (config.kernelPathOverload) { kernelFile = config.kernelPath + kernelFile; } @@ -138,6 +140,8 @@ int main(int argc, char** argv) pluginPattern = libpath + "/openvibe-plugins-*.dll;"; #elif defined TARGET_OS_Linux pluginPattern = libpath + "/libopenvibe-plugins-*.so;"; // + *it + "/lib???.so" +#elif defined TARGET_OS_MacOS + pluginPattern = libpath + "/libopenvibe-plugins-*.dylib;"; // + *it + "/lib???.so" #endif kernelCtx->getPluginManager().addPluginsFromFiles(pluginPattern.c_str()); } diff --git a/applications/developer-tools/skeleton-generator/CMakeLists.txt b/applications/developer-tools/skeleton-generator/CMakeLists.txt index 00de3a41b35f4746dcd6ab40fa575c5b2b59529b..58c6f67c2cc6505acd800fae6a3cee5d45ca0e11 100644 --- a/applications/developer-tools/skeleton-generator/CMakeLists.txt +++ b/applications/developer-tools/skeleton-generator/CMakeLists.txt @@ -15,7 +15,9 @@ target_link_libraries(${PROJECT_NAME} openvibe-module-fs Boost::boost Boost::thread - Boost::regex) + Boost::regex + gtk2 +) if(UNIX AND NOT APPLE) find_library(LIB_RT rt) @@ -30,13 +32,7 @@ set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER}) add_definitions(-DTARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines) -# --------------------------------- -include("FindThirdPartyGTK") - -# ---------------------- -# Generate launch script -# ---------------------- -OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "${PROJECT_NAME}" EXECUTABLE_NAME "${PROJECT_NAME}") +file(COPY share/ DESTINATION ${BUILD_DATADIR}/applications/skeleton-generator) # ----------------------------- # Install files @@ -47,3 +43,11 @@ install(TARGETS ${PROJECT_NAME} ARCHIVE DESTINATION ${DIST_LIBDIR}) install(DIRECTORY share/ DESTINATION ${DIST_DATADIR}/openvibe/applications/skeleton-generator) + +install(CODE + "execute_process( \ + COMMAND ${CMAKE_COMMAND} -E create_symlink \ + ${DIST_BINDIR}/$<TARGET_FILE_NAME:${PROJECT_NAME}> \ + ${DIST_ROOT}/$<TARGET_FILE_NAME:${PROJECT_NAME}> \ + )" +) diff --git a/applications/developer-tools/skeleton-generator/src/CDriverSkeletonGenerator.cpp b/applications/developer-tools/skeleton-generator/src/CDriverSkeletonGenerator.cpp index 5c9d2578a5451f95a031e947e5c61dfaf4031903..2e7ecccba123812aec34fd1b2eec4876a6ee2caa 100644 --- a/applications/developer-tools/skeleton-generator/src/CDriverSkeletonGenerator.cpp +++ b/applications/developer-tools/skeleton-generator/src/CDriverSkeletonGenerator.cpp @@ -406,8 +406,10 @@ bool CDriverSkeletonGenerator::load(const std::string& filename) GtkWidget* sf = GTK_WIDGET(gtk_builder_get_object(m_builder, "entry_sampling_frequencies")); gtk_entry_set_text(GTK_ENTRY(sf), m_kernelCtx.getConfigurationManager().expand("${SkeletonGenerator_Driver_SamplingFrequencies}")); +#if defined TARGET_OS_Linux || defined TARGET_OS_Windows GtkWidget* fileChooser = GTK_WIDGET(gtk_builder_get_object(m_builder, "filechooserbutton_target_directory")); - +#endif + // if the user specified a target directory, it has full priority std::string directory = m_kernelCtx.getConfigurationManager().expand("${SkeletonGenerator_TargetDirectory}").toASCIIString(); #ifdef TARGET_OS_Linux diff --git a/applications/developer-tools/threshold-comparison/CMakeLists.txt b/applications/developer-tools/threshold-comparison/CMakeLists.txt index 117614f94fac4b64c60a07d84c39fc0a7efb69e6..12d472e0dee4d3b4a1bdf0254349f7cd237933fe 100644 --- a/applications/developer-tools/threshold-comparison/CMakeLists.txt +++ b/applications/developer-tools/threshold-comparison/CMakeLists.txt @@ -7,13 +7,6 @@ set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${TESTS_FOLDER}) # Place pro target_link_libraries(${PROJECT_NAME} Boost::boost - tinyxml2) + tinyxml2::tinyxml2) -# Unfortunately we need to install the tests as any application to find .dll/.so files -# on both Windows and Linux. -OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX ${PROJECT_NAME} EXECUTABLE_NAME ${PROJECT_NAME}) -install(TARGETS ${PROJECT_NAME} - RUNTIME DESTINATION ${DIST_BINDIR} - LIBRARY DESTINATION ${DIST_LIBDIR} - ARCHIVE DESTINATION ${DIST_LIBDIR}) \ No newline at end of file diff --git a/applications/developer-tools/vrpn-simulator/CMakeLists.txt b/applications/developer-tools/vrpn-simulator/CMakeLists.txt index b97abf9ee62b793f69f4bb3f1dfa1746913a1c48..b5729cb95f7ed3bc31172aaeae818035ac3c5771 100644 --- a/applications/developer-tools/vrpn-simulator/CMakeLists.txt +++ b/applications/developer-tools/vrpn-simulator/CMakeLists.txt @@ -4,7 +4,6 @@ if(OV_DISABLE_GTK) endif(OV_DISABLE_GTK) project(openvibe-vrpn-simulator VERSION ${OPENVIBE_MAJOR_VERSION}.${OPENVIBE_MINOR_VERSION}.${OPENVIBE_PATCH_VERSION}) - file(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.hpp src/*.inl) add_executable(${PROJECT_NAME} ${SRC_FILES}) @@ -12,31 +11,27 @@ add_executable(${PROJECT_NAME} ${SRC_FILES}) target_link_libraries(${PROJECT_NAME} openvibe openvibe-common - vrpn) + vrpn + gtk2 +) set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER}) -include("FindThirdPartyGTK") - # --------------------------------- # Finds standard library pthread # Adds library to target # Adds include path # --------------------------------- if(UNIX) - find_library(LIB_STANDARD_MODULE_PTHREAD pthread) - if(LIB_STANDARD_MODULE_PTHREAD) - message(STATUS " Found pthread...") - target_link_libraries(${PROJECT_NAME} ${LIB_STANDARD_MODULE_PTHREAD}) - else(LIB_STANDARD_MODULE_PTHREAD) - message(STATUS " FAILED to find pthread...") - endif(LIB_STANDARD_MODULE_PTHREAD) + find_package(Threads) + if(Threads_FOUND) + target_link_libraries(${PROJECT_NAME} Threads::Threads) + else(Threads_FOUND) + message(STATUS " FAILED to find pthread...") + endif(Threads_FOUND) endif(UNIX) -# ---------------------- -# Generate launch script -# ---------------------- -OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "${PROJECT_NAME}" EXECUTABLE_NAME "${PROJECT_NAME}") +file(COPY share/ DESTINATION ${BUILD_DATADIR}/applications/vrpn-simulator) # ----------------------------- # Install files @@ -47,3 +42,11 @@ install(TARGETS ${PROJECT_NAME} ARCHIVE DESTINATION ${DIST_LIBDIR}) install(DIRECTORY share/ DESTINATION ${DIST_DATADIR}/openvibe/applications/vrpn-simulator) + +install(CODE + "execute_process( \ + COMMAND ${CMAKE_COMMAND} -E create_symlink \ + ${DIST_BINDIR}/$<TARGET_FILE_NAME:${PROJECT_NAME}> \ + ${DIST_ROOT}/$<TARGET_FILE_NAME:${PROJECT_NAME}> \ + )" +) \ No newline at end of file diff --git a/applications/examples/convert/CMakeLists.txt b/applications/examples/convert/CMakeLists.txt index 32df87c38e8e0f924bfb9faa18a98ec79c2494a3..4497e8a830890963de9a1c631f58e19f432c7061 100644 --- a/applications/examples/convert/CMakeLists.txt +++ b/applications/examples/convert/CMakeLists.txt @@ -25,17 +25,20 @@ endif() # Create the actual script thats run CONFIGURE_FILE(src/openvibe-convert-real.${OV_EXTENSION}-base ${CMAKE_CURRENT_BINARY_DIR}/openvibe-convert-real.${OV_EXTENSION} @ONLY) -# Required for OV_INSTALL_LAUNCH_SCRIPT -set_target_properties(${PROJECT_NAME} PROPERTIES LOCATION openvibe-convert-real.${OV_EXTENSION}) - # ----------------------------- # Install files # ----------------------------- -# This will call the actual script -OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "${PROJECT_NAME}" EXECUTABLE_NAME "${PROJECT_NAME}") +file(COPY share/ DESTINATION ${BUILD_DATADIR}/scenarios/convert) install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/openvibe-convert-real.${OV_EXTENSION} DESTINATION ${DIST_BINDIR}) install(DIRECTORY share/ DESTINATION ${DIST_DATADIR}/openvibe/scenarios/convert) +install(CODE "execute_process( \ + COMMAND ${CMAKE_COMMAND} -E create_symlink \ + ${DIST_BINDIR}/openvibe-convert-real.${OV_EXTENSION} \ + ${DIST_ROOT}/openvibe-convert.${OV_EXTENSION}\ + )" +) + diff --git a/applications/examples/external-stimulation-connection/CMakeLists.txt b/applications/examples/external-stimulation-connection/CMakeLists.txt index 40967f1e111ace74892af482baaeba0495071945..cba7a684e9c1c9566cf40b51c46d565f30abef08 100644 --- a/applications/examples/external-stimulation-connection/CMakeLists.txt +++ b/applications/examples/external-stimulation-connection/CMakeLists.txt @@ -20,11 +20,6 @@ endif() set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER}) -# ---------------------- -# Generate launch script -# ---------------------- -OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "${PROJECT_NAME}" EXECUTABLE_NAME "${PROJECT_NAME}") - # ----------------------------- # Install files # ----------------------------- @@ -32,3 +27,11 @@ install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION ${DIST_BINDIR} LIBRARY DESTINATION ${DIST_LIBDIR} ARCHIVE DESTINATION ${DIST_LIBDIR}) + +install(CODE + "execute_process( \ + COMMAND ${CMAKE_COMMAND} -E create_symlink \ + ${DIST_BINDIR}/$<TARGET_FILE_NAME:${PROJECT_NAME}> \ + ${DIST_ROOT}/$<TARGET_FILE_NAME:${PROJECT_NAME}> \ + )" +) \ No newline at end of file diff --git a/applications/examples/external-stimulation-connection/src/main.cpp b/applications/examples/external-stimulation-connection/src/main.cpp index dc6c251297947e28648e936917f6d3cd4e41e8b0..de4ee81c4a0c03853093d14a0c62ca3ba5ba510b 100644 --- a/applications/examples/external-stimulation-connection/src/main.cpp +++ b/applications/examples/external-stimulation-connection/src/main.cpp @@ -11,7 +11,7 @@ #include <iostream> -#if defined(TARGET_OS_Linux) +#if defined(TARGET_OS_Linux) || defined(TARGET_OS_MacOS) #include <unistd.h> #else #include <windows.h> @@ -34,7 +34,7 @@ int main() while (true) { std::cout << "Sending a Beep stimulation" << std::endl; osc->SendStimulation(OVTK_StimulationId_Beep); -#if defined(TARGET_OS_Linux) +#if defined(TARGET_OS_Linux) || defined(TARGET_OS_MacOS) sleep(1); #else Sleep(1000); diff --git a/applications/examples/openvibe-to-tcpip/CMakeLists.txt b/applications/examples/openvibe-to-tcpip/CMakeLists.txt index eab789142d60df05b519928d9004b6fe5054adfa..f3d4f804ba9a63874ae07aad5f35f228c7a1c0ce 100755 --- a/applications/examples/openvibe-to-tcpip/CMakeLists.txt +++ b/applications/examples/openvibe-to-tcpip/CMakeLists.txt @@ -17,10 +17,7 @@ if(WIN32) add_definitions(-D_WIN32_WINNT=0x0501) # for boost::asio endif(WIN32) -# ---------------------- -# Generate launch script -# ---------------------- -OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "${PROJECT_NAME}" EXECUTABLE_NAME "${PROJECT_NAME}") +file(COPY box-tutorials DESTINATION ${BUILD_DATADIR}/scenarios) # ----------------------------- # Install files @@ -31,3 +28,11 @@ install(TARGETS ${PROJECT_NAME} ARCHIVE DESTINATION ${DIST_LIBDIR}) install(DIRECTORY box-tutorials/ DESTINATION ${DIST_DATADIR}/openvibe/scenarios/box-tutorials) + +install(CODE + "execute_process( \ + COMMAND ${CMAKE_COMMAND} -E create_symlink \ + ${DIST_BINDIR}/$<TARGET_FILE_NAME:${PROJECT_NAME}> \ + ${DIST_ROOT}/$<TARGET_FILE_NAME:${PROJECT_NAME}> \ + )" +) \ No newline at end of file diff --git a/applications/examples/openvibe-to-vrpn/CMakeLists.txt b/applications/examples/openvibe-to-vrpn/CMakeLists.txt index c86383d21a95d1f9c218df6413c34ffb822be077..8a79f3375769040a1d6fd5285fdad6f7cc3b82c9 100755 --- a/applications/examples/openvibe-to-vrpn/CMakeLists.txt +++ b/applications/examples/openvibe-to-vrpn/CMakeLists.txt @@ -11,10 +11,7 @@ set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER}) include("FindThirdPartyPThread") # needed on Linux for VRPN -# ---------------------- -# Generate launch script -# ---------------------- -OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "${PROJECT_NAME}" EXECUTABLE_NAME "${PROJECT_NAME}") +file(COPY box-tutorials DESTINATION ${BUILD_DATADIR}/scenarios) # ----------------------------- # Install files @@ -25,3 +22,11 @@ install(TARGETS ${PROJECT_NAME} ARCHIVE DESTINATION ${DIST_LIBDIR}) install(DIRECTORY box-tutorials/ DESTINATION ${DIST_DATADIR}/openvibe/scenarios/box-tutorials) + +install(CODE + "execute_process( \ + COMMAND ${CMAKE_COMMAND} -E create_symlink \ + ${DIST_BINDIR}/$<TARGET_FILE_NAME:${PROJECT_NAME}> \ + ${DIST_ROOT}/$<TARGET_FILE_NAME:${PROJECT_NAME}> \ + )" +) \ No newline at end of file diff --git a/applications/examples/vrpn-to-openvibe/CMakeLists.txt b/applications/examples/vrpn-to-openvibe/CMakeLists.txt index d686cbf06ac97d7314cdea5c8de6c017cd86f03b..ac26180ee3b43190e30a9c6e2700185d95aaffe0 100755 --- a/applications/examples/vrpn-to-openvibe/CMakeLists.txt +++ b/applications/examples/vrpn-to-openvibe/CMakeLists.txt @@ -13,10 +13,7 @@ add_definitions(-D_USE_MATH_DEFINES) # Definition for constant math as M_PI include("FindThirdPartyPThread") # needed on Linux for VRPN -# ---------------------- -# Generate launch script -# ---------------------- -OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "${PROJECT_NAME}" EXECUTABLE_NAME "${PROJECT_NAME}") +file(COPY box-tutorials DESTINATION ${BUILD_DATADIR}/scenarios) # ----------------------------- # Install files @@ -27,3 +24,11 @@ install(TARGETS ${PROJECT_NAME} ARCHIVE DESTINATION ${DIST_LIBDIR}) install(DIRECTORY box-tutorials/ DESTINATION ${DIST_DATADIR}/openvibe/scenarios/box-tutorials) + +install(CODE + "execute_process( \ + COMMAND ${CMAKE_COMMAND} -E create_symlink \ + ${DIST_BINDIR}/$<TARGET_FILE_NAME:${PROJECT_NAME}> \ + ${DIST_ROOT}/$<TARGET_FILE_NAME:${PROJECT_NAME}> \ + )" +) \ No newline at end of file diff --git a/applications/platform/acquisition-server-legacy-2023/CMakeLists.txt b/applications/platform/acquisition-server-legacy-2023/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..236b412cf208537727bdd4ead1b427e5d867c744 --- /dev/null +++ b/applications/platform/acquisition-server-legacy-2023/CMakeLists.txt @@ -0,0 +1,135 @@ +if(OV_DISABLE_GTK) + message(STATUS "Skipping Acquisition Server, no GTK") + return() +endif(OV_DISABLE_GTK) + +project(openvibe-acquisition-server VERSION ${OPENVIBE_MAJOR_VERSION}.${OPENVIBE_MINOR_VERSION}.${OPENVIBE_PATCH_VERSION}) + +# We call this first as some dependency getters have been coded to not find the libs on x64 until supported +# --------------------------------- +if(WIN32) + add_definitions(-DWIN32_LEAN_AND_MEAN) +endif(WIN32) + +if (NOT GTK2_FOUND) + message(SEND_ERROR "GTK2 not found - skipping building ${PROJECT_NAME}") + return() +endif() +if (NOT BOOST_FOUND) + message(SEND_ERROR "BOOST not found - skipping building ${PROJECT_NAME}") + return() +endif() +if (NOT Eigen3_FOUND) + message(SEND_ERROR "Eigen3 not found - skipping building ${PROJECT_NAME}") + return() +endif() +if (NOT OPENAL_FOUND) +message(SEND_WARNING "OPENAL not found - skipping building ${PROJECT_NAME}") + return() +endif() + + +include("FindOpenViBEContributions") + +file(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.hpp src/*.inl include/*.h include/*.hpp ${CMAKE_SOURCE_DIR}/extras/contrib/common/contribAcquisitionServer.*) + +if(PATH_OPENVIBE_CONTRIBUTIONS) + include("${CMAKE_SOURCE_DIR}/extras/contrib/common/contribAcquisitionServer.cmake") +endif(PATH_OPENVIBE_CONTRIBUTIONS) + +set(ADDITIONAL_PATH "${CMAKE_SOURCE_DIR}/extras/plugins/server-extensions/") +file(GLOB_RECURSE ADDITIONAL_SRC_FILES ${ADDITIONAL_PATH}/*.cpp ${ADDITIONAL_PATH}/*.h ${ADDITIONAL_PATH}/*.hpp) +set(SRC_FILES "${SRC_FILES};${ADDITIONAL_SRC_FILES}") + +add_executable(${PROJECT_NAME} ${SRC_FILES}) + +target_link_libraries(${PROJECT_NAME} + openvibe + openvibe-common + openvibe-toolkit + openvibe-module-socket + openvibe-module-system + openvibe-module-fs + openvibe-module-lsl + Boost::boost + Boost::system + Eigen3::Eigen + gtk2 + OpenAL::OpenAL + LSL::lsl + # drivers + brainproducts-amplifier-sdk + tmsi + micromed +) + +if(WIN32) + target_link_libraries(${PROJECT_NAME} ws2_32) +endif(WIN32) + +set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER}) + +add_definitions(-DTARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines) + +include_directories("src/drivers") +include_directories("include") + +# add include paths for non-contrib server plugins +file(GLOB children ${ADDITIONAL_PATH}/*) +foreach(FILENAME ${children}) + # message("Testing ${FILENAME}") + if(IS_DIRECTORY ${FILENAME}) + # message("Adding ${FILENAME}") + include_directories(${FILENAME}) + endif(IS_DIRECTORY ${FILENAME}) +endforeach(FILENAME) + +if(WIN32) + # @FIXME CERT getting timeBeginPeriod() linker issues without this + target_link_libraries(${PROJECT_NAME} winmm) +endif(WIN32) + +# These scripts will also add directives to copy the necessary bin dlls if any +include("FindThirdPartyBioSemiLabViewAPI") +include("FindThirdPartyEmotivAPI") +include("FindThirdPartyNeXus") +include("FindThirdPartyMCS") +include("FindThirdPartyMensiaAcquisition") +include("FindThirdPartyNeuroelectricsEnobio3G") +include("FindThirdPartyNeuroServoDeps") +include("FindThirdPartyThinkGearAPI") +include("FindThirdPartyUSBFirstAmpAPI") + +include("FindThirdPartyPThread") # for Windows Fieldtrip +include("FindThirdPartyRT") # external stims shared memory needs this + +if(PATH_OPENVIBE_CONTRIBUTIONS) + include("${CMAKE_SOURCE_DIR}/extras/contrib/common/contribAcquisitionServerLinkLibs.cmake") +endif(PATH_OPENVIBE_CONTRIBUTIONS) + +if(NOT(DISABLE_MENSIA_ACQUISITION_DRIVER)) + add_definitions(-DTARGET_HasMensiaAcquisitionDriver) +endif() + +# ----------------------------- +# Install files +# ----------------------------- +install(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +configure_file(share/interface.ui-base "${CMAKE_CURRENT_BINARY_DIR}/interface.ui") +configure_file(share/interface.ui-base "${BUILD_DATADIR}/applications/acquisition-server/interface.ui") +file(COPY share/ DESTINATION ${BUILD_DATADIR}/applications/acquisition-server PATTERN "*-base*" EXCLUDE) + +install(FILES "${CMAKE_CURRENT_BINARY_DIR}/interface.ui" DESTINATION ${DIST_DATADIR}/openvibe/applications/acquisition-server) +install(DIRECTORY share/ DESTINATION ${DIST_DATADIR}/openvibe/applications/acquisition-server PATTERN "*-base" EXCLUDE) + +install(CODE + "execute_process( \ + COMMAND ${CMAKE_COMMAND} -E create_symlink \ + ${DIST_BINDIR}/$<TARGET_FILE_NAME:${PROJECT_NAME}> \ + ${DIST_ROOT}/$<TARGET_FILE_NAME:${PROJECT_NAME}> \ + )" +) diff --git a/applications/platform/acquisition-server/include/ovasIAcquisitionServerPlugin.h b/applications/platform/acquisition-server-legacy-2023/include/ovasIAcquisitionServerPlugin.h similarity index 100% rename from applications/platform/acquisition-server/include/ovasIAcquisitionServerPlugin.h rename to applications/platform/acquisition-server-legacy-2023/include/ovasIAcquisitionServerPlugin.h diff --git a/applications/platform/acquisition-server/include/ovasIDriver.h b/applications/platform/acquisition-server-legacy-2023/include/ovasIDriver.h similarity index 100% rename from applications/platform/acquisition-server/include/ovasIDriver.h rename to applications/platform/acquisition-server-legacy-2023/include/ovasIDriver.h diff --git a/applications/platform/acquisition-server/include/ovasIHeader.h b/applications/platform/acquisition-server-legacy-2023/include/ovasIHeader.h similarity index 100% rename from applications/platform/acquisition-server/include/ovasIHeader.h rename to applications/platform/acquisition-server-legacy-2023/include/ovasIHeader.h diff --git a/applications/platform/acquisition-server/include/ovas_base.h b/applications/platform/acquisition-server-legacy-2023/include/ovas_base.h similarity index 100% rename from applications/platform/acquisition-server/include/ovas_base.h rename to applications/platform/acquisition-server-legacy-2023/include/ovas_base.h diff --git a/applications/platform/acquisition-server/include/ovas_defines.h b/applications/platform/acquisition-server-legacy-2023/include/ovas_defines.h similarity index 100% rename from applications/platform/acquisition-server/include/ovas_defines.h rename to applications/platform/acquisition-server-legacy-2023/include/ovas_defines.h diff --git a/applications/platform/acquisition-server/share/acquisition-server-defaults.conf b/applications/platform/acquisition-server-legacy-2023/share/acquisition-server-defaults.conf similarity index 95% rename from applications/platform/acquisition-server/share/acquisition-server-defaults.conf rename to applications/platform/acquisition-server-legacy-2023/share/acquisition-server-defaults.conf index bc476a8ee56043ee2afff2a76bbbf4bc2e60617e..a0f818ef70e2d33090df827a4956a1979ce17a5c 100644 --- a/applications/platform/acquisition-server/share/acquisition-server-defaults.conf +++ b/applications/platform/acquisition-server-legacy-2023/share/acquisition-server-defaults.conf @@ -3,6 +3,7 @@ # OpenViBE application acquisition server configuration ##################################################################################### AcquisitionServer_PluginsPatternLinux = ${Path_Lib}/libopenvibe-plugins-*-stream-codecs*.so +AcquisitionServer_PluginsPatternMacOS = ${Path_Lib}/libopenvibe-plugins-*-stream-codecs*.dylib AcquisitionServer_PluginsPatternWindows = ${Path_Bin}/openvibe-plugins-*-stream-codecs*.dll AcquisitionServer_Plugins = ${AcquisitionServer_PluginsPattern${OperatingSystem}} diff --git a/applications/platform/acquisition-server/share/capset-brainproducts-acticap32.txt b/applications/platform/acquisition-server-legacy-2023/share/capset-brainproducts-acticap32.txt similarity index 100% rename from applications/platform/acquisition-server/share/capset-brainproducts-acticap32.txt rename to applications/platform/acquisition-server-legacy-2023/share/capset-brainproducts-acticap32.txt diff --git a/applications/platform/acquisition-server/share/easycap-64ch-electrode-names-10-20.txt b/applications/platform/acquisition-server-legacy-2023/share/easycap-64ch-electrode-names-10-20.txt similarity index 100% rename from applications/platform/acquisition-server/share/easycap-64ch-electrode-names-10-20.txt rename to applications/platform/acquisition-server-legacy-2023/share/easycap-64ch-electrode-names-10-20.txt diff --git a/applications/platform/acquisition-server/share/electrode-names.txt b/applications/platform/acquisition-server-legacy-2023/share/electrode-names.txt similarity index 100% rename from applications/platform/acquisition-server/share/electrode-names.txt rename to applications/platform/acquisition-server-legacy-2023/share/electrode-names.txt diff --git a/applications/platform/acquisition-server/share/filters/f64_100k_1024.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_100k_1024.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_100k_1024.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_100k_1024.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_100k_128.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_100k_128.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_100k_128.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_100k_128.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_100k_2048.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_100k_2048.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_100k_2048.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_100k_2048.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_100k_256.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_100k_256.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_100k_256.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_100k_256.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_100k_4096.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_100k_4096.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_100k_4096.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_100k_4096.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_100k_512.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_100k_512.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_100k_512.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_100k_512.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_10k_1024.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_10k_1024.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_10k_1024.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_10k_1024.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_10k_128.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_10k_128.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_10k_128.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_10k_128.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_10k_2048.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_10k_2048.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_10k_2048.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_10k_2048.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_10k_256.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_10k_256.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_10k_256.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_10k_256.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_10k_4096.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_10k_4096.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_10k_4096.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_10k_4096.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_10k_512.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_10k_512.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_10k_512.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_10k_512.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_20k_1024.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_20k_1024.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_20k_1024.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_20k_1024.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_20k_128.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_20k_128.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_20k_128.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_20k_128.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_20k_2048.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_20k_2048.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_20k_2048.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_20k_2048.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_20k_256.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_20k_256.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_20k_256.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_20k_256.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_20k_4096.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_20k_4096.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_20k_4096.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_20k_4096.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_20k_512.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_20k_512.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_20k_512.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_20k_512.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_25k_1024.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_25k_1024.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_25k_1024.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_25k_1024.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_25k_128.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_25k_128.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_25k_128.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_25k_128.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_25k_2048.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_25k_2048.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_25k_2048.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_25k_2048.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_25k_256.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_25k_256.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_25k_256.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_25k_256.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_25k_4096.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_25k_4096.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_25k_4096.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_25k_4096.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_25k_512.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_25k_512.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_25k_512.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_25k_512.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_2k_128.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_2k_128.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_2k_128.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_2k_128.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_2k_256.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_2k_256.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_2k_256.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_2k_256.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_2k_512.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_2k_512.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_2k_512.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_2k_512.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_50k_1024.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_50k_1024.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_50k_1024.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_50k_1024.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_50k_128.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_50k_128.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_50k_128.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_50k_128.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_50k_2048.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_50k_2048.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_50k_2048.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_50k_2048.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_50k_256.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_50k_256.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_50k_256.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_50k_256.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_50k_4096.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_50k_4096.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_50k_4096.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_50k_4096.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_50k_512.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_50k_512.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_50k_512.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_50k_512.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_5k_1024.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_5k_1024.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_5k_1024.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_5k_1024.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_5k_128.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_5k_128.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_5k_128.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_5k_128.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_5k_2048.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_5k_2048.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_5k_2048.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_5k_2048.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_5k_256.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_5k_256.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_5k_256.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_5k_256.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_5k_4096.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_5k_4096.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_5k_4096.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_5k_4096.bin diff --git a/applications/platform/acquisition-server/share/filters/f64_5k_512.bin b/applications/platform/acquisition-server-legacy-2023/share/filters/f64_5k_512.bin similarity index 100% rename from applications/platform/acquisition-server/share/filters/f64_5k_512.bin rename to applications/platform/acquisition-server-legacy-2023/share/filters/f64_5k_512.bin diff --git a/applications/platform/acquisition-server/share/interface-BioSemi-ActiveTwo.ui b/applications/platform/acquisition-server-legacy-2023/share/interface-BioSemi-ActiveTwo.ui similarity index 100% rename from applications/platform/acquisition-server/share/interface-BioSemi-ActiveTwo.ui rename to applications/platform/acquisition-server-legacy-2023/share/interface-BioSemi-ActiveTwo.ui diff --git a/applications/platform/acquisition-server/share/interface-BrainProducts-ActiCHamp.ui b/applications/platform/acquisition-server-legacy-2023/share/interface-BrainProducts-ActiCHamp.ui similarity index 100% rename from applications/platform/acquisition-server/share/interface-BrainProducts-ActiCHamp.ui rename to applications/platform/acquisition-server-legacy-2023/share/interface-BrainProducts-ActiCHamp.ui diff --git a/applications/platform/acquisition-server/share/interface-BrainProducts-BrainampSeries.ui b/applications/platform/acquisition-server-legacy-2023/share/interface-BrainProducts-BrainampSeries.ui similarity index 100% rename from applications/platform/acquisition-server/share/interface-BrainProducts-BrainampSeries.ui rename to applications/platform/acquisition-server-legacy-2023/share/interface-BrainProducts-BrainampSeries.ui diff --git a/applications/platform/acquisition-server/share/interface-BrainProducts-VAmp.ui b/applications/platform/acquisition-server-legacy-2023/share/interface-BrainProducts-VAmp.ui similarity index 100% rename from applications/platform/acquisition-server/share/interface-BrainProducts-VAmp.ui rename to applications/platform/acquisition-server-legacy-2023/share/interface-BrainProducts-VAmp.ui diff --git a/applications/platform/acquisition-server/share/interface-BrainProductsLiveAmp.ui b/applications/platform/acquisition-server-legacy-2023/share/interface-BrainProductsLiveAmp.ui similarity index 100% rename from applications/platform/acquisition-server/share/interface-BrainProductsLiveAmp.ui rename to applications/platform/acquisition-server-legacy-2023/share/interface-BrainProductsLiveAmp.ui diff --git a/applications/platform/acquisition-server/share/interface-Brainmaster-Discovery.ui b/applications/platform/acquisition-server-legacy-2023/share/interface-Brainmaster-Discovery.ui similarity index 100% rename from applications/platform/acquisition-server/share/interface-Brainmaster-Discovery.ui rename to applications/platform/acquisition-server-legacy-2023/share/interface-Brainmaster-Discovery.ui diff --git a/applications/platform/acquisition-server/share/interface-Emotiv-EPOC.ui b/applications/platform/acquisition-server-legacy-2023/share/interface-Emotiv-EPOC.ui similarity index 100% rename from applications/platform/acquisition-server/share/interface-Emotiv-EPOC.ui rename to applications/platform/acquisition-server-legacy-2023/share/interface-Emotiv-EPOC.ui diff --git a/applications/platform/acquisition-server/share/interface-Enobio3G.ui b/applications/platform/acquisition-server-legacy-2023/share/interface-Enobio3G.ui similarity index 100% rename from applications/platform/acquisition-server/share/interface-Enobio3G.ui rename to applications/platform/acquisition-server-legacy-2023/share/interface-Enobio3G.ui diff --git a/applications/platform/acquisition-server/share/interface-Generic-Oscillator.ui b/applications/platform/acquisition-server-legacy-2023/share/interface-Generic-Oscillator.ui similarity index 100% rename from applications/platform/acquisition-server/share/interface-Generic-Oscillator.ui rename to applications/platform/acquisition-server-legacy-2023/share/interface-Generic-Oscillator.ui diff --git a/applications/platform/acquisition-server/share/interface-Generic-RawFileReader.ui b/applications/platform/acquisition-server-legacy-2023/share/interface-Generic-RawFileReader.ui similarity index 100% rename from applications/platform/acquisition-server/share/interface-Generic-RawFileReader.ui rename to applications/platform/acquisition-server-legacy-2023/share/interface-Generic-RawFileReader.ui diff --git a/applications/platform/acquisition-server/share/interface-Generic-RawTelnetReader.ui b/applications/platform/acquisition-server-legacy-2023/share/interface-Generic-RawTelnetReader.ui similarity index 100% rename from applications/platform/acquisition-server/share/interface-Generic-RawTelnetReader.ui rename to applications/platform/acquisition-server-legacy-2023/share/interface-Generic-RawTelnetReader.ui diff --git a/applications/platform/acquisition-server/share/interface-Generic-TimeSignal.ui b/applications/platform/acquisition-server-legacy-2023/share/interface-Generic-TimeSignal.ui similarity index 100% rename from applications/platform/acquisition-server/share/interface-Generic-TimeSignal.ui rename to applications/platform/acquisition-server-legacy-2023/share/interface-Generic-TimeSignal.ui diff --git a/applications/platform/acquisition-server/share/interface-LabStreamingLayer.ui b/applications/platform/acquisition-server-legacy-2023/share/interface-LabStreamingLayer.ui similarity index 100% rename from applications/platform/acquisition-server/share/interface-LabStreamingLayer.ui rename to applications/platform/acquisition-server-legacy-2023/share/interface-LabStreamingLayer.ui diff --git a/applications/platform/acquisition-server/share/interface-MCSNVXDriver.ui b/applications/platform/acquisition-server-legacy-2023/share/interface-MCSNVXDriver.ui similarity index 100% rename from applications/platform/acquisition-server/share/interface-MCSNVXDriver.ui rename to applications/platform/acquisition-server-legacy-2023/share/interface-MCSNVXDriver.ui diff --git a/applications/platform/acquisition-server/share/interface-Micromed-SystemPlusEvolution.ui b/applications/platform/acquisition-server-legacy-2023/share/interface-Micromed-SystemPlusEvolution.ui similarity index 100% rename from applications/platform/acquisition-server/share/interface-Micromed-SystemPlusEvolution.ui rename to applications/platform/acquisition-server-legacy-2023/share/interface-Micromed-SystemPlusEvolution.ui diff --git a/applications/platform/acquisition-server/share/interface-MindMedia-NeXus32B.ui b/applications/platform/acquisition-server-legacy-2023/share/interface-MindMedia-NeXus32B.ui similarity index 100% rename from applications/platform/acquisition-server/share/interface-MindMedia-NeXus32B.ui rename to applications/platform/acquisition-server-legacy-2023/share/interface-MindMedia-NeXus32B.ui diff --git a/applications/platform/acquisition-server/share/interface-NeuroServoHid.ui b/applications/platform/acquisition-server-legacy-2023/share/interface-NeuroServoHid.ui similarity index 100% rename from applications/platform/acquisition-server/share/interface-NeuroServoHid.ui rename to applications/platform/acquisition-server-legacy-2023/share/interface-NeuroServoHid.ui diff --git a/applications/platform/acquisition-server/share/interface-Neurosky-Mindset.ui b/applications/platform/acquisition-server-legacy-2023/share/interface-Neurosky-Mindset.ui similarity index 100% rename from applications/platform/acquisition-server/share/interface-Neurosky-Mindset.ui rename to applications/platform/acquisition-server-legacy-2023/share/interface-Neurosky-Mindset.ui diff --git a/applications/platform/acquisition-server/share/interface-ShimmerGSR.ui b/applications/platform/acquisition-server-legacy-2023/share/interface-ShimmerGSR.ui similarity index 100% rename from applications/platform/acquisition-server/share/interface-ShimmerGSR.ui rename to applications/platform/acquisition-server-legacy-2023/share/interface-ShimmerGSR.ui diff --git a/applications/platform/acquisition-server/share/interface-Simulated-Deviator.ui b/applications/platform/acquisition-server-legacy-2023/share/interface-Simulated-Deviator.ui similarity index 100% rename from applications/platform/acquisition-server/share/interface-Simulated-Deviator.ui rename to applications/platform/acquisition-server-legacy-2023/share/interface-Simulated-Deviator.ui diff --git a/applications/platform/acquisition-server/share/interface-TMSI-Refa32B.ui b/applications/platform/acquisition-server-legacy-2023/share/interface-TMSI-Refa32B.ui similarity index 100% rename from applications/platform/acquisition-server/share/interface-TMSI-Refa32B.ui rename to applications/platform/acquisition-server-legacy-2023/share/interface-TMSI-Refa32B.ui diff --git a/applications/platform/acquisition-server/share/interface-TMSi.ui b/applications/platform/acquisition-server-legacy-2023/share/interface-TMSi.ui similarity index 100% rename from applications/platform/acquisition-server/share/interface-TMSi.ui rename to applications/platform/acquisition-server-legacy-2023/share/interface-TMSi.ui diff --git a/applications/platform/acquisition-server/share/interface-channel-names.ui b/applications/platform/acquisition-server-legacy-2023/share/interface-channel-names.ui similarity index 100% rename from applications/platform/acquisition-server/share/interface-channel-names.ui rename to applications/platform/acquisition-server-legacy-2023/share/interface-channel-names.ui diff --git a/applications/platform/acquisition-server/share/interface-egi-ampserver.ui b/applications/platform/acquisition-server-legacy-2023/share/interface-egi-ampserver.ui similarity index 100% rename from applications/platform/acquisition-server/share/interface-egi-ampserver.ui rename to applications/platform/acquisition-server-legacy-2023/share/interface-egi-ampserver.ui diff --git a/applications/platform/acquisition-server/share/interface.ui-base b/applications/platform/acquisition-server-legacy-2023/share/interface.ui-base similarity index 100% rename from applications/platform/acquisition-server/share/interface.ui-base rename to applications/platform/acquisition-server-legacy-2023/share/interface.ui-base diff --git a/applications/platform/acquisition-server/share/ov-channel-rename-easycap-64ch.cfg b/applications/platform/acquisition-server-legacy-2023/share/ov-channel-rename-easycap-64ch.cfg similarity index 100% rename from applications/platform/acquisition-server/share/ov-channel-rename-easycap-64ch.cfg rename to applications/platform/acquisition-server-legacy-2023/share/ov-channel-rename-easycap-64ch.cfg diff --git a/applications/platform/acquisition-server/share/scripts/egi-default-initialize.script b/applications/platform/acquisition-server-legacy-2023/share/scripts/egi-default-initialize.script similarity index 100% rename from applications/platform/acquisition-server/share/scripts/egi-default-initialize.script rename to applications/platform/acquisition-server-legacy-2023/share/scripts/egi-default-initialize.script diff --git a/applications/platform/acquisition-server/share/scripts/egi-default-start.script b/applications/platform/acquisition-server-legacy-2023/share/scripts/egi-default-start.script similarity index 100% rename from applications/platform/acquisition-server/share/scripts/egi-default-start.script rename to applications/platform/acquisition-server-legacy-2023/share/scripts/egi-default-start.script diff --git a/applications/platform/acquisition-server/share/scripts/egi-default-stop.script b/applications/platform/acquisition-server-legacy-2023/share/scripts/egi-default-stop.script similarity index 100% rename from applications/platform/acquisition-server/share/scripts/egi-default-stop.script rename to applications/platform/acquisition-server-legacy-2023/share/scripts/egi-default-stop.script diff --git a/applications/platform/acquisition-server/share/scripts/egi-default-uninitialize.script b/applications/platform/acquisition-server-legacy-2023/share/scripts/egi-default-uninitialize.script similarity index 100% rename from applications/platform/acquisition-server/share/scripts/egi-default-uninitialize.script rename to applications/platform/acquisition-server-legacy-2023/share/scripts/egi-default-uninitialize.script diff --git a/applications/platform/acquisition-server/share/vamp-acquiring.bmp b/applications/platform/acquisition-server-legacy-2023/share/vamp-acquiring.bmp similarity index 100% rename from applications/platform/acquisition-server/share/vamp-acquiring.bmp rename to applications/platform/acquisition-server-legacy-2023/share/vamp-acquiring.bmp diff --git a/applications/platform/acquisition-server/share/vamp-default.bmp b/applications/platform/acquisition-server-legacy-2023/share/vamp-default.bmp similarity index 100% rename from applications/platform/acquisition-server/share/vamp-default.bmp rename to applications/platform/acquisition-server-legacy-2023/share/vamp-default.bmp diff --git a/applications/platform/acquisition-server/share/vamp-impedance-mask.bmp b/applications/platform/acquisition-server-legacy-2023/share/vamp-impedance-mask.bmp similarity index 100% rename from applications/platform/acquisition-server/share/vamp-impedance-mask.bmp rename to applications/platform/acquisition-server-legacy-2023/share/vamp-impedance-mask.bmp diff --git a/applications/platform/acquisition-server/share/vamp-standby.bmp b/applications/platform/acquisition-server-legacy-2023/share/vamp-standby.bmp similarity index 100% rename from applications/platform/acquisition-server/share/vamp-standby.bmp rename to applications/platform/acquisition-server-legacy-2023/share/vamp-standby.bmp diff --git a/applications/platform/acquisition-server/share/vamp.bmp b/applications/platform/acquisition-server-legacy-2023/share/vamp.bmp similarity index 100% rename from applications/platform/acquisition-server/share/vamp.bmp rename to applications/platform/acquisition-server-legacy-2023/share/vamp.bmp diff --git a/applications/platform/acquisition-server/src/drivers/biosemi-activetwo/mCBridgeBioSemiActiveTwo.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/biosemi-activetwo/mCBridgeBioSemiActiveTwo.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/biosemi-activetwo/mCBridgeBioSemiActiveTwo.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/biosemi-activetwo/mCBridgeBioSemiActiveTwo.cpp diff --git a/applications/platform/acquisition-server/src/drivers/biosemi-activetwo/mCBridgeBioSemiActiveTwo.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/biosemi-activetwo/mCBridgeBioSemiActiveTwo.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/biosemi-activetwo/mCBridgeBioSemiActiveTwo.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/biosemi-activetwo/mCBridgeBioSemiActiveTwo.h diff --git a/applications/platform/acquisition-server/src/drivers/biosemi-activetwo/ovasCConfigurationBioSemiActiveTwo.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/biosemi-activetwo/ovasCConfigurationBioSemiActiveTwo.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/biosemi-activetwo/ovasCConfigurationBioSemiActiveTwo.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/biosemi-activetwo/ovasCConfigurationBioSemiActiveTwo.cpp diff --git a/applications/platform/acquisition-server/src/drivers/biosemi-activetwo/ovasCConfigurationBioSemiActiveTwo.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/biosemi-activetwo/ovasCConfigurationBioSemiActiveTwo.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/biosemi-activetwo/ovasCConfigurationBioSemiActiveTwo.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/biosemi-activetwo/ovasCConfigurationBioSemiActiveTwo.h diff --git a/applications/platform/acquisition-server/src/drivers/biosemi-activetwo/ovasCDriverBioSemiActiveTwo.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/biosemi-activetwo/ovasCDriverBioSemiActiveTwo.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/biosemi-activetwo/ovasCDriverBioSemiActiveTwo.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/biosemi-activetwo/ovasCDriverBioSemiActiveTwo.cpp diff --git a/applications/platform/acquisition-server/src/drivers/biosemi-activetwo/ovasCDriverBioSemiActiveTwo.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/biosemi-activetwo/ovasCDriverBioSemiActiveTwo.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/biosemi-activetwo/ovasCDriverBioSemiActiveTwo.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/biosemi-activetwo/ovasCDriverBioSemiActiveTwo.h diff --git a/applications/platform/acquisition-server/src/drivers/brainproducts-actichamp/ovasCConfigurationBrainProductsActiCHamp.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-actichamp/ovasCConfigurationBrainProductsActiCHamp.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/brainproducts-actichamp/ovasCConfigurationBrainProductsActiCHamp.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-actichamp/ovasCConfigurationBrainProductsActiCHamp.cpp diff --git a/applications/platform/acquisition-server/src/drivers/brainproducts-actichamp/ovasCConfigurationBrainProductsActiCHamp.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-actichamp/ovasCConfigurationBrainProductsActiCHamp.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/brainproducts-actichamp/ovasCConfigurationBrainProductsActiCHamp.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-actichamp/ovasCConfigurationBrainProductsActiCHamp.h diff --git a/applications/platform/acquisition-server/src/drivers/brainproducts-actichamp/ovasCDriverBrainProductsActiCHamp.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-actichamp/ovasCDriverBrainProductsActiCHamp.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/brainproducts-actichamp/ovasCDriverBrainProductsActiCHamp.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-actichamp/ovasCDriverBrainProductsActiCHamp.cpp diff --git a/applications/platform/acquisition-server/src/drivers/brainproducts-actichamp/ovasCDriverBrainProductsActiCHamp.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-actichamp/ovasCDriverBrainProductsActiCHamp.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/brainproducts-actichamp/ovasCDriverBrainProductsActiCHamp.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-actichamp/ovasCDriverBrainProductsActiCHamp.h diff --git a/applications/platform/acquisition-server/src/drivers/brainproducts-base/CDriverBrainProductsBase.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-base/CDriverBrainProductsBase.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/brainproducts-base/CDriverBrainProductsBase.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-base/CDriverBrainProductsBase.cpp diff --git a/applications/platform/acquisition-server/src/drivers/brainproducts-base/CDriverBrainProductsBase.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-base/CDriverBrainProductsBase.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/brainproducts-base/CDriverBrainProductsBase.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-base/CDriverBrainProductsBase.h diff --git a/applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovasCConfigurationBrainProductsBrainampSeries.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-brainampseries/ovasCConfigurationBrainProductsBrainampSeries.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovasCConfigurationBrainProductsBrainampSeries.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-brainampseries/ovasCConfigurationBrainProductsBrainampSeries.cpp diff --git a/applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovasCConfigurationBrainProductsBrainampSeries.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-brainampseries/ovasCConfigurationBrainProductsBrainampSeries.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovasCConfigurationBrainProductsBrainampSeries.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-brainampseries/ovasCConfigurationBrainProductsBrainampSeries.h diff --git a/applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovasCDriverBrainProductsBrainampSeries.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-brainampseries/ovasCDriverBrainProductsBrainampSeries.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovasCDriverBrainProductsBrainampSeries.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-brainampseries/ovasCDriverBrainProductsBrainampSeries.cpp diff --git a/applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovasCDriverBrainProductsBrainampSeries.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-brainampseries/ovasCDriverBrainProductsBrainampSeries.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovasCDriverBrainProductsBrainampSeries.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-brainampseries/ovasCDriverBrainProductsBrainampSeries.h diff --git a/applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovasCHeaderAdapterBrainProductsBrainampSeries.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-brainampseries/ovasCHeaderAdapterBrainProductsBrainampSeries.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovasCHeaderAdapterBrainProductsBrainampSeries.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-brainampseries/ovasCHeaderAdapterBrainProductsBrainampSeries.cpp diff --git a/applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovasCHeaderAdapterBrainProductsBrainampSeries.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-brainampseries/ovasCHeaderAdapterBrainProductsBrainampSeries.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovasCHeaderAdapterBrainProductsBrainampSeries.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-brainampseries/ovasCHeaderAdapterBrainProductsBrainampSeries.h diff --git a/applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovas_defines_brainamp_series.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-brainampseries/ovas_defines_brainamp_series.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/brainproducts-brainampseries/ovas_defines_brainamp_series.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-brainampseries/ovas_defines_brainamp_series.h diff --git a/applications/platform/acquisition-server/src/drivers/brainproducts-liveamp/ovasCConfigurationBrainProductsLiveAmp.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-liveamp/ovasCConfigurationBrainProductsLiveAmp.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/brainproducts-liveamp/ovasCConfigurationBrainProductsLiveAmp.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-liveamp/ovasCConfigurationBrainProductsLiveAmp.cpp diff --git a/applications/platform/acquisition-server/src/drivers/brainproducts-liveamp/ovasCConfigurationBrainProductsLiveAmp.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-liveamp/ovasCConfigurationBrainProductsLiveAmp.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/brainproducts-liveamp/ovasCConfigurationBrainProductsLiveAmp.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-liveamp/ovasCConfigurationBrainProductsLiveAmp.h diff --git a/applications/platform/acquisition-server/src/drivers/brainproducts-liveamp/ovasCDriverBrainProductsLiveAmp.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-liveamp/ovasCDriverBrainProductsLiveAmp.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/brainproducts-liveamp/ovasCDriverBrainProductsLiveAmp.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-liveamp/ovasCDriverBrainProductsLiveAmp.cpp diff --git a/applications/platform/acquisition-server/src/drivers/brainproducts-liveamp/ovasCDriverBrainProductsLiveAmp.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-liveamp/ovasCDriverBrainProductsLiveAmp.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/brainproducts-liveamp/ovasCDriverBrainProductsLiveAmp.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-liveamp/ovasCDriverBrainProductsLiveAmp.h diff --git a/applications/platform/acquisition-server/src/drivers/brainproducts-vamp/ovasCConfigurationBrainProductsVAmp.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-vamp/ovasCConfigurationBrainProductsVAmp.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/brainproducts-vamp/ovasCConfigurationBrainProductsVAmp.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-vamp/ovasCConfigurationBrainProductsVAmp.cpp diff --git a/applications/platform/acquisition-server/src/drivers/brainproducts-vamp/ovasCConfigurationBrainProductsVAmp.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-vamp/ovasCConfigurationBrainProductsVAmp.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/brainproducts-vamp/ovasCConfigurationBrainProductsVAmp.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-vamp/ovasCConfigurationBrainProductsVAmp.h diff --git a/applications/platform/acquisition-server/src/drivers/brainproducts-vamp/ovasCDriverBrainProductsVAmp.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-vamp/ovasCDriverBrainProductsVAmp.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/brainproducts-vamp/ovasCDriverBrainProductsVAmp.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-vamp/ovasCDriverBrainProductsVAmp.cpp diff --git a/applications/platform/acquisition-server/src/drivers/brainproducts-vamp/ovasCDriverBrainProductsVAmp.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-vamp/ovasCDriverBrainProductsVAmp.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/brainproducts-vamp/ovasCDriverBrainProductsVAmp.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-vamp/ovasCDriverBrainProductsVAmp.h diff --git a/applications/platform/acquisition-server/src/drivers/brainproducts-vamp/ovasCHeaderBrainProductsVAmp.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-vamp/ovasCHeaderBrainProductsVAmp.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/brainproducts-vamp/ovasCHeaderBrainProductsVAmp.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-vamp/ovasCHeaderBrainProductsVAmp.cpp diff --git a/applications/platform/acquisition-server/src/drivers/brainproducts-vamp/ovasCHeaderBrainProductsVAmp.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-vamp/ovasCHeaderBrainProductsVAmp.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/brainproducts-vamp/ovasCHeaderBrainProductsVAmp.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/brainproducts-vamp/ovasCHeaderBrainProductsVAmp.h diff --git a/applications/platform/acquisition-server/src/drivers/egi-ampserver/ovasCConfigurationEGIAmpServer.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/egi-ampserver/ovasCConfigurationEGIAmpServer.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/egi-ampserver/ovasCConfigurationEGIAmpServer.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/egi-ampserver/ovasCConfigurationEGIAmpServer.cpp diff --git a/applications/platform/acquisition-server/src/drivers/egi-ampserver/ovasCConfigurationEGIAmpServer.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/egi-ampserver/ovasCConfigurationEGIAmpServer.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/egi-ampserver/ovasCConfigurationEGIAmpServer.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/egi-ampserver/ovasCConfigurationEGIAmpServer.h diff --git a/applications/platform/acquisition-server/src/drivers/egi-ampserver/ovasCDriverEGIAmpServer.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/egi-ampserver/ovasCDriverEGIAmpServer.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/egi-ampserver/ovasCDriverEGIAmpServer.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/egi-ampserver/ovasCDriverEGIAmpServer.cpp diff --git a/applications/platform/acquisition-server/src/drivers/egi-ampserver/ovasCDriverEGIAmpServer.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/egi-ampserver/ovasCDriverEGIAmpServer.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/egi-ampserver/ovasCDriverEGIAmpServer.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/egi-ampserver/ovasCDriverEGIAmpServer.h diff --git a/applications/platform/acquisition-server/src/drivers/emotiv-epoc/ovasCConfigurationEmotivEPOC.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/emotiv-epoc/ovasCConfigurationEmotivEPOC.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/emotiv-epoc/ovasCConfigurationEmotivEPOC.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/emotiv-epoc/ovasCConfigurationEmotivEPOC.cpp diff --git a/applications/platform/acquisition-server/src/drivers/emotiv-epoc/ovasCConfigurationEmotivEPOC.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/emotiv-epoc/ovasCConfigurationEmotivEPOC.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/emotiv-epoc/ovasCConfigurationEmotivEPOC.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/emotiv-epoc/ovasCConfigurationEmotivEPOC.h diff --git a/applications/platform/acquisition-server/src/drivers/emotiv-epoc/ovasCDriverEmotivEPOC.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/emotiv-epoc/ovasCDriverEmotivEPOC.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/emotiv-epoc/ovasCDriverEmotivEPOC.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/emotiv-epoc/ovasCDriverEmotivEPOC.cpp diff --git a/applications/platform/acquisition-server/src/drivers/emotiv-epoc/ovasCDriverEmotivEPOC.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/emotiv-epoc/ovasCDriverEmotivEPOC.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/emotiv-epoc/ovasCDriverEmotivEPOC.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/emotiv-epoc/ovasCDriverEmotivEPOC.h diff --git a/applications/platform/acquisition-server/src/drivers/filters/f64_100k_1024.bin b/applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_100k_1024.bin similarity index 100% rename from applications/platform/acquisition-server/src/drivers/filters/f64_100k_1024.bin rename to applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_100k_1024.bin diff --git a/applications/platform/acquisition-server/src/drivers/filters/f64_100k_128.bin b/applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_100k_128.bin similarity index 100% rename from applications/platform/acquisition-server/src/drivers/filters/f64_100k_128.bin rename to applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_100k_128.bin diff --git a/applications/platform/acquisition-server/src/drivers/filters/f64_100k_2048.bin b/applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_100k_2048.bin similarity index 100% rename from applications/platform/acquisition-server/src/drivers/filters/f64_100k_2048.bin rename to applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_100k_2048.bin diff --git a/applications/platform/acquisition-server/src/drivers/filters/f64_100k_256.bin b/applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_100k_256.bin similarity index 100% rename from applications/platform/acquisition-server/src/drivers/filters/f64_100k_256.bin rename to applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_100k_256.bin diff --git a/applications/platform/acquisition-server/src/drivers/filters/f64_100k_4096.bin b/applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_100k_4096.bin similarity index 100% rename from applications/platform/acquisition-server/src/drivers/filters/f64_100k_4096.bin rename to applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_100k_4096.bin diff --git a/applications/platform/acquisition-server/src/drivers/filters/f64_100k_512.bin b/applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_100k_512.bin similarity index 100% rename from applications/platform/acquisition-server/src/drivers/filters/f64_100k_512.bin rename to applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_100k_512.bin diff --git a/applications/platform/acquisition-server/src/drivers/filters/f64_10k_1024.bin b/applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_10k_1024.bin similarity index 100% rename from applications/platform/acquisition-server/src/drivers/filters/f64_10k_1024.bin rename to applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_10k_1024.bin diff --git a/applications/platform/acquisition-server/src/drivers/filters/f64_10k_128.bin b/applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_10k_128.bin similarity index 100% rename from applications/platform/acquisition-server/src/drivers/filters/f64_10k_128.bin rename to applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_10k_128.bin diff --git a/applications/platform/acquisition-server/src/drivers/filters/f64_10k_2048.bin b/applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_10k_2048.bin similarity index 100% rename from applications/platform/acquisition-server/src/drivers/filters/f64_10k_2048.bin rename to applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_10k_2048.bin diff --git a/applications/platform/acquisition-server/src/drivers/filters/f64_10k_256.bin b/applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_10k_256.bin similarity index 100% rename from applications/platform/acquisition-server/src/drivers/filters/f64_10k_256.bin rename to applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_10k_256.bin diff --git a/applications/platform/acquisition-server/src/drivers/filters/f64_10k_4096.bin b/applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_10k_4096.bin similarity index 100% rename from applications/platform/acquisition-server/src/drivers/filters/f64_10k_4096.bin rename to applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_10k_4096.bin diff --git a/applications/platform/acquisition-server/src/drivers/filters/f64_10k_512.bin b/applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_10k_512.bin similarity index 100% rename from applications/platform/acquisition-server/src/drivers/filters/f64_10k_512.bin rename to applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_10k_512.bin diff --git a/applications/platform/acquisition-server/src/drivers/filters/f64_25k_1024.bin b/applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_25k_1024.bin similarity index 100% rename from applications/platform/acquisition-server/src/drivers/filters/f64_25k_1024.bin rename to applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_25k_1024.bin diff --git a/applications/platform/acquisition-server/src/drivers/filters/f64_25k_128.bin b/applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_25k_128.bin similarity index 100% rename from applications/platform/acquisition-server/src/drivers/filters/f64_25k_128.bin rename to applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_25k_128.bin diff --git a/applications/platform/acquisition-server/src/drivers/filters/f64_25k_2048.bin b/applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_25k_2048.bin similarity index 100% rename from applications/platform/acquisition-server/src/drivers/filters/f64_25k_2048.bin rename to applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_25k_2048.bin diff --git a/applications/platform/acquisition-server/src/drivers/filters/f64_25k_256.bin b/applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_25k_256.bin similarity index 100% rename from applications/platform/acquisition-server/src/drivers/filters/f64_25k_256.bin rename to applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_25k_256.bin diff --git a/applications/platform/acquisition-server/src/drivers/filters/f64_25k_4096.bin b/applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_25k_4096.bin similarity index 100% rename from applications/platform/acquisition-server/src/drivers/filters/f64_25k_4096.bin rename to applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_25k_4096.bin diff --git a/applications/platform/acquisition-server/src/drivers/filters/f64_25k_512.bin b/applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_25k_512.bin similarity index 100% rename from applications/platform/acquisition-server/src/drivers/filters/f64_25k_512.bin rename to applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_25k_512.bin diff --git a/applications/platform/acquisition-server/src/drivers/filters/f64_50k_1024.bin b/applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_50k_1024.bin similarity index 100% rename from applications/platform/acquisition-server/src/drivers/filters/f64_50k_1024.bin rename to applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_50k_1024.bin diff --git a/applications/platform/acquisition-server/src/drivers/filters/f64_50k_128.bin b/applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_50k_128.bin similarity index 100% rename from applications/platform/acquisition-server/src/drivers/filters/f64_50k_128.bin rename to applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_50k_128.bin diff --git a/applications/platform/acquisition-server/src/drivers/filters/f64_50k_2048.bin b/applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_50k_2048.bin similarity index 100% rename from applications/platform/acquisition-server/src/drivers/filters/f64_50k_2048.bin rename to applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_50k_2048.bin diff --git a/applications/platform/acquisition-server/src/drivers/filters/f64_50k_256.bin b/applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_50k_256.bin similarity index 100% rename from applications/platform/acquisition-server/src/drivers/filters/f64_50k_256.bin rename to applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_50k_256.bin diff --git a/applications/platform/acquisition-server/src/drivers/filters/f64_50k_4096.bin b/applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_50k_4096.bin similarity index 100% rename from applications/platform/acquisition-server/src/drivers/filters/f64_50k_4096.bin rename to applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_50k_4096.bin diff --git a/applications/platform/acquisition-server/src/drivers/filters/f64_50k_512.bin b/applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_50k_512.bin similarity index 100% rename from applications/platform/acquisition-server/src/drivers/filters/f64_50k_512.bin rename to applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_50k_512.bin diff --git a/applications/platform/acquisition-server/src/drivers/filters/f64_5k_1024.bin b/applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_5k_1024.bin similarity index 100% rename from applications/platform/acquisition-server/src/drivers/filters/f64_5k_1024.bin rename to applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_5k_1024.bin diff --git a/applications/platform/acquisition-server/src/drivers/filters/f64_5k_128.bin b/applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_5k_128.bin similarity index 100% rename from applications/platform/acquisition-server/src/drivers/filters/f64_5k_128.bin rename to applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_5k_128.bin diff --git a/applications/platform/acquisition-server/src/drivers/filters/f64_5k_2048.bin b/applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_5k_2048.bin similarity index 100% rename from applications/platform/acquisition-server/src/drivers/filters/f64_5k_2048.bin rename to applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_5k_2048.bin diff --git a/applications/platform/acquisition-server/src/drivers/filters/f64_5k_256.bin b/applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_5k_256.bin similarity index 100% rename from applications/platform/acquisition-server/src/drivers/filters/f64_5k_256.bin rename to applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_5k_256.bin diff --git a/applications/platform/acquisition-server/src/drivers/filters/f64_5k_4096.bin b/applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_5k_4096.bin similarity index 100% rename from applications/platform/acquisition-server/src/drivers/filters/f64_5k_4096.bin rename to applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_5k_4096.bin diff --git a/applications/platform/acquisition-server/src/drivers/filters/f64_5k_512.bin b/applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_5k_512.bin similarity index 100% rename from applications/platform/acquisition-server/src/drivers/filters/f64_5k_512.bin rename to applications/platform/acquisition-server-legacy-2023/src/drivers/filters/f64_5k_512.bin diff --git a/applications/platform/acquisition-server/src/drivers/generic-oscillator/ovasCConfigurationDriverGenericOscillator.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/generic-oscillator/ovasCConfigurationDriverGenericOscillator.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/generic-oscillator/ovasCConfigurationDriverGenericOscillator.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/generic-oscillator/ovasCConfigurationDriverGenericOscillator.cpp diff --git a/applications/platform/acquisition-server/src/drivers/generic-oscillator/ovasCConfigurationDriverGenericOscillator.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/generic-oscillator/ovasCConfigurationDriverGenericOscillator.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/generic-oscillator/ovasCConfigurationDriverGenericOscillator.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/generic-oscillator/ovasCConfigurationDriverGenericOscillator.h diff --git a/applications/platform/acquisition-server/src/drivers/generic-oscillator/ovasCDriverGenericOscillator.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/generic-oscillator/ovasCDriverGenericOscillator.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/generic-oscillator/ovasCDriverGenericOscillator.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/generic-oscillator/ovasCDriverGenericOscillator.cpp diff --git a/applications/platform/acquisition-server/src/drivers/generic-oscillator/ovasCDriverGenericOscillator.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/generic-oscillator/ovasCDriverGenericOscillator.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/generic-oscillator/ovasCDriverGenericOscillator.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/generic-oscillator/ovasCDriverGenericOscillator.h diff --git a/applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCConfigurationGenericRawReader.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/generic-raw-reader/ovasCConfigurationGenericRawReader.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCConfigurationGenericRawReader.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/generic-raw-reader/ovasCConfigurationGenericRawReader.cpp diff --git a/applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCConfigurationGenericRawReader.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/generic-raw-reader/ovasCConfigurationGenericRawReader.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCConfigurationGenericRawReader.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/generic-raw-reader/ovasCConfigurationGenericRawReader.h diff --git a/applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCDriverGenericRawFileReader.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/generic-raw-reader/ovasCDriverGenericRawFileReader.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCDriverGenericRawFileReader.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/generic-raw-reader/ovasCDriverGenericRawFileReader.cpp diff --git a/applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCDriverGenericRawFileReader.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/generic-raw-reader/ovasCDriverGenericRawFileReader.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCDriverGenericRawFileReader.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/generic-raw-reader/ovasCDriverGenericRawFileReader.h diff --git a/applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCDriverGenericRawReader.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/generic-raw-reader/ovasCDriverGenericRawReader.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCDriverGenericRawReader.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/generic-raw-reader/ovasCDriverGenericRawReader.cpp diff --git a/applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCDriverGenericRawReader.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/generic-raw-reader/ovasCDriverGenericRawReader.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCDriverGenericRawReader.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/generic-raw-reader/ovasCDriverGenericRawReader.h diff --git a/applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCDriverGenericRawTelnetReader.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/generic-raw-reader/ovasCDriverGenericRawTelnetReader.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCDriverGenericRawTelnetReader.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/generic-raw-reader/ovasCDriverGenericRawTelnetReader.cpp diff --git a/applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCDriverGenericRawTelnetReader.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/generic-raw-reader/ovasCDriverGenericRawTelnetReader.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/generic-raw-reader/ovasCDriverGenericRawTelnetReader.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/generic-raw-reader/ovasCDriverGenericRawTelnetReader.h diff --git a/applications/platform/acquisition-server/src/drivers/generic-sawtooth/ovasCDriverGenericSawTooth.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/generic-sawtooth/ovasCDriverGenericSawTooth.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/generic-sawtooth/ovasCDriverGenericSawTooth.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/generic-sawtooth/ovasCDriverGenericSawTooth.cpp diff --git a/applications/platform/acquisition-server/src/drivers/generic-sawtooth/ovasCDriverGenericSawTooth.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/generic-sawtooth/ovasCDriverGenericSawTooth.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/generic-sawtooth/ovasCDriverGenericSawTooth.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/generic-sawtooth/ovasCDriverGenericSawTooth.h diff --git a/applications/platform/acquisition-server/src/drivers/generic-time-signal/ovasCConfigurationGenericTimeSignal.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/generic-time-signal/ovasCConfigurationGenericTimeSignal.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/generic-time-signal/ovasCConfigurationGenericTimeSignal.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/generic-time-signal/ovasCConfigurationGenericTimeSignal.cpp diff --git a/applications/platform/acquisition-server/src/drivers/generic-time-signal/ovasCConfigurationGenericTimeSignal.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/generic-time-signal/ovasCConfigurationGenericTimeSignal.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/generic-time-signal/ovasCConfigurationGenericTimeSignal.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/generic-time-signal/ovasCConfigurationGenericTimeSignal.h diff --git a/applications/platform/acquisition-server/src/drivers/generic-time-signal/ovasCDriverGenericTimeSignal.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/generic-time-signal/ovasCDriverGenericTimeSignal.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/generic-time-signal/ovasCDriverGenericTimeSignal.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/generic-time-signal/ovasCDriverGenericTimeSignal.cpp diff --git a/applications/platform/acquisition-server/src/drivers/generic-time-signal/ovasCDriverGenericTimeSignal.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/generic-time-signal/ovasCDriverGenericTimeSignal.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/generic-time-signal/ovasCDriverGenericTimeSignal.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/generic-time-signal/ovasCDriverGenericTimeSignal.h diff --git a/applications/platform/acquisition-server/src/drivers/labstreaminglayer/examples/SendToLSL.m b/applications/platform/acquisition-server-legacy-2023/src/drivers/labstreaminglayer/examples/SendToLSL.m similarity index 100% rename from applications/platform/acquisition-server/src/drivers/labstreaminglayer/examples/SendToLSL.m rename to applications/platform/acquisition-server-legacy-2023/src/drivers/labstreaminglayer/examples/SendToLSL.m diff --git a/applications/platform/acquisition-server-legacy-2023/src/drivers/labstreaminglayer/ovasCConfigurationLabStreamingLayer.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/labstreaminglayer/ovasCConfigurationLabStreamingLayer.cpp new file mode 100755 index 0000000000000000000000000000000000000000..0145ac0e1ab71bfc6e7738017b378ea7f8a07cf4 --- /dev/null +++ b/applications/platform/acquisition-server-legacy-2023/src/drivers/labstreaminglayer/ovasCConfigurationLabStreamingLayer.cpp @@ -0,0 +1,164 @@ +#if defined(TARGET_HAS_ThirdPartyLSL) + +#include "ovasCConfigurationLabStreamingLayer.h" + +#include <lsl_cpp.h> +#include "ovasIHeader.h" + +#include <iostream> +#include <sstream> + +namespace OpenViBE { +namespace AcquisitionServer { + +CConfigurationLabStreamingLayer::CConfigurationLabStreamingLayer(IDriverContext& ctx, const char* gtkBuilderFilename, IHeader& header, bool& limitSpeed, + CString& signalStream, CString& signalStreamID, CString& markerStream, CString& markerStreamID, + uint32_t& fallbackSampling) + : CConfigurationBuilder(gtkBuilderFilename), m_driverCtx(ctx), m_limitSpeed(limitSpeed), m_signalStream(signalStream), + m_signalStreamID(signalStreamID), m_markerStream(markerStream), m_markerStreamID(markerStreamID), m_fallbackSampling(fallbackSampling) {} + +bool CConfigurationLabStreamingLayer::preConfigure() +{ + if (! CConfigurationBuilder::preConfigure()) { return false; } + + GtkToggleButton* buttonSpeedLimit = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_limit_speed")); + gtk_toggle_button_set_active(buttonSpeedLimit, m_limitSpeed ? TRUE : FALSE); + + GtkComboBox* comboBox = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_signal_stream")); + if (!comboBox) { return false; } + + GtkComboBox* markerComboBox = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_marker_stream")); + if (!markerComboBox) { return false; } + + GtkEntry* fallbackSamplingEntry = GTK_ENTRY(gtk_builder_get_object(m_builder, "entry_fallback_sampling_frequency")); + if (!fallbackSamplingEntry) { return false; } + + m_signalIdxs.clear(); + m_markerIdxs.clear(); + + // Allow operation without a marker stream + gtk_combo_box_append_text(markerComboBox, "None"); + gtk_combo_box_set_active(markerComboBox, 0); + m_markerIdxs.push_back(-1); + + m_streams = lsl::resolve_streams(1.0); + + // See if any of the streams can be interpreted as signal or marker + uint32_t nStreams = 0; + uint32_t nMarkerStreams = 0; + bool exactSignalMatch = false; // If we can match both name and ID, stop at that. Otherwise we auto-accept the 'name only' match. + bool exactMarkerMatch = false; + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Discovered " << m_streams.size() << " streams in total\n"; + + for (size_t i = 0; i < m_streams.size(); ++i) { + if (m_streams[i].channel_format() == lsl::cf_float32) { + std::stringstream ss; + ss << m_streams[i].name() << " / " << m_streams[i].source_id(); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << i << ". Discovered signal stream " << m_streams[i].name() << ", id " << ss.str() << "\n"; + + gtk_combo_box_append_text(comboBox, ss.str().c_str()); + m_signalIdxs.push_back(static_cast<int>(i)); + if ((m_signalStream == CString(m_streams[i].name().c_str()) && !exactSignalMatch) || !nStreams) { + if (m_signalStreamID == CString(m_streams[i].source_id().c_str())) { exactSignalMatch = true; } + gtk_combo_box_set_active(comboBox, nStreams); + } + nStreams++; + } + else if (m_streams[i].channel_format() == lsl::cf_int32) { + std::stringstream ss; + ss << m_streams[i].name().c_str() << " / " << m_streams[i].source_id().c_str(); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << i << ". Discovered marker stream " << m_streams[i].name() << ", id " << ss.str() << "\n"; + + gtk_combo_box_append_text(markerComboBox, ss.str().c_str()); + m_markerIdxs.push_back(i); + if ((m_markerStream == CString(m_streams[i].name().c_str()) && !exactMarkerMatch) || !nMarkerStreams) { + if (m_markerStreamID == CString(m_streams[i].source_id().c_str())) { + // If we can match both name and ID, stop at that. Otherwise we accept the 'name only' match. + exactMarkerMatch = true; + } + gtk_combo_box_set_active(markerComboBox, nMarkerStreams + 1); + } + nMarkerStreams++; + } + else { + // Only float and int are currently supported for signals and markers respectively + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << i << ". Discovered stream with channel format " << m_streams[i].channel_format() + << " of stream [" << m_streams[i].name() << "] which is not supported, skipped.\n"; + } + } + + if (m_fallbackSampling == 0) { gtk_entry_set_text(fallbackSamplingEntry, ""); } + else { + const std::string buffer = std::to_string(m_fallbackSampling); + gtk_entry_set_text(fallbackSamplingEntry, buffer.c_str()); + } + + return true; +} + +bool CConfigurationLabStreamingLayer::postConfigure() +{ + if (m_applyConfig) { + GtkToggleButton* buttonSpeedLimit = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_limit_speed")); + m_limitSpeed = gtk_toggle_button_get_active(buttonSpeedLimit) ? true : false; + + // Retrieve signal stream info + GtkComboBox* comboBoxSignal = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_signal_stream")); + if (!comboBoxSignal) { + m_applyConfig = false; + CConfigurationBuilder::postConfigure(); // close window etc + return false; + } + + if (m_signalIdxs.empty()) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "LSL: Cannot proceed without a signal stream.\n"; + m_applyConfig = false; + CConfigurationBuilder::postConfigure(); // close window etc + return false; + } + + const int signalIdx = m_signalIdxs[gtk_combo_box_get_active(comboBoxSignal)]; + + m_signalStream = m_streams[signalIdx].name().c_str(); + m_signalStreamID = m_streams[signalIdx].source_id().c_str(); + + GtkComboBox* comboBoxMarker = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_marker_stream")); + if (!comboBoxMarker) { + m_applyConfig = false; + CConfigurationBuilder::postConfigure(); // close window etc + return false; + } + + // Retrieve marker stream info + const int markerIdx = m_markerIdxs[gtk_combo_box_get_active(comboBoxMarker)]; + if (markerIdx >= 0) { + m_markerStream = m_streams[markerIdx].name().c_str(); + m_markerStreamID = m_streams[markerIdx].source_id().c_str(); + } + else { + m_markerStream = "None"; + m_markerStreamID = ""; + } + + // Retrieve fallback sampling rate + GtkEntry* entry = GTK_ENTRY(gtk_builder_get_object(m_builder, "entry_fallback_sampling_frequency")); + uint32_t sampling = 0; + if (sscanf(gtk_entry_get_text(entry), "%u", &sampling) == 1) { m_fallbackSampling = uint32_t(sampling); } + else { m_fallbackSampling = 0; } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Binding to [" << m_signalStream << ", id " << m_signalStreamID << "] and [" + << m_markerStream << ", id " << m_markerStreamID << "]\n"; + } + + // normal header is filled (Subject ID, Age, Gender, channels, sampling frequency), ressources are realesed + if (!CConfigurationBuilder::postConfigure()) { return false; } + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyLSL diff --git a/applications/platform/acquisition-server-legacy-2023/src/drivers/labstreaminglayer/ovasCConfigurationLabStreamingLayer.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/labstreaminglayer/ovasCConfigurationLabStreamingLayer.h new file mode 100755 index 0000000000000000000000000000000000000000..5cab0cc39abe57de36f0e46b12f27aad27c257be --- /dev/null +++ b/applications/platform/acquisition-server-legacy-2023/src/drivers/labstreaminglayer/ovasCConfigurationLabStreamingLayer.h @@ -0,0 +1,49 @@ +#pragma once + +#if defined(TARGET_HAS_ThirdPartyLSL) + +#include "../ovasCConfigurationBuilder.h" +#include "ovasIDriver.h" +#include "ovasIHeader.h" + +#include <lsl_cpp.h> + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CConfigurationLabStreamingLayer + * \author Jussi T. Lindgren / Inria + * \date Wed Oct 15 09:41:18 2014 + * \brief The CConfigurationLabStreamingLayer handles the configuration dialog specific to the LabStreamingLayer (LSL) device. + * + * \sa CDriverLabStreamingLayer + */ +class CConfigurationLabStreamingLayer final : public CConfigurationBuilder +{ +public: + CConfigurationLabStreamingLayer(IDriverContext& ctx, const char* gtkBuilderFilename, IHeader& header, bool& limitSpeed, CString& signalStream, + CString& signalStreamID, CString& markerStream, CString& markerStreamID, uint32_t& fallbackSampling); + + bool preConfigure() override; + bool postConfigure() override; + +protected: + IDriverContext& m_driverCtx; + +private: + + bool& m_limitSpeed; + CString& m_signalStream; + CString& m_signalStreamID; + CString& m_markerStream; + CString& m_markerStreamID; + uint32_t& m_fallbackSampling; + + std::vector<lsl::stream_info> m_streams; + std::vector<int> m_signalIdxs; + std::vector<int> m_markerIdxs; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyLSL diff --git a/applications/platform/acquisition-server/src/drivers/labstreaminglayer/ovasCDriverLabStreamingLayer.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/labstreaminglayer/ovasCDriverLabStreamingLayer.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/labstreaminglayer/ovasCDriverLabStreamingLayer.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/labstreaminglayer/ovasCDriverLabStreamingLayer.cpp diff --git a/applications/platform/acquisition-server/src/drivers/labstreaminglayer/ovasCDriverLabStreamingLayer.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/labstreaminglayer/ovasCDriverLabStreamingLayer.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/labstreaminglayer/ovasCDriverLabStreamingLayer.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/labstreaminglayer/ovasCDriverLabStreamingLayer.h diff --git a/applications/platform/acquisition-server/src/drivers/mcs-nvx/ovasCConfigurationMCSNVXDriver.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/mcs-nvx/ovasCConfigurationMCSNVXDriver.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/mcs-nvx/ovasCConfigurationMCSNVXDriver.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/mcs-nvx/ovasCConfigurationMCSNVXDriver.cpp diff --git a/applications/platform/acquisition-server/src/drivers/mcs-nvx/ovasCConfigurationMCSNVXDriver.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/mcs-nvx/ovasCConfigurationMCSNVXDriver.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/mcs-nvx/ovasCConfigurationMCSNVXDriver.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/mcs-nvx/ovasCConfigurationMCSNVXDriver.h diff --git a/applications/platform/acquisition-server/src/drivers/mcs-nvx/ovasCDriverMCSNVXDriver.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/mcs-nvx/ovasCDriverMCSNVXDriver.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/mcs-nvx/ovasCDriverMCSNVXDriver.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/mcs-nvx/ovasCDriverMCSNVXDriver.cpp diff --git a/applications/platform/acquisition-server/src/drivers/mcs-nvx/ovasCDriverMCSNVXDriver.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/mcs-nvx/ovasCDriverMCSNVXDriver.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/mcs-nvx/ovasCDriverMCSNVXDriver.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/mcs-nvx/ovasCDriverMCSNVXDriver.h diff --git a/applications/platform/acquisition-server/src/drivers/mensia-acquisition/ovasCConfigurationDriverMensiaAcquisition.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/mensia-acquisition/ovasCConfigurationDriverMensiaAcquisition.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/mensia-acquisition/ovasCConfigurationDriverMensiaAcquisition.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/mensia-acquisition/ovasCConfigurationDriverMensiaAcquisition.cpp diff --git a/applications/platform/acquisition-server/src/drivers/mensia-acquisition/ovasCConfigurationDriverMensiaAcquisition.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/mensia-acquisition/ovasCConfigurationDriverMensiaAcquisition.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/mensia-acquisition/ovasCConfigurationDriverMensiaAcquisition.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/mensia-acquisition/ovasCConfigurationDriverMensiaAcquisition.h diff --git a/applications/platform/acquisition-server/src/drivers/mensia-acquisition/ovasCDriverMensiaAcquisition.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/mensia-acquisition/ovasCDriverMensiaAcquisition.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/mensia-acquisition/ovasCDriverMensiaAcquisition.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/mensia-acquisition/ovasCDriverMensiaAcquisition.cpp diff --git a/applications/platform/acquisition-server/src/drivers/mensia-acquisition/ovasCDriverMensiaAcquisition.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/mensia-acquisition/ovasCDriverMensiaAcquisition.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/mensia-acquisition/ovasCDriverMensiaAcquisition.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/mensia-acquisition/ovasCDriverMensiaAcquisition.h diff --git a/applications/platform/acquisition-server/src/drivers/micromed-systemplusevolution/ovasCDriverMicromedSystemPlusEvolution.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/micromed-systemplusevolution/ovasCDriverMicromedSystemPlusEvolution.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/micromed-systemplusevolution/ovasCDriverMicromedSystemPlusEvolution.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/micromed-systemplusevolution/ovasCDriverMicromedSystemPlusEvolution.cpp diff --git a/applications/platform/acquisition-server/src/drivers/micromed-systemplusevolution/ovasCDriverMicromedSystemPlusEvolution.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/micromed-systemplusevolution/ovasCDriverMicromedSystemPlusEvolution.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/micromed-systemplusevolution/ovasCDriverMicromedSystemPlusEvolution.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/micromed-systemplusevolution/ovasCDriverMicromedSystemPlusEvolution.h diff --git a/applications/platform/acquisition-server/src/drivers/mindmedia-nexus32b/ovasCDriverMindMediaNeXus32B.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/mindmedia-nexus32b/ovasCDriverMindMediaNeXus32B.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/mindmedia-nexus32b/ovasCDriverMindMediaNeXus32B.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/mindmedia-nexus32b/ovasCDriverMindMediaNeXus32B.cpp diff --git a/applications/platform/acquisition-server/src/drivers/mindmedia-nexus32b/ovasCDriverMindMediaNeXus32B.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/mindmedia-nexus32b/ovasCDriverMindMediaNeXus32B.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/mindmedia-nexus32b/ovasCDriverMindMediaNeXus32B.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/mindmedia-nexus32b/ovasCDriverMindMediaNeXus32B.h diff --git a/applications/platform/acquisition-server/src/drivers/neuroelectrics-enobio3g/ovasCConfigurationEnobio3G.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/neuroelectrics-enobio3g/ovasCConfigurationEnobio3G.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/neuroelectrics-enobio3g/ovasCConfigurationEnobio3G.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/neuroelectrics-enobio3g/ovasCConfigurationEnobio3G.cpp diff --git a/applications/platform/acquisition-server/src/drivers/neuroelectrics-enobio3g/ovasCConfigurationEnobio3G.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/neuroelectrics-enobio3g/ovasCConfigurationEnobio3G.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/neuroelectrics-enobio3g/ovasCConfigurationEnobio3G.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/neuroelectrics-enobio3g/ovasCConfigurationEnobio3G.h diff --git a/applications/platform/acquisition-server/src/drivers/neuroelectrics-enobio3g/ovasCDriverEnobio3G.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/neuroelectrics-enobio3g/ovasCDriverEnobio3G.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/neuroelectrics-enobio3g/ovasCDriverEnobio3G.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/neuroelectrics-enobio3g/ovasCDriverEnobio3G.cpp diff --git a/applications/platform/acquisition-server/src/drivers/neuroelectrics-enobio3g/ovasCDriverEnobio3G.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/neuroelectrics-enobio3g/ovasCDriverEnobio3G.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/neuroelectrics-enobio3g/ovasCDriverEnobio3G.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/neuroelectrics-enobio3g/ovasCDriverEnobio3G.h diff --git a/applications/platform/acquisition-server/src/drivers/neuroservo/HidDeviceApi/HidDevice.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/neuroservo/HidDeviceApi/HidDevice.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/neuroservo/HidDeviceApi/HidDevice.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/neuroservo/HidDeviceApi/HidDevice.cpp diff --git a/applications/platform/acquisition-server/src/drivers/neuroservo/HidDeviceApi/HidDevice.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/neuroservo/HidDeviceApi/HidDevice.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/neuroservo/HidDeviceApi/HidDevice.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/neuroservo/HidDeviceApi/HidDevice.h diff --git a/applications/platform/acquisition-server/src/drivers/neuroservo/HidDeviceApi/HidDeviceNotifier.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/neuroservo/HidDeviceApi/HidDeviceNotifier.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/neuroservo/HidDeviceApi/HidDeviceNotifier.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/neuroservo/HidDeviceApi/HidDeviceNotifier.cpp diff --git a/applications/platform/acquisition-server/src/drivers/neuroservo/HidDeviceApi/HidDeviceNotifier.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/neuroservo/HidDeviceApi/HidDeviceNotifier.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/neuroservo/HidDeviceApi/HidDeviceNotifier.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/neuroservo/HidDeviceApi/HidDeviceNotifier.h diff --git a/applications/platform/acquisition-server/src/drivers/neuroservo/HidDeviceApi/HidDeviceNotifierRef.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/neuroservo/HidDeviceApi/HidDeviceNotifierRef.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/neuroservo/HidDeviceApi/HidDeviceNotifierRef.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/neuroservo/HidDeviceApi/HidDeviceNotifierRef.cpp diff --git a/applications/platform/acquisition-server/src/drivers/neuroservo/HidDeviceApi/HidDeviceNotifierRef.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/neuroservo/HidDeviceApi/HidDeviceNotifierRef.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/neuroservo/HidDeviceApi/HidDeviceNotifierRef.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/neuroservo/HidDeviceApi/HidDeviceNotifierRef.h diff --git a/applications/platform/acquisition-server/src/drivers/neuroservo/doc/NeuroServoDriverClass.png b/applications/platform/acquisition-server-legacy-2023/src/drivers/neuroservo/doc/NeuroServoDriverClass.png similarity index 100% rename from applications/platform/acquisition-server/src/drivers/neuroservo/doc/NeuroServoDriverClass.png rename to applications/platform/acquisition-server-legacy-2023/src/drivers/neuroservo/doc/NeuroServoDriverClass.png diff --git a/applications/platform/acquisition-server/src/drivers/neuroservo/doc/readme.txt b/applications/platform/acquisition-server-legacy-2023/src/drivers/neuroservo/doc/readme.txt similarity index 100% rename from applications/platform/acquisition-server/src/drivers/neuroservo/doc/readme.txt rename to applications/platform/acquisition-server-legacy-2023/src/drivers/neuroservo/doc/readme.txt diff --git a/applications/platform/acquisition-server/src/drivers/neuroservo/ovasCConfigurationNeuroServoHid.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/neuroservo/ovasCConfigurationNeuroServoHid.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/neuroservo/ovasCConfigurationNeuroServoHid.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/neuroservo/ovasCConfigurationNeuroServoHid.cpp diff --git a/applications/platform/acquisition-server/src/drivers/neuroservo/ovasCConfigurationNeuroServoHid.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/neuroservo/ovasCConfigurationNeuroServoHid.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/neuroservo/ovasCConfigurationNeuroServoHid.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/neuroservo/ovasCConfigurationNeuroServoHid.h diff --git a/applications/platform/acquisition-server/src/drivers/neuroservo/ovasCDriverNeuroServoHid.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/neuroservo/ovasCDriverNeuroServoHid.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/neuroservo/ovasCDriverNeuroServoHid.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/neuroservo/ovasCDriverNeuroServoHid.cpp diff --git a/applications/platform/acquisition-server/src/drivers/neuroservo/ovasCDriverNeuroServoHid.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/neuroservo/ovasCDriverNeuroServoHid.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/neuroservo/ovasCDriverNeuroServoHid.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/neuroservo/ovasCDriverNeuroServoHid.h diff --git a/applications/platform/acquisition-server/src/drivers/neurosky-mindset/ovasCConfigurationNeuroskyMindset.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/neurosky-mindset/ovasCConfigurationNeuroskyMindset.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/neurosky-mindset/ovasCConfigurationNeuroskyMindset.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/neurosky-mindset/ovasCConfigurationNeuroskyMindset.cpp diff --git a/applications/platform/acquisition-server/src/drivers/neurosky-mindset/ovasCConfigurationNeuroskyMindset.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/neurosky-mindset/ovasCConfigurationNeuroskyMindset.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/neurosky-mindset/ovasCConfigurationNeuroskyMindset.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/neurosky-mindset/ovasCConfigurationNeuroskyMindset.h diff --git a/applications/platform/acquisition-server/src/drivers/neurosky-mindset/ovasCDriverNeuroskyMindset.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/neurosky-mindset/ovasCDriverNeuroskyMindset.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/neurosky-mindset/ovasCDriverNeuroskyMindset.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/neurosky-mindset/ovasCDriverNeuroskyMindset.cpp diff --git a/applications/platform/acquisition-server/src/drivers/neurosky-mindset/ovasCDriverNeuroskyMindset.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/neurosky-mindset/ovasCDriverNeuroskyMindset.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/neurosky-mindset/ovasCDriverNeuroskyMindset.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/neurosky-mindset/ovasCDriverNeuroskyMindset.h diff --git a/applications/platform/acquisition-server/src/drivers/shimmer-gsr/ovasCConfigurationShimmerGSR.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/shimmer-gsr/ovasCConfigurationShimmerGSR.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/shimmer-gsr/ovasCConfigurationShimmerGSR.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/shimmer-gsr/ovasCConfigurationShimmerGSR.cpp diff --git a/applications/platform/acquisition-server/src/drivers/shimmer-gsr/ovasCConfigurationShimmerGSR.hpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/shimmer-gsr/ovasCConfigurationShimmerGSR.hpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/shimmer-gsr/ovasCConfigurationShimmerGSR.hpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/shimmer-gsr/ovasCConfigurationShimmerGSR.hpp diff --git a/applications/platform/acquisition-server/src/drivers/shimmer-gsr/ovasCDefinesShimmerGSR.hpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/shimmer-gsr/ovasCDefinesShimmerGSR.hpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/shimmer-gsr/ovasCDefinesShimmerGSR.hpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/shimmer-gsr/ovasCDefinesShimmerGSR.hpp diff --git a/applications/platform/acquisition-server/src/drivers/shimmer-gsr/ovasCDriverShimmerGSR.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/shimmer-gsr/ovasCDriverShimmerGSR.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/shimmer-gsr/ovasCDriverShimmerGSR.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/shimmer-gsr/ovasCDriverShimmerGSR.cpp diff --git a/applications/platform/acquisition-server/src/drivers/shimmer-gsr/ovasCDriverShimmerGSR.hpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/shimmer-gsr/ovasCDriverShimmerGSR.hpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/shimmer-gsr/ovasCDriverShimmerGSR.hpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/shimmer-gsr/ovasCDriverShimmerGSR.hpp diff --git a/applications/platform/acquisition-server/src/drivers/simulated-deviator/ovasCConfigurationDriverSimulatedDeviator.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/simulated-deviator/ovasCConfigurationDriverSimulatedDeviator.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/simulated-deviator/ovasCConfigurationDriverSimulatedDeviator.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/simulated-deviator/ovasCConfigurationDriverSimulatedDeviator.cpp diff --git a/applications/platform/acquisition-server/src/drivers/simulated-deviator/ovasCConfigurationDriverSimulatedDeviator.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/simulated-deviator/ovasCConfigurationDriverSimulatedDeviator.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/simulated-deviator/ovasCConfigurationDriverSimulatedDeviator.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/simulated-deviator/ovasCConfigurationDriverSimulatedDeviator.h diff --git a/applications/platform/acquisition-server/src/drivers/simulated-deviator/ovasCDriverSimulatedDeviator.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/simulated-deviator/ovasCDriverSimulatedDeviator.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/simulated-deviator/ovasCDriverSimulatedDeviator.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/simulated-deviator/ovasCDriverSimulatedDeviator.cpp diff --git a/applications/platform/acquisition-server/src/drivers/simulated-deviator/ovasCDriverSimulatedDeviator.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/simulated-deviator/ovasCDriverSimulatedDeviator.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/simulated-deviator/ovasCDriverSimulatedDeviator.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/simulated-deviator/ovasCDriverSimulatedDeviator.h diff --git a/applications/platform/acquisition-server/src/drivers/tmsi-refa32b/ovasCConfigurationTMSIRefa32B.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/tmsi-refa32b/ovasCConfigurationTMSIRefa32B.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/tmsi-refa32b/ovasCConfigurationTMSIRefa32B.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/tmsi-refa32b/ovasCConfigurationTMSIRefa32B.cpp diff --git a/applications/platform/acquisition-server/src/drivers/tmsi-refa32b/ovasCConfigurationTMSIRefa32B.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/tmsi-refa32b/ovasCConfigurationTMSIRefa32B.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/tmsi-refa32b/ovasCConfigurationTMSIRefa32B.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/tmsi-refa32b/ovasCConfigurationTMSIRefa32B.h diff --git a/applications/platform/acquisition-server/src/drivers/tmsi-refa32b/ovasCDriverTMSiRefa32B.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/tmsi-refa32b/ovasCDriverTMSiRefa32B.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/tmsi-refa32b/ovasCDriverTMSiRefa32B.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/tmsi-refa32b/ovasCDriverTMSiRefa32B.cpp diff --git a/applications/platform/acquisition-server/src/drivers/tmsi-refa32b/ovasCDriverTMSiRefa32B.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/tmsi-refa32b/ovasCDriverTMSiRefa32B.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/tmsi-refa32b/ovasCDriverTMSiRefa32B.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/tmsi-refa32b/ovasCDriverTMSiRefa32B.h diff --git a/applications/platform/acquisition-server/src/drivers/tmsi/ovasCConfigurationTMSi.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/tmsi/ovasCConfigurationTMSi.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/tmsi/ovasCConfigurationTMSi.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/tmsi/ovasCConfigurationTMSi.cpp diff --git a/applications/platform/acquisition-server/src/drivers/tmsi/ovasCConfigurationTMSi.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/tmsi/ovasCConfigurationTMSi.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/tmsi/ovasCConfigurationTMSi.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/tmsi/ovasCConfigurationTMSi.h diff --git a/applications/platform/acquisition-server/src/drivers/tmsi/ovasCDriverTMSi.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/tmsi/ovasCDriverTMSi.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/tmsi/ovasCDriverTMSi.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/tmsi/ovasCDriverTMSi.cpp diff --git a/applications/platform/acquisition-server/src/drivers/tmsi/ovasCDriverTMSi.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/tmsi/ovasCDriverTMSi.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/tmsi/ovasCDriverTMSi.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/tmsi/ovasCDriverTMSi.h diff --git a/applications/platform/acquisition-server/src/drivers/tmsi/ovasCTMSiAccess.cpp b/applications/platform/acquisition-server-legacy-2023/src/drivers/tmsi/ovasCTMSiAccess.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/tmsi/ovasCTMSiAccess.cpp rename to applications/platform/acquisition-server-legacy-2023/src/drivers/tmsi/ovasCTMSiAccess.cpp diff --git a/applications/platform/acquisition-server/src/drivers/tmsi/ovasCTMSiAccess.h b/applications/platform/acquisition-server-legacy-2023/src/drivers/tmsi/ovasCTMSiAccess.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/tmsi/ovasCTMSiAccess.h rename to applications/platform/acquisition-server-legacy-2023/src/drivers/tmsi/ovasCTMSiAccess.h diff --git a/applications/platform/acquisition-server-legacy-2023/src/main.cpp b/applications/platform/acquisition-server-legacy-2023/src/main.cpp new file mode 100644 index 0000000000000000000000000000000000000000..fb7dd99b719b25a07b74cf372df351f2650479eb --- /dev/null +++ b/applications/platform/acquisition-server-legacy-2023/src/main.cpp @@ -0,0 +1,257 @@ +#include "ovasCAcquisitionServerGUI.h" + +#include <openvibe/ov_all.h> +#include <toolkit/ovtk_all.h> + +#include <gtk/gtk.h> + +#include <iostream> +#include <clocale> // std::setlocale + +#include <system/ovCTime.h> + +#if defined(TARGET_OS_Windows) +#include <Windows.h> +#include <MMSystem.h> +#endif + +typedef struct SConfiguration +{ + SConfiguration() { } + + // <name, value> + std::map<std::string, std::string> flag; + std::map<std::string, std::string> tokens; +} configuration_t; + +bool parse_arguments(int argc, char** argv, configuration_t& config) +{ + configuration_t configuration; + + std::vector<std::string> argValue; + for (int i = 1; i < argc; ++i) { argValue.push_back(argv[i]); } + argValue.push_back(""); + + for (auto it = argValue.begin(); it != argValue.end(); ++it) { + if (*it == "") {} + else if (*it == "-c" || *it == "--config") { + if (*++it == "") { + std::cout << "Error: Switch --config needs an argument\n"; + return false; + } + configuration.flag["config"] = *it; + } + else if (*it == "-d" || *it == "--define") { + if (*++it == "") { + std::cout << "Error: Need two arguments after -d / --define.\n"; + return false; + } + + // Were not using = as a separator for token/value, as on Windows its a problem passing = to the cmd interpreter + // which is used to launch the actual designer exe. + const std::string& token = *it; + if (*++it == "") { + std::cout << "Error: Need two arguments after -d / --define.\n"; + return false; + } + + const std::string& value = *it; // iterator will increment later + + configuration.tokens[token] = value; + } + else if (*it == "-k" || *it == "--kernel") { + if (*++it == "") { + std::cout << "Error: Switch --kernel needs an argument\n"; + return false; + } + configuration.flag["kernel"] = *it; + } + else if (*it == "-h" || *it == "--help") { return false; } + else if (*it == "-v" || *it == "--version") { +#if defined(TARGET_OS_Windows) + const std::string platform("Windows"); +#elif defined(TARGET_OS_Linux) + const std::string platform("Linux"); +#else + const std::string platform("Other"); +#endif +#if defined(TARGET_ARCHITECTURE_x64) + const std::string arch("64bit"); +#else + const std::string arch("32bit"); +#endif +#if defined(TARGET_BUILDTYPE_Debug) + const std::string buildType("Debug"); +#elif defined(TARGET_BUILDTYPE_Release) + const std::string buildType("Release"); +#else + const std::string buildType("Unknown"); +#endif + std::cout << OV_PROJECT_NAME << " Acquisition Server - Version " << OV_VERSION_MAJOR << "." << OV_VERSION_MINOR << "." << OV_VERSION_PATCH + << " (" << platform << " " << arch << " " << buildType << " build)" << std::endl; + exit(0); + } + else { + // The argument may be relevant to GTK, do not stop here + std::cout << "Note: Unknown argument [" << *it << "], passing it on to gtk...\n"; + } + } + + config = configuration; + + return true; +} + + +int main(int argc, char** argv) +{ + //___________________________________________________________________// + // // + + configuration_t config; + if (!parse_arguments(argc, argv, config)) { + std::cout << "Syntax : " << argv[0] << " [ switches ]\n"; + std::cout << "Possible switches :\n"; + std::cout << " --config filename : path to config file\n"; + std::cout << " --define token value : specify configuration token with a given value\n"; + std::cout << " --help : displays this help message and exits\n"; + std::cout << " --kernel filename : path to openvibe kernel library\n"; + std::cout << " --version : prints version information and exits\n"; + return -1; + } + +#if defined(TARGET_OS_Windows) + HANDLE process = GetCurrentProcess(); + + // Some sources claim this is needed for accurate timing. Microsoft disagrees, so we do not use it. You can try, or try google. + //SetThreadAffinityMask(hProcess, threadMask); + + // Set the clock interval to 1ms (default on Win7: 15ms). This is needed to get under 15ms accurate sleeps, + // and improves the precision of non-QPC clocks. Note that since boost 1.58, the sleeps no longer seem + // to be 1ms accurate on Windows (as they seemed to be on 1.55), and sleep can oversleep even 10ms even with + // timeBeginPeriod(1) called. @todo in the future, make sure nothing relies on sleep accuracy in openvibe + timeBeginPeriod(1); + + // Since AS is just sleeping when its not acquiring, a high priority should not be a problem. + // As a result of these calls, the server should have a 'normal' priority INSIDE the 'realtime' priority class. + // However, unless you run AS with admin priviledges, Windows probably will truncate these priorities lower. + // n.b. For correct timing, it may be preferable to set the priority here globally and not mess with it in the drivers; + // any child threads should inherit this automagically. + SetPriorityClass(process, REALTIME_PRIORITY_CLASS); // The highest priority class + SetThreadPriority(process, THREAD_PRIORITY_NORMAL); // Even higher options: THREAD_PRIORITY_HIGHEST, THREAD_PRIORITY_TIME_CRITICAL + +#else + std::string interface_file = std::string(OpenViBE::Directories::getDataDir()) + "/applications/designer/themes/Adwaita/gtk-2.0/gtkrc"; + gchar * gtk_theme = const_cast<gchar *>(interface_file.c_str()); + gchar *rc_files[] = {gtk_theme, NULL}; + gtk_rc_set_default_files(rc_files); +#endif + + OpenViBE::CKernelLoader kernelLoader; + + std::cout << "[ INF ] Created kernel loader, trying to load kernel module" << std::endl; + OpenViBE::CString error; + + OpenViBE::CString kernelFile = OpenViBE::Directories::getLib("kernel"); + + if (config.flag.count("kernel")) { kernelFile = OpenViBE::CString(config.flag["kernel"].c_str()); } + if (!kernelLoader.load(kernelFile, &error)) { std::cout << "[ FAILED ] Error loading kernel from [" << kernelFile << "]: " << error << "\n"; } + else { + std::cout << "[ INF ] Kernel module loaded, trying to get kernel descriptor" << std::endl; + OpenViBE::Kernel::IKernelDesc* kernelDesc = nullptr; + kernelLoader.initialize(); + kernelLoader.getKernelDesc(kernelDesc); + if (!kernelDesc) { std::cout << "[ FAILED ] No kernel descriptor" << std::endl; } + else { + std::cout << "[ INF ] Got kernel descriptor, trying to create kernel" << std::endl; + + + OpenViBE::CString configFile = OpenViBE::CString(OpenViBE::Directories::getDataDir() + "/kernel/openvibe.conf"); + if (config.flag.count("config")) { configFile = OpenViBE::CString(config.flag["config"].c_str()); } + + OpenViBE::Kernel::IKernelContext* kernelCtx = kernelDesc->createKernel("acquisition-server", configFile); + if (!kernelCtx) { std::cout << "[ FAILED ] No kernel created by kernel descriptor" << std::endl; } + else { + kernelCtx->initialize(); + + OpenViBE::Kernel::IConfigurationManager& configManager = kernelCtx->getConfigurationManager(); + + // @FIXME CERT silent fail if missing file is provided + configManager.addConfigurationFromFile(configManager.expand("${Path_Data}/applications/acquisition-server/acquisition-server-defaults.conf")); + + // User configuration mods + configManager.addConfigurationFromFile(configManager.expand("${Path_UserData}/openvibe-acquisition-server.conf")); + + kernelCtx->getPluginManager().addPluginsFromFiles(configManager.expand("${AcquisitionServer_Plugins}")); + + for (auto itr = config.tokens.begin(); itr != config.tokens.end(); ++itr) { + kernelCtx->getLogManager() << OpenViBE::Kernel::LogLevel_Trace << "Adding command line configuration token [" + << (*itr).first.c_str() << " = " << (*itr).second.c_str() << "]\n"; + configManager.addOrReplaceConfigurationToken((*itr).first.c_str(), (*itr).second.c_str()); + } + + // Check the clock + if (!System::Time::isClockSteady()) { + kernelCtx->getLogManager() << OpenViBE::Kernel::LogLevel_Warning + << "The system does not seem to have a steady clock. This may affect the acquisition time precision.\n"; + } + + if (!gtk_init_check(&argc, &argv)) { + kernelCtx->getLogManager() << OpenViBE::Kernel::LogLevel_Error + << "Unable to initialize GTK. Possibly the display could not be opened. Exiting.\n"; + + OpenViBE::Toolkit::uninitialize(*kernelCtx); + kernelDesc->releaseKernel(kernelCtx); + + kernelLoader.uninitialize(); + kernelLoader.unload(); + +#if defined(TARGET_OS_Windows) + timeEndPeriod(1); +#endif + + return -2; + } + + // We rely on this with 64bit/gtk 2.24, to roll back gtk_init() sometimes switching + // the locale to one where ',' is needed instead of '.' for separators of floats, + // causing issues, for example getConfigurationManager.expandAsFloat("0.05") -> 0; + // due to implementation by std::stod(). + std::setlocale(LC_ALL, "C"); + + // gtk_rc_parse(Directories::getDataDir() + "/applications/designer/interface.gtkrc"); + +#ifdef TARGET_OS_Linux + // Replace the gtk signal handlers with the default ones. As a result, + // the following exits on terminating signals won't be graceful, + // but its better than not exiting at all (gtk default on Linux apparently) + signal(SIGHUP, SIG_DFL); + signal(SIGINT, SIG_DFL); + signal(SIGQUIT, SIG_DFL); +#endif + + { + // If this is encapsulated by gdk_threads_enter() and gdk_threads_exit(), m_thread->join() can hang when gtk_main() returns before destructor of app has been called. + OpenViBE::AcquisitionServer::CAcquisitionServerGUI app(*kernelCtx); + + try { gtk_main(); } + catch (...) { kernelCtx->getLogManager() << OpenViBE::Kernel::LogLevel_Fatal << "Catched top level exception\n"; } + } + + std::cout << "[ INF ] Application terminated, releasing allocated objects" << std::endl; + + OpenViBE::Toolkit::uninitialize(*kernelCtx); + + kernelDesc->releaseKernel(kernelCtx); + } + } + kernelLoader.uninitialize(); + kernelLoader.unload(); + } + +#if defined(TARGET_OS_Windows) + timeEndPeriod(1); +#endif + + return 0; +} diff --git a/applications/platform/acquisition-server/src/ovasCAcquisitionServer.cpp b/applications/platform/acquisition-server-legacy-2023/src/ovasCAcquisitionServer.cpp similarity index 100% rename from applications/platform/acquisition-server/src/ovasCAcquisitionServer.cpp rename to applications/platform/acquisition-server-legacy-2023/src/ovasCAcquisitionServer.cpp diff --git a/applications/platform/acquisition-server/src/ovasCAcquisitionServer.h b/applications/platform/acquisition-server-legacy-2023/src/ovasCAcquisitionServer.h similarity index 100% rename from applications/platform/acquisition-server/src/ovasCAcquisitionServer.h rename to applications/platform/acquisition-server-legacy-2023/src/ovasCAcquisitionServer.h diff --git a/applications/platform/acquisition-server/src/ovasCAcquisitionServerGUI.cpp b/applications/platform/acquisition-server-legacy-2023/src/ovasCAcquisitionServerGUI.cpp similarity index 100% rename from applications/platform/acquisition-server/src/ovasCAcquisitionServerGUI.cpp rename to applications/platform/acquisition-server-legacy-2023/src/ovasCAcquisitionServerGUI.cpp diff --git a/applications/platform/acquisition-server/src/ovasCAcquisitionServerGUI.h b/applications/platform/acquisition-server-legacy-2023/src/ovasCAcquisitionServerGUI.h similarity index 100% rename from applications/platform/acquisition-server/src/ovasCAcquisitionServerGUI.h rename to applications/platform/acquisition-server-legacy-2023/src/ovasCAcquisitionServerGUI.h diff --git a/applications/platform/acquisition-server/src/ovasCAcquisitionServerThread.h b/applications/platform/acquisition-server-legacy-2023/src/ovasCAcquisitionServerThread.h similarity index 100% rename from applications/platform/acquisition-server/src/ovasCAcquisitionServerThread.h rename to applications/platform/acquisition-server-legacy-2023/src/ovasCAcquisitionServerThread.h diff --git a/applications/platform/acquisition-server/src/ovasCConfigurationBuilder.cpp b/applications/platform/acquisition-server-legacy-2023/src/ovasCConfigurationBuilder.cpp similarity index 100% rename from applications/platform/acquisition-server/src/ovasCConfigurationBuilder.cpp rename to applications/platform/acquisition-server-legacy-2023/src/ovasCConfigurationBuilder.cpp diff --git a/applications/platform/acquisition-server/src/ovasCConfigurationBuilder.h b/applications/platform/acquisition-server-legacy-2023/src/ovasCConfigurationBuilder.h similarity index 100% rename from applications/platform/acquisition-server/src/ovasCConfigurationBuilder.h rename to applications/platform/acquisition-server-legacy-2023/src/ovasCConfigurationBuilder.h diff --git a/applications/platform/acquisition-server/src/ovasCConfigurationNetworkBuilder.cpp b/applications/platform/acquisition-server-legacy-2023/src/ovasCConfigurationNetworkBuilder.cpp similarity index 100% rename from applications/platform/acquisition-server/src/ovasCConfigurationNetworkBuilder.cpp rename to applications/platform/acquisition-server-legacy-2023/src/ovasCConfigurationNetworkBuilder.cpp diff --git a/applications/platform/acquisition-server/src/ovasCConfigurationNetworkBuilder.h b/applications/platform/acquisition-server-legacy-2023/src/ovasCConfigurationNetworkBuilder.h similarity index 100% rename from applications/platform/acquisition-server/src/ovasCConfigurationNetworkBuilder.h rename to applications/platform/acquisition-server-legacy-2023/src/ovasCConfigurationNetworkBuilder.h diff --git a/applications/platform/acquisition-server/src/ovasCDriftCorrection.cpp b/applications/platform/acquisition-server-legacy-2023/src/ovasCDriftCorrection.cpp similarity index 100% rename from applications/platform/acquisition-server/src/ovasCDriftCorrection.cpp rename to applications/platform/acquisition-server-legacy-2023/src/ovasCDriftCorrection.cpp diff --git a/applications/platform/acquisition-server/src/ovasCDriftCorrection.h b/applications/platform/acquisition-server-legacy-2023/src/ovasCDriftCorrection.h similarity index 100% rename from applications/platform/acquisition-server/src/ovasCDriftCorrection.h rename to applications/platform/acquisition-server-legacy-2023/src/ovasCDriftCorrection.h diff --git a/applications/platform/acquisition-server/src/ovasCHeader.cpp b/applications/platform/acquisition-server-legacy-2023/src/ovasCHeader.cpp similarity index 100% rename from applications/platform/acquisition-server/src/ovasCHeader.cpp rename to applications/platform/acquisition-server-legacy-2023/src/ovasCHeader.cpp diff --git a/applications/platform/acquisition-server/src/ovasCHeader.h b/applications/platform/acquisition-server-legacy-2023/src/ovasCHeader.h similarity index 100% rename from applications/platform/acquisition-server/src/ovasCHeader.h rename to applications/platform/acquisition-server-legacy-2023/src/ovasCHeader.h diff --git a/applications/platform/acquisition-server/src/ovasCSettingsHelper.cpp b/applications/platform/acquisition-server-legacy-2023/src/ovasCSettingsHelper.cpp similarity index 100% rename from applications/platform/acquisition-server/src/ovasCSettingsHelper.cpp rename to applications/platform/acquisition-server-legacy-2023/src/ovasCSettingsHelper.cpp diff --git a/applications/platform/acquisition-server/src/ovasCSettingsHelper.h b/applications/platform/acquisition-server-legacy-2023/src/ovasCSettingsHelper.h similarity index 100% rename from applications/platform/acquisition-server/src/ovasCSettingsHelper.h rename to applications/platform/acquisition-server-legacy-2023/src/ovasCSettingsHelper.h diff --git a/applications/platform/acquisition-server/src/ovasCSettingsHelperOperators.h b/applications/platform/acquisition-server-legacy-2023/src/ovasCSettingsHelperOperators.h similarity index 100% rename from applications/platform/acquisition-server/src/ovasCSettingsHelperOperators.h rename to applications/platform/acquisition-server-legacy-2023/src/ovasCSettingsHelperOperators.h diff --git a/applications/platform/acquisition-server/CMakeLists.txt b/applications/platform/acquisition-server/CMakeLists.txt index 8fd655e82f106570fc3101a239ed335d67e738bd..f58e7d6b32c3dc9d40945df5d9f814030dd276d4 100644 --- a/applications/platform/acquisition-server/CMakeLists.txt +++ b/applications/platform/acquisition-server/CMakeLists.txt @@ -1,113 +1,8 @@ -if(OV_DISABLE_GTK) - message(STATUS "Skipping Acquisition Server, no GTK") - return() -endif(OV_DISABLE_GTK) - -project(openvibe-acquisition-server VERSION ${OPENVIBE_MAJOR_VERSION}.${OPENVIBE_MINOR_VERSION}.${OPENVIBE_PATCH_VERSION}) - -# We call this first as some dependency getters have been coded to not find the libs on x64 until supported -# --------------------------------- -if(WIN32) - add_definitions(-DWIN32_LEAN_AND_MEAN) -endif(WIN32) - -include("FindOpenViBEContributions") - -file(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.hpp src/*.inl include/*.h include/*.hpp ${CMAKE_SOURCE_DIR}/extras/contrib/common/contribAcquisitionServer.*) - -if(PATH_OPENVIBE_CONTRIBUTIONS) - include("${CMAKE_SOURCE_DIR}/extras/contrib/common/contribAcquisitionServer.cmake") -endif(PATH_OPENVIBE_CONTRIBUTIONS) - -set(ADDITIONAL_PATH "${CMAKE_SOURCE_DIR}/extras/plugins/server-extensions/") -file(GLOB_RECURSE ADDITIONAL_SRC_FILES ${ADDITIONAL_PATH}/*.cpp ${ADDITIONAL_PATH}/*.h ${ADDITIONAL_PATH}/*.hpp) -set(SRC_FILES "${SRC_FILES};${ADDITIONAL_SRC_FILES}") - -add_executable(${PROJECT_NAME} ${SRC_FILES}) - -target_link_libraries(${PROJECT_NAME} - openvibe - openvibe-common - openvibe-toolkit - openvibe-module-socket - openvibe-module-system - openvibe-module-fs - openvibe-module-lsl - Boost::boost - Boost::system - Eigen3::Eigen - # drivers - brainproducts-amplifier-sdk -) - -set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER}) - -add_definitions(-DTARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines) - -include_directories("src/drivers") -include_directories("include") - -# add include paths for non-contrib server plugins -file(GLOB children ${ADDITIONAL_PATH}/*) -foreach(FILENAME ${children}) - # message("Testing ${FILENAME}") - if(IS_DIRECTORY ${FILENAME}) - # message("Adding ${FILENAME}") - include_directories(${FILENAME}) - endif(IS_DIRECTORY ${FILENAME}) -endforeach(FILENAME) - -include("FindThirdPartyGTK") - -if(WIN32) - # @FIXME CERT getting timeBeginPeriod() linker issues without this - target_link_libraries(${PROJECT_NAME} winmm) -endif(WIN32) - -# These scripts will also add directives to copy the necessary bin dlls if any -include("FindThirdPartyBioSemiLabViewAPI") -include("FindThirdPartyEmotivAPI") -include("FindThirdPartyNeXus") -include("FindThirdPartyMCS") -include("FindThirdPartyMensiaAcquisition") -include("FindThirdPartyMicromed") -include("FindThirdPartyNeuroelectricsEnobio3G") -include("FindThirdPartyNeuroServoDeps") -include("FindThirdPartyThinkGearAPI") -include("FindThirdPartyTMSi") -include("FindThirdPartyUSBFirstAmpAPI") - -include("FindThirdPartyOpenAL") -include("FindThirdPartyPThread") # for Windows Fieldtrip -include("FindThirdPartyRT") # external stims shared memory needs this - -include("FindThirdPartyLSL") - -if(PATH_OPENVIBE_CONTRIBUTIONS) - include("${CMAKE_SOURCE_DIR}/extras/contrib/common/contribAcquisitionServerLinkLibs.cmake") -endif(PATH_OPENVIBE_CONTRIBUTIONS) - -if(NOT(DISABLE_MENSIA_ACQUISITION_DRIVER)) - add_definitions(-DTARGET_HasMensiaAcquisitionDriver) -endif() - - - -# ---------------------- -# Generate launch script -# ---------------------- -OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "${PROJECT_NAME}" EXECUTABLE_NAME "${PROJECT_NAME}") - -# ----------------------------- -# Install files -# ----------------------------- -install(TARGETS ${PROJECT_NAME} - RUNTIME DESTINATION ${DIST_BINDIR} - LIBRARY DESTINATION ${DIST_LIBDIR} - ARCHIVE DESTINATION ${DIST_LIBDIR}) - -CONFIGURE_FILE("share/interface.ui-base" "${CMAKE_CURRENT_BINARY_DIR}/interface.ui") - -install(FILES "${CMAKE_CURRENT_BINARY_DIR}/interface.ui" DESTINATION ${DIST_DATADIR}/openvibe/applications/acquisition-server) -install(DIRECTORY share/ DESTINATION ${DIST_DATADIR}/openvibe/applications/acquisition-server PATTERN "*-base" EXCLUDE) - +return() +set(CMAKE_AUTOMOC ON) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin) +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin) + +add_subdirectory(app) +add_subdirectory(src) diff --git a/applications/platform/acquisition-server/app/CMakeLists.txt b/applications/platform/acquisition-server/app/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..1ad38e5b6ed0010ab9dacae18df237f6487ba2ae --- /dev/null +++ b/applications/platform/acquisition-server/app/CMakeLists.txt @@ -0,0 +1,24 @@ +project(openvibe-acquisition-server-qml VERSION ${OPENVIBE_MAJOR_VERSION}.${OPENVIBE_MINOR_VERSION}.${OPENVIBE_PATCH_VERSION}) + +qt_add_executable(${PROJECT_NAME} + main.cpp) + +qt_add_qml_module(${PROJECT_NAME} +URI + ${PROJECT_NAME} +VERSION + ${PROJECT_VERSION} +QML_FILES + main.qml +NO_CACHEGEN) + +target_link_libraries(${PROJECT_NAME} +PRIVATE + Qt6::Quick + Qt6::QuickControls2 + OVASInterface) + + install(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) diff --git a/applications/platform/acquisition-server/app/main.cpp b/applications/platform/acquisition-server/app/main.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b000be83600894c867042af803fe18f1aaefce0e --- /dev/null +++ b/applications/platform/acquisition-server/app/main.cpp @@ -0,0 +1,21 @@ +#include <QGuiApplication> +#include <QStyleHints> +#include <QQmlApplicationEngine> +#include <QtQml/qqmlextensionplugin.h> +#include <QLoggingCategory> + + +int main(int argc, char *argv[]) +{ + QGuiApplication app(argc, argv); + + + QGuiApplication::styleHints()->setUseHoverEffects(true); + QLoggingCategory::setFilterRules(QStringLiteral("qt.qml.binding.removal.info=true")); + + QQmlApplicationEngine engine; + engine.addImportPath("qrc:/qt/qml/"); + engine.load(QUrl("qrc:/qt/qml/openvibe-acquisition-server/main.qml")); + + return app.exec(); +} diff --git a/applications/platform/acquisition-server/app/main.qml b/applications/platform/acquisition-server/app/main.qml new file mode 100644 index 0000000000000000000000000000000000000000..81e684cb3da91f212b907f5a02fdca31ad45f60b --- /dev/null +++ b/applications/platform/acquisition-server/app/main.qml @@ -0,0 +1,188 @@ +import QtQuick +import QtQuick.Layouts +import QtQuick.Controls +import QtQuick.Controls.Material + + +import OVASInterface as OV + +//window containing the application +ApplicationWindow { + id: window + visible: true + + //title of the application + title: qsTr("Openvibe Acquisition Manager") + width: 640 + height: 480 + + OV.OVMaster { + id: master + } + + //menu containing two menu items + menuBar: MenuBar { + Menu { + title: qsTr("File") + MenuItem { + text: qsTr("&Open") + onTriggered: console.log("Open action triggered"); + } + MenuItem { + text: qsTr("Exit") + onTriggered: Qt.quit(); + } + } + } + + //Content Area + ColumnLayout { + id: mainLayout + anchors.fill: parent + + RowLayout { + Layout.alignment: Qt.AlignTop + Layout.preferredWidth: parent.width*0.8 + GridLayout { + columns: 3 + flow: GridLayout.LeftToRight + Layout.fillHeight: true + + Text { + text: "Driver" + } + ComboBox { + id: cb_drivers + model: master.drivers + + onCurrentTextChanged: { + console.log("miaouuuu, ", currentText) + //master.setCurrentDriver(currentText) + } + } + Button { + text: "Driver Properties" + onClicked: { + device_config.open(); + } + } + + Text { + text: "Connection Port" + } + ComboBox { + Layout.columnSpan: 2 + Layout.fillWidth: true + + model: ["1024 ", "Second", "Third"] + } + + Text { + text: "Sample count per sent block" + } + ComboBox { + Layout.columnSpan: 2 + Layout.fillWidth: true + + model: ["32", "Second", "Third"] + } + + } + + ColumnLayout { + Layout.minimumWidth: 80 + Button { + Layout.alignment: Qt.AlignRight + text: qsTr("Preferences") + } + Button { + Layout.alignment: Qt.AlignRight + text: qsTr("Connect") + onClicked: { + if(text === "Connect") { + text= "disconnect"; + button_play.enabled = true; + button_stop.enabled = true; + } else { + text= "Connect"; + button_play.enabled = false; + button_stop.enabled = false; + } + } + } + Button { + id: button_play + Layout.alignment: Qt.AlignRight + text: qsTr("Play") + enabled: false + } + Button { + id: button_stop + Layout.alignment: Qt.AlignRight + text: qsTr("Stop") + enabled: false + } + } + } // RowLayout + + Text { + id: drift_text + Layout.alignment: Qt.AlignHCenter + text: "Device drift: 0.00ms" + } + + RowLayout { + Layout.fillWidth: true + ProgressBar { + width: window.width/2 + value: 0.5 + } + + ProgressBar { + width: window.width/2 + value: 0.2 + } + } + + } + + //Dialog + Dialog { + id: device_config + title: "Device Configuration" + modal: true + standardButtons: Dialog.Ok | Dialog.Cancel + + GridLayout { + columns: 2 + flow: GridLayout.LeftToRight + + + //model: master.driverParameters + + Text { text: "Identifier" } + SpinBox { value: 0 } + Text { text: "Age" } + SpinBox { value: 18 } + Text { text: "Gender" } + ComboBox { model: ["Other", "Male", "Female"] } + Text { text: "Buffer host name" } + TextInput { text: "Localhost" } + Text { text: "Buffer port number" } + TextInput { text: "1979" } + Text { text: "Min nb of samples in buffer" } + SpinBox { value: 1 } + } + + onAccepted: console.log("Ok clicked") + onRejected: console.log("Cancel clicked") + } + + + //a button in the middle of the content area + //Button { + // text: qsTr("Hello World") + // anchors.horizontalCenter: parent.horizontalCenter + // anchors.verticalCenter: parent.verticalCenter + //} +} diff --git a/applications/platform/acquisition-server/src/CMakeLists.txt b/applications/platform/acquisition-server/src/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..4d6ef24f729a5bee7d27fc8e62cc499db518bf62 --- /dev/null +++ b/applications/platform/acquisition-server/src/CMakeLists.txt @@ -0,0 +1,3 @@ +add_subdirectory(OVASCore) +add_subdirectory(OVASDrivers) +add_subdirectory(OVASInterface) diff --git a/applications/platform/acquisition-server/src/OVASCore/CMakeLists.txt b/applications/platform/acquisition-server/src/OVASCore/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..583f9f62c87f79ca4bda9019d6ca02a1f4a143d3 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASCore/CMakeLists.txt @@ -0,0 +1,73 @@ +project(OVASCore VERSION ${OPENVIBE_MAJOR_VERSION}.${OPENVIBE_MINOR_VERSION}.${OPENVIBE_PATCH_VERSION}) + +set(SRC + ovasCAcquisitionServer.h + ovasCAcquisitionServer.cpp + ovasCSettingsHelper.h + ovasCSettingsHelper.cpp + ovasCHeader.h + ovasCHeader.cpp + ovasCDriftCorrection.h + ovasCDriftCorrection.cpp +) + +add_definitions(-DTARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines) + + +add_library(${PROJECT_NAME} SHARED + ${SRC} +) + +target_include_directories(${PROJECT_NAME} + PUBLIC include .) + +target_link_libraries(${PROJECT_NAME} + openvibe + openvibe-common + openvibe-toolkit + openvibe-module-socket + openvibe-module-system + openvibe-module-fs + openvibe-module-lsl + Boost::boost + Boost::system + Eigen3::Eigen + LSL::lsl + # drivers + brainproducts-amplifier-sdk +) + +if(WIN32) + # @FIXME CERT getting timeBeginPeriod() linker issues without this + target_link_libraries(${PROJECT_NAME} winmm) +endif(WIN32) + + +# These scripts will also add directives to copy the necessary bin dlls if any +# include("FindThirdPartyBioSemiLabViewAPI") +# include("FindThirdPartyEmotivAPI") +# include("FindThirdPartyNeXus") +# include("FindThirdPartyMCS") +# include("FindThirdPartyMensiaAcquisition") +# include("FindThirdPartyNeuroelectricsEnobio3G") +# include("FindThirdPartyNeuroServoDeps") +# include("FindThirdPartyThinkGearAPI") +# include("FindThirdPartyUSBFirstAmpAPI") +# +# include("FindThirdPartyPThread") # for Windows Fieldtrip +# include("FindThirdPartyRT") # external stims shared memory needs this +# +# +# if(PATH_OPENVIBE_CONTRIBUTIONS) +# include("${CMAKE_SOURCE_DIR}/extras/contrib/common/contribAcquisitionServerLinkLibs.cmake") +# endif(PATH_OPENVIBE_CONTRIBUTIONS) +# +# if(NOT(DISABLE_MENSIA_ACQUISITION_DRIVER)) +# add_definitions(-DTARGET_HasMensiaAcquisitionDriver) +# endif() + +# Install files +install(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) diff --git a/applications/platform/acquisition-server/src/OVASCore/include/ovasIAcquisitionServerPlugin.h b/applications/platform/acquisition-server/src/OVASCore/include/ovasIAcquisitionServerPlugin.h new file mode 100755 index 0000000000000000000000000000000000000000..a2b9fdbd51ad9869a44327e79d9d149c3abd6c86 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASCore/include/ovasIAcquisitionServerPlugin.h @@ -0,0 +1,66 @@ +#pragma once + +#include "ovas_base.h" + +#include "../ovasCSettingsHelper.h" + +#include "boost/variant.hpp" +#include <deque> + +/** + * \brief Interface for acquisition server plugins + * + * Contains an interface to the acquisition server plugins. Any plugin must inherit from this class in order to be able to register with the acquisition server. + */ + +namespace OpenViBE { +namespace AcquisitionServer { +class CAcquisitionServer; + +class IAcquisitionServerPlugin +{ +public: + // Interface of the plugin. To develop a new plugin override any of the Hook functions in your implementation. + + /// Hook called at the end of the AcquisitionServer constructor + virtual void createHook() {} + + /// Hook called at the end of the start() function of AcquisitionServer. At this point the device has been connected to, + /// and signal properties should already be correct. + /// This function should return false if start failed. + virtual bool startHook(const std::vector<CString>& /*selectedChannelNames*/, const size_t /*sampling*/, const size_t /*nChannel*/, + const size_t /*nSamplePerSentBlock*/) { return true; } + + /// Hook called at the end of the stop() function of AcquisitionServer + virtual void stopHook() {} + + + /** \brief Hook called in the loop() function of AcquisitionServer + * + * This hook is called before sending the stimulations or signal to the connected clients. + * It gets a reference to the current signal buffer and the stimulation set with its start and end dates. + * + * Note that the given input buffer may have more samples than what should be processed + * per iteration. All operations on vPendingBuffer done in the hook should only consider + * the first sampleCountSentPerBlock samples. The later samples should be left as-is + * and will be provided on the next call. + */ + virtual void loopHook(std::deque<std::vector<float>>& /*pendingBuffer*/, CStimulationSet& /*stimulationSet*/, const uint64_t /*start*/, + const uint64_t /*end*/, const uint64_t /*sampleTime*/) {} + + /// Hook called at the end of the acceptNewConnection() function of AcquisitionServer + virtual void acceptNewConnectionHook() {} + + IAcquisitionServerPlugin(const Kernel::IKernelContext& ctx, const CString& name) : m_kernelCtx(ctx), m_settings(name, ctx.getConfigurationManager()) {} + + virtual ~IAcquisitionServerPlugin() {} + + const SettingsHelper& getSettingsHelper() const { return m_settings; } + SettingsHelper& getSettingsHelper() { return m_settings; } + +protected: + const Kernel::IKernelContext& m_kernelCtx; + SettingsHelper m_settings; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASCore/include/ovasIDriver.h b/applications/platform/acquisition-server/src/OVASCore/include/ovasIDriver.h new file mode 100644 index 0000000000000000000000000000000000000000..539fe5fdcef99217825abc1cbae363cf0e5c584b --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASCore/include/ovasIDriver.h @@ -0,0 +1,513 @@ +#pragma once + +#include "ovas_base.h" + +namespace OpenViBE { +namespace AcquisitionServer { +class IHeader; + +enum class EDriverFlag { IsUnstable, IsDeprecated }; + +/** + * \class IDriverContext + * \author Yann Renard (INRIA/IRISA) + * \date 2009-10-12 + * \brief Base class for kernel functioanlities access from the driver classes + * \sa IDriver + */ +class IDriverContext +{ +public: + /** + * \brief Destructor + */ + virtual ~IDriverContext() { } + + /** + * \brief Gets the kernel Log Manager + * \return the kernel Log Manager + * \sa Kernel::ILogManager + */ + virtual Kernel::ILogManager& getLogManager() const = 0; + + /** + * \brief Gets the kernel Configuration Manager + * \return the kernel Configuration Manager + * \sa Kernel::IConfigurationManager + */ + virtual Kernel::IConfigurationManager& getConfigurationManager() const = 0; + + /** + * \brief Gets connection status + * \return \e true if the driver is connected + * \return \e false if the driver is not connected + * \sa isStarted + */ + virtual bool isConnected() const = 0; + + /** + * \brief Gets acquisition status + * \return \e true if acquisition is started + * \return \e false if acquisition is stoped + * \sa isConnected + */ + virtual bool isStarted() const = 0; + + /** + * \brief Checks if impedance check is required (when available) + * \return \e true if impedance check is required + * \return \e false if impedance check is not required + * + * It is up to the driver to check whether impedance check is required by + * the acquisition server or not. If this test is required, then the driver + * should perform impedance measures while initialized but not yet started. + */ + virtual bool isImpedanceCheckRequested() const = 0; + + /** + * \brief Gets drift sample count + * \return \e the drift sample count + * \sa correctDriftSampleCount + * + * This function returns the difference between the theorical + * number of samples this driver should have sent so far and + * the number of samples it actually sent. This drift sample + * count is computed by the acquisition server and can be used + * to correct a drifting device behavior. + * + * \note If this number is less than 0 then samples are missing + * \note If this number if more than 0 then there are too much samples + * \note If this number is exactly 0 then the driver sent the exact + * number of samples it had to send + */ + virtual int64_t getDriftSampleCount() const = 0; + + /** + * \brief Gets the drift sample count tolerance + * \return \e the drift sample count tolerance + * + * Gets the tolerance configured for the acquisition server. This + * tolerance is present to avoid numerous corrections on a drift + * value that would oscillate in a small range around 0. In such case, + * a correction in a way would probably turn in a correction in the + * opposite way a few seconds later, resulting in crap measurements + * because of irregular but valid source. + * + * If the actual drift is in the [-tolerance +tolerance] range, + * better don't correct it. + */ + virtual int64_t getDriftToleranceSampleCount() const = 0; + + /** + * \brief Gets the suggested drift correction sample count + * \return \e the suggested drift correction sample count + * + * In case you don't want to manage how much samples should + * be used to correct the drift, you could simply use this function. The + * algorithm used to compute the returned value should be considered + * as undefined. This computation could change over time and versions + * of OpenViBE. That means the driver should not make any assumption + * on the way of computing the actual value returned by this function. + */ + virtual int64_t getSuggestedDriftCorrectionSampleCount() const = 0; + + /** + * \brief Corrects a drifting device + * \return \e true in case of success + * \return \e false in case of error + * \sa getDriftSampleCount + * \sa setInnerLatencySampleCount + * + * Some devices don't sent the number of samples they promised to + * while requesting sampling rate. This can be for multiple reasons + * but the most probable one is that the device does not have its + * internal clock synchronized with the internal computer clock. + * OpenViBE data being dated with a start / end time, it is important + * for synchronisation purpose that all the theorical number of + * samples per second is preserved. + * + * In case the difference between the theorical number of samples + * this driver should have sent so far and the number of samples + * it actually sent becomes too big, this function helps to + * correct the drifting, removing or adding dummy samples. + * In a strict signal processing point of view those samples + * can't be considered as valid. However, this is the only way + * to guarantee that the timings are preserved. + * + * \note Passing a negative value removes samples + * \note Passing a positive value adds samples + * \note Passing 0 does nothing + * \note This function can be called several times if needed + * but does not change what \ref getDriftSampleCount + * returns until the next \ref IDriver::loop execution + * \warning Please be careful when calling this function. + * Consider the fact that there could be some drifting + * in the device and ths OS-level driver itself, or even + * in the communication pipeline to the prorprietary + * acquisition software. As an OpenViBE driver developer, + * you should allow an arbitrary small drifting (which + * range depends of the actual driver you are creating). + */ + virtual bool correctDriftSampleCount(const int64_t nSample) = 0; + + /** + * \brief Sets a fixed latency due to the driver implementation and / or hardware + * \param[in] nSample : the number of samples for the inner latency + * + * Some drivers / hardware devices implement processes that delay the + * overall acquisition stream. Such processes include for instance + * sample buffering or temporal filtering. The delay induced by these + * processes can not be known by the acquisition server in a generic way + * and are usually not provided by the device manufacturer. An intelligent + * setup based on hardware tagging could however induce a fair estimate of this + * latency so that it can be injected in the drift correction process. + * Driver developers will generally not have to care about this feature. + * However, if it is important to have neurophysiologically relevant measures + * (more particularly on ERPs) and it is know that the driver and / or hardware + * has a latency, this latency compensation can be injected in the drift correction + * process using the aforementionned function. + * + * \note Passing a positive value supposes the driver / hardware induce a delay which shall be corrected + * \note Passing a negative value supposes the driver / hardware is able to predict and send future measures before they actually get measured (probably not recommended) + * \note Passing 0 supposes both the driver and hardware are ideals and send samples immediately to the acquisition server as they happen on the scalp + * \note Default configuration supposes both the driver and hardware are ideal, thus sets the inner latency to 0 + * + * \sa getInnerLatencySampleCount + */ + virtual void setInnerLatencySampleCount(const int64_t nSample) = 0; + + /** + * \brief Gets the fixed latency due to the driver implementation and / or hardware + * \return \e The inner latency of the driver in sample count + * \sa setInnerLatencySampleCount + */ + virtual int64_t getInnerLatencySampleCount() const = 0; + + /** + * \brief Updates impedance for a specific channel + * \param index [in] : the index of the channel should be updated + * \param impedance [in] : the impedance of the specified channel (in ohm) + * \return \e true in case of success. + * \return \e false in case of error. + * + * This can be used during initialization phase to check + * if impedances are correct. This function should be connected + * while the driver is initialized and not started. + * + * If \c impedance is -1, then the impedance is considered as "unknown / measuring" + * If \c impedance is -2, then the impedance is considered as "unknown / not available" + * If \c impedance is any other negative value, then the impedance is considered as "unknown" + */ + virtual bool updateImpedance(const size_t index, const double impedance) = 0; +}; + +/** + * \class IDriverCallback + * \author Yann Renard (INRIA/IRISA) + * \date 2007-04-01 + * \brief Base class for all the OpenViBE acquisition server driver callbacks + * + * Objects derived from this class are called by any driver to provide + * built sample buffers. + * + * \sa IDriver + * \sa IDriver::loop + */ +class IDriverCallback +{ +public: + /** + * \brief Gives new sample buffer + * \param samples [in] : a buffer containing all the samples + * + * This is used by the acquisition server to be notified when the + * driver has finished to build the whole buffer of data to send. + * This function is called by the driver during the \e IDriver::loop + * and should give an array of \c nSamplesPerChannel x \c nChannel + * organised by channel first. + * + * The caller retains the ownership of the samples pointer. + * + * \code + * samples[0] is channel 0 sample 0 + * samples[1] is channel 0 sample 1 + * ... + * samples[nSamplesPerChannel-1] is channel 0 sample nSamplesPerChannel-1 + * samples[nSamplesPerChannel ] is channel 1 sample 0 + * samples[nSamplesPerChannel+1] is channel 1 sample 1 + * ... + * samples[i*nSamplesPerChannel+j] is channel i sample j + * \endcode + * + * \sa IDriver::loop + */ + virtual void setSamples(const float* samples) = 0; + + /** + * \brief Gives new sample buffer + * \param samples [in] : a buffer containing all the samples + * \param size : size of buffer + * + * This is used by the acquisition server to be notified when the + * driver has finished to build the whole buffer of data to send. + * This function is called by the driver during the \e IDriver::loop + * and should give an array of \c nSamplesPerChannel x \c nChannel + * organised by channel first. + * + * The caller retains the ownership of the samples pointer. + * + * \code + * samples[0] is channel 0 sample 0 + * samples[1] is channel 0 sample 1 + * ... + * samples[nSamplesPerChannel-1] is channel 0 sample nSamplesPerChannel-1 + * samples[nSamplesPerChannel ] is channel 1 sample 0 + * samples[nSamplesPerChannel+1] is channel 1 sample 1 + * ... + * samples[i*nSamplesPerChannel+j] is channel i sample j + * \endcode + * + * \sa IDriver::loop + */ + virtual void setSamples(const float* samples, const size_t size) = 0; + + /** + * \brief Gives a new stimulation set corresponding to the last sample buffer + * \param stimSet [in] : the stimulation set associated with the last sample buffer + * + * This is used by the acquisition server to be notified when the + * driver has finished to build the whole buffer of data to send. + * This function is called by the driver during the \e IDriver::loop + * and immediatly after the IDriverCallback::setSamples function, even + * if the stimulation set is empty. + * + * \warning The stimulation dates are relative to the + * last buffer start time. + * + * \sa IDriver::loop + */ + virtual void setStimulationSet(const CStimulationSet& stimSet) = 0; + + /** + * \brief Destructor + */ + virtual ~IDriverCallback() { } +}; + +/** + * \class IDriver + * \author Yann Renard (INRIA/IRISA) + * \date 2007-04-01 + * \brief Base class for all the OpenViBE acquisition server drivers + * + * This class should be used by hardware driver developers in order + * to add new peripherals to the OpenViBE acquisition server. This driver + * is then used by the server to get cerebral activity measurments and to + * send this measured activity to the platform so it can be processed. + * + * The behavior of the driver is splitted into 3 phases : + * - configuration + * - initialization / uninitialization + * - acquisition start / stop + * + * The implemented driver could either have direct access to the hardware + * or read the measurements from a proprietarry server, depending on the + * hardware manufacturer choice. Thus, the configuration phase of this driver + * should be able to provide the information OpenViBE needs that are + * not present from the hardware manufacturer'. + * + * Important job for the driver is to give the acquisition server fixed + * size measured buffers... This implies that if the hardware sends random + * size buffers, sample per sample buffers, fixed length buffer but not the + * size the acquisition server requested, it would be the driver's job to + * rebuild correct buffers. + * + * \sa CAcquisitionServer + */ +class IDriver +{ +public: + /** + * \brief Constructor + * \param ctx [in] : the driver context + */ + explicit IDriver(IDriverContext& ctx) : m_driverCtx(ctx) { } + + /** + * \brief Destructor + */ + virtual ~IDriver() { } + + /** \name General purpose functions */ + //@{ + + /** + * \brief Gets the driver name (usually the hardware name) + * \return the driver name. + */ + virtual const char* getName() = 0; + /** + * \brief Tests if a flag is set for this driver + * \param flag [in] : the flag to test + * \return \e true if the tested flag is set + * \return \e false if the tested flag is not set + * \note Default implementation always returns false, meaning that no flag is set + */ + virtual bool isFlagSet(const EDriverFlag flag) const { return false; } + + //@} + /** \name Driver configuration */ + //@{ + + /** + * \brief This function should tell whether the dirver is configurable or not + * \return \e true if this driver is configurable. + * \return \e false if this driver is not configurable. + * \sa configure + */ + virtual bool isConfigurable() = 0; + /** + * \brief Requests the driver to configure itself + * \return \e true if the configuration ended successfully + * \return \e false if the configuration ended with an error + * + * This function requests the driver to configure itself. The acquisition + * server never calls this function if \c isConfigurable returned \e false. + * However, calling this reflects a lack of information from the + * hardware itself or from the server that is provided by the hardware + * manufacturer. The configure function should then ask the user + * for missing information to be filled. + * + * Filling these information can be done any way you want... But + * if the driver developer wants to use a GUI for this, it is + * recommended to use Glade/GTK since the acquisition server + * already uses this API. If you use Glade/GTK, you won't have to + * perform API initialization ; this is done by the acquisition server + * already. It is the responsability of the driver developer to + * release any allocated GUI object after the configuration is done. + * + * \sa isConfigurable + */ + virtual bool configure() = 0; + + //@} + /** \name Initialization / uninitialization */ + //@{ + + /** + * \brief Initializes the driver + * \param nSamplePerSentBlock [in] : the number of samples to + * send per channel per driver send operation. + * \param callback [in] : the callback object to call when the buffer + * are filled correctly. + * \return \e true in case of success. + * \return \e false in case of error. + * + * When called, this function should prepare the driver to receive + * data from the hardware. This means doing everything from checking + * the hardware is present, checking its configuration, getting header + * information from it and so on. This function should return only when + * it has a valid header to return to the acquisition server... For + * some hardware, this could nead data sending request (so it gets basic + * information), and then request data sending to stop... + * + * \sa uninitialize + * \sa getHeader + * \sa IHeader + */ + virtual bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) = 0; + /** + * \brief Uninitializes the driver + * \return \e true in case of success. + * \return \e false in case of error. + * + * This function disconnects any link to the hardware and frees any + * allocated structures/objects related to the hardware. When this + * is called, the driver may be re-configured and re-initialized + * to start a new acquisition session. + */ + virtual bool uninitialize() = 0; + /** + * \brief Gets the header information for the session + * \return the header information for the session + * + * The returned header is used by the acquisition server to send + * encapsulated data to the platform at the beginning of the sending + * process. This header should be filled by the information collected + * from the hardware or the driver itself when configure is called. + * + * \sa IHeader + */ + virtual const IHeader* getHeader() = 0; + + //@} + /** \name Starting / Stopping acquisition */ + //@{ + + /** + * \brief Starts acquisition for this driver + * \return \e true in case of success. + * \return \e false in case of error. + * + * This function is called by the acquistion server to notify the driver + * that signal acquisiton should start... The driver should forward this + * instruction to the hardware... The loop function is then called + * repeatedly to receive data from the hardware and send it back to the + * server. + * + * \sa loop + * \sa stop + */ + virtual bool start() = 0; + /** + * \brief Stops acquisition for this driver + * \return \e true in case of success. + * \return \e false in case of error. + * + * This function is called by the acquistion server to notify the driver + * that signal acquisiton should stop... The driver should forward this + * instruction to the hardware... The loop function is then no more called + * and the driver may be uninitialized to be re-configured. + * + * \sa start + * \sa loop + */ + virtual bool stop() = 0; + /** + * \brief Requests data acquisition to be done + * \return \e true in case of success. + * \return \e false in case of error. + * + * This function is called repeatedly by the acquisition server when + * the driver is correctly initialized and started. The driver's job + * here is to receive measures from the hardware, build the buffers + * according to the requested sampling count per channel (see \c initialize) + * and send this built buffer to the provided callback object. The + * server will then send these informations to the platform. + * + * During this loop function, the object passed as IDriverCallback at + * the initialize phase should be ready to be notified of samples or + * stimulations. + * + * \warning When implementing the driver, one should take care + * of configuring stimulation dates so that they are relative + * to the last buffer start time. + * + * \sa IDriverCallback::setSamples + * \sa IDriverCallback::setStimulationSet + */ + virtual bool loop() = 0; + + //@} + +protected: + IDriverContext& m_driverCtx; ///< The driver context + +private: + /** + * \brief Default constructor can not be used because a context is needed + */ + IDriver(); +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASCore/include/ovasIHeader.h b/applications/platform/acquisition-server/src/OVASCore/include/ovasIHeader.h new file mode 100644 index 0000000000000000000000000000000000000000..ac70a271e678ea7ed160c40684283bb6f9a6844c --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASCore/include/ovasIHeader.h @@ -0,0 +1,321 @@ +#pragma once + +#include "ovas_base.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class IHeader + * \author Yann Renard (INRIA/IRISA) + * \date 2007-04-01 + * \brief Base class for an OpenViBE header container + * + * IHeader objects are used by IDriver objects to give all the header + * information to the acquisition server. The IDriver developer may + * implement his own IHeader derived class or use the one provided + * with the acquisition server. To get a standard header, refer to + * the \c CHeader class. + * + * The IHeader objects mainly consist in get/set/isSet functions + * that allow user code to modify, read back and check state of some + * single header information. + * + * \sa IDriver + * \sa IDriver::getHeader + * \sa CHeader + */ +class IHeader +{ +public: + /** \name General purpose functions */ + //@{ + + /** + * \brief Resets this header + * + * When called, this function resets all the header content to its + * default values. Most of the is*Set will return \e false after + * this call. + */ + virtual void reset() = 0; + + //@} + /** \name Experiment information */ + //@{ + + /** + * \brief Sets the experiment identifier + * \param experimentID [in] : the experiment identifier to send to + * the OpenViBE platform. + * \return \e true in case of success. + * \return \e false in case of error. + * + * The experiment identifier may be used by the platform + * to get details from a database, for example a description + * of the experiment, what is done, where etc... + */ + virtual bool setExperimentID(const size_t experimentID) = 0; + /** + * \brief Sets the subject age + * \param subjectAge [in] : the subject age in years + * \return \e true in case of success. + * \return \e false in case of error. + */ + virtual bool setSubjectAge(const size_t subjectAge) = 0; + /** + * \brief Sets the subject gender + * \param subjectGender [in] : the subject gender + * \return \e true in case of success. + * \return \e false in case of error. + * + * The subject gender is given as an integer and should + * be ISO 5218 conformant... Allowed values are : + * - 0 : unknown + * - 1 : male + * - 2 : female + * - 3 : not specified + * + * \note This values are defined in the OpenViBE toolkit. + */ + virtual bool setSubjectGender(const size_t subjectGender) = 0; + /** + * \brief Gets the experiment identifier + * \return the experiement identifier. + * \sa setExperimentID + */ + virtual size_t getExperimentID() const = 0; + /** + * \brief Gets the subject age + * \return the subject age. + * \sa setSubjectAge + */ + virtual size_t getSubjectAge() const = 0; + /** + * \brief Gets the subject gender + * \return the subject gender. + * \sa setSubjectGender + */ + virtual size_t getSubjectGender() const = 0; + /** + * \brief Tests if experiment identifier has been set + * \return \e true if experiment identifier has been set since last \c reset. + * \return \e false if experiment identifier has not been set. + * \sa setExperimentID + */ + virtual bool isExperimentIDSet() const = 0; + /** + * \brief Tests if subject age has been set + * \return \e true if the subject age has been set since last \c reset. + * \return \e false if the subject age has not been set. + * \sa setSubjectAge + */ + virtual bool isSubjectAgeSet() const = 0; + /** + * \brief Tests if subject gender has been set + * \return \e true if the subject gender has been set since last \c reset. + * \return \e false if the subject gender has not been set. + * \sa setSubjectGender + */ + virtual bool isSubjectGenderSet() const = 0; + + virtual void setImpedanceCheckRequested(const bool active) = 0; + + virtual bool isImpedanceCheckRequested() const = 0; + + /** + * \brief Get impedance limit + * \return \e the chosen impedance limit (ohms) + */ + virtual size_t getImpedanceLimit() const = 0; + /** + * \brief Set impedance limit + * \param limit [in] : the new value for impedance limit (ohms) + */ + virtual void setImpedanceLimit(const size_t limit) = 0; + + //@} + /** \name Chanel information */ + //@{ + + /** + * \brief Sets channel count for the recorded signal + * \param nChannel [in] : the number of the channel for the recorder signal + * \return \e true in case of success. + * \return \e false in case of error. + * + * The number of channels will be used by the IDriver and the acquisition server + * to calculate the sample buffer size (that is \c nSamplesPerChannel x \c nChannel). + */ + virtual bool setChannelCount(const size_t nChannel) = 0; + /** + * \brief Sets a channel' name + * \param index [in] : the index of the channel which name should be set + * \param name [in] : the new name for this channel + * \return \e true in case of success. + * \return \e false in case of error. + * \note As soon as a channel name is set, all the yet-unset channel names are + * considered to be set to empty string. + */ + virtual bool setChannelName(const size_t index, const char* name) = 0; + /** + * \brief Sets a channel' gain + * \param index [in] : the index of the channel which gain should be set + * \param gain [in] : the gain value for this channel + * \return \e true in case of success. + * \return \e false in case of error. + * \note As soon as a channel gain is set, all the yet-unset channel gains are + * considered to be set to 1. + * + * Gains are multiplicator coefficients that are used by the OpenViBE platform to + * to transform measured values into physical dimension. + */ + virtual bool setChannelGain(const size_t index, const float gain) = 0; + /** + * \brief Sets a channel' measurement unit and its scaling factor + * \param index [in] : the index of the channel which gain should be set + * \param unit [in] : the unit + * \param factor [in] : the scaling factor + * \return \e true in case of success. + * \return \e false in case of error. + * + * Measurement units (e.g. Volts, Litres, ...) are specified by size_t enums defined in the openvibe toolkit. + * Scaling factors (megas, millis, ...) are specified similarly. To specify that the channel is in millivolts, + * you set unit to volts and factor to millis. You get the list of supported enums from toolkit/ovtk_defines.h. + * + * Default unit is 'Unspecified' and default factor is code translating 1e00. + */ + virtual bool setChannelUnits(const size_t index, const size_t unit, const size_t factor) = 0; + + /// \todo setChannelLocation + // virtual bool setChannelLocation(const size_t index, const float channelLocationX, const float channelLocationY, const float channelLocationZ)=0; + + /** + * \brief Gets the number of channels for this header + * \return the number of channels. + * \sa setChannelCount + */ + virtual size_t getChannelCount() const = 0; + /** + * \brief Gets the name of a channel + * \param index [in] : the index of the channel which name is wanted + * \return the name of the \c index th channel if in the correct range + * and name has been specified. + * \return an empty string if in the correct range but name has not been specified. + * \return an empty string when \c index is out of range. + * \sa setChannelName + */ + virtual const char* getChannelName(const size_t index) const = 0; + /** + * \brief Gets the gain of a channel + * \param index [in] : the index of the channel which gain is wanted + * \return the gain of the \c index th channel if in the correct range + * and gain has been specified. + * \return 1 if in the correct range but gain has not been specified. + * \return 0 when \c index is out of range. + * \sa setChannelGain + */ + virtual float getChannelGain(const size_t index) const = 0; + /** + * \brief Gets a channel' measurement unit and its scaling factor + * \param index [in] : the index of the channel which gain should be set + * \param channelUnit [in] : the unit + * \param channelFactor [in] : the scaling factor + * \return \e true in case of success. + * \return \e false in case of error. On false, the outputs will be set to default values. + * + * See setChannelUnits(). + */ + virtual bool getChannelUnits(const size_t index, size_t& channelUnit, size_t& channelFactor) const = 0; + /// \todo getChannelLocation + // virtual getChannelLocation(const size_t index) const=0; + /** + * \brief Tests if channel count has been set + * \return \e true if channel count has been set since last \c reset. + * \return \e false if channel count has not been set. + * \sa setChannelCount + */ + virtual bool isChannelCountSet() const = 0; + /** + * \brief Tests if channel name has been set at least once + * \return \e true if channel name has been set at least once since last \c reset. + * \return \e false if channel name has not been set. + * \sa setChannelName + */ + virtual bool isChannelNameSet() const = 0; + /** + * \brief Tests if channel gain has been set at least once + * \return \e true if channel gain has been set at least once since last \c reset. + * \return \e false if channel gain has not been set. + * \sa setChannelGain + */ + virtual bool isChannelGainSet() const = 0; + /// \todo isChannelLocationSet + // virtual bool isChannelLocationSet() const=0; + /** + * \brief Tests if channel unit has been set at least once + * \return \e true if channel unit has been set at least once since last \c reset. + * \return \e false if channel unit has not been set. + * \sa setChannelGain + */ + virtual bool isChannelUnitSet() const = 0; + + //@} + /** \name Samples information */ + //@{ + + /** + * \brief Sets measured signal sampling rate + * \param sampling [in] : the sampling rate for the measured signal + * \return \e true in case of success. + * \return \e false in case of error. + * \note the sampling rate is a global value. It can not be specified per channel. + */ + virtual bool setSamplingFrequency(const size_t sampling) = 0; + /** + * \brief Gets the sampling rate of the measured signal + * \return the sampling rate of the measured signal + * \sa setSamplingFrequency + */ + virtual size_t getSamplingFrequency() const = 0; + /** + * \brief Tests if sampling frequency has been set + * \return \e true if sampling frequency has been set since last \c reset. + * \return \e false if sampling frequency has not been set. + * \sa setSamplingFrequency + */ + virtual bool isSamplingFrequencySet() const = 0; + + //@} + + /** + * \brief Destructor + */ + virtual ~IHeader() { } + + static void copy(IHeader& dst, const IHeader& src) + { + // Make sure that nothing lingers, this is mainly for channel units: we have no way to restore dst to an 'unset' state unless we reset + dst.reset(); + + const size_t nChannel = src.getChannelCount(); + dst.setExperimentID(src.getExperimentID()); + dst.setSubjectAge(src.getSubjectAge()); + dst.setSubjectGender(src.getSubjectGender()); + dst.setChannelCount(src.getChannelCount()); + dst.setSamplingFrequency(src.getSamplingFrequency()); + dst.setChannelCount(src.getChannelCount()); + for (size_t i = 0; i < nChannel; ++i) { + dst.setChannelName(i, src.getChannelName(i)); + dst.setChannelGain(i, src.getChannelGain(i)); + } + if (src.isChannelUnitSet()) { + for (size_t i = 0; i < nChannel; ++i) { + size_t unit = 0, factor = 0; + src.getChannelUnits(i, unit, factor); // No need to test for error, will set defaults on fail + dst.setChannelUnits(i, unit, factor); + } + } + } +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASCore/include/ovas_base.h b/applications/platform/acquisition-server/src/OVASCore/include/ovas_base.h new file mode 100644 index 0000000000000000000000000000000000000000..8982162f827b9a9c46ac8e5726e81d5bf0ee0195 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASCore/include/ovas_base.h @@ -0,0 +1,6 @@ +#pragma once + +#include "ovas_defines.h" + +#include <openvibe/ov_all.h> +#include <toolkit/ovtk_all.h> diff --git a/applications/platform/acquisition-server/src/OVASCore/include/ovas_defines.h b/applications/platform/acquisition-server/src/OVASCore/include/ovas_defines.h new file mode 100644 index 0000000000000000000000000000000000000000..29b98c93c716c699b78744fa5e5b2c27f0934359 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASCore/include/ovas_defines.h @@ -0,0 +1,16 @@ +#pragma once + + +#define OVAS_Impedance_NotAvailable -2 +#define OVAS_Impedance_Unknown -1 +#define OVAS_Impedance_Zero 0 + +//___________________________________________________________________// +// // +// Global defines // +//___________________________________________________________________// +// // + +#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines +#include "ovp_global_defines.h" +#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines diff --git a/applications/platform/acquisition-server/src/main.cpp b/applications/platform/acquisition-server/src/OVASCore/main.cpp similarity index 100% rename from applications/platform/acquisition-server/src/main.cpp rename to applications/platform/acquisition-server/src/OVASCore/main.cpp diff --git a/applications/platform/acquisition-server/src/OVASCore/ovasCAcquisitionServer.cpp b/applications/platform/acquisition-server/src/OVASCore/ovasCAcquisitionServer.cpp new file mode 100755 index 0000000000000000000000000000000000000000..f9a32f3ea950a575bd02f530e6a4937169b0aeac --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASCore/ovasCAcquisitionServer.cpp @@ -0,0 +1,936 @@ +#include "ovasCAcquisitionServer.h" +#include "ovasIAcquisitionServerPlugin.h" + +#include <toolkit/ovtk_all.h> + +#include <ovp_global_defines.h> + +#include <system/ovCTime.h> + +#include <fstream> +#include <sstream> + +#include <string> +#include <functional> +#include <cctype> +#include <cmath> // std::isnan, std::isfinite +#include <condition_variable> + +#include <mutex> + +#include <socket/IConnectionClient.h> + +// #include <iomanip> + +namespace OpenViBE { +namespace AcquisitionServer { + +// because std::tolower has multiple signatures, +// it can not be easily used in std::transform +// this workaround is taken from http://www.gcek.net/ref/books/sw/cpp/ticppv2/ +template <class T> +static T to_lower(T c) { return std::tolower(c); } + +class CDriverContext final : public IDriverContext +{ +public: + CDriverContext(const Kernel::IKernelContext& ctx, CAcquisitionServer& acquisitionServer) : m_kernelCtx(ctx), m_acquisitionServer(acquisitionServer) { } + + Kernel::ILogManager& getLogManager() const override { return m_kernelCtx.getLogManager(); } + Kernel::IConfigurationManager& getConfigurationManager() const override { return m_kernelCtx.getConfigurationManager(); } + + bool isConnected() const override { return m_acquisitionServer.isConnected(); } + bool isStarted() const override { return m_acquisitionServer.isStarted(); } + bool isImpedanceCheckRequested() const override { return m_acquisitionServer.isImpedanceCheckRequested(); } + bool isChannelSelectionRequested() const { return m_acquisitionServer.isChannelSelectionRequested(); } + int64_t getDriftSampleCount() const override { return m_acquisitionServer.m_DriftCorrection.getDriftSampleCount(); } + + bool correctDriftSampleCount(const int64_t count) override + { + return m_acquisitionServer.m_DriftCorrection.correctDrift(count, m_acquisitionServer.m_nSample, m_acquisitionServer.m_PendingBuffers, + m_acquisitionServer.m_PendingStimSet, m_acquisitionServer.m_SwapBuffers); + } + + int64_t getDriftToleranceSampleCount() const override { return m_acquisitionServer.m_DriftCorrection.getDriftToleranceSampleCount(); } + + int64_t getSuggestedDriftCorrectionSampleCount() const override { return m_acquisitionServer.m_DriftCorrection.getSuggestedDriftCorrectionSampleCount(); } + + void setInnerLatencySampleCount(const int64_t count) override { m_acquisitionServer.m_DriftCorrection.setInnerLatencySampleCount(count); } + int64_t getInnerLatencySampleCount() const override { return m_acquisitionServer.m_DriftCorrection.getInnerLatencySampleCount(); } + + bool updateImpedance(const size_t index, const double impedance) override { return m_acquisitionServer.updateImpedance(index, impedance); } + + uint64_t getStartTime() const { return m_acquisitionServer.m_startTime; } + +protected: + const Kernel::IKernelContext& m_kernelCtx; + CAcquisitionServer& m_acquisitionServer; +}; + +class CConnectionServerHandlerThread +{ +public: + CConnectionServerHandlerThread(CAcquisitionServer& acquisitionServer, Socket::IConnectionServer& connectionServer) + : m_AcquisitionServer(acquisitionServer), m_ConnectionServer(connectionServer) { } + + void operator()() + { + Socket::IConnection* connection; + do { + connection = m_ConnectionServer.accept(); + m_AcquisitionServer.acceptNewConnection(connection); + } while (connection && m_AcquisitionServer.isConnected()); + } + + CAcquisitionServer& m_AcquisitionServer; + Socket::IConnectionServer& m_ConnectionServer; +}; + +class CConnectionClientHandlerThread +{ +public: + CConnectionClientHandlerThread(CAcquisitionServer& acquisitionServer, Socket::IConnection& connection) + : m_AcquisitionServer(acquisitionServer), m_Connection(connection) { } + + void operator()() + { + std::unique_lock<std::mutex> oLock(m_ClientThreadMutex, std::defer_lock); + + while (true) { + oLock.lock(); + + // Wait until something interesting happens... + m_PendingBufferCondition.wait(oLock, [this]() { return (m_PleaseQuit || !m_Connection.isConnected() || !m_ClientPendingBuffer.empty()); }); + + // Exit the loop if we're told to quit or if we've lost the connection + if (m_PleaseQuit || !m_Connection.isConnected()) { + oLock.unlock(); + break; + } + + // At this point, we should have a buffer + if (m_ClientPendingBuffer.empty()) { + // n.b. Shouldn't happen, but we don't have an error reporting mechanism in the thread... + oLock.unlock(); + continue; + } + + CMemoryBuffer* buffer = m_ClientPendingBuffer.front(); + m_ClientPendingBuffer.pop_front(); + + // Don't go into blocking send while holding the lock; ok to unlock as buffer ptr+mem is now owned by this thread + oLock.unlock(); + + const uint64_t size = buffer->getSize(); + m_Connection.sendBufferBlocking(&size, sizeof(size)); + m_Connection.sendBufferBlocking(buffer->getDirectPointer(), buffer->getSize()); + delete buffer; + } + + oLock.lock(); + + // We're done, clean any possible pending buffers + for (auto it = m_ClientPendingBuffer.begin(); it != m_ClientPendingBuffer.end(); ++it) { delete *it; } + m_ClientPendingBuffer.clear(); + + oLock.unlock(); + + // The thread will exit here and can be joined + } + + void scheduleBuffer(const CMemoryBuffer& buffer) + { + { + std::lock_guard<std::mutex> oLock(m_ClientThreadMutex); + if (!m_PleaseQuit) { + CMemoryBuffer* tmp = new CMemoryBuffer(buffer); + m_ClientPendingBuffer.push_back(tmp); + } + } + + // No big harm notifying in any case, though if in 'quit' state, the quit request has already notified + m_PendingBufferCondition.notify_one(); + } + + CAcquisitionServer& m_AcquisitionServer; + Socket::IConnection& m_Connection; + + std::deque<CMemoryBuffer*> m_ClientPendingBuffer; + + // Here we use a condition variable to avoid sleeping + std::mutex m_ClientThreadMutex; + std::condition_variable m_PendingBufferCondition; + + // Should this thread quit? + bool m_PleaseQuit = false; +}; + +static void start_connection_client_handler_thread(CConnectionClientHandlerThread* thread) { (*thread)(); } + + +//___________________________________________________________________// +// // + +std::string toString(const ENaNReplacementPolicy policy) +{ + switch (policy) { + case ENaNReplacementPolicy::Disabled: return "Disabled"; + case ENaNReplacementPolicy::LastCorrectValue: return "LastCorrectValue"; + case ENaNReplacementPolicy::Zero: return "Zero"; + default: return "N/A"; + } +} + +CAcquisitionServer::CAcquisitionServer(const Kernel::IKernelContext& ctx) + : m_DriftCorrection(ctx), m_kernelCtx(ctx) +{ + m_driverCtx = new CDriverContext(ctx, *this); + + m_encoder = &m_kernelCtx.getAlgorithmManager().getAlgorithm( + m_kernelCtx.getAlgorithmManager().createAlgorithm(OVP_GD_ClassId_Algorithm_MasterAcquisitionEncoder)); + m_encoder->initialize(); + + ip_subjectID.initialize(m_encoder->getInputParameter(OVP_GD_Algorithm_MasterAcquisitionEncoder_InputParameterId_SubjectID)); + ip_subjectAge.initialize(m_encoder->getInputParameter(OVP_GD_Algorithm_MasterAcquisitionEncoder_InputParameterId_SubjectAge)); + ip_subjectGender.initialize(m_encoder->getInputParameter(OVP_GD_Algorithm_MasterAcquisitionEncoder_InputParameterId_SubjectGender)); + ip_matrix.initialize(m_encoder->getInputParameter(OVP_GD_Algorithm_MasterAcquisitionEncoder_InputParameterId_SignalMatrix)); + ip_sampling.initialize(m_encoder->getInputParameter(OVP_GD_Algorithm_MasterAcquisitionEncoder_InputParameterId_SignalSampling)); + ip_stimSet.initialize(m_encoder->getInputParameter(OVP_GD_Algorithm_MasterAcquisitionEncoder_InputParameterId_StimulationSet)); + ip_bufferDuration.initialize(m_encoder->getInputParameter(OVP_GD_Algorithm_MasterAcquisitionEncoder_InputParameterId_BufferDuration)); + ip_channelUnits.initialize(m_encoder->getInputParameter(OVP_GD_Algorithm_MasterAcquisitionEncoder_InputParameterId_ChannelUnits)); + op_buffer.initialize(m_encoder->getOutputParameter(OVP_GD_Algorithm_MasterAcquisitionEncoder_OutputParameterId_EncodedMemoryBuffer)); + + ip_encodeChannelLocalisationData.initialize( + m_encoder->getInputParameter(OVP_GD_Algorithm_MasterAcquisitionEncoder_InputParameterId_EncodeChannelLocalisationData)); + ip_encodeChannelUnitData.initialize(m_encoder->getInputParameter(OVP_GD_Algorithm_MasterAcquisitionEncoder_InputParameterId_EncodeChannelUnitData)); + + const std::string policy = m_kernelCtx.getConfigurationManager().expand("${AcquisitionServer_NaNReplacementPolicy}").toASCIIString(); + if (policy == "Disabled") { this->setNaNReplacementPolicy(ENaNReplacementPolicy::Disabled); } + else if (policy == "Zero") { this->setNaNReplacementPolicy(ENaNReplacementPolicy::Zero); } + else { this->setNaNReplacementPolicy(ENaNReplacementPolicy::LastCorrectValue); } + + this->setOversamplingFactor(m_kernelCtx.getConfigurationManager().expandAsUInteger("${AcquisitionServer_OverSamplingFactor}", 1)); + this->setImpedanceCheckRequest(m_kernelCtx.getConfigurationManager().expandAsBoolean("${AcquisitionServer_CheckImpedance}", false)); + this->setChannelSelectionRequest(m_kernelCtx.getConfigurationManager().expandAsBoolean("${AcquisitionServer_ChannelSelection}", false)); + + m_startedDriverSleepDuration = m_kernelCtx.getConfigurationManager().expandAsInteger("${AcquisitionServer_StartedDriverSleepDuration}", 0); + m_stoppedDriverSleepDuration = m_kernelCtx.getConfigurationManager().expandAsUInteger("${AcquisitionServer_StoppedDriverSleepDuration}", 100); + m_driverTimeoutDuration = m_kernelCtx.getConfigurationManager().expandAsUInteger("${AcquisitionServer_DriverTimeoutDuration}", 5000); + + for (auto itp = m_Plugins.begin(); itp != m_Plugins.end(); ++itp) { (*itp)->createHook(); } +} + +CAcquisitionServer::~CAcquisitionServer() +{ + if (m_isStarted) { + m_Driver->stop(); + m_isStarted = false; + } + + if (m_isInitialized) { + m_Driver->uninitialize(); + m_isInitialized = false; + } + + if (m_connectionServer) { + m_connectionServer->release(); + m_connectionServer = nullptr; + } + + // n.b. We don't clear the connection list as the teardown order (even on window close) + // will lead to AcquisitionServerGUI terminating the AcquisitionThread which will + // in turn call the server's ::stop() that clears the list. + + ip_subjectID.uninitialize(); + ip_subjectAge.uninitialize(); + ip_subjectGender.uninitialize(); + ip_matrix.uninitialize(); + ip_sampling.uninitialize(); + ip_stimSet.uninitialize(); + ip_bufferDuration.uninitialize(); + op_buffer.uninitialize(); + ip_channelUnits.uninitialize(); + + ip_encodeChannelLocalisationData.uninitialize(); + ip_encodeChannelUnitData.uninitialize(); + + m_encoder->uninitialize(); + m_kernelCtx.getAlgorithmManager().releaseAlgorithm(*m_encoder); + m_encoder = nullptr; + + delete m_driverCtx; + m_driverCtx = nullptr; +} + +IDriverContext& CAcquisitionServer::getDriverContext() const { return *m_driverCtx; } + +//___________________________________________________________________// +// // + +bool CAcquisitionServer::loop() +{ + // m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "loop()\n"; + + // Searches for new connection(s) + if (m_connectionServer) { + DoubleLock lock(&m_oPendingConnectionProtectionMutex, &m_oPendingConnectionExecutionMutex); + + for (auto it = m_pendingConnections.begin(); it != m_pendingConnections.end(); ++it) { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Received new connection...\n"; + + Socket::IConnection* connection = it->first; + if (this->isStarted()) { + // When a new connection is found and the + // acq server is started, send the header + + // Computes inner data to skip + const int64_t toSkip = m_DriftCorrection.isActive() + ? ((int64_t(it->second.connectionTime - m_startTime) * int64_t(m_sampling)) >> 32) - m_nSample + m_PendingBuffers. + size() + : ((int64_t(it->second.connectionTime - m_lastDeliveryTime) * int64_t(m_sampling)) >> 32) + m_PendingBuffers.size(); + + const uint64_t theoreticalSampleCountToSkip = (toSkip < 0 ? 0 : uint64_t(toSkip)); + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Sample count offset at connection : " << theoreticalSampleCountToSkip << "\n"; + + if ((m_nSample - m_PendingBuffers.size()) % m_nSamplePerSentBlock != 0) { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Buffer start sample " << m_nSample - m_PendingBuffers.size() << + " doesn't seem to be divisible by " << m_nSamplePerSentBlock << " (case B)\n"; + } + + const uint64_t bufferDuration = ip_bufferDuration; + const uint64_t pastBufferCount = (m_nSample - m_PendingBuffers.size()) / m_nSamplePerSentBlock; + const uint64_t connBufferTimeOffset = CTime(m_sampling, theoreticalSampleCountToSkip).time(); + + connection_info_t info; + info.connectionTime = it->second.connectionTime; + info.stimulationTimeOffset = pastBufferCount * bufferDuration + connBufferTimeOffset; + info.nSampleToSkip = theoreticalSampleCountToSkip; + info.connectionClientHandlerThread = new CConnectionClientHandlerThread(*this, *connection); + info.connectionClientHandlerStdThread = new std::thread(std::bind(&start_connection_client_handler_thread, info.connectionClientHandlerThread)); + info.isChannelLocalisationSent = false; + info.isChannelUnitsSent = false; + + m_connections.push_back(std::pair<Socket::IConnection*, connection_info_t>(connection, info)); + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "Creating header\n"; + + op_buffer->setSize(0, true); + m_encoder->process(OVP_GD_Algorithm_MasterAcquisitionEncoder_InputTriggerId_EncodeHeader); + + info.connectionClientHandlerThread->scheduleBuffer(*op_buffer); + } + else { + // When a new connection is found and the + // acq server is _not_ started, drop the + // connection + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Dropping connection - acquisition is not started\n"; + connection->release(); + } + } + m_pendingConnections.clear(); + } + + // Cleans disconnected client(s) + for (auto it = m_connections.begin(); it != m_connections.end();) { + Socket::IConnection* connection = it->first; + if (!connection->isConnected()) { + if (it->second.connectionClientHandlerStdThread) { + requestClientThreadQuit(it->second.connectionClientHandlerThread); + + it->second.connectionClientHandlerStdThread->join(); + delete it->second.connectionClientHandlerStdThread; + delete it->second.connectionClientHandlerThread; + } + connection->release(); + it = m_connections.erase(it); + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Closed connection...\n"; + } + else { ++it; } + } + + // Handles driver's main loop + if (m_Driver) { + bool res; + if (this->isStarted()) { + res = true; + bool timeout = false; + m_gotData = false; + const uint32_t timeBeforeCall = System::Time::getTime(); + while (res && !m_gotData && !timeout) { + // Calls driver's loop + res = m_Driver->loop(); + // @fixme behavior seems to be bad if the loop() returns false; should fix this! + if (!m_gotData) { + timeout = (System::Time::getTime() > timeBeforeCall + m_driverTimeoutDuration); + + if (m_startedDriverSleepDuration > 0) { + // This may cause jitter due to inaccuracies in sleep duration, but has the + // benefit that it frees the CPU core for other tasks + System::Time::sleep(size_t(m_startedDriverSleepDuration)); + } + else if (m_startedDriverSleepDuration == 0) { + // Generally spins, but gives other threads a chance. Note that there is no guarantee when + // the scheduler reschedules this thread. + std::this_thread::yield(); + } + else { + // < 0 -> NOP, spins, doesn't offer to yield + // n.b. Unless the driver waits for samples (preferably with a hardware event), + // this choice will spin one core fully. + } + } + } + if (timeout) { + m_kernelCtx.getLogManager() << Kernel::LogLevel_ImportantWarning << "After " << m_driverTimeoutDuration << + " milliseconds, did not receive anything from the driver - Timed out\n"; + return false; + } + if (m_gotData && m_DriftCorrection.getDriftCorrectionPolicy() == EDriftCorrectionPolicies::Forced) { + m_DriftCorrection.correctDrift(m_DriftCorrection.getSuggestedDriftCorrectionSampleCount(), m_nSample, m_PendingBuffers, m_PendingStimSet, + m_SwapBuffers); + } + } + else { + // Calls driver's loop + res = m_Driver->loop(); + System::Time::sleep(m_stoppedDriverSleepDuration); + } + + // Calls driver's loop + if (!res) { + m_kernelCtx.getLogManager() << Kernel::LogLevel_ImportantWarning << "Something bad happened in the loop callback, stopping the acquisition\n"; + return false; + } + } + + // Eventually builds up buffer and + // sends data to connected client(s) + while (m_PendingBuffers.size() >= m_nSamplePerSentBlock * 2) { + const int64_t p = m_nSample - m_PendingBuffers.size(); + if (p < 0) { m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Signed number used for bit operations:" << p << " (case A)\n"; } + if (p % m_nSamplePerSentBlock != 0) { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Buffer start sample " << p << " doesn't seem to be divisible by " + << m_nSamplePerSentBlock << " (case A)\n"; + } + + // n.b. here we use arithmetic based on buffer duration so that we are in perfect agreement with + // Acquisition Client box that sets the chunk starts and ends by steps of buffer duration. + const uint64_t duration = ip_bufferDuration; + const uint64_t startSamples = m_nSample - m_PendingBuffers.size(); + const uint64_t nBuffer = startSamples / m_nSamplePerSentBlock; + const uint64_t startTime = nBuffer * duration; + const uint64_t endTime = startTime + duration; + const uint64_t lastTime = CTime(m_sampling, m_nSample).time(); + + // Pass the stimuli and buffer to all plugins; note that they may modify them + for (auto itp = m_Plugins.begin(); itp != m_Plugins.end(); ++itp) { + (*itp)->loopHook(m_PendingBuffers, m_PendingStimSet, startTime, endTime, lastTime); + } + + // Handle connections + for (auto it = m_connections.begin(); it != m_connections.end(); ++it) { + // Socket::IConnection* connection=it->first; + connection_info_t& info = it->second; + + if (info.nSampleToSkip < m_nSamplePerSentBlock) { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "Creating buffer for connection " << uint64_t(it->first) << "\n"; + + // Signal buffer + for (size_t j = 0; j < m_nChannel; ++j) { + for (size_t i = 0; i < m_nSamplePerSentBlock; ++i) { + ip_matrix->getBuffer()[j * m_nSamplePerSentBlock + i] = double(m_PendingBuffers[int(i + info.nSampleToSkip)][j]); + } + } + + // Boundaries of the part of the buffer to be sent to this connection + const uint64_t connBufferTimeOffset = CTime(m_sampling, info.nSampleToSkip).time(); + const uint64_t connBlockStartTime = startTime + connBufferTimeOffset; + const uint64_t connBlockEndTime = endTime + connBufferTimeOffset; + + //m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "start: " << (start) << "end: " << (end) << "\n"; + + // Stimulation buffer + CStimulationSet& stimSet = *ip_stimSet; + stimSet.clear(); + + // Take the stimuli range valid for the buffer and adjust wrt connection time (stamp at connection = stamp at time 0 for the client) + for (size_t k = 0; k < m_PendingStimSet.size(); ++k) { + const uint64_t date = m_PendingStimSet.getDate(k); // this date is wrt the whole acquisition time in the server + if (date >= connBlockStartTime && date <= connBlockEndTime) { + // The new date is wrt the specific connection time of the client (i.e. the chunk times on Designer side) + const uint64_t newDate = ((date > info.stimulationTimeOffset) ? (date - info.stimulationTimeOffset) : 0); + + /* + std::cout << std::setprecision(10) << CTime(date).toSeconds() << " to " << CTime(newDate).toSeconds() + << " for [" << CTime(startTime).toSeconds() << "," << CTime(endTime).toSeconds() << "]\n"; + */ + + stimSet.push_back(m_PendingStimSet.getId(k), newDate, m_PendingStimSet.getDuration(k)); + } + } + + // Send a chunk of channel units? Note that we'll always send the units header. + if (!info.isChannelUnitsSent) { + // If default values in channel units, don't bother sending unit data chunk + ip_encodeChannelUnitData = m_headerCopy->isChannelUnitSet(); + // std::cout << "Set " << ip_channelUnits->getBufferElementCount() << "\n"; + } + + op_buffer->setSize(0, true); + m_encoder->process(OVP_GD_Algorithm_MasterAcquisitionEncoder_InputTriggerId_EncodeBuffer); + + if (!info.isChannelUnitsSent) { + // Do not send again + info.isChannelUnitsSent = true; + ip_encodeChannelUnitData = false; + } + + info.connectionClientHandlerThread->scheduleBuffer(*op_buffer); + } + else { + // Here sample count to skip >= block size, so we effective drop this chunk from the viewpoint of this connection. + // n.b. This is the reason why the pending buffer size needs to be 2x, as the skip can be up to 1x bufferSize and + // after that we need a full buffer to send. Note that by construction + // the count to skip can never underflow but remains >= 0 (the other if branch doesnt decrement). + info.nSampleToSkip -= m_nSamplePerSentBlock; + } + } + + // Clears pending stimulations; Can start from zero as we know we'll never send anything in the future thats + // before current BufferEndTime. + m_PendingStimSet.removeRange(0, endTime); + + // Clears pending signal + m_PendingBuffers.erase(m_PendingBuffers.begin(), m_PendingBuffers.begin() + m_nSamplePerSentBlock); + } + + return true; +} + +//___________________________________________________________________// +// // + +bool CAcquisitionServer::connect(IDriver& driver, IHeader& headerCopy, const uint32_t nSamplingPerSentBlock, const uint32_t port) +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "connect\n"; + + + m_Driver = &driver; + m_headerCopy = &headerCopy; + m_nSamplePerSentBlock = nSamplingPerSentBlock; + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Connecting to device [" << CString(m_Driver->getName()) << "]...\n"; + + // Initializes driver + if (!m_Driver->initialize(m_nSamplePerSentBlock, *this)) { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Connection failed...\n"; + return false; + } + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Connection succeeded !\n"; + + const IHeader& header = *driver.getHeader(); + IHeader::copy(headerCopy, header); + + m_nChannel = headerCopy.getChannelCount(); + m_sampling = headerCopy.getSamplingFrequency() * m_overSamplingFactor; + + m_selectedChannels.clear(); + if (m_isChannelSelectionRequested) { + for (size_t i = 0, l = 0; i < m_nChannel; ++i) { + const std::string name = headerCopy.getChannelName(i); + if (!name.empty()) { + m_selectedChannels.push_back(i); + headerCopy.setChannelName(l, name.c_str()); + + size_t unit = 0, factor = 0; + if (headerCopy.isChannelUnitSet()) { + headerCopy.getChannelUnits(i, unit, factor); // no need to check, will be defaults on failure + headerCopy.setChannelUnits(l, unit, factor); + } + l++; + } + } + headerCopy.setChannelCount(m_selectedChannels.size()); + m_nChannel = headerCopy.getChannelCount(); + } + else { for (size_t i = 0; i < m_nChannel; ++i) { m_selectedChannels.push_back(i); } } + + // These are passed to plugins + m_selectedChannelNames.clear(); + for (size_t i = 0; i < headerCopy.getChannelCount(); ++i) { m_selectedChannelNames.push_back(CString(headerCopy.getChannelName(i))); } + + if (m_nChannel == 0) { + std::stringstream ss; + ss << "Driver claimed to have 0 channel"; + if (isChannelSelectionRequested()) { ss << "(check whether the property `Select only named channel' is set).\n"; } + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << ss.str(); + return false; + } + + if (m_sampling == 0) { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Driver claimed to have a sample frequency of 0.\n"; + return false; + } + + m_impedances.resize(m_nChannel, OVAS_Impedance_NotAvailable); + m_SwapBuffers.resize(m_nChannel); + + // A hack to check that the port is not already open; this doesn't guarantee it as another process + // might grab the port after this test. But it will cover the normal use cases where multiple acquisition servers + // are started by the user manually at different times. A proper way to solve this would be to + // change ConnectionServer::listen() in the SDK to disallow multiple listens. + Socket::IConnectionClient* testClient = Socket::createConnectionClient(); + if (testClient->connect("localhost", port, 100)) // 100ms + { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Server Connection Port " << port << + " already in use. Please change the port or close the other application.\n"; + testClient->close(); + delete testClient; + return false; + } + delete testClient; + testClient = nullptr; + + m_connectionServer = Socket::createConnectionServer(); + if (m_connectionServer->listen(port)) { + m_isInitialized = true; + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "NaN value correction is set to "; + switch (m_eNaNReplacementPolicy) { + default: case ENaNReplacementPolicy::LastCorrectValue: m_kernelCtx.getLogManager() << CString("LastCorrectValue") << "\n"; + break; + case ENaNReplacementPolicy::Zero: m_kernelCtx.getLogManager() << CString("Zero") << "\n"; + break; + case ENaNReplacementPolicy::Disabled: m_kernelCtx.getLogManager() << CString("Disabled") << "\n"; + break; + } + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Oversampling factor set to " << m_overSamplingFactor << "\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Sampling frequency set to " << m_sampling << "Hz\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Started driver sleeping duration is " << m_startedDriverSleepDuration << " milliseconds\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Stopped driver sleeping duration is " << m_stoppedDriverSleepDuration << " milliseconds\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Driver timeout duration set to " << m_driverTimeoutDuration << " milliseconds\n"; + + ip_bufferDuration = CTime(m_sampling, m_nSamplePerSentBlock).time(); + + ip_subjectID = headerCopy.getExperimentID(); + ip_subjectAge = headerCopy.getSubjectAge(); + ip_subjectGender = headerCopy.getSubjectGender(); + + ip_sampling = m_sampling; + ip_matrix->resize(m_nChannel, m_nSamplePerSentBlock); + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Sampling rate : " << m_sampling << "\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Samples per block : " << m_nSamplePerSentBlock << "\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Channel count : " << m_nChannel << "\n"; + + for (size_t i = 0; i < m_nChannel; ++i) { + const std::string name = headerCopy.getChannelName(i); + if (!name.empty()) { ip_matrix->setDimensionLabel(0, i, name.c_str()); } + else { ip_matrix->setDimensionLabel(0, i, ("Channel " + std::to_string(i + 1)).c_str()); } + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Channel name : " << CString(ip_matrix->getDimensionLabel(0, i)) << "\n"; + } + + // Construct channel units stream header & matrix + // Note: Channel units, although part of IHeader, will be sent as a matrix chunk during loop() once - if at all - to each client + if (m_headerCopy->isChannelUnitSet()) { + ip_channelUnits->resize(m_nChannel, 2); // Units, Factor + for (size_t c = 0; c < m_nChannel; ++c) { + ip_channelUnits->setDimensionLabel(0, c, m_headerCopy->getChannelName(c)); + if (m_headerCopy->isChannelUnitSet()) { + size_t unit = 0, factor = 0; + m_headerCopy->getChannelUnits(c, unit, factor); // no need to check, will be defaults on failure + + ip_channelUnits->getBuffer()[c * 2 + 0] = double(unit); + ip_channelUnits->getBuffer()[c * 2 + 1] = double(factor); + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Channel Unit : " << unit << ", factor=" << OVTK_DECODE_FACTOR(factor) << + "\n"; + } + } + ip_channelUnits->setDimensionLabel(1, 0, "Unit"); + ip_channelUnits->setDimensionLabel(1, 1, "Factor"); + } + else { + // Driver did not set units. Convention: send empty header matrix in this case. + ip_channelUnits->clean(); + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Driver did not set units, sending empty channel units matrix\n"; + } + + // @TODO Channel localisation + ip_encodeChannelLocalisationData = false; // never at the moment + + // @TODO Gain is ignored + } + else { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Could not listen on TCP port (firewall problem ?)\n"; + return false; + } + + m_connectionServerHandlerStdThread = new std::thread(CConnectionServerHandlerThread(*this, *m_connectionServer)); + + return true; +} + +bool CAcquisitionServer::start() +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "buttonStartPressedCB\n"; + + if (isImpedanceCheckRequested()) { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Please disable impedance check before pressing Play\n"; + return false; + } + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Starting the acquisition...\n"; + + m_PendingBuffers.clear(); + m_PendingStimSet.clear(); + + m_nSample = 0; + m_nLastSample = 0; + + // Starts driver + if (!m_Driver->start()) { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Starting failed !\n"; + return false; + } + + m_startTime = System::Time::zgetTime(); + m_lastDeliveryTime = m_startTime; + + m_DriftCorrection.start(m_sampling, m_startTime); + + for (auto itp = m_Plugins.begin(); itp != m_Plugins.end(); ++itp) { + const bool ok = (*itp)->startHook(m_selectedChannelNames, m_sampling, m_nChannel, m_nSamplePerSentBlock); + if (!ok) { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Problem starting a plugin, bailing out for safety.\n"; + return false; + } + } + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Now acquiring...\n"; + m_isStarted = true; + return true; +} + +bool CAcquisitionServer::requestClientThreadQuit(CConnectionClientHandlerThread* th) +{ + // Use a scoped lock before toggling a variable owned by the thread + { + std::lock_guard<std::mutex> oLock(th->m_ClientThreadMutex); + + // Tell the thread to quit + th->m_PleaseQuit = true; + } + + // Wake up the thread in case it happens to be waiting on the cond var + th->m_PendingBufferCondition.notify_one(); + + return true; +} + +bool CAcquisitionServer::stop() +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "buttonStopPressedCB\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Stopping the acquisition.\n"; + + m_DriftCorrection.printStats(); + m_DriftCorrection.stop(); + + // Stops driver + m_Driver->stop(); + + for (auto it = m_connections.begin(); it != m_connections.end(); ++it) { + if (it->first->isConnected()) { it->first->close(); } + if (it->second.connectionClientHandlerStdThread) { + requestClientThreadQuit(it->second.connectionClientHandlerThread); + + it->second.connectionClientHandlerStdThread->join(); + delete it->second.connectionClientHandlerStdThread; + delete it->second.connectionClientHandlerThread; + } + it->first->release(); + } + m_connections.clear(); + + for (auto itp = m_Plugins.begin(); itp != m_Plugins.end(); ++itp) { (*itp)->stopHook(); } + + + m_isStarted = false; + + m_PendingBuffers.clear(); + + return true; +} + +bool CAcquisitionServer::disconnect() +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Disconnecting.\n"; + + if (m_isInitialized) { m_Driver->uninitialize(); } + + m_impedances.clear(); + + if (m_connectionServer) { + m_connectionServer->close(); + m_connectionServer->release(); + m_connectionServer = nullptr; + } + + m_isInitialized = false; + + // Thread joining must be done after + // switching m_isInitialized to false + if (m_connectionServerHandlerStdThread) { + m_connectionServerHandlerStdThread->join(); + delete m_connectionServerHandlerStdThread; + m_connectionServerHandlerStdThread = nullptr; + } + + return true; +} + +//___________________________________________________________________// +// // + +void CAcquisitionServer::setSamples(const float* samples) +{ + if (samples == nullptr) { m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Null data detected\n"; } + this->setSamples(samples, m_nSamplePerSentBlock); +} + +void CAcquisitionServer::setSamples(const float* samples, const size_t count) +{ + if (m_isStarted) { + for (size_t i = 0; i < count; ++i) { + if (!m_replacementInProgress) { + // otherwise NaN are propagating + m_overSamplingSwapBuffers = m_SwapBuffers; + } + for (size_t k = 0; k < m_overSamplingFactor; ++k) { + const float alpha = float(k + 1) / m_overSamplingFactor; + + bool hadNaN = false; + + for (size_t j = 0; j < m_nChannel; ++j) { + const size_t channel = m_selectedChannels[j]; + + if (std::isnan(samples[channel * count + i]) || !std::isfinite(samples[channel * count + i])) { // NaN or infinite values + hadNaN = true; + + switch (m_eNaNReplacementPolicy) { + case ENaNReplacementPolicy::Disabled: m_SwapBuffers[j] = std::numeric_limits<float>::quiet_NaN(); + break; + case ENaNReplacementPolicy::Zero: m_SwapBuffers[j] = 0; + break; + case ENaNReplacementPolicy::LastCorrectValue: + // we simply don't update the value + break; + default: break; + } + } + else { m_SwapBuffers[j] = alpha * samples[channel * count + i] + (1 - alpha) * m_overSamplingSwapBuffers[j]; } + } + + const uint64_t currentIdx = m_nSample + i * m_overSamplingFactor + k; // j is not included here as all channels have the equal sample time + + if (hadNaN) { + // When a NaN is encountered at time t1 on any channel, OVTK_StimulationId_Artifact stimulus is sent. When a first good sample is encountered + // after the last bad sample t2, OVTK_StimulationId_NoArtifact stimulus is sent, i.e. specifying a range of bad data : [t1,t2]. The stimuli are global + // and not specific to channels. + + if (!m_replacementInProgress) { + const uint64_t incorrectBlockStarts = CTime(m_sampling, currentIdx).time(); + m_PendingStimSet.push_back(OVTK_StimulationId_Artifact, incorrectBlockStarts, 0); + m_replacementInProgress = true; + } + } + else { + if (m_replacementInProgress) { + // @note -1 is used here because the incorrect-correct range is inclusive, [a,b]. So when sample is good at b+1, we set the end point at b. + const uint64_t incorrectBlockStops = CTime(m_sampling, currentIdx - 1).time(); + + m_PendingStimSet.push_back(OVTK_StimulationId_NoArtifact, incorrectBlockStops, 0); + m_replacementInProgress = false; + } + } + + m_PendingBuffers.push_back(m_SwapBuffers); + } + } + + m_nLastSample = m_nSample; + m_nSample += count * m_overSamplingFactor; + + m_DriftCorrection.estimateDrift(count * m_overSamplingFactor); + + m_lastDeliveryTime = System::Time::zgetTime(); + m_gotData = true; + } + else { m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "The acquisition is not started\n"; } +} + +void CAcquisitionServer::setStimulationSet(const CStimulationSet& stimSet) +{ + if (m_isStarted) { + const uint64_t time = CTime(m_sampling, m_nLastSample).time(); + m_PendingStimSet.append(stimSet, time); + } + else { m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "The acquisition is not started\n"; } +} + + +bool CAcquisitionServer::updateImpedance(const size_t index, const double impedance) +{ + for (size_t i = 0; i < m_selectedChannels.size(); ++i) { + if (index == m_selectedChannels[i]) { + m_impedances[i] = impedance; + return true; + } + } + return false; +} + +// ____________________________________________________________________________ +// + +bool CAcquisitionServer::setOversamplingFactor(const uint64_t oversamplingFactor) +{ + m_overSamplingFactor = oversamplingFactor; + if (m_overSamplingFactor < 1) { m_overSamplingFactor = 1; } + if (m_overSamplingFactor > 16) { m_overSamplingFactor = 16; } + return true; +} + +// ____________________________________________________________________________ +// + +bool CAcquisitionServer::acceptNewConnection(Socket::IConnection* connection) +{ + if (!connection) { return false; } + + const uint64_t time = System::Time::zgetTime(); + + DoubleLock lock(&m_oPendingConnectionProtectionMutex, &m_oPendingConnectionExecutionMutex); + + connection_info_t info; + info.connectionTime = time; + info.stimulationTimeOffset = 0; // not used + info.nSampleToSkip = 0; // not used + info.connectionClientHandlerThread = nullptr; // not used + info.connectionClientHandlerStdThread = nullptr; // not used + info.isChannelLocalisationSent = false; + info.isChannelUnitsSent = false; + + m_pendingConnections.push_back(std::pair<Socket::IConnection*, connection_info_t>(connection, info)); + + for (auto itp = m_Plugins.begin(); itp != m_Plugins.end(); ++itp) { (*itp)->acceptNewConnectionHook(); } + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASCore/ovasCAcquisitionServer.h b/applications/platform/acquisition-server/src/OVASCore/ovasCAcquisitionServer.h new file mode 100644 index 0000000000000000000000000000000000000000..f81445ed3d87063d6070ef8b1575764df4ff4b8c --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASCore/ovasCAcquisitionServer.h @@ -0,0 +1,183 @@ +#pragma once + +#include "ovas_base.h" +#include "ovasIDriver.h" +#include "ovasIHeader.h" +#include "ovasCDriftCorrection.h" + +#include <socket/IConnectionServer.h> + +#include <mutex> +#include <thread> + +#include <vector> +#include <list> +#include <deque> + +namespace OpenViBE { +namespace AcquisitionServer { +class CConnectionServerHandlerThread; +class CConnectionClientHandlerThread; +class IAcquisitionServerPlugin; + +typedef struct +{ + uint64_t connectionTime; // Time the client connected + uint64_t stimulationTimeOffset; // Time offset wrt acquisition start + uint64_t nSampleToSkip; // How many samples to skip wrt current buffer start. n.b. not a constant. + CConnectionClientHandlerThread* connectionClientHandlerThread; // Ptr to the class object that is executed by the client connection handler thread + std::thread* connectionClientHandlerStdThread; // The actual thread handle + bool isChannelUnitsSent; + bool isChannelLocalisationSent; +} connection_info_t; + +enum class ENaNReplacementPolicy { LastCorrectValue=0, Zero, Disabled }; + +std::string toString(const ENaNReplacementPolicy policy); + +// Concurrency handling +class DoubleLock +{ + // Implements + // lock(mutex1); + // lock(mutex2); + // unlock(mutex1); + // mutex2 lock is released when the object goes out of scope + // + // @details The two mutex 'pattern' is used to avoid thread starving which can happen e.g. + // on Linux if just a single mutex is used; apparently the main loop just takes the + // mutex repeatedly without the gui thread sitting on the mutex being unlocked. + // n.b. potentially calls for redesign +public: + DoubleLock(std::mutex* m1, std::mutex* m2) : lock2(*m2, std::defer_lock) + { + std::lock_guard<std::mutex> lock1(*m1); + lock2.lock(); + } + +private: + std::unique_lock<std::mutex> lock2; +}; + +class CDriverContext; + +class CAcquisitionServer final : public IDriverCallback +{ +public: + explicit CAcquisitionServer(const Kernel::IKernelContext& ctx); + ~CAcquisitionServer() override; + + IDriverContext& getDriverContext() const; + size_t getClientCount() const { return m_connections.size(); } + double getImpedance(const size_t index) { return (index < m_impedances.size()) ? m_impedances[index] : OVAS_Impedance_Unknown; } + + bool loop(); + + bool connect(IDriver& driver, IHeader& headerCopy, const uint32_t nSamplingPerSentBlock, const uint32_t port); + bool start(); + bool stop(); + bool disconnect(); + + // Driver samples information callback + void setSamples(const float* samples) override; + void setSamples(const float* samples, const size_t count) override; + void setStimulationSet(const CStimulationSet& stimSet) override; + + // Driver context callback + bool isConnected() const { return m_isInitialized; } + bool isStarted() const { return m_isStarted; } + bool updateImpedance(const size_t index, const double impedance); + + // General parameters configurable from the GUI + ENaNReplacementPolicy getNaNReplacementPolicy() const { return m_eNaNReplacementPolicy; } + uint64_t getOversamplingFactor() const { return m_overSamplingFactor; } + bool isImpedanceCheckRequested() const { return m_Driver ? m_Driver->getHeader()->isImpedanceCheckRequested() : false; } + bool isChannelSelectionRequested() const { return m_isChannelSelectionRequested; } + void setNaNReplacementPolicy(const ENaNReplacementPolicy policy) { m_eNaNReplacementPolicy = policy; } + bool setOversamplingFactor(const uint64_t oversamplingFactor); + void setImpedanceCheckRequest(const bool active) { m_isImpedanceCheckRequested = active; } + void setChannelSelectionRequest(const bool active) { m_isChannelSelectionRequested = active; } + + std::vector<IAcquisitionServerPlugin*> getPlugins() const { return m_Plugins; } + + bool acceptNewConnection(Socket::IConnection* connection); + + //---------- Variables ---------- + // See class DoubleLock + std::mutex m_ProtectionMutex; + std::mutex m_ExecutionMutex; + + std::deque<std::vector<float>> m_PendingBuffers; + std::vector<float> m_SwapBuffers; + + size_t m_nSample = 0; + size_t m_startTime = 0; + + CDriftCorrection m_DriftCorrection; + CStimulationSet m_PendingStimSet; + + std::vector<IAcquisitionServerPlugin*> m_Plugins; + +protected: + static bool requestClientThreadQuit(CConnectionClientHandlerThread* th); + + //---------- Variables ---------- + std::mutex m_oPendingConnectionProtectionMutex; + std::mutex m_oPendingConnectionExecutionMutex; + + std::thread* m_connectionServerHandlerStdThread = nullptr; + + const Kernel::IKernelContext& m_kernelCtx; + CDriverContext* m_driverCtx = nullptr; + IDriver* m_Driver = nullptr; + const IHeader* m_headerCopy = nullptr; + + Kernel::IAlgorithmProxy* m_encoder = nullptr; + Kernel::TParameterHandler<uint64_t> ip_subjectID; + Kernel::TParameterHandler<uint64_t> ip_subjectAge; + Kernel::TParameterHandler<uint64_t> ip_subjectGender; + Kernel::TParameterHandler<CMatrix*> ip_matrix; + Kernel::TParameterHandler<CMatrix*> ip_channelUnits; + Kernel::TParameterHandler<uint64_t> ip_sampling; + Kernel::TParameterHandler<CStimulationSet*> ip_stimSet; + Kernel::TParameterHandler<uint64_t> ip_bufferDuration; + Kernel::TParameterHandler<CMemoryBuffer*> op_buffer; + + Kernel::TParameterHandler<bool> ip_encodeChannelLocalisationData; + Kernel::TParameterHandler<bool> ip_encodeChannelUnitData; + + std::list<std::pair<Socket::IConnection*, connection_info_t>> m_connections; + std::list<std::pair<Socket::IConnection*, connection_info_t>> m_pendingConnections; + std::vector<float> m_overSamplingSwapBuffers; + std::vector<double> m_impedances; + std::vector<size_t> m_selectedChannels; + std::vector<CString> m_selectedChannelNames; + Socket::IConnectionServer* m_connectionServer = nullptr; + + ENaNReplacementPolicy m_eNaNReplacementPolicy = ENaNReplacementPolicy::LastCorrectValue; + bool m_replacementInProgress = false; + + bool m_isInitialized = false; + bool m_isStarted = false; + bool m_isImpedanceCheckRequested = false; + bool m_isChannelSelectionRequested = false; + bool m_gotData = false; + size_t m_overSamplingFactor = 0; + size_t m_nChannel = 0; + size_t m_sampling = 0; + size_t m_nSamplePerSentBlock = 0; + size_t m_nLastSample = 0; + size_t m_lastDeliveryTime = 0; + + //CDriftCorrection m_DriftCorrection; + + size_t m_nJitterEstimationForDrift = 0; + size_t m_driverTimeoutDuration = 0; // ms after which the driver is considered having time-outed + int64_t m_startedDriverSleepDuration = 0; // ms, <0 == spin, 0 == yield thread, >0 sleep. Used when driver does not return samples. + size_t m_stoppedDriverSleepDuration = 0; // ms to sleep when driver is not running + + uint8_t* m_sampleBuffer = nullptr; + //CStimulationSet m_PendingStimSet; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASCore/ovasCAcquisitionServerGUI.cpp b/applications/platform/acquisition-server/src/OVASCore/ovasCAcquisitionServerGUI.cpp new file mode 100755 index 0000000000000000000000000000000000000000..cb6556881d5066305d732c991ff132473d95e4d9 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASCore/ovasCAcquisitionServerGUI.cpp @@ -0,0 +1,867 @@ +#include "ovasCAcquisitionServerGUI.h" +#include "ovasCAcquisitionServerThread.h" +#include "ovasCAcquisitionServer.h" +#include "ovasIAcquisitionServerPlugin.h" +// Drivers + +#ifdef TARGET_HAS_OpenViBEContributions +#include "contribAcquisitionServer.inl" +#endif + +#include "ovasCPluginLSLOutput.h" +#include "ovasCPluginFiddler.h" + +#include "generic-raw-reader/ovasCDriverGenericRawFileReader.h" +#include "generic-raw-reader/ovasCDriverGenericRawTelnetReader.h" + +// Simulation drivers +#include "generic-oscillator/ovasCDriverGenericOscillator.h" +#include "generic-sawtooth/ovasCDriverGenericSawTooth.h" +#include "generic-time-signal/ovasCDriverGenericTimeSignal.h" +#include "simulated-deviator/ovasCDriverSimulatedDeviator.h" + +#include "biosemi-activetwo/ovasCDriverBioSemiActiveTwo.h" +#include "brainproducts-actichamp/ovasCDriverBrainProductsActiCHamp.h" +#include "brainproducts-brainampseries/ovasCDriverBrainProductsBrainampSeries.h" +#include "brainproducts-vamp/ovasCDriverBrainProductsVAmp.h" +#include "brainproducts-liveamp/ovasCDriverBrainProductsLiveAmp.h" +#include "egi-ampserver/ovasCDriverEGIAmpServer.h" +#include "emotiv-epoc/ovasCDriverEmotivEPOC.h" +#include "labstreaminglayer/ovasCDriverLabStreamingLayer.h" +#include "micromed-systemplusevolution/ovasCDriverMicromedSystemPlusEvolution.h" +#include "mindmedia-nexus32b/ovasCDriverMindMediaNeXus32B.h" +#include "mcs-nvx/ovasCDriverMCSNVXDriver.h" +#include "neuroelectrics-enobio3g/ovasCDriverEnobio3G.h" +#include "neuroservo/ovasCDriverNeuroServoHid.h" +#include "neurosky-mindset/ovasCDriverNeuroskyMindset.h" +#include "tmsi/ovasCDriverTMSi.h" +#include "tmsi-refa32b/ovasCDriverTMSiRefa32B.h" + +#include "mensia-acquisition/ovasCDriverMensiaAcquisition.h" + +#include "shimmer-gsr/ovasCDriverShimmerGSR.hpp" + +#include <limits> + +// Plugins + +#include <fstream> + +#include <string> +#include <vector> +#include <algorithm> +#include <functional> +#include <cctype> +#include <cstring> + +#include <cassert> +#include <system/WindowsUtilities.h> +// + +namespace OpenViBE { +namespace AcquisitionServer { + +#define OVAS_GUI_File OpenViBE::Directories::getDataDir() + "/applications/acquisition-server/interface.ui" + +// because std::tolower has multiple signatures, +// it can not be easily used in std::transform +// this workaround is taken from http://www.gcek.net/ref/books/sw/cpp/ticppv2/ +template <class T> +static T to_lower(T c) { return std::tolower(c); } + +static void PreferencePressedCB(GtkButton* button, void* data) { static_cast<CAcquisitionServerGUI*>(data)->buttonPreferencePressedCB(button); } +static void ConfigurePressedCB(GtkButton* button, void* data) { static_cast<CAcquisitionServerGUI*>(data)->buttonConfigurePressedCB(button); } +static void ConnectToggledCB(GtkToggleButton* button, void* data) { static_cast<CAcquisitionServerGUI*>(data)->buttonConnectToggledCB(button); } +static void StartPressedCB(GtkButton* button, void* data) { static_cast<CAcquisitionServerGUI*>(data)->buttonStartPressedCB(button); } +static void StopPressedCB(GtkButton* button, void* data) { static_cast<CAcquisitionServerGUI*>(data)->buttonStopPressedCB(button); } +static void DriverChangedCB(GtkComboBox* box, void* data) { static_cast<CAcquisitionServerGUI*>(data)->comboBoxDriverChanged(box); } + +static void SampleCountPerSentBlockChangedCB(GtkComboBox* box, void* data) +{ + static_cast<CAcquisitionServerGUI*>(data)->comboBoxSampleCountPerSentBlockChanged(box); +} + +static bool compare_driver_names(IDriver* a, IDriver* b) +{ + std::string sA = a->getName(); + std::string sB = b->getName(); + + std::transform(sA.begin(), sA.end(), sA.begin(), tolower); + std::transform(sB.begin(), sB.end(), sB.begin(), tolower); + + return sA < sB; +} + +//___________________________________________________________________// +// // + +CAcquisitionServerGUI::CAcquisitionServerGUI(const Kernel::IKernelContext& ctx) + : m_kernelCtx(ctx) +{ + // bool showUnstable = m_kernelCtx.getConfigurationManager().expandAsBoolean("${AcquisitionServer_ShowUnstable}", false); + + m_acquisitionServer = new CAcquisitionServer(ctx); + + m_drivers.push_back(new CDriverGenericOscillator(m_acquisitionServer->getDriverContext())); + m_drivers.push_back(new CDriverGenericSawTooth(m_acquisitionServer->getDriverContext())); + m_drivers.push_back(new CDriverGenericTimeSignal(m_acquisitionServer->getDriverContext())); + m_drivers.push_back(new CDriverSimulatedDeviator(m_acquisitionServer->getDriverContext())); + + m_drivers.push_back(new CDriverGenericRawFileReader(m_acquisitionServer->getDriverContext())); + m_drivers.push_back(new CDriverGenericRawTelnetReader(m_acquisitionServer->getDriverContext())); + +#if defined TARGET_OS_Windows + m_drivers.push_back(new CDriverShimmerGSR(m_acquisitionServer->getDriverContext())); + + m_drivers.push_back(new CDriverBrainProductsBrainampSeries(m_acquisitionServer->getDriverContext())); +#endif + +#if defined TARGET_HAS_ThirdPartyBrainProductsAmplifierSDK + m_drivers.push_back(new CDriverBrainProductsLiveAmp(m_acquisitionServer->getDriverContext())); + m_drivers.push_back(new CDriverBrainProductsActiCHamp(m_acquisitionServer->getDriverContext())); +#endif + +#if defined TARGET_HAS_ThirdPartyBioSemiAPI + m_drivers.push_back(new CDriverBioSemiActiveTwo(m_acquisitionServer->getDriverContext())); +#endif + + m_drivers.push_back(new CDriverEGIAmpServer(m_acquisitionServer->getDriverContext())); + +#if defined TARGET_HAS_ThirdPartyEmotivAPI + m_drivers.push_back(new CDriverEmotivEPOC(m_acquisitionServer->getDriverContext())); +#endif +#if defined TARGET_HAS_ThirdPartyEnobioAPI + m_drivers.push_back(new CDriverEnobio3G(m_acquisitionServer->getDriverContext())); +#endif +#if defined TARGET_HAS_ThirdPartyMCS + m_drivers.push_back(new CDriverMKSNVXDriver(m_acquisitionServer->getDriverContext())); +#endif +#if defined(TARGET_HAS_ThirdPartyMicromed) + m_drivers.push_back(new CDriverMicromedSystemPlusEvolution(m_acquisitionServer->getDriverContext())); +#endif +#if defined(TARGET_HAS_ThirdPartyNeuroServo) + m_drivers.push_back(new CDriverNeuroServoHid(m_acquisitionServer->getDriverContext())); +#endif + //#if defined TARGET_HAS_ThirdPartyEEGOAPI + // m_drivers.push_back(new CDriverEEGO(m_acquisitionServer->getDriverContext())); + //#endif + + +#if defined(TARGET_HAS_ThirdPartyNeXus) + m_drivers.push_back(new CDriverMindMediaNeXus32B(m_acquisitionServer->getDriverContext())); + m_drivers.push_back(new CDriverTMSiRefa32B(m_acquisitionServer->getDriverContext())); +#endif +#if defined TARGET_HAS_ThirdPartyThinkGearAPI + m_drivers.push_back(new CDriverNeuroskyMindset(m_acquisitionServer->getDriverContext())); +#endif +#if defined TARGET_HAS_ThirdPartyTMSi + m_drivers.push_back(new CDriverTMSi(m_acquisitionServer->getDriverContext())); +#endif +#if defined TARGET_HAS_ThirdPartyUSBFirstAmpAPI + m_drivers.push_back(new CDriverBrainProductsVAmp(m_acquisitionServer->getDriverContext())); +#endif +#if defined TARGET_HAS_ThirdPartyLSL + m_drivers.push_back(new CDriverLabStreamingLayer(m_acquisitionServer->getDriverContext())); +#endif + + // BEGIN MENSIA ACQUISITION DRIVERS +#if defined TARGET_OS_Windows && defined TARGET_HasMensiaAcquisitionDriver + + m_acquisitionServer->getDriverContext().getLogManager() << Kernel::LogLevel_Trace << "Loading Mensia Driver Collection\n"; + m_libMensia = nullptr; + const std::string path = m_acquisitionServer->getDriverContext().getConfigurationManager().expand("${Path_Bin}/openvibe-driver-mensia-acquisition.dll"). + toASCIIString(); + if (!std::ifstream(path).is_open()) { + m_acquisitionServer->getDriverContext().getLogManager() << Kernel::LogLevel_Trace << "Couldn't open dll file [" + << path << "], perhaps it was not installed.\n"; + } + else { + m_libMensia = System::WindowsUtilities::utf16CompliantLoadLibrary(path.c_str()); + HINSTANCE libModule = HINSTANCE(m_libMensia); + + //if it can't be open return FALSE; + if (libModule == nullptr) { + m_acquisitionServer->getDriverContext().getLogManager() << Kernel::LogLevel_Warning << "Couldn't load DLL: [" + << path << "]. Got error: [" << size_t(GetLastError()) << "]\n"; + } + else { + typedef int (*initialize_mensia_library_t)(); + const initialize_mensia_library_t initLibrary = initialize_mensia_library_t(GetProcAddress(libModule, "initializeAcquisitionLibrary")); + typedef const char* (*get_driver_id_t)(size_t driverId); + const get_driver_id_t getDriverID = get_driver_id_t(GetProcAddress(libModule, "getDriverId")); + + const int nDevice = initLibrary(); + if (nDevice >= 0) { + for (size_t i = 0; i < size_t(nDevice); i++) { + char id[1024]; + + strcpy(id, getDriverID(i)); + if (strcmp(id, "") != 0) { + m_acquisitionServer->getDriverContext().getLogManager() << Kernel::LogLevel_Info << "Found driver [" + << id << "] in Mensia Driver Collection\n"; + m_drivers.push_back(new CDriverMensiaAcquisition(m_acquisitionServer->getDriverContext(), id)); + } + } + } + else { + m_acquisitionServer->getDriverContext().getLogManager() << Kernel::LogLevel_Error + << "Error occurred while initializing Mensia Acquisition Library\n"; + } + + FreeLibrary(libModule); + } + } +#endif + // END MENSIA ACQUISITION DRIVERS + +#if defined TARGET_HAS_OpenViBEContributions + Contributions::InitiateContributions(this, m_acquisitionServer, ctx, &m_drivers); +#endif + + // Plugins that just send out data must be the last in list (since other plugins may modify the data) + +#if defined TARGET_HAS_ThirdPartyLSL + registerPlugin(new Plugins::CPluginLSLOutput(ctx)); +#endif + + registerPlugin(new Plugins::CPluginFiddler(ctx)); + + std::sort(m_drivers.begin(), m_drivers.end(), compare_driver_names); + + scanPluginSettings(); + + m_acquisitionServerThread = new CAcquisitionServerThread(m_kernelCtx, *this, *m_acquisitionServer); + + // Initialize GTK objects as the thread started below may refer to them quickly + this->initialize(); + + m_thread = new std::thread(CAcquisitionServerThreadHandle(*m_acquisitionServerThread)); +} + +CAcquisitionServerGUI::~CAcquisitionServerGUI() +{ + m_acquisitionServerThread->terminate(); + m_thread->join(); + + savePluginSettings(); + + // Saves current configuration + FILE* file = fopen(m_kernelCtx.getConfigurationManager().expand("${Path_UserData}/openvibe-acquisition-server.conf").toASCIIString(), "wt"); + if (file) { + fprintf(file, "# This file is generated\n"); + fprintf(file, "# Do not modify\n"); + fprintf(file, "\n"); + fprintf(file, "# Last settings set in the acquisition server\n"); + fprintf(file, "AcquisitionServer_LastDriver = %s\n", m_Driver->getName()); + fprintf(file, "AcquisitionServer_LastSampleCountPerBuffer = %i\n", this->getSampleCountPerBuffer()); + fprintf(file, "AcquisitionServer_LastConnectionPort = %i\n", this->getTCPPort()); + fprintf(file, "# Last Preferences set in the acquisition server\n"); + fprintf(file, "AcquisitionServer_DriftCorrectionPolicy = %s\n", m_acquisitionServer->m_DriftCorrection.getDriftCorrectionPolicyStr().toASCIIString()); + fprintf(file, "AcquisitionServer_JitterEstimationCountForDrift = %u\n", + uint32_t(m_acquisitionServer->m_DriftCorrection.getJitterEstimationCountForDrift())); + fprintf(file, "AcquisitionServer_DriftToleranceDuration = %u\n", uint32_t(m_acquisitionServer->m_DriftCorrection.getDriftToleranceDurationMs())); + fprintf(file, "AcquisitionServer_OverSamplingFactor = %u\n", uint32_t(m_acquisitionServer->getOversamplingFactor())); + fprintf(file, "AcquisitionServer_ChannelSelection = %s\n", (m_acquisitionServer->isChannelSelectionRequested() ? "True" : "False")); + fprintf(file, "AcquisitionServer_NaNReplacementPolicy = %s\n", toString(m_acquisitionServer->getNaNReplacementPolicy()).c_str()); + + fprintf(file, "# Settings for various device drivers\n"); + std::vector<std::string> tokens; + Kernel::IConfigurationManager* configMgr = &m_kernelCtx.getConfigurationManager(); + CIdentifier tokenID; // defaults to CIdentifier::undefined() + // Collect token names + while ((tokenID = configMgr->getNextConfigurationTokenIdentifier(tokenID)) != CIdentifier::undefined()) { + const std::string prefix("AcquisitionServer_Driver_"); + const std::string prefix2("AcquisitionServer_Plugin_"); + CString tokenName = configMgr->getConfigurationTokenName(tokenID); + if (std::string(tokenName.toASCIIString()).compare(0, prefix.length(), prefix) == 0 + || std::string(tokenName.toASCIIString()).compare(0, prefix.length(), prefix2) == 0) { + std::string token = std::string(tokenName.toASCIIString()); + tokens.push_back(token); + } + } + std::sort(tokens.begin(), tokens.end()); + // Write out as sorted + for (size_t i = 0; i < tokens.size(); ++i) { + CString tokenValue = configMgr->lookUpConfigurationTokenValue(tokens[i].c_str()); + fprintf(file, "%s = %s\n", tokens[i].c_str(), tokenValue.toASCIIString()); + } + + fclose(file); + } + + for (auto it = m_drivers.begin(); it != m_drivers.end(); ++it) { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "Deleting " << (*it)->getName() << "\n"; + delete (*it); + } + + m_drivers.clear(); + m_Driver = nullptr; + + // BEGIN MENSIA ACQUISITION DRIVERS + // For future implementation +#if defined TARGET_OS_Windows && defined TARGET_HasMensiaAcquisitionDriver + typedef int (*release_mensia_library_t)(); + release_mensia_library_t fpReleaseMensiaLibrary = release_mensia_library_t(GetProcAddress(HINSTANCE(m_libMensia), "releaseAcquisitionLibrary")); + // fpReleaseMensiaLibrary(); +#endif + // END MENSIA ACQUISITION DRIVERS + + delete m_thread; + m_thread = nullptr; + + delete m_acquisitionServerThread; + m_acquisitionServerThread = nullptr; + + delete m_acquisitionServer; + m_acquisitionServer = nullptr; +} + +//___________________________________________________________________// +// // + +bool CAcquisitionServerGUI::initialize() +{ + m_builder = gtk_builder_new(); // glade_xml_new(OVAS_GUI_File, nullptr, nullptr); + gtk_builder_add_from_file(m_builder, OVAS_GUI_File, nullptr); + + // Connects custom GTK signals + + // Note: Seems the signals below have to be "clicked", not "pressed", or the underlined keyboard shortcuts + // of gtk stock items that can be activated with alt key ("mnemonics") do not work. + g_signal_connect(gtk_builder_get_object(m_builder, "button_preference"), "clicked", G_CALLBACK(PreferencePressedCB), this); + g_signal_connect(gtk_builder_get_object(m_builder, "button_configure"), "clicked", G_CALLBACK(ConfigurePressedCB), this); + g_signal_connect(gtk_builder_get_object(m_builder, "togglebutton_connect"), "toggled", G_CALLBACK(ConnectToggledCB), this); + g_signal_connect(gtk_builder_get_object(m_builder, "button_play"), "clicked", G_CALLBACK(StartPressedCB), this); + g_signal_connect(gtk_builder_get_object(m_builder, "button_stop"), "clicked", G_CALLBACK(StopPressedCB), this); + g_signal_connect(gtk_builder_get_object(m_builder, "combobox_driver"), "changed", G_CALLBACK(DriverChangedCB), this); + g_signal_connect(gtk_builder_get_object(m_builder, "combobox_sample_count_per_sent_block"), "changed", G_CALLBACK(SampleCountPerSentBlockChangedCB), this); + gtk_builder_connect_signals(m_builder, nullptr); + + GtkComboBox* comboBoxDriver = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_driver")); + + enum { Resource_StringMarkup }; + + // Prepares drivers combo box + + gtk_combo_box_set_model(comboBoxDriver, nullptr); + + GtkCellRenderer* cellRendererName = gtk_cell_renderer_text_new(); + + gtk_cell_layout_clear(GTK_CELL_LAYOUT(comboBoxDriver)); + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(comboBoxDriver), cellRendererName, TRUE); + gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(comboBoxDriver), cellRendererName, "markup", Resource_StringMarkup); + + GtkTreeStore* driverTreeStore = gtk_tree_store_new(1, G_TYPE_STRING); + gtk_combo_box_set_model(comboBoxDriver, GTK_TREE_MODEL(driverTreeStore)); + + std::string defaultDriverName = m_kernelCtx.getConfigurationManager().expand("${AcquisitionServer_DefaultDriver}").toASCIIString(); + transform(defaultDriverName.begin(), defaultDriverName.end(), defaultDriverName.begin(), to_lower<std::string::value_type>); + for (size_t i = 0; i < m_drivers.size(); ++i) // n.b. dont use iterator here as we need a numeric index for gtk later anyway + { + IDriver* driver = m_drivers[i]; + + GtkTreeIter it; + gtk_tree_store_append(driverTreeStore, &it, nullptr); + + std::string name = driver->getName(); + + const bool unstable = driver->isFlagSet(EDriverFlag::IsUnstable); + const bool deprecated = driver->isFlagSet(EDriverFlag::IsDeprecated); + + const std::string toDisplay = std::string((unstable || deprecated) ? "<span foreground=\"#6f6f6f\">" : "") + name + + ((unstable || deprecated) ? "</span>" : "") + + (unstable ? " <span size=\"smaller\" style=\"italic\">(<span foreground=\"#202060\">unstable</span>)</span>" : "") + + (deprecated ? " <span size=\"smaller\" style=\"italic\">(<span foreground=\"#602020\">deprecated</span>)</span>" : ""); + + gtk_tree_store_set(driverTreeStore, &it, Resource_StringMarkup, toDisplay.c_str(), -1); + + transform(name.begin(), name.end(), name.begin(), to_lower<std::string::value_type>); + if (defaultDriverName == name) { gtk_combo_box_set_active(comboBoxDriver, gint(i)); } + } + if (gtk_combo_box_get_active(comboBoxDriver) == -1) { gtk_combo_box_set_active(comboBoxDriver, 0); } + + // Prepares sample count per buffer combo box + + bool found = false; + const std::string nSamplePerBuffer = m_kernelCtx.getConfigurationManager().expand("${AcquisitionServer_DefaultSampleCountPerBuffer}").toASCIIString(); + GtkComboBox* boxNSamplePerBuffer = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_sample_count_per_sent_block")); + for (int i = 0; ; ++i) { + gtk_combo_box_set_active(boxNSamplePerBuffer, i); + if (gtk_combo_box_get_active(boxNSamplePerBuffer) == -1) { break; } + if (nSamplePerBuffer == gtk_combo_box_get_active_text(boxNSamplePerBuffer)) { + found = true; + break; + } + } + if (!found) { + if (nSamplePerBuffer != "-1") { gtk_combo_box_prepend_text(boxNSamplePerBuffer, nSamplePerBuffer.c_str()); } + gtk_combo_box_set_active(boxNSamplePerBuffer, 0); + } + + // Prepares default connection port + + GtkSpinButton* buttonConnectionPort = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_connection_port")); + gtk_spin_button_update(buttonConnectionPort); + const uint64_t connectionPort = m_kernelCtx.getConfigurationManager().expandAsUInteger("${AcquisitionServer_DefaultConnectionPort}", 1024); + gtk_spin_button_set_value(buttonConnectionPort, gdouble(connectionPort)); + + // Optionnally autostarts + + if (m_kernelCtx.getConfigurationManager().expandAsBoolean("${AcquisitionServer_AutoStart}", false)) { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "togglebutton_connect")), TRUE); + gtk_button_pressed(GTK_BUTTON(gtk_builder_get_object(m_builder, "button_play"))); + } + + + // Shows main window + if (!m_kernelCtx.getConfigurationManager().expandAsBoolean("${AcquisitionServer_NoGUI}", false)) { + GtkWidget* mainWindow = GTK_WIDGET(gtk_builder_get_object(m_builder, "openvibe-acquisition-server")); + + std::string title(gtk_window_get_title(GTK_WINDOW(mainWindow))); +#if defined(TARGET_ARCHITECTURE_x64) + title += " (64bit)"; +#else + title += " (32bit)"; +#endif + gtk_window_set_title(GTK_WINDOW(mainWindow), title.c_str()); + + gtk_widget_show(mainWindow); + } + + return true; +} + +//___________________________________________________________________// +// // + +uint32_t CAcquisitionServerGUI::getTCPPort() const +{ + GtkSpinButton* button = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_connection_port")); + gtk_spin_button_update(button); + return gtk_spin_button_get_value_as_int(button); +} + +void CAcquisitionServerGUI::setClientText(const char* sClientText) const +{ + gtk_label_set_label(GTK_LABEL(gtk_builder_get_object(m_builder, "label_connected_host_count")), sClientText); +} + +void CAcquisitionServerGUI::setStateText(const char* sStateText) const +{ + gtk_label_set_label(GTK_LABEL(gtk_builder_get_object(m_builder, "label_status")), sStateText); +} + +void CAcquisitionServerGUI::setDriftMs(const double ms) const +{ + const uint64_t driftTolerance = m_acquisitionServer->m_DriftCorrection.getDriftToleranceDurationMs(); + double driftRatio = ms / double(driftTolerance); + bool driftWarning = false; + char label[1024]; + +#ifdef TIMINGDEBUG + std::cout << "GUI drift " << ms << " rat " << driftRatio << "\n"; +#endif + + if (driftRatio < -1) { + driftRatio = -1; + driftWarning = true; + } + + if (driftRatio > 1) { + driftRatio = 1; + driftWarning = true; + } + + if (driftRatio < 0) { + gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(gtk_builder_get_object(m_builder, "progressbar_drift_1")), -driftRatio); + gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(gtk_builder_get_object(m_builder, "progressbar_drift_2")), 0); + } + else { + gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(gtk_builder_get_object(m_builder, "progressbar_drift_1")), 0); + gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(gtk_builder_get_object(m_builder, "progressbar_drift_2")), driftRatio); + } + + if (driftWarning) { + sprintf(label, "<b>Device drift is too high</b> : %3.2lf ms\n<small>late <-- (tolerance is set to %u ms) --> early</small>", ms, + uint32_t(driftTolerance)); + } + else { sprintf(label, "Device drift : %3.2lf ms\n<small>late <-- (tolerance is set to %u ms) --> early</small>", ms, uint32_t(driftTolerance)); } + gtk_label_set_markup(GTK_LABEL(gtk_builder_get_object(m_builder, "label_drift")), label); +} + +void CAcquisitionServerGUI::setImpedance(const uint32_t index, const double impedance) +{ + if (m_impedanceWindow) { + if (impedance >= 0) { + //double fraction = (impedance*.001/20); With fixed impedance limit, 20kOhm max / 25%=5kOhm to be good + double fraction = (impedance / (m_kernelCtx.getConfigurationManager().expandAsFloat("${AcquisitionServer_DefaultImpedanceLimit}", 5000) * 4)); + if (fraction > 1) { fraction = 1; } + + char msg[1024]; + char label[1024]; + char sImpedance[1024]; + char status[1024]; + + if (strcmp(m_headerCopy.getChannelName(index), "")) { strcpy(label, m_headerCopy.getChannelName(index)); } + else { sprintf(label, "Channel %i", index + 1); } + + if (fraction == 1) { sprintf(sImpedance, "Too high !"); } + else { sprintf(sImpedance, "%.2f kOhm", impedance * .001); } + + sprintf(status, "%s", fraction < .25 ? "Good !" : "Bad..."); + sprintf(msg, "%s\n%s\n\n%s", label, sImpedance, status); + + gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(m_levelMesures[index]), fraction); + gtk_progress_bar_set_text(GTK_PROGRESS_BAR(m_levelMesures[index]), msg); + } + else { + gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(m_levelMesures[index]), 0); + if (impedance == OVAS_Impedance_Unknown) { gtk_progress_bar_set_text(GTK_PROGRESS_BAR(m_levelMesures[index]), "Measuring..."); } + else if (impedance == OVAS_Impedance_NotAvailable) { gtk_progress_bar_set_text(GTK_PROGRESS_BAR(m_levelMesures[index]), "n/a"); } + else { gtk_progress_bar_set_text(GTK_PROGRESS_BAR(m_levelMesures[index]), "Unknown"); } + } + } +} + +void CAcquisitionServerGUI::disconnect() const +{ + GtkToggleButton* button = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "togglebutton_connect")); + if (gtk_toggle_button_get_active(button)) { gtk_toggle_button_set_active(button, false); } +} + +//___________________________________________________________________// +// // + +void CAcquisitionServerGUI::buttonConnectToggledCB(GtkToggleButton* button) +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "buttonConnectToggledCB\n"; + + if (gtk_toggle_button_get_active(button)) { + if (m_nSamplePerBuffer != uint32_t(-1) && m_acquisitionServerThread->connect()) { + // Impedance window creation + { + const uint64_t nCol = m_kernelCtx.getConfigurationManager().expandAsInteger("${AcquisitionServer_CheckImpedance_ColumnCount}", 8); + const size_t nRow = size_t(m_headerCopy.getChannelCount() / nCol); + const size_t lastCount = size_t(m_headerCopy.getChannelCount() % nCol); + + GtkWidget* table = gtk_table_new(gint(nRow + (lastCount ? 1 : 0)), gint((nRow ? nCol : lastCount)), true); + + for (size_t i = 0; i < m_headerCopy.getChannelCount(); ++i) { + const uint32_t j = uint32_t(i / nCol); + const uint32_t k = uint32_t(i % nCol); + GtkWidget* progressBar = gtk_progress_bar_new(); + gtk_progress_bar_set_orientation(GTK_PROGRESS_BAR(progressBar), GTK_PROGRESS_BOTTOM_TO_TOP); + gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progressBar), 0); + gtk_progress_bar_set_text(GTK_PROGRESS_BAR(progressBar), "n/a"); + gtk_table_attach_defaults(GTK_TABLE(table), progressBar, k, k + 1, j, j + 1); + m_levelMesures.push_back(progressBar); + } + + m_impedanceWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_title(GTK_WINDOW(m_impedanceWindow), "Impedance check"); + gtk_container_add(GTK_CONTAINER(m_impedanceWindow), table); + if (m_acquisitionServer->isImpedanceCheckRequested()) { gtk_widget_show_all(m_impedanceWindow); } + } + + gtk_button_set_label(GTK_BUTTON(button), "gtk-disconnect"); + + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_configure")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_preference")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_play")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_stop")), false); + + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "spinbutton_connection_port")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_sample_count_per_sent_block")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_driver")), false); + } + else { + if (m_nSamplePerBuffer == uint32_t(-1)) { m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Sample count per sent block is invalid.\n"; } + + gtk_toggle_button_set_active(button, false); + } + } + else { + m_acquisitionServerThread->disconnect(); + + if (m_impedanceWindow) { + gtk_widget_destroy(m_impedanceWindow); + m_levelMesures.clear(); + m_impedanceWindow = nullptr; + } + + gtk_button_set_label(GTK_BUTTON(button), "gtk-connect"); + + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_configure")), m_Driver->isConfigurable()); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_preference")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_play")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_stop")), false); + + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "spinbutton_connection_port")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_sample_count_per_sent_block")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_driver")), true); + + setClientText(""); + } +} + +void CAcquisitionServerGUI::buttonStartPressedCB(GtkButton* /*button*/) +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "buttonStartPressedCB\n"; + + if (m_acquisitionServerThread->start()) { + if (m_impedanceWindow) { gtk_widget_hide(m_impedanceWindow); } + + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_play")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_stop")), true); + + setStateText("Starting..."); + } + else { + setStateText("Start failed !"); + setClientText(""); + } +} + +void CAcquisitionServerGUI::buttonStopPressedCB(GtkButton* /*button*/) +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "buttonStopPressedCB\n"; + + if (m_acquisitionServerThread->stop()) { + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_play")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_stop")), false); + } + else { + setStateText("Stop failed !"); + setClientText(""); + } +} + +void CAcquisitionServerGUI::buttonPreferencePressedCB(GtkButton* /*button*/) +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "buttonPreferencePressedCB\n"; + + GtkBuilder* builder = gtk_builder_new(); + gtk_builder_add_from_file(builder, OVAS_GUI_File, nullptr); + GtkDialog* dialog = GTK_DIALOG(gtk_builder_get_object(builder, "openvibe-acquisition-server-configuration")); + GtkComboBox* driftCorrectionPolicy = GTK_COMBO_BOX(gtk_builder_get_object(builder, "combobox_drift_correction")); + GtkComboBox* naNReplacementPolicy = GTK_COMBO_BOX(gtk_builder_get_object(builder, "combobox_nan_replacement")); + GtkSpinButton* driftTolerance = GTK_SPIN_BUTTON(gtk_builder_get_object(builder, "spinbutton_drift_tolerance")); + GtkSpinButton* jitterMeasureCount = GTK_SPIN_BUTTON(gtk_builder_get_object(builder, "spinbutton_jitter_measure_count")); + GtkSpinButton* overSamplingFactor = GTK_SPIN_BUTTON(gtk_builder_get_object(builder, "spinbutton_oversampling_factor")); + GtkToggleButton* channelSelection = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "checkbutton_channel_selection")); + + gtk_combo_box_set_active(driftCorrectionPolicy, int(m_acquisitionServer->m_DriftCorrection.getDriftCorrectionPolicy())); + gtk_spin_button_set_value(driftTolerance, gdouble(m_acquisitionServer->m_DriftCorrection.getDriftToleranceDurationMs())); + gtk_spin_button_set_value(jitterMeasureCount, gdouble(m_acquisitionServer->m_DriftCorrection.getJitterEstimationCountForDrift())); + gtk_spin_button_set_value(overSamplingFactor, gdouble(m_acquisitionServer->getOversamplingFactor())); + gtk_toggle_button_set_active(channelSelection, m_acquisitionServer->isChannelSelectionRequested() ? TRUE : FALSE); + gtk_combo_box_set_active(naNReplacementPolicy, int(m_acquisitionServer->getNaNReplacementPolicy())); + + // Load the settings for the plugins + + GtkTable* settingsTable = GTK_TABLE(gtk_builder_get_object(builder, "table-pluginsettings")); + + gtk_table_resize(settingsTable, guint(m_PluginsProperties.size()), 2); + + for (size_t i = 0; i < m_PluginsProperties.size(); ++i) { + Property* property = m_PluginsProperties[i].m_Property; + + // Create the setting controller widget + GtkWidget* settingControl; + + if (const TypedProperty<bool>* rb = dynamic_cast<const TypedProperty<bool>*>(property)) { + // std::cout << "bool\n"; + settingControl = gtk_check_button_new(); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(settingControl), *(rb->getData())); + } + else if (const TypedProperty<CString>* rcs = dynamic_cast<const TypedProperty<CString>*>(property)) { + // std::cout << "string\n"; + settingControl = gtk_entry_new(); + gtk_entry_append_text(GTK_ENTRY(settingControl), rcs->getData()->toASCIIString()); + } + else if (const TypedProperty<std::string>* rs = dynamic_cast<const TypedProperty<std::string>*>(property)) { + // std::cout << "string\n"; + settingControl = gtk_entry_new(); + gtk_entry_append_text(GTK_ENTRY(settingControl), rs->getData()->c_str()); + } + else if (const TypedProperty<uint32_t>* ru32 = dynamic_cast<const TypedProperty<uint32_t>*>(property)) { + // std::cout << "uinteger\n"; + settingControl = gtk_spin_button_new_with_range(gdouble(std::numeric_limits<uint32_t>::min()), gdouble(std::numeric_limits<uint32_t>::max()), 1.0); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(settingControl), gdouble(*(ru32->getData()))); + } + else if (const TypedProperty<uint64_t>* ru64 = dynamic_cast<const TypedProperty<uint64_t>*>(property)) { + // std::cout << "uinteger\n"; + settingControl = gtk_spin_button_new_with_range(gdouble(std::numeric_limits<uint64_t>::min()), gdouble(std::numeric_limits<uint64_t>::max()), 1.0); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(settingControl), gdouble(*(ru64->getData()))); + } + else if (const TypedProperty<int64_t>* ri = dynamic_cast<const TypedProperty<int64_t>*>(property)) { + // std::cout << "integer\n"; + settingControl = gtk_spin_button_new_with_range(gdouble(std::numeric_limits<int64_t>::min()), gdouble(std::numeric_limits<int64_t>::max()), 1.0); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(settingControl), gdouble(*(ri->getData()))); + } + else if (const TypedProperty<float>* rf = dynamic_cast<const TypedProperty<float>*>(property)) { + // std::cout << "float\n"; + settingControl = gtk_spin_button_new_with_range(gdouble(std::numeric_limits<float>::min()), gdouble(std::numeric_limits<float>::max()), 1.0); + gtk_spin_button_set_digits(GTK_SPIN_BUTTON(settingControl), 5); + gtk_spin_button_set_increments(GTK_SPIN_BUTTON(settingControl), 0.1, 1.0); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(settingControl), gdouble(*(rf->getData()))); + } + else { + // std::cout << "unknown\n"; + settingControl = gtk_label_new("Undefined Type"); + } + + if (settingControl) { + // Create label + GtkWidget* settingLabel = gtk_label_new(property->getName().toASCIIString()); + + // align to left + gtk_misc_set_alignment(GTK_MISC(settingLabel), 0.0, 0.0); + + // insert the settings into the table + gtk_table_attach(settingsTable, settingLabel, 0, 1, guint(i), guint(i + 1), GTK_FILL, GTK_SHRINK, 2, 0); + gtk_table_attach_defaults(settingsTable, settingControl, 1, 2, guint(i), guint(i + 1)); + + m_PluginsProperties[i].m_Widget = settingControl; + gtk_widget_show(settingLabel); + gtk_widget_show(settingControl); + } + } + + const gint responseId = gtk_dialog_run(dialog); + switch (responseId) { + case GTK_RESPONSE_APPLY: + case GTK_RESPONSE_OK: + case GTK_RESPONSE_YES: + m_acquisitionServer->setNaNReplacementPolicy(ENaNReplacementPolicy(gtk_combo_box_get_active(naNReplacementPolicy))); + m_acquisitionServer->m_DriftCorrection.setDriftCorrectionPolicy(EDriftCorrectionPolicies(gtk_combo_box_get_active(driftCorrectionPolicy))); + m_acquisitionServer->m_DriftCorrection.setDriftToleranceDurationMs(gtk_spin_button_get_value_as_int(driftTolerance)); + m_acquisitionServer->m_DriftCorrection.setJitterEstimationCountForDrift(gtk_spin_button_get_value_as_int(jitterMeasureCount)); + m_acquisitionServer->setOversamplingFactor(gtk_spin_button_get_value_as_int(overSamplingFactor)); + m_acquisitionServer->setChannelSelectionRequest(gtk_toggle_button_get_active(channelSelection) ? true : false); + + // Side-effect: Update the tolerance ms + setDriftMs(0); + + for (size_t index = 0; index < m_PluginsProperties.size(); ++index) { + Property* property = m_PluginsProperties[index].m_Property; + + if (TypedProperty<bool>* rb = dynamic_cast<TypedProperty<bool>*>(property)) { + // std::cout << "bool\n"; + bool tmp = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_PluginsProperties[index].m_Widget)) ? true : false; + rb->replaceData(tmp); + } + else if (TypedProperty<CString>* rcs = dynamic_cast<TypedProperty<CString>*>(property)) { + CString tmp = CString(gtk_entry_get_text(GTK_ENTRY(m_PluginsProperties[index].m_Widget))); + // std::cout << "string: " << tmp.toASCIIString() << "\n"; + rcs->replaceData(tmp); + } + else if (TypedProperty<std::string>* rs = dynamic_cast<TypedProperty<std::string>*>(property)) { + std::string tmp = std::string(gtk_entry_get_text(GTK_ENTRY(m_PluginsProperties[index].m_Widget))); + // std::cout << "string: " << tmp.toASCIIString() << "\n"; + rs->replaceData(tmp); + } + else if (TypedProperty<int64_t>* ri = dynamic_cast<TypedProperty<int64_t>*>(property)) { + // std::cout << "integer\n"; + GtkSpinButton* spinButton = GTK_SPIN_BUTTON(m_PluginsProperties[index].m_Widget); + gtk_spin_button_update(spinButton); + int64_t tmp = int64_t(gtk_spin_button_get_value(spinButton)); + ri->replaceData(tmp); + } + else if (TypedProperty<uint32_t>* ru32 = dynamic_cast<TypedProperty<uint32_t>*>(property)) { + // std::cout << "uinteger\n"; + GtkSpinButton* spinButton = GTK_SPIN_BUTTON(m_PluginsProperties[index].m_Widget); + gtk_spin_button_update(spinButton); + uint32_t tmp = uint32_t(gtk_spin_button_get_value(spinButton)); + ru32->replaceData(tmp); + } + else if (TypedProperty<uint64_t>* ru64 = dynamic_cast<TypedProperty<uint64_t>*>(property)) { + // std::cout << "uinteger\n"; + GtkSpinButton* spinButton = GTK_SPIN_BUTTON(m_PluginsProperties[index].m_Widget); + gtk_spin_button_update(spinButton); + uint64_t tmp = uint64_t(gtk_spin_button_get_value(spinButton)); + ru64->replaceData(tmp); + } + else if (TypedProperty<float>* rf = dynamic_cast<TypedProperty<float>*>(property)) { + // std::cout << "float\n"; + GtkSpinButton* spinButton = GTK_SPIN_BUTTON(m_PluginsProperties[index].m_Widget); + gtk_spin_button_update(spinButton); + float tmp = float(gtk_spin_button_get_value(spinButton)); + rf->replaceData(tmp); + } + else { } // std::cout << "unknown\n"; + } + + + break; + case GTK_RESPONSE_CANCEL: + case GTK_RESPONSE_NO: break; + default: break; + } + + gtk_widget_destroy(GTK_WIDGET(dialog)); + g_object_unref(builder); +} + +void CAcquisitionServerGUI::buttonConfigurePressedCB(GtkButton* /*button*/) +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "buttonConfigurePressedCB\n"; + if (m_Driver->isConfigurable()) { m_Driver->configure(); } +} + +void CAcquisitionServerGUI::comboBoxDriverChanged(GtkComboBox* box) +{ + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "comboBoxDriverChanged\n"; + m_Driver = m_drivers[gtk_combo_box_get_active(box)]; + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_configure")), m_Driver->isConfigurable()); +} + +void CAcquisitionServerGUI::comboBoxSampleCountPerSentBlockChanged(GtkComboBox* /*box*/) +{ + int nSamplePerSentBlock = 0; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << "comboBoxSampleCountPerSentBlockChanged\n"; + if (sscanf(gtk_combo_box_get_active_text(GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_sample_count_per_sent_block"))), "%i", + &nSamplePerSentBlock) == 1 && nSamplePerSentBlock > 0) { m_nSamplePerBuffer = uint32_t(nSamplePerSentBlock); } + else { m_nSamplePerBuffer = uint32_t(-1); } +} + +void CAcquisitionServerGUI::registerPlugin(IAcquisitionServerPlugin* plugin) const +{ + if (m_acquisitionServer != nullptr) { m_acquisitionServer->m_Plugins.push_back(plugin); } +} + +/** + * \brief This function scans all registered plugins for settings. + * + * All of the plugins are inserted into a vector containing the pointer to the actual settings structure + * along with a unique name for settings. + */ +void CAcquisitionServerGUI::scanPluginSettings() +{ + std::vector<IAcquisitionServerPlugin*> plugins = m_acquisitionServer->getPlugins(); + + m_PluginsProperties.clear(); + + for (auto itp = plugins.begin(); itp != plugins.end(); ++itp) { + IAcquisitionServerPlugin* plugin = dynamic_cast<IAcquisitionServerPlugin*>(*itp); + + SettingsHelper& tmp = plugin->getSettingsHelper(); + const std::map<CString, Property*>& props = tmp.getAllProperties(); + + for (auto it = props.begin(); it != props.end(); ++it) { m_PluginsProperties.push_back(PropertyAndWidget(it->second, nullptr)); } + } +} + +void CAcquisitionServerGUI::savePluginSettings() const +{ + std::vector<IAcquisitionServerPlugin*> plugins = m_acquisitionServer->getPlugins(); + + for (auto itp = plugins.begin(); itp != plugins.end(); ++itp) { + IAcquisitionServerPlugin* plugin = dynamic_cast<IAcquisitionServerPlugin*>(*itp); + SettingsHelper& tmp = plugin->getSettingsHelper(); + tmp.save(); + } +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASCore/ovasCAcquisitionServerGUI.h b/applications/platform/acquisition-server/src/OVASCore/ovasCAcquisitionServerGUI.h new file mode 100644 index 0000000000000000000000000000000000000000..a4955687241f8ca7d7314a91d6e82b63ba370339 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASCore/ovasCAcquisitionServerGUI.h @@ -0,0 +1,91 @@ +#pragma once + +#include "ovas_base.h" +#include "ovasIDriver.h" +#include "ovasIHeader.h" +#include "ovasCHeader.h" + +#include <thread> + +#include <gtk/gtk.h> + +namespace OpenViBE { +namespace AcquisitionServer { +class CAcquisitionServer; +class CAcquisitionServerThread; +class IAcquisitionServerPlugin; +struct PluginSetting; +class Property; + +class CAcquisitionServerGUI final +{ +public: + explicit CAcquisitionServerGUI(const Kernel::IKernelContext& ctx); + ~CAcquisitionServerGUI(); + + bool initialize(); + + IDriver& getDriver() const { return *m_Driver; } + uint32_t getSampleCountPerBuffer() { return m_nSamplePerBuffer; } + uint32_t getTCPPort() const; + IHeader& getHeaderCopy() { return m_headerCopy; } + + void setStateText(const char* sStateText) const; + void setClientText(const char* sClientText) const; + void setDriftMs(double ms) const; + void setImpedance(uint32_t index, double impedance); + void disconnect() const; + + // GTK button callbacks + void buttonPreferencePressedCB(GtkButton* button); + void buttonConfigurePressedCB(GtkButton* button); + void buttonConnectToggledCB(GtkToggleButton* button); + void buttonStartPressedCB(GtkButton* button); + void buttonStopPressedCB(GtkButton* button); + void comboBoxDriverChanged(GtkComboBox* box); + void comboBoxSampleCountPerSentBlockChanged(GtkComboBox* box); + + /// registers a new acquisition server plugin, the plugin is activated immediately + void registerPlugin(IAcquisitionServerPlugin* plugin) const; + + /// scans all plugins for settings and puts them into a flat structure easier to handle + void scanPluginSettings(); + + void savePluginSettings() const; + + class PropertyAndWidget + { + public: + PropertyAndWidget(Property* prop, GtkWidget* widget) : m_Property(prop), m_Widget(widget) { } + + Property* m_Property = nullptr; + GtkWidget* m_Widget = nullptr; + }; + + /// holds references to the plugins' settings for faster access + std::vector<PropertyAndWidget> m_PluginsProperties; + +protected : + const Kernel::IKernelContext& m_kernelCtx; + IDriver* m_Driver = nullptr; + IDriverContext* m_driverCtx = nullptr; + CAcquisitionServer* m_acquisitionServer = nullptr; + CAcquisitionServerThread* m_acquisitionServerThread = nullptr; + CHeader m_headerCopy; + + uint32_t m_nSamplePerBuffer = 0; + + std::vector<IDriver*> m_drivers; + + GtkBuilder* m_builder = nullptr; + + GtkWidget* m_impedanceWindow = nullptr; + std::vector<GtkWidget*> m_levelMesures; + + std::thread* m_thread = nullptr; +#if defined TARGET_OS_Windows && defined TARGET_HasMensiaAcquisitionDriver + void* m_libMensia = nullptr; +#endif +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASCore/ovasCAcquisitionServerThread.h b/applications/platform/acquisition-server/src/OVASCore/ovasCAcquisitionServerThread.h new file mode 100644 index 0000000000000000000000000000000000000000..a682aa89e776a506f54108a8266222c4e386dcad --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASCore/ovasCAcquisitionServerThread.h @@ -0,0 +1,277 @@ +#pragma once + +#include "ovasCAcquisitionServerGUI.h" +#include "ovasCAcquisitionServer.h" + +#include <system/ovCTime.h> +#include <cmath> // std::abs() for Fedora + +// fwd declare of gtk idle callbacks +static gboolean idle_updateimpedance_cb(void* data); +static gboolean idle_updatedrift_cb(void* data); +static gboolean idle_updatedisconnect_cb(void* data); +static gboolean idle_updatestatus_cb(void* data); + +namespace OpenViBE { +namespace AcquisitionServer { +class CAcquisitionServerThread +{ +public: + enum class EStatus { Idle, Connected, Started, Finished }; + + CAcquisitionServerThread(const Kernel::IKernelContext& ctx, CAcquisitionServerGUI& gui, CAcquisitionServer& acquisitionServer) + : m_kernelCtx(ctx), m_gui(gui), m_acquisitionServer(acquisitionServer) { } // Always call update on start + + void main() + { + bool finished = false; + uint64_t lastGUIUpdate = 0; + + while (!finished) { + bool shouldSleep = false; + bool shouldDisconnect = false; + size_t clientCount; + double driftMs; + + { + DoubleLock lock(&m_acquisitionServer.m_ProtectionMutex, &m_acquisitionServer.m_ExecutionMutex); + + clientCount = m_acquisitionServer.getClientCount(); + driftMs = (m_status == EStatus::Started ? m_acquisitionServer.m_DriftCorrection.getDriftMs() : 0); + + + switch (m_status) { + case EStatus::Idle: shouldSleep = true; + break; + + case EStatus::Connected: + case EStatus::Started: + { + if (!m_acquisitionServer.loop()) { shouldDisconnect = true; } + else { for (size_t i = 0; i < m_impedances.size(); ++i) { m_impedances[i] = m_acquisitionServer.getImpedance(i); } } + } + break; + + case EStatus::Finished: finished = true; + break; + + default: break; + } + } + + if (!finished) { + if (m_acquisitionServer.isImpedanceCheckRequested()) { + // In the impedance check mode, we need to yield the thread to get reliable redraw + shouldSleep = true; + } + + // Update the GUI if the variables have changed. In order to avoid + // gdk_threads_enter()/gdk_threads_exit() calls that may not work on all + // backends (esp. Windows), delegate the work to g_idle_add() functions. + // As a result, we need to protect access to the variables that the callbacks use; + // this protection is done inside the callbacks. + if (!std::equal(m_impedances.begin(), m_impedances.end(), m_impedancesLast.begin(), + [](const double a, const double b) { return (std::abs(a - b) < 0.01); })) { + m_impedancesLast = m_impedances; + + gdk_threads_add_idle(idle_updateimpedance_cb, static_cast<void*>(this)); + } + + if (m_lastStatus != m_status || clientCount != m_nClient) { + m_lastStatus = m_status; + m_nClient = clientCount; + gdk_threads_add_idle(idle_updatestatus_cb, static_cast<void*>(this)); + } + + if (shouldDisconnect) { gdk_threads_add_idle(idle_updatedisconnect_cb, static_cast<void*>(this)); } + + // update fast changing variables at most every 0.25 sec to avoid hammering the gui + const uint64_t now = System::Time::zgetTime(); + if (now - lastGUIUpdate > (1LL << 32) / 4LL) { + if (std::abs(driftMs - m_lastDriftMs) > 0) { + m_lastDriftMs = driftMs; + + gdk_threads_add_idle(idle_updatedrift_cb, static_cast<void*>(this)); + } + + lastGUIUpdate = now; + } + + if (shouldSleep) { System::Time::sleep(100); } + } + } + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "CAcquisitionServerThread:: thread finished\n"; + } + + bool connect() + { + DoubleLock lock(&m_acquisitionServer.m_ProtectionMutex, &m_acquisitionServer.m_ExecutionMutex); + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "CAcquisitionServerThread::connect()\n"; + + if (!m_acquisitionServer.connect(m_gui.getDriver(), m_gui.getHeaderCopy(), m_gui.getSampleCountPerBuffer(), m_gui.getTCPPort())) { return false; } + m_status = EStatus::Connected; + + { + m_impedances.resize(m_gui.getHeaderCopy().getChannelCount(), OVAS_Impedance_NotAvailable); + m_impedancesLast.resize(m_gui.getHeaderCopy().getChannelCount(), OVAS_Impedance_NotAvailable); + } + return true; + } + + bool start() + { + DoubleLock lock(&m_acquisitionServer.m_ProtectionMutex, &m_acquisitionServer.m_ExecutionMutex); + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "CAcquisitionServerThread::start()\n"; + if (!m_acquisitionServer.start()) { + m_acquisitionServer.stop(); + return false; + } + m_status = EStatus::Started; + return true; + } + + bool stop() + { + DoubleLock lock(&m_acquisitionServer.m_ProtectionMutex, &m_acquisitionServer.m_ExecutionMutex); + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "CAcquisitionServerThread::stop()\n"; + m_acquisitionServer.stop(); + m_status = EStatus::Connected; + return true; + } + + bool disconnect() + { + DoubleLock lock(&m_acquisitionServer.m_ProtectionMutex, &m_acquisitionServer.m_ExecutionMutex); + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "CAcquisitionServerThread::disconnect()\n"; + + if (m_status == EStatus::Started) { m_acquisitionServer.stop(); } + + m_acquisitionServer.disconnect(); + + m_impedances.clear(); + m_impedancesLast.clear(); + + m_status = EStatus::Idle; + return true; + } + + bool terminate() + { + DoubleLock lock(&m_acquisitionServer.m_ProtectionMutex, &m_acquisitionServer.m_ExecutionMutex); + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "CAcquisitionServerThread::terminate()\n"; + + switch (m_status) { + case EStatus::Started: m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "CAcquisitionServerThread::stop()\n"; + m_acquisitionServer.stop(); + case EStatus::Connected: m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "CAcquisitionServerThread::disconnect()\n"; + m_acquisitionServer.disconnect(); + default: break; + } + + m_status = EStatus::Finished; + return true; + } + + // GTK C callbacks call these from the main thread to update the GUI + void updateGUIImpedance() + { + DoubleLock lock(&m_acquisitionServer.m_ProtectionMutex, &m_acquisitionServer.m_ExecutionMutex); + for (size_t i = 0; i < m_impedancesLast.size(); ++i) { m_gui.setImpedance(i, m_impedancesLast[i]); } + } + + void updateGUIDrift() const + { + DoubleLock lock(&m_acquisitionServer.m_ProtectionMutex, &m_acquisitionServer.m_ExecutionMutex); + m_gui.setDriftMs(m_lastDriftMs); + } + + void updateGUIStatus() const + { + DoubleLock lock(&m_acquisitionServer.m_ProtectionMutex, &m_acquisitionServer.m_ExecutionMutex); + + std::string state; + std::string text; + + switch (m_status) { + case EStatus::Started: state = (m_nClient == 0) ? "Receiving..." : "Receiving and sending..."; + text = std::to_string(m_nClient) + " client" + (m_nClient != 1 ? "s" : "") + " connected"; + break; + case EStatus::Idle: state = "Disconnected"; + break; + case EStatus::Connected: state = "Connected to device!"; + text = "Press play to start..."; + break; + default: state = "Unknown"; + break; + } + m_gui.setStateText(state.c_str()); + m_gui.setClientText(text.c_str()); + } + + void updateGUIDisconnect() const + { + DoubleLock lock(&m_acquisitionServer.m_ProtectionMutex, &m_acquisitionServer.m_ExecutionMutex); + m_gui.disconnect(); + } + + /* + uint32_t getStatus() + { + DoubleLock lock(&m_AcquisitionServer.m_ProtectionMutex, &m_AcquisitionServer.m_ExecutionMutex); + return m_status; + } + */ +protected: + const Kernel::IKernelContext& m_kernelCtx; + CAcquisitionServerGUI& m_gui; + CAcquisitionServer& m_acquisitionServer; + EStatus m_status = EStatus::Idle; + EStatus m_lastStatus = EStatus::Idle; + + size_t m_nClient = 0; + double m_lastDriftMs = -1.0; + std::vector<double> m_impedancesLast; + std::vector<double> m_impedances; +}; + +class CAcquisitionServerThreadHandle +{ +public: + explicit CAcquisitionServerThreadHandle(CAcquisitionServerThread& thread) : m_thread(thread) { } + void operator()() const { m_thread.main(); } + +protected: + CAcquisitionServerThread& m_thread; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +static gboolean idle_updateimpedance_cb(void* data) +{ + static_cast<OpenViBE::AcquisitionServer::CAcquisitionServerThread*>(data)->updateGUIImpedance(); + return FALSE; // don't call again +} + +static gboolean idle_updatedrift_cb(void* data) +{ + static_cast<OpenViBE::AcquisitionServer::CAcquisitionServerThread*>(data)->updateGUIDrift(); + return FALSE; // don't call again +} + +static gboolean idle_updatestatus_cb(void* data) +{ + static_cast<OpenViBE::AcquisitionServer::CAcquisitionServerThread*>(data)->updateGUIStatus(); + return FALSE; // don't call again +} + +static gboolean idle_updatedisconnect_cb(void* data) +{ + static_cast<OpenViBE::AcquisitionServer::CAcquisitionServerThread*>(data)->updateGUIDisconnect(); + return FALSE; // don't call again +} diff --git a/applications/platform/acquisition-server/src/OVASCore/ovasCConfigurationBuilder.cpp b/applications/platform/acquisition-server/src/OVASCore/ovasCConfigurationBuilder.cpp new file mode 100644 index 0000000000000000000000000000000000000000..17d548c1280d7b7023bb3e74b97c1fa9ae8ac892 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASCore/ovasCConfigurationBuilder.cpp @@ -0,0 +1,492 @@ +#include "ovasCConfigurationBuilder.h" +#include "ovasIHeader.h" + +#include <toolkit/ovtk_all.h> + +#include <iostream> +#include <fstream> +#include <list> +#include <cstdlib> +#include <cstring> + +#define OVAS_ElectrodeNames_File OpenViBE::Directories::getDataDir() + "/applications/acquisition-server/electrode-names.txt" +#define OVAS_ConfigureGUIElectrodes_File OpenViBE::Directories::getDataDir() + "/applications/acquisition-server/interface-channel-names.ui" + +namespace OpenViBE { +namespace AcquisitionServer { + +static void GTKComboBoxSetActiveText(GtkComboBox* box, const gchar* sActiveText) +{ + GtkTreeModel* treeModel = gtk_combo_box_get_model(box); + GtkTreeIter it; + int index = 0; + gchar* name = nullptr; + if (gtk_tree_model_get_iter_first(treeModel, &it)) { + do { + gtk_tree_model_get(treeModel, &it, 0, &name, -1); + if (std::string(name) == std::string(sActiveText)) { + gtk_combo_box_set_active(box, index); + return; + } + index++; + } while (gtk_tree_model_iter_next(treeModel, &it)); + } +} + +static void button_change_channel_names_cb(GtkButton* /*button*/, void* data) +{ +#if defined _DEBUG_Callbacks_ + std::cout << "button_change_channel_names_cb" << std::endl; +#endif + static_cast<CConfigurationBuilder*>(data)->buttonChangeChannelNamesCB(); +} + +static void button_apply_channel_name_cb(GtkButton* /*button*/, void* data) +{ +#if defined _DEBUG_Callbacks_ + std::cout << "button_apply_channel_name_cb" << std::endl; +#endif + static_cast<CConfigurationBuilder*>(data)->buttonApplyChannelNameCB(); +} + +static void button_remove_channel_name_cb(GtkButton* /*button*/, void* data) +{ +#if defined _DEBUG_Callbacks_ + std::cout << "button_remove_channel_name_cb" << std::endl; +#endif + static_cast<CConfigurationBuilder*>(data)->buttonRemoveChannelNameCB(); +} + +static void treeview_apply_channel_name_cb(GtkTreeView* /*treeview*/, GtkTreePath* /*path*/, GtkTreeViewColumn* /*column*/, void* data) +{ +#if defined _DEBUG_Callbacks_ + std::cout << "treeview_apply_channel_name_cb" << std::endl; +#endif + static_cast<CConfigurationBuilder*>(data)->treeviewApplyChannelNameCB(); +} + +//___________________________________________________________________// +// // + +CConfigurationBuilder::CConfigurationBuilder(const char* gtkBuilderFilename) + : m_gtkBuilderFilename(gtkBuilderFilename ? gtkBuilderFilename : ""), + m_electrodeFilename(OVAS_ElectrodeNames_File), + m_gtkBuilderChannelsFilename(OVAS_ConfigureGUIElectrodes_File) {} + +CConfigurationBuilder::~CConfigurationBuilder() {} + +//___________________________________________________________________// +// // + +bool CConfigurationBuilder::configure(IHeader& header) +{ + m_applyConfig = true; + + m_header = &header; + if (!this->preConfigure()) { + std::cout << "Error: Driver preconfigure failed\n"; + m_applyConfig = false; + } + + // Only run if preConfig succeeded + EError code; + if (m_applyConfig && !this->doConfigure(code)) { + if (code != EError::UserCancelled) { std::cout << "Note: Driver doConfigure failed with code " << toString(code) << "\n"; } + m_applyConfig = false; + } + + // Run the postconfigure in any case to close a possible dialog + if (!this->postConfigure()) { + std::cout << "Error: Driver postconfigure failed\n"; + m_applyConfig = false; + } + m_header = nullptr; + + return m_applyConfig; +} + +bool CConfigurationBuilder::preConfigure() +{ + // Prepares interface + m_builder = gtk_builder_new(); // glade_xml_new(m_gtkBuilderFilename.c_str(), nullptr, nullptr); + GError* error = nullptr; + if (!gtk_builder_add_from_file(m_builder, m_gtkBuilderFilename.c_str(), &error)) { + std::cout << "Error: Unable to load interface from " << m_gtkBuilderFilename << ", code " << error->code << " (" << error->message << ")\n"; + return false; + } + m_builderChannel = gtk_builder_new(); // glade_xml_new(m_gtkBuilderChannelsFilename.c_str(), nullptr, nullptr); + if (!gtk_builder_add_from_file(m_builderChannel, m_gtkBuilderChannelsFilename.c_str(), &error)) { + std::cout << "Error: Unable to load channels from " << m_gtkBuilderChannelsFilename << ", code " << error->code << " (" << error->message << ")\n"; + return false; + } + + // Finds all the widgets + m_dialog = GTK_WIDGET(gtk_builder_get_object(m_builder, "openvibe-acquisition-server-settings")); + if (!m_dialog) { + std::cout << "Error: Unable to find even the basic settings dialog from " << m_gtkBuilderFilename << "\n"; + return false; + } + m_ID = GTK_WIDGET(gtk_builder_get_object(m_builder, "spinbutton_identifier")); + m_age = GTK_WIDGET(gtk_builder_get_object(m_builder, "spinbutton_age")); + m_nChannels = GTK_WIDGET(gtk_builder_get_object(m_builder, "spinbutton_number_of_channels")); + // NB: sampling_frequency is not really a "combobox" everywhere (eg telnet reader), should update in every UI the ID name + m_sampling = GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_sampling_frequency")); + m_gender = GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_gender")); + if (gtk_builder_get_object(m_builder, "checkbutton_impedance")) { + m_impedanceCheck = GTK_WIDGET(gtk_builder_get_object(m_builder, "checkbutton_impedance")); + } + m_electrodeNameTreeView = GTK_WIDGET(gtk_builder_get_object(m_builderChannel, "treeview_electrode_names")); + m_channelNameTreeView = GTK_WIDGET(gtk_builder_get_object(m_builderChannel, "treeview_channel_names")); + + // Prepares electrode name tree view + GtkTreeView* electrodeTreeView = GTK_TREE_VIEW(m_electrodeNameTreeView); + GtkCellRenderer* electrodeIdxCellRenderer = gtk_cell_renderer_text_new(); + GtkTreeViewColumn* electrodeIdxTreeViewCol = gtk_tree_view_column_new_with_attributes("Name", electrodeIdxCellRenderer, "text", 0, nullptr); + + gtk_tree_view_append_column(electrodeTreeView, electrodeIdxTreeViewCol); + + // Prepares channel name tree view + GtkTreeView* channelTreeView = GTK_TREE_VIEW(m_channelNameTreeView); + GtkCellRenderer* channelIdxCellRenderer = gtk_cell_renderer_text_new(); + GtkCellRenderer* channelValueCellRenderer = gtk_cell_renderer_text_new(); + GtkTreeViewColumn* channelIdxTreeViewCol = gtk_tree_view_column_new_with_attributes("Index", channelIdxCellRenderer, "text", 0, nullptr); + GtkTreeViewColumn* channelNameValueTreeViewColumn = gtk_tree_view_column_new_with_attributes("Name", channelValueCellRenderer, "text", 1, nullptr); + gtk_tree_view_append_column(channelTreeView, channelIdxTreeViewCol); + gtk_tree_view_append_column(channelTreeView, channelNameValueTreeViewColumn); + + // Connects custom GTK signals + GObject* tmp[4]; + tmp[0] = gtk_builder_get_object(m_builder, "button_change_channel_names"); + tmp[1] = gtk_builder_get_object(m_builderChannel, "button_apply_channel_name"); + tmp[2] = gtk_builder_get_object(m_builderChannel, "button_remove_channel_name"); + tmp[3] = gtk_builder_get_object(m_builderChannel, "treeview_electrode_names"); + if (tmp[0]) { g_signal_connect(tmp[0], "pressed", G_CALLBACK(button_change_channel_names_cb), this); } + if (tmp[1]) { g_signal_connect(tmp[1], "pressed", G_CALLBACK(button_apply_channel_name_cb), this); } + if (tmp[2]) { g_signal_connect(tmp[2], "pressed", G_CALLBACK(button_remove_channel_name_cb), this); } + if (tmp[3]) { g_signal_connect(tmp[3], "row-activated", G_CALLBACK(treeview_apply_channel_name_cb), this); } + if (!tmp[0] || !tmp[1] || !tmp[2] || !tmp[3]) { + // @fixme should make a log entry if any NULL but no manager here +#if defined _DEBUG_Callbacks_ + std::cout << "Note: The driver UI file lacks some of the expected buttons or elements. This may be intentional." << std::endl; +#endif + } + gtk_builder_connect_signals(m_builder, nullptr); + gtk_builder_connect_signals(m_builderChannel, nullptr); + + // Configures interface with preconfigured values + + if (m_header->isExperimentIDSet()) { + gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_ID), m_header->getExperimentID()); + } + + if (m_header->isSubjectAgeSet()) { + gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_age), m_header->getSubjectAge()); + } + + if (m_header->isChannelCountSet()) { + gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_nChannels), m_header->getChannelCount()); + } + + if (m_header->isSamplingFrequencySet()) { + const std::string sampling = std::to_string(m_header->getSamplingFrequency()); + // sampling frequency could be set to an Int through a spin button instead of regular combo box (eg: telnet reader) + if (std::strcmp(G_OBJECT_TYPE_NAME(m_sampling), "GtkSpinButton") == 0) { + gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_sampling), m_header->getSamplingFrequency()); + } + // would be a "GtkComboBox" + else { + GTKComboBoxSetActiveText(GTK_COMBO_BOX(m_sampling), sampling.c_str()); + } + } + else { + // sampling frequency could be set to an Int through a spin button instead of regular combo box (eg: telnet reader) + if (std::strcmp(G_OBJECT_TYPE_NAME(m_sampling), "GtkSpinButton") == 0) { + gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_sampling), 0); + } + // would be a "GtkComboBox" + else { + gtk_combo_box_set_active(GTK_COMBO_BOX(m_sampling), 0); + } + } + if (m_header->isSubjectGenderSet()) { + GTKComboBoxSetActiveText(GTK_COMBO_BOX(m_gender), m_header->getSubjectGender() == OVTK_Value_Gender_Male ? "male" + : m_header->getSubjectGender() == OVTK_Value_Gender_Female ? "female" + : m_header->getSubjectGender() == OVTK_Value_Gender_Unknown ? "unknown" : "unspecified"); + } + else { + gtk_combo_box_set_active(GTK_COMBO_BOX(m_gender), 0); + } + if (m_impedanceCheck) { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_impedanceCheck), m_header->isImpedanceCheckRequested()); + } + + // Prepares channel name cache + if (m_header->isChannelCountSet()) { + for (size_t i = 0; i < m_header->getChannelCount(); ++i) { + m_channelNames[i] = m_header->getChannelName(i); + } + } + return true; +} + +bool CConfigurationBuilder::doConfigure(EError& errorCode) +{ + if (!m_dialog) { + errorCode = EError::Unknown; + return false; + } + + const gint response = gtk_dialog_run(GTK_DIALOG(m_dialog)); + + switch (response) { + case GTK_RESPONSE_APPLY: errorCode = EError::NoError; + return true; + case GTK_RESPONSE_CANCEL: errorCode = EError::UserCancelled; + return false; + default: errorCode = EError::Unknown; + return false; + } +} + +bool CConfigurationBuilder::postConfigure() +{ + if (m_applyConfig) { + gtk_spin_button_update(GTK_SPIN_BUTTON(m_ID)); + gtk_spin_button_update(GTK_SPIN_BUTTON(m_age)); + gtk_spin_button_update(GTK_SPIN_BUTTON(m_nChannels)); + + const std::string gender = gtk_combo_box_get_active_text(GTK_COMBO_BOX(m_gender)); + m_header->setExperimentID(gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(m_ID))); + m_header->setSubjectAge(gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(m_age))); + m_header->setChannelCount(gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(m_nChannels))); + // sampling frequency could be set to an Int through a spin button instead of regular combo box (eg: telnet reader) + if (std::strcmp(G_OBJECT_TYPE_NAME(m_sampling), "GtkSpinButton") == 0) { + gtk_spin_button_update(GTK_SPIN_BUTTON(m_sampling)); + m_header->setSamplingFrequency(gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(m_sampling))); + } + // would be a "GtkComboBox" + else { + gchar* sampling = gtk_combo_box_get_active_text(GTK_COMBO_BOX(m_sampling)); + m_header->setSamplingFrequency(sampling ? atoi(sampling) : 0); + } + m_header->setSubjectGender(gender == "male" ? OVTK_Value_Gender_Male + : gender == "female" ? OVTK_Value_Gender_Female + : gender == "unknown" ? OVTK_Value_Gender_Unknown : OVTK_Value_Gender_NotSpecified); + for (size_t i = 0; i != m_header->getChannelCount(); ++i) { m_header->setChannelName(i, m_channelNames[i].c_str()); } + + if (m_impedanceCheck) { m_header->setImpedanceCheckRequested(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_impedanceCheck)) != FALSE); } + else { m_header->setImpedanceCheckRequested(false); } + } + + if (m_dialog) { gtk_widget_hide(m_dialog); } + + if (m_builder) { + g_object_unref(m_builder); + m_builder = nullptr; + } + + if (m_builderChannel) { + g_object_unref(m_builderChannel); + m_builderChannel = nullptr; + } + + m_channelNames.clear(); + + return true; +} + +void CConfigurationBuilder::buttonChangeChannelNamesCB() +{ + GtkTreeIter itElectrodeName, itChannelName; + GtkDialog* dialog = GTK_DIALOG(gtk_builder_get_object(m_builderChannel, "channel-names")); + GtkTreeView* electrodeNameTreeView = GTK_TREE_VIEW(m_electrodeNameTreeView); + GtkTreeView* channelNameTreeView = GTK_TREE_VIEW(m_channelNameTreeView); + + // Creates electrode name and channel name models + + m_electrodeNameListStore = gtk_list_store_new(1, G_TYPE_STRING); + m_channelNameListStore = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING); + + // Fills in electrode name model + { + std::ifstream file(m_electrodeFilename.c_str()); + if (file.is_open()) { + std::list<std::string> electrodNames; + while (!file.eof()) { + std::string name; + file >> name; + electrodNames.push_back(name); + } + file.close(); + + for (auto it = electrodNames.begin(); it != electrodNames.end(); ++it) { + gtk_list_store_append(m_electrodeNameListStore, &itElectrodeName); + gtk_list_store_set(m_electrodeNameListStore, &itElectrodeName, 0, it->c_str(), -1); + } + } + } + // Fills in channel name model + + const uint32_t nChannel = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(m_nChannels)); + for (size_t i = 0; i < nChannel; ++i) { + std::string name = std::to_string(i + 1); + gtk_list_store_append(m_channelNameListStore, &itChannelName); + gtk_list_store_set(m_channelNameListStore, &itChannelName, 0, name.c_str(), -1); + gtk_list_store_set(m_channelNameListStore, &itChannelName, 1, m_channelNames[i].c_str(), -1); + } + + // Attachs model to views + + gtk_tree_view_set_model(electrodeNameTreeView, GTK_TREE_MODEL(m_electrodeNameListStore)); + gtk_tree_view_set_model(channelNameTreeView, GTK_TREE_MODEL(m_channelNameListStore)); + + // Selects first line of each + if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(m_electrodeNameListStore), &itElectrodeName)) { + gtk_tree_selection_select_iter(gtk_tree_view_get_selection(electrodeNameTreeView), &itElectrodeName); + } + if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(m_channelNameListStore), &itChannelName)) { + gtk_tree_selection_select_iter(gtk_tree_view_get_selection(channelNameTreeView), &itChannelName); + } + + // Runs dialog ! + + gint dialogResponse; + do { + dialogResponse = gtk_dialog_run(dialog); + switch (dialogResponse) { + case GTK_RESPONSE_APPLY: + { + size_t i = 0; + gchar* channelName = nullptr; + if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(m_channelNameListStore), &itChannelName)) { + do { + gtk_tree_model_get(GTK_TREE_MODEL(m_channelNameListStore), &itChannelName, 1, &channelName, -1); + m_channelNames[i++] = channelName; + } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(m_channelNameListStore), &itChannelName)); + } + } + break; + + case 1: // Load + { + GtkWidget* widgetDialogOpen = gtk_file_chooser_dialog_new("Select file to open...", nullptr, GTK_FILE_CHOOSER_ACTION_OPEN, GTK_STOCK_CANCEL, + GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, nullptr); + //gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(widgetDialogOpen), this->getWorkingDirectory().toASCIIString()); + if (gtk_dialog_run(GTK_DIALOG(widgetDialogOpen)) == GTK_RESPONSE_ACCEPT) { + char* fileName = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widgetDialogOpen)); + std::ifstream file(fileName); + if (file.is_open()) { + std::list<std::string> electrodNames; + // Reads channel names from file + std::string name; + while (getline(file, name)) { + //if line is empty, skip the channel by setting empty string as name + //if we do not, loading will squeeze the channels together. + if (name.empty()) { name = ""; } + electrodNames.push_back(name); + } + file.close(); + + // Clears list store + if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(m_channelNameListStore), &itChannelName)) { + do { gtk_list_store_set(m_channelNameListStore, &itChannelName, 1, "", -1); } while (gtk_tree_model_iter_next( + GTK_TREE_MODEL(m_channelNameListStore), &itChannelName)); + } + + // Fills list store with channel names + auto it = electrodNames.begin(); + if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(m_channelNameListStore), &itChannelName) && it != electrodNames.end()) { + do { + gtk_list_store_set(m_channelNameListStore, &itChannelName, 1, it->c_str(), -1); + ++it; + } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(m_channelNameListStore), &itChannelName) && it != electrodNames.end()); + } + } + g_free(fileName); + } + gtk_widget_destroy(widgetDialogOpen); + } + break; + + case 2: // Save + { + GtkWidget* widgetDialogOpen = gtk_file_chooser_dialog_new("Select file to save to...", nullptr, GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, + GTK_RESPONSE_CANCEL, GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT, nullptr); + //gtk_file_chooser_set_current_folder(GTK_FILE_CHOOSER(widgetDialogOpen), this->getWorkingDirectory().toASCIIString()); + if (gtk_dialog_run(GTK_DIALOG(widgetDialogOpen)) == GTK_RESPONSE_ACCEPT) { + char* fileName = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widgetDialogOpen)); + std::ofstream file(fileName); + if (file.is_open()) { + gchar* channelName = nullptr; + if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(m_channelNameListStore), &itChannelName)) { + do { + gtk_tree_model_get(GTK_TREE_MODEL(m_channelNameListStore), &itChannelName, 1, &channelName, -1); + file << channelName << "\n"; + } while (gtk_tree_model_iter_next(GTK_TREE_MODEL(m_channelNameListStore), &itChannelName)); + } + } + g_free(fileName); + } + gtk_widget_destroy(widgetDialogOpen); + } + break; + default: break; + } + } while (dialogResponse != GTK_RESPONSE_APPLY && dialogResponse != GTK_RESPONSE_CANCEL); + + gtk_widget_hide(GTK_WIDGET(dialog)); + g_object_unref(m_channelNameListStore); + g_object_unref(m_electrodeNameListStore); + m_channelNameListStore = nullptr; + m_electrodeNameListStore = nullptr; +} + +void CConfigurationBuilder::buttonApplyChannelNameCB() +{ + GtkTreeIter itElectrodeName, itChannelName; + GtkTreeView* electrodeNameTreeView = GTK_TREE_VIEW(m_electrodeNameTreeView); + GtkTreeView* channelNameTreeView = GTK_TREE_VIEW(m_channelNameTreeView); + + GtkTreeSelection* channelNameTreeViewSelection = gtk_tree_view_get_selection(channelNameTreeView); + GtkTreeSelection* electrodeNameTreeViewSelection = gtk_tree_view_get_selection(electrodeNameTreeView); + + if (!gtk_tree_selection_get_selected(channelNameTreeViewSelection, nullptr, &itChannelName)) { + if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(m_channelNameListStore), &itChannelName)) { + gtk_tree_selection_select_iter(channelNameTreeViewSelection, &itChannelName); + } + } + + if (gtk_tree_selection_get_selected(channelNameTreeViewSelection, nullptr, &itChannelName)) { + if (gtk_tree_selection_get_selected(electrodeNameTreeViewSelection, nullptr, &itElectrodeName)) { + gchar* name = nullptr; + gtk_tree_model_get(GTK_TREE_MODEL(m_electrodeNameListStore), &itElectrodeName, 0, &name, -1); + gtk_list_store_set(m_channelNameListStore, &itChannelName, 1, name, -1); + if (gtk_tree_model_iter_next(GTK_TREE_MODEL(m_channelNameListStore), &itChannelName)) { + gtk_tree_selection_select_iter(channelNameTreeViewSelection, &itChannelName); + } + else { + if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(m_channelNameListStore), &itChannelName)) { + gtk_tree_selection_select_iter(channelNameTreeViewSelection, &itChannelName); + } + } + } + } +} + +void CConfigurationBuilder::buttonRemoveChannelNameCB() +{ + GtkTreeIter it; + GtkTreeView* treeView = GTK_TREE_VIEW(m_channelNameTreeView); + + GtkTreeSelection* selection = gtk_tree_view_get_selection(treeView); + if (gtk_tree_selection_get_selected(selection, nullptr, &it)) { + gtk_list_store_set(m_channelNameListStore, &it, 1, "", -1); + if (gtk_tree_model_iter_next(GTK_TREE_MODEL(m_channelNameListStore), &it)) { gtk_tree_selection_select_iter(selection, &it); } + else { if (gtk_tree_model_get_iter_first(GTK_TREE_MODEL(m_channelNameListStore), &it)) { gtk_tree_selection_select_iter(selection, &it); } } + } +} + +void CConfigurationBuilder::treeviewApplyChannelNameCB() { this->buttonApplyChannelNameCB(); } + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASCore/ovasCConfigurationBuilder.h b/applications/platform/acquisition-server/src/OVASCore/ovasCConfigurationBuilder.h new file mode 100644 index 0000000000000000000000000000000000000000..0a3f173f2d1882f6cc627b9466262a608f802926 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASCore/ovasCConfigurationBuilder.h @@ -0,0 +1,73 @@ +#pragma once + +#include "ovas_base.h" + +#include <gtk/gtk.h> + +#include <string> +#include <map> + +namespace OpenViBE { +namespace AcquisitionServer { +class IHeader; + +class CConfigurationBuilder +{ +public: + explicit CConfigurationBuilder(const char* gtkBuilderFilename); + virtual ~CConfigurationBuilder(); + + virtual bool configure(IHeader& header); + + virtual void buttonChangeChannelNamesCB(); + virtual void buttonApplyChannelNameCB(); + virtual void buttonRemoveChannelNameCB(); + virtual void treeviewApplyChannelNameCB(); + +protected: + enum class EError { NoError = 0, UserCancelled = 1, Unknown = 2 }; + + static std::string toString(const EError& e) + { + switch (e) { + case EError::NoError: return "No Error"; + case EError::UserCancelled: return "User Cancelled"; + case EError::Unknown: return "Unknown"; + default: return "Invalid Error Code"; + } + } + + CConfigurationBuilder() = delete; + + virtual bool preConfigure(); + virtual bool doConfigure(EError& errorCode); + virtual bool postConfigure(); + + bool m_applyConfig = false; + + GtkBuilder* m_builder = nullptr; + GtkBuilder* m_builderChannel = nullptr; + + GtkWidget* m_dialog = nullptr; + + GtkWidget* m_ID = nullptr; + GtkWidget* m_age = nullptr; + GtkWidget* m_nChannels = nullptr; + GtkWidget* m_sampling = nullptr; + GtkWidget* m_gender = nullptr; + GtkWidget* m_impedanceCheck = nullptr; + + GtkListStore* m_electrodeNameListStore = nullptr; + GtkListStore* m_channelNameListStore = nullptr; + + GtkWidget* m_electrodeNameTreeView = nullptr; + GtkWidget* m_channelNameTreeView = nullptr; + + std::map<uint32_t, std::string> m_channelNames; + std::string m_gtkBuilderFilename; + std::string m_electrodeFilename; + std::string m_gtkBuilderChannelsFilename; + IHeader* m_header = nullptr; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASCore/ovasCConfigurationNetworkBuilder.cpp b/applications/platform/acquisition-server/src/OVASCore/ovasCConfigurationNetworkBuilder.cpp new file mode 100644 index 0000000000000000000000000000000000000000..2eedc2f540feecd949655e9630caef4bc53b97a6 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASCore/ovasCConfigurationNetworkBuilder.cpp @@ -0,0 +1,51 @@ +#include "ovasCConfigurationNetworkBuilder.h" + +#include <toolkit/ovtk_all.h> + +#include <iostream> + +namespace OpenViBE { +namespace AcquisitionServer { + +bool CConfigurationNetworkBuilder::setHostName(const CString& hostName) +{ + m_hostName = hostName; + return true; +} + +bool CConfigurationNetworkBuilder::setHostPort(const uint32_t hostPort) +{ + m_hostPort = hostPort; + return true; +} + +//___________________________________________________________________// +// // + +bool CConfigurationNetworkBuilder::preConfigure() +{ + const bool res = CConfigurationBuilder::preConfigure(); + + m_pHostName = GTK_WIDGET(gtk_builder_get_object(m_builder, "entry_host_name")); + m_pHostPort = GTK_WIDGET(gtk_builder_get_object(m_builder, "spinbutton_host_port")); + + gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_pHostPort), m_hostPort); + gtk_entry_set_text(GTK_ENTRY(m_pHostName), m_hostName.toASCIIString()); + + return res; +} + +bool CConfigurationNetworkBuilder::postConfigure() +{ + if (m_applyConfig) { + gtk_spin_button_update(GTK_SPIN_BUTTON(m_pHostPort)); + + m_hostPort = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(m_pHostPort)); + m_hostName = gtk_entry_get_text(GTK_ENTRY(m_pHostName)); + } + + return CConfigurationBuilder::postConfigure(); +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASCore/ovasCConfigurationNetworkBuilder.h b/applications/platform/acquisition-server/src/OVASCore/ovasCConfigurationNetworkBuilder.h new file mode 100644 index 0000000000000000000000000000000000000000..19f4a0196bf63d2235cca4eaee1a65c23d929339 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASCore/ovasCConfigurationNetworkBuilder.h @@ -0,0 +1,31 @@ +#pragma once + +#include "ovasCConfigurationBuilder.h" + +namespace OpenViBE { +namespace AcquisitionServer { +class CConfigurationNetworkBuilder : public CConfigurationBuilder +{ +public: + explicit CConfigurationNetworkBuilder(const char* gtkBuilderFileName) : CConfigurationBuilder(gtkBuilderFileName) {} + ~CConfigurationNetworkBuilder() override {} + + + virtual bool setHostName(const CString& hostName); + virtual bool setHostPort(uint32_t hostPort); + + virtual CString getHostName() const { return m_hostName; } + virtual uint32_t getHostPort() const { return m_hostPort; } + +protected: + bool preConfigure() override; + bool postConfigure() override; + + GtkWidget* m_pHostName = nullptr; + GtkWidget* m_pHostPort = nullptr; + + CString m_hostName = "localhost"; + uint32_t m_hostPort = 4000; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASCore/ovasCDriftCorrection.cpp b/applications/platform/acquisition-server/src/OVASCore/ovasCDriftCorrection.cpp new file mode 100644 index 0000000000000000000000000000000000000000..cf2b8bafa8d7ba5196d9068d34e2bfb7a86eea57 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASCore/ovasCDriftCorrection.cpp @@ -0,0 +1,371 @@ +// @note in this code, conversion in time or in second are sometimes used simply to convert between floating and fixed point even if the units are not seconds. +#include "ovasCDriftCorrection.h" + +#include <toolkit/ovtk_all.h> + +#include <ovp_global_defines.h> + +#include <system/ovCTime.h> +#include <cmath> // std::abs +#include <algorithm> // std::min, std::max +#include <iostream> + +namespace OpenViBE { +namespace AcquisitionServer { + +CDriftCorrection::CDriftCorrection(const Kernel::IKernelContext& ctx) + : m_kernelCtx(ctx), m_driftCorrectionPolicy(EDriftCorrectionPolicies::DriverChoice) +{ + const std::string policy = m_kernelCtx.getConfigurationManager().expand("${AcquisitionServer_DriftCorrectionPolicy}").toASCIIString(); + if (policy == "Forced") { this->setDriftCorrectionPolicy(EDriftCorrectionPolicies::Forced); } + else if (policy == "Disabled") { this->setDriftCorrectionPolicy(EDriftCorrectionPolicies::Disabled); } + else { this->setDriftCorrectionPolicy(EDriftCorrectionPolicies::DriverChoice); } + + this->setDriftToleranceDurationMs(m_kernelCtx.getConfigurationManager().expandAsUInteger("${AcquisitionServer_DriftToleranceDuration}", 5)); + this->setJitterEstimationCountForDrift(m_kernelCtx.getConfigurationManager().expandAsUInteger("${AcquisitionServer_JitterEstimationCountForDrift}", 128)); + + m_initialSkipPeriod = m_kernelCtx.getConfigurationManager().expandAsUInteger("${AcquisitionServer_DriftInitialSkipPeriodMs}", 0); + m_initialSkipPeriod = (m_initialSkipPeriod << 32) / 1000; // ms to fixed point sec + + reset(); +} + +bool CDriftCorrection::start(const uint32_t sampling, const uint64_t startTime) +{ + if (sampling == 0) { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Drift correction doesn't support sampling rate of 0.\n"; + return false; + } + + reset(); + + m_sampling = sampling; + m_nDriftToleranceSample = (m_driftToleranceDurationMs * m_sampling) / 1000; + + m_startTime = startTime + m_initialSkipPeriod; + + m_lastEstimationTime = startTime; + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Drift correction is set to "; + switch (m_driftCorrectionPolicy) { + default: case EDriftCorrectionPolicies::DriverChoice: m_kernelCtx.getLogManager() << "DriverChoice\n"; + break; + case EDriftCorrectionPolicies::Forced: m_kernelCtx.getLogManager() << "Forced\n"; + break; + case EDriftCorrectionPolicies::Disabled: m_kernelCtx.getLogManager() << "Disabled\n"; + break; + } + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Driver monitoring drift estimation on " << m_nJitterEstimationForDrift << " jitter measures\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "Driver monitoring drift tolerance set to " << m_driftToleranceDurationMs << " milliseconds - eq " + << m_nDriftToleranceSample << " samples\n"; + + m_isStarted = true; + + return true; +} + +void CDriftCorrection::stop() +{ + m_isStarted = false; + m_isActive = false; +} + +void CDriftCorrection::reset() +{ + m_jittersEstimate.clear(); + + m_receivedSampleCount = 0; + m_correctedSampleCount = 0; + m_nInnerLatencySample = 0; + + m_driftEstimate = 0; + m_driftEstimateTooSlowMax = 0; + m_driftEstimateTooFastMax = 0; + m_nDriftCorrectionSampleAdded = 0; + m_nDriftCorrectionSampleRemoved = 0; + + m_nDriftCorrection = 0; + + // Don't know the sampling rate yet, so cannot put a good value. Put something. + m_nDriftToleranceSample = 1; + + m_isActive = false; + m_initialSkipPeriodPassed = (m_initialSkipPeriod <= 0 ? true : false); +} + + +//___________________________________________________________________// +// // + +void CDriftCorrection::printStats() const +{ + if (!m_isStarted) { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Drift correction is stopped, no statistics were collected.\n"; + return; + } + + const uint64_t elapsedTime = m_lastEstimationTime - m_startTime; + const double elapsedTimeSec = CTime(elapsedTime).toSeconds(); + + const uint64_t theoreticalSampleCountFixedPoint = m_sampling * elapsedTime; + const double theoreticalSampleCount = CTime(theoreticalSampleCountFixedPoint).toSeconds(); + + const double addedRatio = (theoreticalSampleCount != 0 ? (m_nDriftCorrectionSampleAdded / theoreticalSampleCount) : 0); + const double removedRatio = (theoreticalSampleCount != 0 ? (m_nDriftCorrectionSampleRemoved / theoreticalSampleCount) : 0); + + const uint64_t driftToleranceDurationMs = getDriftToleranceDurationMs(); + const double driftRatio = getDriftMs() / double(driftToleranceDurationMs); + const double driftRatioTooFastMax = getDriftTooFastMax() / double(driftToleranceDurationMs); + const double driftRatioTooSlowMax = getDriftTooSlowMax() / double(driftToleranceDurationMs); + + const double estimatedSamplingRate = m_receivedSampleCount / elapsedTimeSec; + const double deviationPercent = 100.0 * (estimatedSamplingRate / double(m_sampling)); + + + if (driftRatioTooFastMax > 1.0 || driftRatioTooSlowMax > 1.0 || std::abs(driftRatio) > 1.0) { + // Drift tolerance was exceeded, print some stats + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Stats after " << elapsedTimeSec << " second session of " << m_sampling << + "hz sampling (declared rate),\n"; + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << " Estimate : Driver samples at " << std::round(estimatedSamplingRate * 10.0) / 10.0 + << "hz (" << std::round(deviationPercent * 10.0) / 10.0 << "% of declared)\n"; + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << " Received : " << m_receivedSampleCount << " samples\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << " Expected : " << theoreticalSampleCount << " samples\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << " Returned : " << m_correctedSampleCount << " samples " + << (m_driftCorrectionPolicy == EDriftCorrectionPolicies::Disabled ? "(drift correction disabled)" : "(after drift correction)") << "\n"; + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << " Added : " << m_nDriftCorrectionSampleAdded << " samples (" << addedRatio << "%)\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << " Removed : " << m_nDriftCorrectionSampleRemoved << " samples (" << removedRatio << "%)\n"; + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << " Operated : " << m_nDriftCorrection << " times (interventions)\n"; + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Estimated drift (tolerance = " << driftToleranceDurationMs << "ms),\n"; + + m_kernelCtx.getLogManager() << (driftRatioTooSlowMax > 1.0 ? Kernel::LogLevel_Warning : Kernel::LogLevel_Info) + << " Slow peak : " << -m_driftEstimateTooSlowMax << " samples (" << getDriftTooSlowMax() << "ms late, " << 100 * driftRatioTooSlowMax << + "% of tol.)\n"; + + m_kernelCtx.getLogManager() << (driftRatioTooFastMax > 1.0 ? Kernel::LogLevel_Warning : Kernel::LogLevel_Info) + << " Fast peak : " << m_driftEstimateTooFastMax << " samples (" << getDriftTooFastMax() << "ms early, " << 100 * driftRatioTooFastMax << + "% of tol.)\n"; + + m_kernelCtx.getLogManager() << (std::abs(driftRatio) > 1.0 ? Kernel::LogLevel_Warning : Kernel::LogLevel_Info) + << " Last estim : " << m_driftEstimate << " samples (" << getDriftMs() << "ms, " << 100 * driftRatio << "% of tol., " + << std::round(100.0 * (getDriftMs() / 1000.0) / elapsedTimeSec * 10.0) / 10.0 << "% of session length)" + << (m_driftCorrectionPolicy == EDriftCorrectionPolicies::Disabled ? "" : ", after corr.") + << "\n"; + + const double remainingDriftCount = m_correctedSampleCount - theoreticalSampleCount; + const double remainingDriftMs = 1000.0 * remainingDriftCount / double(m_sampling); + m_kernelCtx.getLogManager() << (std::abs(remainingDriftMs) > driftToleranceDurationMs ? Kernel::LogLevel_Warning : Kernel::LogLevel_Info) + << " Remaining : " << remainingDriftCount << " samples (" << remainingDriftMs << "ms, " << 100 * remainingDriftMs / driftToleranceDurationMs + << "% of tol., " + << std::round(100.0 * (remainingDriftMs / 1000.0) / elapsedTimeSec * 10.0) / 10.0 << "% of session length)" + << (m_driftCorrectionPolicy == EDriftCorrectionPolicies::Disabled ? "" : ", after corr.") + << "\n"; + + if (m_driftCorrectionPolicy == EDriftCorrectionPolicies::DriverChoice && m_nDriftCorrectionSampleAdded == 0 && m_nDriftCorrectionSampleRemoved == 0) { + m_kernelCtx.getLogManager() << Kernel::LogLevel_ImportantWarning << + " The driver did not try to correct the drift. This may be a feature of the driver.\n"; + } + } +} + + +//___________________________________________________________________// +// // + +double CDriftCorrection::computeJitter(const uint64_t currentTime) const +{ + // Compute the jitter. To get a bit cleaner code, instead of basing jitter estimate + // on difference of estimated sample counts, we compute the diffs in the elapsed + // and the expected time based on the amount of samples received. + const uint64_t expectedTime = m_startTime + CTime(m_correctedSampleCount).time() / uint64_t(m_sampling); + + double timeDiff; // time in seconds that our expectation differs from the measured clock + if (expectedTime >= currentTime) { + // The driver is early + timeDiff = CTime(expectedTime - currentTime).toSeconds(); + } + else { + // The driver is late + timeDiff = -CTime(currentTime - expectedTime).toSeconds(); + } + + // Jitter in fractional samples + return timeDiff * m_sampling + double(m_nInnerLatencySample); +} + + +bool CDriftCorrection::estimateDrift(const uint64_t newSamples) +{ + if (!m_isStarted) { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Drift correction: estimateDrift() called before start()\n"; + return false; + } + + const uint64_t currentTime = System::Time::zgetTime(); + if (currentTime < m_startTime) { + // We can ignore some sets of samples for the driver to stabilize. For example, + // a delay in delivering the first set would cause a permanent drift (offset) unless corrected. + // Yet this offset would be totally harmless to any client connecting to AS after first + // set of samples have been received, and if drift correction is disabled, it would + // stay there in the measure. + // + // With conf token AcquisitionServer_DriftInitialSkipPeriodMs set to 0 no sets will be skipped. + + return true; + } + if (!m_initialSkipPeriodPassed) { + // The next call will be the first estimation + m_initialSkipPeriodPassed = true; + m_startTime = currentTime; + m_lastEstimationTime = currentTime; + return true; + } + + m_receivedSampleCount += newSamples; // How many samples have arrived from the driver + m_correctedSampleCount += newSamples; // The "corrected" amount of samples + + // m_kernelCtx.getLogManager() << Kernel::LogLevel_Info << "Drift measured at " << CTime(currentTime - m_startTime).toSeconds() * 1000 << "ms.\n"; + + const double jitter = computeJitter(currentTime); + + m_jittersEstimate.push_back(jitter); + if (m_jittersEstimate.size() > m_nJitterEstimationForDrift) { m_jittersEstimate.pop_front(); } + + // Estimate the drift after we have a full buffer of jitter estimates + if (m_jittersEstimate.size() == m_nJitterEstimationForDrift) { + double newDriftEstimate = 0; + + for (auto j = m_jittersEstimate.begin(); j != m_jittersEstimate.end(); ++j) { newDriftEstimate += *j; } + + m_driftEstimate = newDriftEstimate / m_nJitterEstimationForDrift; + + if (m_driftEstimate > 0) { m_driftEstimateTooFastMax = std::max<double>(m_driftEstimateTooFastMax, m_driftEstimate); } + else { m_driftEstimateTooSlowMax = std::max<double>(m_driftEstimateTooSlowMax, -m_driftEstimate); } + + if (std::abs(m_driftEstimate) > this->getDriftToleranceSampleCount()) { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Debug << + "At " << CTime(currentTime).toSeconds() * 1000 << "ms," + << " Acq mon [drift:" << getDriftMs() << "][jitter:" << jitter << "] samples," + << " dsc " << getDriftSampleCount() + << " (inner lat. samples " << m_nInnerLatencySample << ")\n"; + } + } + + m_lastEstimationTime = currentTime; + + return true; +} + + +bool CDriftCorrection::correctDrift(const int64_t correction, size_t& totalSamples, std::deque<std::vector<float>>& pendingBuffers, + CStimulationSet& pendingStimSet, const std::vector<float>& paddingBuffer) +{ + if (!m_isStarted) { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Drift correction: correctDrift() called before start()\n"; + return false; + } + + if (m_driftCorrectionPolicy == EDriftCorrectionPolicies::Disabled) { + // Not an error, we just don't correct + return false; + } + + m_isActive = true; + + if (correction == 0) { return true; } + + if (totalSamples != uint64_t(m_correctedSampleCount)) { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Warning << "Server and drift correction class disagree on the number of samples\n"; + } + + const uint64_t elapsedTime = System::Time::zgetTime() - m_startTime; + const double elapsedTimeSec = CTime(elapsedTime).toSeconds(); + + m_kernelCtx.getLogManager() << Kernel::LogLevel_Trace << "At time " << elapsedTimeSec << "s : Correcting drift by " << correction << " samples\n"; + + if (correction > 0) { + for (int64_t i = 0; i < correction; ++i) { pendingBuffers.push_back(paddingBuffer); } + + const uint64_t timeOfIncorrect = CTime(m_correctedSampleCount - 1).time() / uint64_t(m_sampling); + const uint64_t durationOfIncorrect = CTime(m_sampling, correction).time(); + const uint64_t timeOfCorrect = CTime(m_correctedSampleCount - 1 + correction).time() / uint64_t(m_sampling); + pendingStimSet.push_back(OVTK_StimulationId_AddedSamplesBegin, timeOfIncorrect, durationOfIncorrect); + pendingStimSet.push_back(OVTK_StimulationId_AddedSamplesEnd, timeOfCorrect, 0); + + m_driftEstimate += correction; + + m_correctedSampleCount += correction; + m_nDriftCorrectionSampleAdded += correction; + m_nDriftCorrection++; + } + else if (correction < 0) { + const size_t samplesToRemove = std::min<size_t>(size_t(-correction), pendingBuffers.size()); + + pendingBuffers.erase(pendingBuffers.begin() + pendingBuffers.size() - int(samplesToRemove), pendingBuffers.begin() + pendingBuffers.size()); + + const size_t lastSampleDate = CTime(m_correctedSampleCount - samplesToRemove).time() / size_t(m_sampling); + for (size_t i = 0; i < pendingStimSet.size(); ++i) { if (pendingStimSet.getDate(i) > lastSampleDate) { pendingStimSet.setDate(i, lastSampleDate); } } + + pendingStimSet.push_back(OVTK_StimulationId_RemovedSamples, lastSampleDate, 0); + + m_driftEstimate -= samplesToRemove; + + m_correctedSampleCount -= samplesToRemove; + m_nDriftCorrectionSampleRemoved += samplesToRemove; + m_nDriftCorrection++; + } + + // correct the jitter estimate to match the correction we made. For example, if we had + // a jitter estimate of [-1,-1,-1,...] and correct the drift by adding 1 sample, the new + // estimate should become [0,0,0,0,...] with relation to the adjustment. This changes jitter estimates + // in the past. The other alternative would be to reset the estimate. Adjusting + // might keep some detail the reset would lose. + for (auto j = m_jittersEstimate.begin(); j != m_jittersEstimate.end(); ++j) { (*j) += correction; } + + totalSamples = uint64_t(m_correctedSampleCount); + + return true; +} + +// Note that we cannot do actual correction with subsample accuracy, so here we truncate the drift estimate to integer in getDriftSampleCount(). +int64_t CDriftCorrection::getSuggestedDriftCorrectionSampleCount() const +{ + const double toleranceMs = double(this->getDriftToleranceDurationMs()); + const double currentDriftMs = this->getDriftMs(); + + if (std::abs(currentDriftMs) > toleranceMs) { + // The correction is always to the opposite direction of the drift + return -this->getDriftSampleCount(); + } + + return 0; +} + +// ____________________________________________________________________________ +// + +bool CDriftCorrection::setDriftToleranceDurationMs(const uint64_t ms) +{ + if (ms == 0) { + m_kernelCtx.getLogManager() << Kernel::LogLevel_Error << "Minimum accepted drift tolerance limit is 1ms\n"; + m_driftToleranceDurationMs = 1; + return true; + } + + m_driftToleranceDurationMs = ms; + return true; +} + +bool CDriftCorrection::setJitterEstimationCountForDrift(const uint64_t count) +{ + m_nJitterEstimationForDrift = count; + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASCore/ovasCDriftCorrection.h b/applications/platform/acquisition-server/src/OVASCore/ovasCDriftCorrection.h new file mode 100644 index 0000000000000000000000000000000000000000..cf51052ede74523068b8eb2c3f5cef5c3f51f490 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASCore/ovasCDriftCorrection.h @@ -0,0 +1,133 @@ +#pragma once + +#include "ovas_base.h" + +#include <string> +#include <vector> +#include <list> +#include <deque> + +namespace OpenViBE { +namespace AcquisitionServer { +enum class EDriftCorrectionPolicies { DriverChoice = 0, Forced, Disabled }; + +inline std::string toString(const EDriftCorrectionPolicies& policy) +{ + switch (policy) { + case EDriftCorrectionPolicies::Disabled: return "Disabled"; + case EDriftCorrectionPolicies::DriverChoice: return "Driver Choice"; + case EDriftCorrectionPolicies::Forced: return "Forced"; + } +} + +/* + * \class CDriftCorrection + * \author Jussi T. Lindgren / Inria + * + * \brief A refactoring of the old drift correction code that was originally mixed into the acquisition server main code. + * + */ +class CDriftCorrection final +{ +public: + explicit CDriftCorrection(const Kernel::IKernelContext& ctx); + ~CDriftCorrection() { } + + // To start a new drift estimation and stop it. + bool start(uint32_t sampling, uint64_t startTime); + void stop(); + + // Estimate the drift + // + // \param newSamples [in] : How many samples the driver returned + bool estimateDrift(uint64_t newSamples); + + // Request a drift correction + // + // \param i64correction [in] : the number of samples to correct + // \param totalSamples [out] : Number of total samples after correction for drift + // \param pendingBuffers [in/out] : The sample buffer to be corrected + // \param pendingStimSet [in/out] : The stimulation set to be realigned + // \param paddingBuffer[in] : The sample to repeatedly add if correction > 0 + bool correctDrift(int64_t correction, size_t& totalSamples, std::deque<std::vector<float>>& pendingBuffers, + CStimulationSet& pendingStimSet, const std::vector<float>& paddingBuffer); + + // Status functions + bool isActive() const { return m_isActive; } + + // Prints various statistics but only if drift tolerance was exceeded + void printStats() const; + + // Result getters + // current drift, in ms. + double getDriftMs() const { return (m_sampling == 0) ? 0 : m_driftEstimate * 1000.0 / m_sampling; } + // maximum positive drift observed, in ms. (driver gave too many samples) + double getDriftTooFastMax() const { return (m_sampling == 0) ? 0 : m_driftEstimateTooFastMax * 1000.0 / m_sampling; } + // maximum negative drift observed, in ms. (driver gave too few samples) + double getDriftTooSlowMax() const { return (m_sampling == 0) ? 0 : m_driftEstimateTooSlowMax * 1000. / m_sampling; } + // current drift, in samples + int64_t getDriftSampleCount() const { return int64_t(m_driftEstimate); } + int64_t getDriftToleranceSampleCount() const { return m_nDriftToleranceSample; } + // number of samples to correct drift with + int64_t getSuggestedDriftCorrectionSampleCount() const; + + // Parameter getters and setters + int64_t getInnerLatencySampleCount() const { return m_nInnerLatencySample; } + void setInnerLatencySampleCount(const int64_t count) { m_nInnerLatencySample = count; } + + EDriftCorrectionPolicies getDriftCorrectionPolicy() const { return m_driftCorrectionPolicy; } + CString getDriftCorrectionPolicyStr() const { return toString(m_driftCorrectionPolicy).c_str(); } + void setDriftCorrectionPolicy(const EDriftCorrectionPolicies policy) { m_driftCorrectionPolicy = policy; } + + uint64_t getDriftToleranceDurationMs() const { return m_driftToleranceDurationMs; } + bool setDriftToleranceDurationMs(uint64_t ms); + + uint64_t getJitterEstimationCountForDrift() const { return m_nJitterEstimationForDrift; } + bool setJitterEstimationCountForDrift(uint64_t count); + +protected: + void reset(); + + // Computes jitter in fractional samples + double computeJitter(uint64_t currentTime) const; + + const Kernel::IKernelContext& m_kernelCtx; + + // State of the drift correction + bool m_isInitialized = false; + bool m_isStarted = false; + bool m_isActive = false; + bool m_initialSkipPeriodPassed = false; + + // Parameters + EDriftCorrectionPolicies m_driftCorrectionPolicy; + uint64_t m_driftToleranceDurationMs = 0; + int64_t m_nDriftToleranceSample = 0; + int64_t m_nInnerLatencySample = 0; + uint64_t m_nJitterEstimationForDrift = 0; + uint32_t m_sampling = 0; + uint64_t m_initialSkipPeriod = 0; + + // Results + double m_receivedSampleCount = 0; + double m_correctedSampleCount = 0; + double m_driftEstimate = 0; // In subsample accuracy, e.g. 1.2 samples. + double m_driftEstimateTooFastMax = 0; // maximum over time + double m_driftEstimateTooSlowMax = 0; // minimum over time + + // Stats + int64_t m_nDriftCorrectionSampleAdded = 0; + int64_t m_nDriftCorrectionSampleRemoved = 0; + uint64_t m_nDriftCorrection = 0; + + // Timekeeping + uint64_t m_startTime = 0; + uint64_t m_lastEstimationTime = 0; + + // Jitter estimation buffer. Each entry is the difference between the expected number of + // samples and the received number of samples per each call to estimateDrift(). The buffer has subsample accuracy to avoid rounding errors. + // -> The average of the buffer items is the current aggregated drift estimate (in samples), convertable to ms by getDrift(). + std::list<double> m_jittersEstimate; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASCore/ovasCHeader.cpp b/applications/platform/acquisition-server/src/OVASCore/ovasCHeader.cpp new file mode 100644 index 0000000000000000000000000000000000000000..5698d8771904fada6e2da1403c5d7f171e78cc95 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASCore/ovasCHeader.cpp @@ -0,0 +1,237 @@ +#include "ovasCHeader.h" + +#include <map> +#include <string> + +#define NO_VALUE_I 0xffffffff + +namespace OpenViBE { +namespace AcquisitionServer { +namespace { +class CHeaderImpl final : public IHeader +{ +public: + CHeaderImpl() {} + ~CHeaderImpl() override {} + void reset() override; + + // Experiment information + bool setExperimentID(const size_t experimentID) override; + bool setSubjectAge(const size_t subjectAge) override; + bool setSubjectGender(const size_t subjectGender) override; + + size_t getExperimentID() const override { return m_experimentID; } + size_t getSubjectAge() const override { return m_subjectAge; } + size_t getSubjectGender() const override { return m_subjectGender; } + + bool isExperimentIDSet() const override { return m_experimentID != NO_VALUE_I; } + bool isSubjectAgeSet() const override { return m_subjectAge != NO_VALUE_I; } + bool isSubjectGenderSet() const override { return m_subjectGender != NO_VALUE_I; } + + void setImpedanceCheckRequested(const bool active) override { m_isImpedanceCheckRequested = active; } + bool isImpedanceCheckRequested() const override { return m_isImpedanceCheckRequested; } + size_t getImpedanceLimit() const override { return m_impedanceLimit; } + void setImpedanceLimit(const size_t limit) override { m_impedanceLimit = limit; } + + // Chanel information + bool setChannelCount(const size_t nChannel) override; + bool setChannelName(const size_t index, const char* name) override; + bool setChannelGain(const size_t index, const float gain) override; + bool setChannelUnits(const size_t index, const size_t unit, const size_t factor) override; + // virtual bool setChannelLocation(const size_t index, const float channelLocationX, const float channelLocationY, const float channelLocationZ); + + size_t getChannelCount() const override { return m_nChannel; } + const char* getChannelName(const size_t index) const override; + float getChannelGain(const size_t index) const override; + bool getChannelUnits(const size_t index, size_t& unit, size_t& factor) const override; + // virtual getChannelLocation(const size_t index) const; + + bool isChannelCountSet() const override { return m_nChannel != NO_VALUE_I && m_nChannel != 0; } + bool isChannelNameSet() const override { return isChannelCountSet(); } + bool isChannelGainSet() const override { return isChannelCountSet(); } + // virtual bool isChannelLocationSet() const; + bool isChannelUnitSet() const override { return !m_channelUnits.empty(); } + + // Samples information + bool setSamplingFrequency(const size_t sampling) override; + + size_t getSamplingFrequency() const override { return m_sampling; } + + bool isSamplingFrequencySet() const override { return m_sampling != NO_VALUE_I; } + +protected: + // Experiment information + size_t m_experimentID = NO_VALUE_I; + size_t m_subjectAge = 18; + size_t m_subjectGender = OVTK_Value_Gender_NotSpecified; + + // Chanel information + size_t m_nChannel = NO_VALUE_I; + std::map<size_t, std::string> m_channelNames; + std::map<size_t, float> m_channelsGain; + std::map<size_t, std::pair<size_t, size_t>> m_channelUnits; + + // Samples information + size_t m_sampling = NO_VALUE_I; + + // Impedance check + bool m_isImpedanceCheckRequested = false; + size_t m_impedanceLimit = NO_VALUE_I; +}; +} // namespace +//___________________________________________________________________// +// // + +void CHeaderImpl::reset() +{ + m_experimentID = NO_VALUE_I; + m_subjectAge = NO_VALUE_I; + m_subjectGender = NO_VALUE_I; + m_nChannel = NO_VALUE_I; + m_channelNames.clear(); + m_channelsGain.clear(); + m_channelUnits.clear(); + m_sampling = NO_VALUE_I; + m_isImpedanceCheckRequested = false; + m_nChannel = NO_VALUE_I; +} + +//___________________________________________________________________// +// // + +// Experiment information +bool CHeaderImpl::setExperimentID(const size_t experimentID) +{ + m_experimentID = experimentID; + return m_experimentID != NO_VALUE_I; +} + +bool CHeaderImpl::setSubjectAge(const size_t subjectAge) +{ + m_subjectAge = subjectAge; + return m_subjectAge != NO_VALUE_I; +} + +bool CHeaderImpl::setSubjectGender(const size_t subjectGender) +{ + m_subjectGender = subjectGender; + return m_subjectGender != NO_VALUE_I; +} + +//___________________________________________________________________// +// // + +// Chanel information + +bool CHeaderImpl::setChannelCount(const size_t nChannel) +{ + m_nChannel = nChannel; + // m_channelNames.clear(); + // m_channelsGain.clear(); + return m_nChannel != NO_VALUE_I; +} + +bool CHeaderImpl::setChannelName(const size_t index, const char* name) +{ + m_channelNames[index] = name; + return index < m_nChannel; +} + +bool CHeaderImpl::setChannelGain(const size_t index, const float gain) +{ + m_channelsGain[index] = gain; + return index < m_nChannel; +} + +bool CHeaderImpl::setChannelUnits(const size_t index, const size_t unit, const size_t factor) +{ + m_channelUnits[index] = std::pair<size_t, size_t>(unit, factor); + return index < m_nChannel; +} + +// bool CHeaderImpl::setChannelLocation(const size_t index, const float channelLocationX, const float channelLocationY, const float channelLocationZ); + +const char* CHeaderImpl::getChannelName(const size_t index) const +{ + const auto i = m_channelNames.find(index); + if (i == m_channelNames.end()) { return ""; } + return i->second.c_str(); +} + +float CHeaderImpl::getChannelGain(const size_t index) const +{ + const auto i = m_channelsGain.find(index); + if (i == m_channelsGain.end()) { return (index < m_nChannel ? 1.0F : 0.0F); } + return i->second; +} + +bool CHeaderImpl::getChannelUnits(const size_t index, size_t& unit, size_t& factor) const +{ + const auto i = m_channelUnits.find(index); + if (i == m_channelUnits.end()) { + unit = OVTK_UNIT_Unspecified; + factor = OVTK_FACTOR_Base; + + return false; + } + + unit = (i->second).first; + factor = (i->second).second; + + return true; +} + +//___________________________________________________________________// +// // + +// Samples information +bool CHeaderImpl::setSamplingFrequency(const size_t sampling) +{ + m_sampling = sampling; + return m_sampling != NO_VALUE_I; +} + +//___________________________________________________________________// +// // + +CHeader::CHeader() { m_impl = new CHeaderImpl(); } +CHeader::~CHeader() { delete m_impl; } +void CHeader::reset() { m_impl->reset(); } + +// Experiment information +bool CHeader::setExperimentID(const size_t id) { return m_impl->setExperimentID(id); } +bool CHeader::setSubjectAge(const size_t age) { return m_impl->setSubjectAge(age); } +bool CHeader::setSubjectGender(const size_t gender) { return m_impl->setSubjectGender(gender); } +size_t CHeader::getExperimentID() const { return m_impl->getExperimentID(); } +size_t CHeader::getSubjectAge() const { return m_impl->getSubjectAge(); } +size_t CHeader::getSubjectGender() const { return m_impl->getSubjectGender(); } +bool CHeader::isExperimentIDSet() const { return m_impl->isExperimentIDSet(); } +bool CHeader::isSubjectAgeSet() const { return m_impl->isSubjectAgeSet(); } +bool CHeader::isSubjectGenderSet() const { return m_impl->isSubjectGenderSet(); } + +void CHeader::setImpedanceCheckRequested(const bool state) { m_impl->setImpedanceCheckRequested(state); } +bool CHeader::isImpedanceCheckRequested() const { return m_impl->isImpedanceCheckRequested(); } +size_t CHeader::getImpedanceLimit() const { return m_impl->getImpedanceLimit(); } +void CHeader::setImpedanceLimit(const size_t limit) { m_impl->setImpedanceLimit(limit); } + +// Chanel information +bool CHeader::setChannelCount(const size_t nChannel) { return m_impl->setChannelCount(nChannel); } +bool CHeader::setChannelName(const size_t index, const char* name) { return m_impl->setChannelName(index, name); } +bool CHeader::setChannelGain(const size_t index, const float gain) { return m_impl->setChannelGain(index, gain); } +bool CHeader::setChannelUnits(const size_t index, const size_t unit, const size_t factor) { return m_impl->setChannelUnits(index, unit, factor); } +size_t CHeader::getChannelCount() const { return m_impl->getChannelCount(); } +const char* CHeader::getChannelName(const size_t index) const { return m_impl->getChannelName(index); } +float CHeader::getChannelGain(const size_t index) const { return m_impl->getChannelGain(index); } +bool CHeader::getChannelUnits(const size_t index, size_t& unit, size_t& factor) const { return m_impl->getChannelUnits(index, unit, factor); } +bool CHeader::isChannelCountSet() const { return m_impl->isChannelCountSet(); } +bool CHeader::isChannelNameSet() const { return m_impl->isChannelNameSet(); } +bool CHeader::isChannelGainSet() const { return m_impl->isChannelGainSet(); } +bool CHeader::isChannelUnitSet() const { return m_impl->isChannelUnitSet(); } + +// Samples information +bool CHeader::setSamplingFrequency(const size_t sampling) { return m_impl->setSamplingFrequency(sampling); } +size_t CHeader::getSamplingFrequency() const { return m_impl->getSamplingFrequency(); } +bool CHeader::isSamplingFrequencySet() const { return m_impl->isSamplingFrequencySet(); } + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASCore/ovasCHeader.h b/applications/platform/acquisition-server/src/OVASCore/ovasCHeader.h new file mode 100644 index 0000000000000000000000000000000000000000..b1cbaad2312c597f7648646e18b7b9aaa28d2001 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASCore/ovasCHeader.h @@ -0,0 +1,114 @@ +#pragma once + +#include "ovasIHeader.h" + +namespace OpenViBE { +namespace AcquisitionServer { +class CHeader : public IHeader +{ +public: + CHeader(); + ~CHeader() override; + void reset() override; + + // Experiment information + bool setExperimentID(const size_t id) override; + bool setSubjectAge(const size_t age) override; + bool setSubjectGender(const size_t gender) override; + + size_t getExperimentID() const override; + size_t getSubjectAge() const override; + size_t getSubjectGender() const override; + + bool isExperimentIDSet() const override; + bool isSubjectAgeSet() const override; + bool isSubjectGenderSet() const override; + + void setImpedanceCheckRequested(const bool state) override; + bool isImpedanceCheckRequested() const override; + size_t getImpedanceLimit() const override; + void setImpedanceLimit(const size_t limit) override; + + // Chanel information + bool setChannelCount(const size_t nChannel) override; + bool setChannelName(const size_t index, const char* name) override; + bool setChannelGain(const size_t index, const float gain) override; + bool setChannelUnits(const size_t index, const size_t unit, const size_t factor) override; + // virtual bool setChannelLocation(const size_t index, const float channelLocationX, const float channelLocationY, const float channelLocationZ); + + size_t getChannelCount() const override; + const char* getChannelName(const size_t index) const override; + float getChannelGain(const size_t index) const override; + bool getChannelUnits(const size_t index, size_t& unit, size_t& factor) const override; + // virtual getChannelLocation(const size_t index) const; + + bool isChannelCountSet() const override; + bool isChannelNameSet() const override; + bool isChannelGainSet() const override; + // virtual bool isChannelLocationSet() const; + bool isChannelUnitSet() const override; + + // Samples information + bool setSamplingFrequency(const size_t sampling) override; + + size_t getSamplingFrequency() const override; + + bool isSamplingFrequencySet() const override; + +protected: + IHeader* m_impl = nullptr; +}; + +class CHeaderAdapter : public IHeader +{ +public: + explicit CHeaderAdapter(IHeader& header) : m_header(header) { } + + void reset() override { return m_header.reset(); } + + // Experiment information + bool setExperimentID(const size_t id) override { return m_header.setExperimentID(id); } + + bool setSubjectAge(const size_t age) override { return m_header.setSubjectAge(age); } + bool setSubjectGender(const size_t gender) override { return m_header.setSubjectGender(gender); } + + size_t getExperimentID() const override { return m_header.getExperimentID(); } + size_t getSubjectAge() const override { return m_header.getSubjectAge(); } + size_t getSubjectGender() const override { return m_header.getSubjectGender(); } + + bool isExperimentIDSet() const override { return m_header.isExperimentIDSet(); } + bool isSubjectAgeSet() const override { return m_header.isSubjectAgeSet(); } + bool isSubjectGenderSet() const override { return m_header.isSubjectGenderSet(); } + void setImpedanceCheckRequested(const bool active) override { m_header.setImpedanceCheckRequested(active); } + bool isImpedanceCheckRequested() const override { return m_header.isImpedanceCheckRequested(); } + size_t getImpedanceLimit() const override { return m_header.getImpedanceLimit(); } + void setImpedanceLimit(const size_t impedanceLimit) override { m_header.setImpedanceLimit(impedanceLimit); } + + // Channel information + bool setChannelCount(const size_t nChannel) override { return m_header.setChannelCount(nChannel); } + bool setChannelName(const size_t index, const char* name) override { return m_header.setChannelName(index, name); } + bool setChannelGain(const size_t index, const float gain) override { return m_header.setChannelGain(index, gain); } + + bool setChannelUnits(const size_t index, const size_t unit, const size_t factor) override { return m_header.setChannelUnits(index, unit, factor); } + + size_t getChannelCount() const override { return m_header.getChannelCount(); } + const char* getChannelName(const size_t index) const override { return m_header.getChannelName(index); } + float getChannelGain(const size_t index) const override { return m_header.getChannelGain(index); } + + bool getChannelUnits(const size_t index, size_t& unit, size_t& factor) const override { return m_header.getChannelUnits(index, unit, factor); } + + bool isChannelCountSet() const override { return m_header.isChannelCountSet(); } + bool isChannelNameSet() const override { return m_header.isChannelNameSet(); } + bool isChannelGainSet() const override { return m_header.isChannelGainSet(); } + bool isChannelUnitSet() const override { return m_header.isChannelUnitSet(); } + + // Samples information + bool setSamplingFrequency(const size_t sampling) override { return m_header.setSamplingFrequency(sampling); } + size_t getSamplingFrequency() const override { return m_header.getSamplingFrequency(); } + bool isSamplingFrequencySet() const override { return m_header.isSamplingFrequencySet(); } + +protected: + IHeader& m_header; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASCore/ovasCSettingsHelper.cpp b/applications/platform/acquisition-server/src/OVASCore/ovasCSettingsHelper.cpp new file mode 100644 index 0000000000000000000000000000000000000000..de35608c9e3376d0dc7dce6eb55d3b5b35a37e21 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASCore/ovasCSettingsHelper.cpp @@ -0,0 +1,47 @@ +#include "ovasCSettingsHelper.h" + +namespace OpenViBE { +namespace AcquisitionServer { + +// Save all registered variables to the configuration manager +void SettingsHelper::save() +{ + for (auto it = m_properties.begin(); it != m_properties.end(); ++it) { + std::stringstream ss; + + ss << *(it->second); + + // m_rContext.getLogManager() << Kernel::LogLevel_Info << "Token " << it->first << " wrote [" << ss.str() << "]\n"; + const CString name = m_prefix + CString("_") + it->first; + CIdentifier id = m_configManager.lookUpConfigurationTokenIdentifier(name); + if (id == CIdentifier::undefined()) { m_configManager.createConfigurationToken(m_prefix + CString("_") + it->first, CString(ss.str().c_str())); } + else { + // replacing token value + m_configManager.setConfigurationTokenValue(id, CString(ss.str().c_str())); + } + } +} + +// Load all registered variables from the configuration manager +void SettingsHelper::load() +{ + for (auto it = m_properties.begin(); it != m_properties.end(); ++it) { + const CString name = m_prefix + CString("_") + it->first; + if (m_configManager.lookUpConfigurationTokenIdentifier(name) != CIdentifier::undefined()) { + const CString value = m_configManager.expand(CString("${") + name + CString("}")); + + // m_rContext.getLogManager() << Kernel::LogLevel_Info << "Token " << it->first << " found, mgr setting = [" << value << "]\n"; + + // Note that we have to accept empty strings as the user may have intended to keep the token empty. So we do not check here. + std::stringstream ss; + ss << value.toASCIIString(); + ss >> *(it->second); + + // m_rContext.getLogManager() << Kernel::LogLevel_Info << "Token " << it->first << " inserted as [" << *(it->second) << "]\n"; + } + // else { } // token not found + } +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASCore/ovasCSettingsHelper.h b/applications/platform/acquisition-server/src/OVASCore/ovasCSettingsHelper.h new file mode 100644 index 0000000000000000000000000000000000000000..de9abd3d06e88a37c9783c43f8b6553ef6dcddb6 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASCore/ovasCSettingsHelper.h @@ -0,0 +1,189 @@ +#pragma once + +#include <ovas_base.h> + +#include <map> +#include <iostream> + +#include "ovasCSettingsHelperOperators.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class Property + * \author Jussi T. Lindgren (Inria) + * \date 2013-11 + * \brief Base class for properties. A property is essentially a <name,value> pair. + * + * \note This class is intended for typed inheritance. It carries no data. + */ +class Property +{ +public: + explicit Property(const CString& name) : m_name(name) { } + + virtual ~Property() {} + + CString getName() const { return m_name; } + + virtual std::ostream& toStream(std::ostream& out) const = 0; + virtual std::istream& fromStream(std::istream& in) = 0; + +private: + CString m_name; +}; + +// Helper operators to map base class << and >> to those of the derived classes. These can not be members. +inline std::ostream& operator<<(std::ostream& out, const Property& obj) { return obj.toStream(out); } +inline std::istream& operator>>(std::istream& in, Property& obj) { return obj.fromStream(in); } + +/* + * \class TypedProperty + * \author Jussi T. Lindgren (Inria) + * \date 2013-11 + * \brief A property with a typed data pointer. + * + * \note The class does NOT own the data pointer, but may allow modification of its contents via replaceData(). + */ +template <typename T> +class TypedProperty final : public Property +{ +public: + TypedProperty(const CString& name, T* data) : Property(name), m_data(data) { } + + // Access data + const T* getData() const { return m_data; } + + // Overwrites existing data with new contents. + void replaceData(T& data) { *m_data = data; } + + std::ostream& toStream(std::ostream& out) const override + { + out << *m_data; + return out; + } + + std::istream& fromStream(std::istream& in) override + { + in >> *m_data; + return in; + } + +private: + T* m_data = nullptr; +}; + +#ifdef OV_SH_SUPPORT_GETTERS + /* + * \class GetterSetterProperty + * \author Jussi T. Lindgren (Inria) + * \date 2013-11 + * \brief A property for situations where the data can only be accessed by getters and setters + * + * \note Type T is the type of the object that has the getters and setters as a member. The + * types V and W indicate the actual data type that the getters and setters deal with. We + * use two types V and W as in the case of the setter, the type is usually const, but for getter, + * its not. This avoids the compiler getting confused. + */ + template <typename T, typename V, typename W> + class GetterSetterProperty : public Property + { + public: + GetterSetterProperty(const CString& name, T& obj, V ( T::*getter)() const, bool ( T::*setter)(W)) + : Property(name), m_obj(obj), m_getterFunction(getter), m_setterFunction(setter) { }; + + virtual std::ostream& toStream(std::ostream& out) const + { + // std::cout << "Writing " << (m_obj.*m_getter)() << "\n"; + out << (m_obj.*m_getterFunction)(); + return out; + } + + virtual std::istream& fromStream(std::istream& in) + { + W tmp; + in >> tmp; + // std::cout << "Reading " << tmp << "\n"; + (m_obj.*m_setterFunction)(tmp); + return in; + } + + private: + + T& m_obj; + V ( T::*m_getterFunction )() const; + bool ( T::*m_setterFunction )(W); + }; +#endif + +/* + * \class SettingsHelper + * \author Jussi T. Lindgren (Inria) + * \date 2013-11 + * \brief Convenience helper class that eases the saving and loading of variables (properties) to/from the configuration manager + * + * \note For registering exotic types, the user must provide the << and >> overloads to/from streams + */ +class SettingsHelper +{ +public: + SettingsHelper(const char* prefix, Kernel::IConfigurationManager& rMgr) : m_prefix(prefix), m_configManager(rMgr) { } + + ~SettingsHelper() + { + for (auto it = m_properties.begin(); it != m_properties.end(); ++it) { delete(it->second); } + m_properties.clear(); + } + + // Register or replace a variable. The variable must remain valid for the lifetime of the SettingsHelper object. + template <typename T> + bool add(const CString& name, T* var) + { + if (!var) { return false; } // std::cout << "Tried to add a NULL pointer\n"; + + // If key is in map, replace + auto it = m_properties.find(name); + if (it != m_properties.end()) { delete it->second; } // m_rContext.getLogManager() << Kernel::LogLevel_Trace << "Replacing key [" << name << "]\n"; + + TypedProperty<T>* myProperty = new TypedProperty<T>(name, var); + m_properties[myProperty->getName()] = myProperty; + + return true; + } + +#ifdef OV_SH_SUPPORT_GETTERS + // Register or replace a property used via setters and getters. The actual object must be provided as well and + // must remain valid for the lifetime of the SettingsHelper object. + template <typename T, typename V, typename W> + bool add(const CString& name, T& obj, V ( T::*getter)() const, bool ( T::*setter)(W)) + { + if (getter == nullptr || setter == nullptr) { return false; } // std::cout << "Tried to add a NULL pointer\n"; + + // If key is in map, replace + auto it = m_properties.find(name); + if (it != m_properties.end()) { delete it->second; } // m_rContext.getLogManager() << Kernel::LogLevel_Trace << "Replacing key [" << name << "]\n"; + + GetterSetterProperty<T, V, W>* myProperty = new GetterSetterProperty<T, V, W>(name, obj, getter, setter); + m_properties[myProperty->getName()] = myProperty; + + return true; + } +#endif + + // Save all registered variables to the configuration manager + void save(); + + // Load all registered variables from the configuration manager + void load(); + + // Get access to the registered variables + const std::map<CString, Property*>& getAllProperties() const { return m_properties; } + +private: + CString m_prefix; + Kernel::IConfigurationManager& m_configManager; + + std::map<CString, Property*> m_properties; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASCore/ovasCSettingsHelperOperators.h b/applications/platform/acquisition-server/src/OVASCore/ovasCSettingsHelperOperators.h new file mode 100644 index 0000000000000000000000000000000000000000..94529be1d36eb7db15e398d1f4c6e661798f6207 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASCore/ovasCSettingsHelperOperators.h @@ -0,0 +1,150 @@ +#pragma once + +#include <ovas_base.h> +#include "ovasIHeader.h" + +#include <map> + +/* + * \brief Operators used to convert between typical variables (as used in properties & settings) and streams + * + * + */ + +namespace OpenViBE { +namespace AcquisitionServer { +inline std::ostream& operator<<(std::ostream& out, const CString& var) +{ + out << std::string(var.toASCIIString()); + return out; +} + +inline std::istream& operator>>(std::istream& in, CString& var) +{ + std::string tmp; + std::getline(in, tmp); + var.set(tmp.c_str()); + // std::cout << "Parsed [" << var.toASCIIString() << "]\n"; + return in; +} + +// Writes fields of IHeader to a stream +inline std::ostream& operator<<(std::ostream& out, const IHeader& var) +{ + if (var.isExperimentIDSet()) { out << "ExperimentID " << var.getExperimentID() << " "; } + if (var.isSubjectAgeSet()) { out << "SubjectAge " << var.getSubjectAge() << " "; } + if (var.isSubjectGenderSet()) { out << "SubjectGender " << var.getSubjectGender() << " "; } + out << "ImpedanceCheck " << var.isImpedanceCheckRequested() << " "; + if (var.isSamplingFrequencySet()) { out << "SamplingFrequency " << var.getSamplingFrequency() << " "; } + if (var.isChannelCountSet()) { out << "Channels " << var.getChannelCount() << " "; } + + if (var.isChannelCountSet() && var.isChannelNameSet()) { + out << "Names "; + for (size_t i = 0; i < var.getChannelCount(); ++i) { out << var.getChannelName(i) << ";"; } + out << " "; + } + + if (var.isChannelCountSet() && var.isChannelGainSet()) { + out << "Gains "; + for (size_t i = 0; i < var.getChannelCount(); ++i) { out << var.getChannelGain(i) << " "; } + } + + return out; +} + +// Reads fields of IHeader from a stream +inline std::istream& operator>>(std::istream& in, IHeader& var) +{ + std::string token; + + while (std::getline(in, token, ' ')) { + if (token.empty()) { continue; } + + // std::cout << "Got token [" << token << "]\n"; + + if (token == "ExperimentID") { + // std::cout << "Parsing experiment id\n"; + uint32_t tmp; + in >> tmp; + var.setExperimentID(tmp); + } + else if (token == "SubjectAge") { + // std::cout << "Parsing age\n"; + uint32_t tmp; + in >> tmp; + var.setSubjectAge(tmp); + } + else if (token == "SubjectGender") { + // std::cout << "Parsing gender\n"; + uint32_t tmp; + in >> tmp; + var.setSubjectGender(tmp); + } + else if (token == "ImpedanceCheck") { + // std::cout << "Parsing impedance check\n"; + bool tmp; + in >> tmp; + var.setImpedanceCheckRequested(tmp); + } + else if (token == "SamplingFrequency") { + // std::cout << "Parsing freq\n"; + + uint32_t tmp; + in >> tmp; + var.setSamplingFrequency(tmp); + + // std::cout << " Got " << sampling << "\n"; + } + else if (token == "Channels") { + // std::cout << "Parsing chn count\n"; + uint32_t tmp; + in >> tmp; + var.setChannelCount(tmp); + + // std::cout << " Got " << nChannels << "\n"; + } + else if (token == "Names" && var.isChannelCountSet()) { + // std::cout << "Parsing names\n"; + + std::string tmp; + for (size_t i = 0; i < var.getChannelCount(); ++i) { + std::getline(in, tmp, ';'); + // std::cout << " Parsed " << value << "\n"; + var.setChannelName(i, tmp.c_str()); + } + } + else if (token == "Gains" && var.isChannelCountSet()) { + // std::cout << "Parsing gains\n"; + float tmp; + for (size_t i = 0; i < var.getChannelCount(); ++i) { + in >> tmp; + var.setChannelGain(i, tmp); + // std::cout << " Parsed " << tmpGain << "\n"; + } + } + else { }// std::cout << "Unexpected token [" << token << "]\n"; + } + + return in; +} + +inline std::ostream& operator<<(std::ostream& out, const std::map<uint32_t, uint32_t>& var) +{ + for (auto it = var.begin(); it != var.end(); ++it) { out << it->first << " " << it->second << " "; } + return out; +} + +inline std::istream& operator>>(std::istream& in, std::map<uint32_t, uint32_t>& var) +{ + var.clear(); + uint32_t key; + uint32_t value; + while (in >> key) { + in >> value; + var[key] = value; + } + + return in; +} +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASDrivers/CMakeLists.txt b/applications/platform/acquisition-server/src/OVASDrivers/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..c22effc2f7f7cf4bd280b6f379d8fbc10e854e8d --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/CMakeLists.txt @@ -0,0 +1,48 @@ +project(OVASDrivers VERSION ${OPENVIBE_MAJOR_VERSION}.${OPENVIBE_MINOR_VERSION}.${OPENVIBE_PATCH_VERSION}) + +# We call this first as some dependency getters have been coded to not find the libs on x64 until supported +# --------------------------------- +if(WIN32) + add_definitions(-DWIN32_LEAN_AND_MEAN) +endif(WIN32) + + +#file(GLOB_RECURSE SRC_FILES ./*.cpp ./*.h ./*.hpp) + +set(SRC_FILES generic-oscillator/ovasCDriverGenericOscillator.cpp generic-oscillator/ovasCDriverGenericOscillator.h) + +add_library(${PROJECT_NAME} SHARED ${SRC_FILES}) + + +target_compile_definitions(${PROJECT_NAME} + PUBLIC -DTARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines +) + +target_include_directories(${PROJECT_NAME} +PUBLIC . +) + + +target_link_libraries(${PROJECT_NAME} + openvibe + openvibe-common + openvibe-toolkit + openvibe-module-socket + openvibe-module-system + openvibe-module-fs + openvibe-module-lsl + Boost::boost + Boost::system + Eigen3::Eigen + # drivers + brainproducts-amplifier-sdk + OVASCore +) + +add_definitions(-DTARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines) + +# Install files +install(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) diff --git a/applications/platform/acquisition-server/src/OVASDrivers/biosemi-activetwo/mCBridgeBioSemiActiveTwo.cpp b/applications/platform/acquisition-server/src/OVASDrivers/biosemi-activetwo/mCBridgeBioSemiActiveTwo.cpp new file mode 100644 index 0000000000000000000000000000000000000000..8c5955e71c202ee414711eda3bb4c9051ed6e606 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/biosemi-activetwo/mCBridgeBioSemiActiveTwo.cpp @@ -0,0 +1,706 @@ +///------------------------------------------------------------------------------------------------- +/// \copyright Copyright (C) 2012, Mensia Technologies SA. All rights reserved. +/// +/// This library is free software; you can redistribute it and/or +/// modify it under the terms of the GNU Lesser General Public +/// License as published by the Free Software Foundation; either +/// version 2.1 of the License, or (at your option) any later version. +/// +/// This library is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +/// Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with this library; if not, write to the Free Software +/// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +/// MA 02110-1301 USA +///------------------------------------------------------------------------------------------------- + +/* +This code implements the procedure described her: +http://www.biosemi.com/faq/make_own_acquisition_software.htm +*/ + +#ifdef TARGET_HAS_ThirdPartyBioSemiAPI +#include "mCBridgeBioSemiActiveTwo.h" + +#include <iostream> +//debug +#include <fstream> + +#ifdef WIN32 +#ifndef WIN32_LEAN_AND_MEAN + #define WIN32_LEAN_AND_MEAN +#endif +#include <windows.h> +#else +// linux, mac +#include <unistd.h> +#endif // WIN32 + +#include <labview_dll.h> + +//___________________________________________________________________// +// // +#ifdef _DEBUG +#define __BioSemiBridgeLogConsole__(msg, ...) printf(msg, __VA_ARGS__) +#else +#define __BioSemiBridgeLogConsole__(msg, ...) +#endif + +//___________________________________________________________________// +// // +// Ring buffer must be large enough to hold at least a complete sample round +// otherwise we wont be able to detect the length between 2 sync bytes and deduce channel count. +// test gives 131072 bytes (32768 long) per read +// it needs to be a multiple of 512 +#define BIOSEMI_ACTIVETWO_RINGBUFFERLONGCOUNT (32768*512) +#define BIOSEMI_ACTIVETWO_RINGBUFFERBYTES (BIOSEMI_ACTIVETWO_RINGBUFFERLONGCOUNT*sizeof(int)) //67108864 bytes + +// The control buffer is sent through USB_WRITE. It is a 64 bytes buffer. +// First byte controls the start/stop filling of ring buffer; if Odd, it starts. +// 2nd and 3rd byte are used for outgoing triggers. +// byte 4-64 unused. +#define BIOSEMI_ACTIVETWO_CONTROLBUFFERBYTES 64 + +// SYNC bytes pads the stream that sends a fixed number of bytes per read() independently of the channel count. +#define BIOSEMI_ACTIVETWO_SYNCBYTES 0xffffff00 + +// the device can be configured by changing the speedmode "button" in front of the amplifier 0-9 +#define BIOSEMI_ACTIVETWO_SPEEDMODECOUNT 10 + +namespace BioSemi { +/* +AD-box model MK1 + +AD-box switch | Sample-rate | Pin channels + EX channels + Sensor channels +***************|*****************|********************************************* +0 | 2048 (2 kHz) | 256+0+0 +1 | 4096 (4 kHz) | 128+0+0 +2 | 8192 (8 kHz) | 64+0+0 +3 | 16384 (16 kHz) | 32+0+0 +4 | 2048 (2 kHz) | 232+8+7 +5 | 4096 (4 kHz) | 104+8+7 +6 | 8192 (8 kHz) | 40+8+7 +7 | 16384 (16 kHz) | 8+8+7 +8 (AIB-mode) | 2048 (2 kHz) | AIB-mode +9 | Reserved | Reserved +*/ +static uint32_t activeTwoMarkISpeedModeFrequency[BIOSEMI_ACTIVETWO_SPEEDMODECOUNT] = { 2048, 4096, 8192, 16384, 2048, 4096, 8192, 16384, 2048, 0 }; + +/* +AD-box model MK2 + +AD-box switch | Sample-rate | Pin channels + EX channels + Sensor channels +***************|*****************|********************************************* +0 | 2048 (2 kHz) | >> Daisy-chain mode: +1 | 4096 (4 kHz) | >> In speedmode 0 to 3, the AD-boxes work as up to 4 optical fiber 'daisy chained' boxes, +2 | 8192 (8 kHz) | >> each with a maximum of 128+8 channels+sensors @ 2 kHz, speedmode switch = box number. (0=Box1, 1=Box2, 2=Box3, 3=Box4). +3 | 16384 (16 kHz) | >> Daisy chain possibilities are not standard included in the base system price +4 | 2048 (2 kHz) | 256+8+7 +5 | 4096 (4 kHz) | 128+8+7 +6 | 8192 (8 kHz) | 64+8+7 +7 | 16384 (16 kHz) | 32+8+7 +8 (AIB-mode) | 2048 (2 kHz) | 256+8+7+32AIB +9 (ABR-mode) | 16384 (16 kHz) | 5 +*/ +static uint32_t activeTwoMarkIISpeedModeFrequency[BIOSEMI_ACTIVETWO_SPEEDMODECOUNT] = { 2048, 4096, 8192, 16384, 2048, 4096, 8192, 16384, 2048, 16384 }; + +static uint32_t* activeTwoSpeedModeFrequency[2] = { activeTwoMarkISpeedModeFrequency, activeTwoMarkIISpeedModeFrequency }; + +/* +The ActiveTwo sends the following number of 32-bit words per sample: + +Mk1: +Speedmode 0 and 4: 258 +Speedmode 1 and 5: 130 +Speedmode 2 and 6: 66 +Speedmode 3 and 7: 34 +Speedmode 8: 290 (2+256+32) +*/ +static uint32_t activeTwoMarkILongPerSample[BIOSEMI_ACTIVETWO_SPEEDMODECOUNT] = { 258, 130, 66, 34, 258, 130, 66, 34, 290, 0 }; + +/* +Mk2: +Speedmode 0, 1, 2 and 3: 610 (2+4*152) +Speedmode 4: 282 +Speedmode 5: 154 +Speedmode 6: 90 +Speedmode 7: 58 +Speedmode 8: 314 (2+280+32) +*/ +static uint32_t activeTwoMarkIILongPerSample[BIOSEMI_ACTIVETWO_SPEEDMODECOUNT] = { 610, 610, 610, 610, 282, 154, 90, 58, 314, 0 }; + +static uint32_t* activeTwoMarkLongPerSample[2] = { activeTwoMarkILongPerSample, activeTwoMarkIILongPerSample }; +/* +The ActiveTwo sends the following number of 32-bit words per sample: + +Mk1: +Speedmode 0 and 4: 258 +Speedmode 1 and 5: 130 +Speedmode 2 and 6: 66 +Speedmode 3 and 7: 34 +Speedmode 8: 290 (2+256+32) +*/ +static uint32_t activeTwoMarkIElectrodeChannelPerSample[BIOSEMI_ACTIVETWO_SPEEDMODECOUNT] = { 256, 128, 256, 34, 232, 104, 40, 8, 290, 0 }; + +/* +The ActiveTwo sends the following number of 32-bit words per sample: + +Mk2: +Speedmode 0 and 4: 258 +Speedmode 1 and 5: 130 +Speedmode 2 and 6: 66 +Speedmode 3 and 7: 34 +Speedmode 8: 290 (2+256+32) +*/ +static uint32_t activeTwoMarkIIElectrodeChannelPerSample[BIOSEMI_ACTIVETWO_SPEEDMODECOUNT] = { 256, 128, 256, 128, 256, 128, 64, 32, 314, 0 }; + +static uint32_t* activeTwoMarkElectrodeChannelPerSample[2] = { activeTwoMarkIElectrodeChannelPerSample, activeTwoMarkIIElectrodeChannelPerSample }; + +/* +Mk2: +Speedmode 0, 1, 2 and 3: 610 (2+4*152) +Speedmode 4: 282 +Speedmode 5: 154 +Speedmode 6: 90 +Speedmode 7: 58 +Speedmode 8: 314 (2+280+32) +*/ +static uint32_t activeTwoMarkIExChannelPerSample[BIOSEMI_ACTIVETWO_SPEEDMODECOUNT] = { 0, 0, 0, 0, 8, 8, 8, 8, 8, 8 }; + +/* +Mk2: +Speedmode 0, 1, 2 and 3: 610 (2+4*152) +Speedmode 4: 282 +Speedmode 5: 154 +Speedmode 6: 90 +Speedmode 7: 58 +Speedmode 8: 314 (2+280+32) +*/ +static uint32_t activeTwoMarkIIExChannelPerSample[BIOSEMI_ACTIVETWO_SPEEDMODECOUNT] = { 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 }; + +static uint32_t* activeTwoMarkExChannelPerSample[2] = { activeTwoMarkIExChannelPerSample, activeTwoMarkIIExChannelPerSample }; +} // namespace BioSemi + +//___________________________________________________________________// +// // +namespace OpenViBE { + +CBridgeBioSemiActiveTwo::CBridgeBioSemiActiveTwo() +{ + m_buffers.resize(BIOSEMI_ACTIVETWO_RINGBUFFERBYTES, 0); + m_controlBuffers.resize(BIOSEMI_ACTIVETWO_CONTROLBUFFERBYTES); + m_lastError = BioSemiError_NoError; + m_useEXChannels = false; +} + +CBridgeBioSemiActiveTwo::~CBridgeBioSemiActiveTwo() {} + +//___________________________________________________________________// +// // +bool CBridgeBioSemiActiveTwo::isDeviceConnected() +{ + m_hDevice = OPEN_DRIVER(); + if (m_hDevice == INVALID_HANDLE_VALUE) + { + __BioSemiBridgeLogConsole__("Failed to open driver!\n"); + m_lastError = BioSemiError_OSOpenFailed; + return false; + } + + Sleep(100); + + if (!CLOSE_DRIVER(m_hDevice)) + { + __BioSemiBridgeLogConsole__("device driver cannot be closed!!\n"); + m_lastError = BioSemiError_OSCloseFailed; + return false; + } + + return true; +} + + +bool CBridgeBioSemiActiveTwo::open() +{ + m_lastRingBufferByteIdx = 0; + m_consumptionByteIdx = 0; + m_firstRead = true; + + m_nTotalByteRead = 0; + + m_nChannel = 0; + m_nInitialChannel = 0; + m_bridgeSyncedWithDevice = false; + + m_triggers.clear(); + m_triggers.resize(16, false); + m_epochStarted = false; + m_cmsInRange = false; + m_batteryLow = false; + m_activeTwoMarkII = false; + m_initialActiveTwoMarkII = false; + m_speedMode = -1; + m_initialSpeedmode = 0; + + m_hDevice = OPEN_DRIVER(); + if (m_hDevice == INVALID_HANDLE_VALUE) + { + __BioSemiBridgeLogConsole__("Failed to open driver!\n"); + m_lastError = BioSemiError_OSOpenFailed; + return false; + } + + __BioSemiBridgeLogConsole__("Handle created, configuring...\n"); + + // TEMP for debug: log file written along with the LabView_DLL + //BSIF_SET_LOG(true); + + // default config + //BSIF_SET_SYNC(true); + //BSIF_SET_DEBUG(false); + + // No stride + //BSIF_SET_STRIDE_KB(0); + //BSIF_SET_STRIDE_MS(0); + + char bufferInfo[256]; + GET_DRIVER_INFO(bufferInfo, 256); + __BioSemiBridgeLogConsole__("Driver Info: %s", bufferInfo); + + __BioSemiBridgeLogConsole__("connecting ring buffer ...\n"); + READ_MULTIPLE_SWEEPS(m_hDevice, &m_buffers[0], BIOSEMI_ACTIVETWO_RINGBUFFERBYTES); + + __BioSemiBridgeLogConsole__("device driver now opened.\n"); + return true; +} + +bool CBridgeBioSemiActiveTwo::start() +{ + m_controlBuffers.clear(); + m_controlBuffers.resize(BIOSEMI_ACTIVETWO_CONTROLBUFFERBYTES); + m_controlBuffers[0] = char(-1); // Odd number to start the filling of ring buffer + + BOOL status = false; + + status = USB_WRITE(m_hDevice, &m_controlBuffers[0]); + if (!status) + { + __BioSemiBridgeLogConsole__("usb_write for enable handshake failed with [%i]\n", GetLastError()); + m_lastError = BioSemiError_EnableUSBHandshakeFailed; + return false; + } + + // Past this point, the ring buffer is constantly filled. + return true; +} + +int CBridgeBioSemiActiveTwo::read() +{ + int bytesRead; +#if TARGET_ARCHITECTURE_x64 + long long currentRingBufferByteIdx; +#else + int currentRingBufferByteIdx; +#endif + const bool status = (READ_POINTER(m_hDevice, ¤tRingBufferByteIdx) != FALSE); + + if (!status) + { + __BioSemiBridgeLogConsole__("READ_POINTER failed !!\n"); + m_lastError = BioSemiError_ReadPointerFailed; + return -1; + } + + if (currentRingBufferByteIdx != m_lastRingBufferByteIdx) + { + bytesRead = currentRingBufferByteIdx - m_lastRingBufferByteIdx; + + // ring buffer: we can loop indices + if (bytesRead < 0) + { + bytesRead += BIOSEMI_ACTIVETWO_RINGBUFFERBYTES; + __BioSemiBridgeLogConsole__("RING BUFFER IS ROLLING\n"); + } + + //__BioSemiBridgeLogConsole__("READ_POINTER read %i bytes\n",l_iBytesRead); + + m_nTotalByteRead += uint32_t(bytesRead); + m_lastRingBufferByteIdx = currentRingBufferByteIdx; + + // determine number of channels according to sync bytes + // Two extra channels are leading the ADC data: before: channel 1 = sync (check for FFFFFF00) and channel 2 = Status + // (see http://www.biosemi.com/faq/trigger_signals.htm), channels 3-258 are ADCs 1-256. + + uint32_t firstSyncByte = -1; + uint32_t nextSyncByte = -1; + + // for loop over LONG values, not bytes + for (int i = 0; i < bytesRead && !m_bridgeSyncedWithDevice; ++i) + { + if (*(reinterpret_cast<int*>(&m_buffers[i])) == BIOSEMI_ACTIVETWO_SYNCBYTES) + { + __BioSemiBridgeLogConsole__("sync detected at byte %i\n", i); + if (firstSyncByte == -1) { firstSyncByte = i; } + else + { + //second sync found, we can deduce the channel count: it's the number of longs in between + nextSyncByte = i; + m_nChannel = nextSyncByte - firstSyncByte; + m_nChannel /= sizeof(int); + m_nChannel -= 2; + + + // we also initialize the status values for getSamplingFrequency + const int statusChannelValue = *(reinterpret_cast<int*>(&m_buffers[firstSyncByte + sizeof(int)])); // status integer just after sync integer + if (!this->updateStatusFromValue(statusChannelValue)) + { + __BioSemiBridgeLogConsole__("something bad in latest status value !\n"); + return -1; + } + + // Bridge is synced, user can call status getters + m_bridgeSyncedWithDevice = true; + + //consuming all sync samples + //this->consumeBytes(sizeof(int) * (getSampleCount() - m_nChannel - 1)); + + // The Handsake is complete; we can safely consume the corresponding data + // channel# + SYNC (Status is consumed in updateStatusFromValue function) + this->consumeBytes((m_nChannel + 1) * sizeof(int)); + + // fix number of channel + } + } + } + + if (!m_bridgeSyncedWithDevice) + { + __BioSemiBridgeLogConsole__("Cannot synchronize on current data, waiting for more.\n"); + return 0; + } + + //debug + /*fstream fs("C:/biosemi-buffer.data",fstream::app); + fs<< "START----------------------------------------------"; + for (int i=0; i<l_iBytesRead; i+=4) + fs << hex << *(reinterpret_cast<int*>(&m_buffers[i])) << std::endl; + fs.close(); + fs<< "END----------------------------------------------";*/ + + if (m_firstRead) + { + m_nInitialChannel = m_useEXChannels ? m_nChannel + getEXChannelCount() : m_nChannel; + m_initialSpeedmode = m_speedMode; + m_initialActiveTwoMarkII = m_activeTwoMarkII; + m_firstRead = false; + + // Consume what remains of data + // samples# - channel# - SYNC + this->consumeBytes(sizeof(int) * (getSampleCount() - m_nChannel - 1)); + + m_nChannel = m_nChannel < getElectrodeChannelCount() ? m_nChannel : getElectrodeChannelCount(); + __BioSemiBridgeLogConsole__( + "Bridge sync! Initial configuration is: %u channels | speedmode %u | Mark2 %u | Sample count %u | electrode channel count %u | EX channel count: %u \n", + m_nInitialChannel, m_initialSpeedmode, m_initialActiveTwoMarkII, getSampleCount(), getElectrodeChannelCount(), getEXChannelCount()); + } + return bytesRead; + } + + // nothing read + //__BioSemiBridgeLogConsole__("READ_POINTER has nothing for us.\n)"; + return 0; +} + +//___________________________________________________________________// +// // + +bool CBridgeBioSemiActiveTwo::updateStatusFromValue(int value) +{ + /* + Bit 00 (LSB) Trigger Input 1 (High = trigger on) + Bit 01 Trigger Input 2 (High = trigger on) + Bit 02 Trigger Input 3 (High = trigger on) + Bit 03 Trigger Input 4 (High = trigger on) + Bit 04 Trigger Input 5 (High = trigger on) + Bit 05 Trigger Input 6 (High = trigger on) + Bit 06 Trigger Input 7 (High = trigger on) + Bit 07 Trigger Input 8 (High = trigger on) + Bit 08 Trigger Input 9 (High = trigger on) + Bit 09 Trigger Input 10 (High = trigger on) + Bit 10 Trigger Input 11 (High = trigger on) + Bit 11 Trigger Input 12 (High = trigger on) + Bit 12 Trigger Input 13 (High = trigger on) + Bit 13 Trigger Input 14 (High = trigger on) + Bit 14 Trigger Input 15 (High = trigger on) + Bit 15 Trigger Input 16 (High = trigger on) + Bit 16 High when new Epoch is started + Bit 17 Speed bit 0 + Bit 18 Speed bit 1 + Bit 19 Speed bit 2 + Bit 20 High when CMS is within range ---> error in the documentation, it is the opposite + Bit 21 Speed bit 3 + Bit 22 High when battery is low + Bit 23 (MSB) High if ActiveTwo MK2 + */ + //__BioSemiBridgeLogConsole__("status line value is [%#x]\n",value); + // the status channel has 2 bytes padding (zeros), so we start at 0x100 + for (uint32_t t = 0; t < 16; ++t) { m_triggers[t] = (value & (0x100 << t)) != 0; } + + m_epochStarted = (value & (0x100 << 16)) != 0; + m_cmsInRange = !(value & (0x100 << 20)) != 0; // bit low = CM in range ! + m_batteryLow = (value & (0x100 << 22)) != 0; + m_activeTwoMarkII = (value & (0x100 << 23)) != 0; + m_speedMode = ((value & (0x100 << 17)) != 0) + (((value & (0x100 << 18)) != 0) << 1) + + (((value & (0x100 << 19)) != 0) << 2); + // + (((value & (0x100 << 21))!= 0) << 3); + + this->consumeBytes(sizeof(int)); + + // fail cases: + if (!m_firstRead && m_activeTwoMarkII != m_initialActiveTwoMarkII) + { + __BioSemiBridgeLogConsole__("Device type changed during acquisition! Stream may have lost synchronization.\n"); + m_lastError = BioSemiError_DeviceTypeChanged; + return false; + } + if (!m_firstRead && m_speedMode != m_initialSpeedmode) + { + __BioSemiBridgeLogConsole__("Speedmode changed during acquisition (%u > %u). Stream may have lost synchronization.\n", m_initialSpeedmode, m_speedMode); + m_lastError = BioSemiError_SpeedmodeChanged; + return false; + } + if (m_speedMode >= BIOSEMI_ACTIVETWO_SPEEDMODECOUNT) + { + __BioSemiBridgeLogConsole__("Invalid speedmode [%u].\n", m_speedMode); + m_lastError = BioSemiError_InvalidSpeedmode; + return false; + } + + return true; +} + +uint32_t CBridgeBioSemiActiveTwo::getSamplingFrequency() const { return BioSemi::activeTwoSpeedModeFrequency[(m_activeTwoMarkII ? 1 : 0)][m_speedMode]; } + +//___________________________________________________________________// +// // + +bool CBridgeBioSemiActiveTwo::discard() +{ + const uint32_t count = this->getAvailableSampleCount(); + for (uint32_t i = 0; i < count; ++i) + { + if (!this->consumeOneSamplePerChannel(nullptr, 0)) + { + __BioSemiBridgeLogConsole__("the sample %u/%u [%u] cannot be discarded ! stopping discard.\n", i, count, m_consumptionByteIdx); + return false; + } + } + return true; +} + +uint32_t CBridgeBioSemiActiveTwo::getAvailableByteCount() const +{ + if (m_lastRingBufferByteIdx > m_consumptionByteIdx) { return m_lastRingBufferByteIdx - m_consumptionByteIdx; } + return m_lastRingBufferByteIdx + (BIOSEMI_ACTIVETWO_RINGBUFFERBYTES - m_consumptionByteIdx); +} + +uint32_t CBridgeBioSemiActiveTwo::getAvailableSampleCount() +{ + if (!m_bridgeSyncedWithDevice) return 0; + // this will be rounded + return (this->getAvailableByteCount() / (sizeof(int) * getSampleCount())); +} + +void CBridgeBioSemiActiveTwo::consumeBytes(const uint32_t count) +{ + /*fstream fs("C:/biosemi-consume.txt",fstream::app); + fs <<dec<< count<< " : " << m_consumptionByteIdx << std::endl; + fs.close();*/ + + m_consumptionByteIdx = (m_consumptionByteIdx + count) % BIOSEMI_ACTIVETWO_RINGBUFFERBYTES; +} + +bool CBridgeBioSemiActiveTwo::consumeOneSamplePerChannel(float* pSampleBuffer, uint32_t uiBufferValueCount) +{ + // fail case: we can't consume if not yet sync'ed + if (!m_bridgeSyncedWithDevice) + { + __BioSemiBridgeLogConsole__("Bridge is not synced with the device, cannot consume.\n"); + m_lastError = BioSemiError_NoSync; + return false; + } + + //fail case: we do nothing if we cannot completly fill the user buffer + if (this->getAvailableByteCount() < uiBufferValueCount * sizeof(int)) + { + __BioSemiBridgeLogConsole__("Not enough data to complete user buffer. Waiting for next read & consume run.\n"); + m_lastError = BioSemiError_NotEnoughDataInBuffer; + return false; + } + + /* if(*(reinterpret_cast<int*>(&m_buffers[m_consumptionByteIdx])) != BIOSEMI_ACTIVETWO_SYNCBYTES) + { + __BioSemiBridgeLogConsole__("Lost sync at consume time ! byte index is [%i]\n",m_consumptionByteIdx); + m_lastError = BioSemiError_SyncLost; + return false; + } + */ + /* + the LongPerSample value gives the number of integers that the device sends per sample round. + For example with the Mark II and a speedmode = 4, we have 282 Integers per sample. + Say we have 8 channels connected, we end up with 282 integers with SYNC forward padding: + - 273 SYNC + - 1 Integer for the Status + - 8 Integers for the 8 channels + */ + //this->consumeBytes(sizeof(int) * (getSampleCount() - m_nChannel - 1)); + + // We consume the integer from STATUS channel. + const int value = *(reinterpret_cast<int*>(&m_buffers[m_consumptionByteIdx])); + if (!this->updateStatusFromValue(value)) + { + __BioSemiBridgeLogConsole__("something bad in latest status value !\n"); + return false; + } + + // EEG channels fill the user buffer. + if (pSampleBuffer != nullptr) + { + /* + The receiver converts every 24-bit word from the AD-box into a 32-bit Signed Integer, + by adding an extra zero Least Significant Byte to the ADC data. + The 24-bit ADC output has an LSB value of 1/32th uV. + The 32-bit Integer received for the USB interface has an LSB value of 1/32*1/256 = 1/8192th uV + */ + const float factor = 1.f / 8192; + + uint32_t sampleLongConsumed = 0; + uint32_t sampleInBuffer = 0; + const uint32_t maxEEGChannel = isUseEXChannels() ? uiBufferValueCount - getEXChannelCount() : uiBufferValueCount; + while (sampleInBuffer < maxEEGChannel) + { + const int iValue = *(reinterpret_cast<int*>(&m_buffers[m_consumptionByteIdx])); + + // We don't add more samples that the number that should be displayed, + // to avoid displaying an electrode channel instaed of an EX channel + if (sampleInBuffer < m_nChannel) { pSampleBuffer[sampleInBuffer] = iValue * factor; } + else + { + // If the number of requested channel is superior to the number of available channels, pad with 0 + pSampleBuffer[sampleInBuffer] = 0; + } + + sampleInBuffer++; + sampleLongConsumed++; + this->consumeBytes(sizeof(int)); + } + if (m_useEXChannels) + { + // Consuming all sync samples until EX channels + // ELECTRODE CHANNEL # - CHANNEL# + this->consumeBytes(sizeof(int) * (getElectrodeChannelCount() - maxEEGChannel)); + while (sampleLongConsumed < maxEEGChannel + getEXChannelCount()) + { + const int iValue = *(reinterpret_cast<int*>(&m_buffers[m_consumptionByteIdx])); + if (sampleInBuffer < uiBufferValueCount) + { + pSampleBuffer[sampleInBuffer] = iValue * factor; + sampleInBuffer++; + } + sampleLongConsumed++; + this->consumeBytes(sizeof(int)); + } + // Consuming all remaining samples (sensor channels) + // SAMPLE# - ELECTRODE CHANNEL# - EX CHANNEL# - SYNC + this->consumeBytes(sizeof(int) * (getSampleCount() - (getElectrodeChannelCount() + getEXChannelCount() + 1))); + } + else + { + // Consuming all sync samples plus EX and sensor channels + // SAMPLE# - CHANNEL# - SYNC + this->consumeBytes(sizeof(int) * (getSampleCount() - maxEEGChannel - 1)); + } + } + //if pSample == nullptr + else + { + // Consuming all sync samples plus EX and sensor channels + // SAMPLE# - CHANNEL# - SYNC + this->consumeBytes(sizeof(int) * (getSampleCount() - 1)); + } + /*if(*(reinterpret_cast<int*>(&m_buffers[m_consumptionByteIdx])) != BIOSEMI_ACTIVETWO_SYNCBYTES) + { + __BioSemiBridgeLogConsole__("Lost sync at consume time ! byte index is [%i]\n",m_consumptionByteIdx); + m_lastError = BioSemiError_SyncLost; + return false; + }*/ + //this->consumeBytes(sizeof(int) * m_nChannel); + + //__BioSemiBridgeLogConsole__("consumed "<<l_uiByteConsumed<<" bytes this round.\n"; + return true; +} + + +uint32_t CBridgeBioSemiActiveTwo::getElectrodeChannelCount() const +{ + if (!m_bridgeSyncedWithDevice) { return 0; } + // this will be rounded + return (BioSemi::activeTwoMarkElectrodeChannelPerSample[(m_activeTwoMarkII ? 1 : 0)][m_speedMode]); +} + +uint32_t CBridgeBioSemiActiveTwo::getEXChannelCount() const +{ + if (!m_useEXChannels || !m_bridgeSyncedWithDevice) { return 0; } + // this will be rounded + return (BioSemi::activeTwoMarkExChannelPerSample[(m_activeTwoMarkII ? 1 : 0)][m_speedMode]); +} + +uint32_t CBridgeBioSemiActiveTwo::getSampleCount() const +{ + if (!m_bridgeSyncedWithDevice) { return 0; } + // this will be rounded + return (BioSemi::activeTwoMarkLongPerSample[(m_activeTwoMarkII ? 1 : 0)][m_speedMode]); +} + +//___________________________________________________________________// +// // + +bool CBridgeBioSemiActiveTwo::stop() +{ + //float bytesPerMsec = GET_BYTES_PER_MSEC(); + //__BioSemiBridgeLogConsole__("STATS: Bytes per ms: " << bytesPerMsec << std::endl; + + // To stop, we disable the handshake + m_controlBuffers.clear(); + m_controlBuffers.resize(BIOSEMI_ACTIVETWO_CONTROLBUFFERBYTES); + m_controlBuffers[0] = 0; // stop byte + + const BOOL status = USB_WRITE(m_hDevice, &m_controlBuffers[0]); + if (!status) + { + __BioSemiBridgeLogConsole__("usb_write for disabling handshake failed with [%i]\n", GetLastError()); + m_lastError = BioSemiError_DisableUSBHandshakeFailed; + return false; + } + + return true; +} + +bool CBridgeBioSemiActiveTwo::close() +{ + if (!CLOSE_DRIVER(m_hDevice)) + { + __BioSemiBridgeLogConsole__("device driver cannot be closed!!\n"); + m_lastError = BioSemiError_OSCloseFailed; + return false; + } + + __BioSemiBridgeLogConsole__("device driver now closed.\n"); + return true; +} + +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyBioSemiAPI diff --git a/applications/platform/acquisition-server/src/OVASDrivers/biosemi-activetwo/mCBridgeBioSemiActiveTwo.h b/applications/platform/acquisition-server/src/OVASDrivers/biosemi-activetwo/mCBridgeBioSemiActiveTwo.h new file mode 100644 index 0000000000000000000000000000000000000000..30b77f49ae8a24c674f9e853af7991806f59a5c1 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/biosemi-activetwo/mCBridgeBioSemiActiveTwo.h @@ -0,0 +1,134 @@ +///------------------------------------------------------------------------------------------------- +/// \copyright Copyright (C) 2012, Mensia Technologies SA. All rights reserved. +/// +/// This library is free software; you can redistribute it and/or +/// modify it under the terms of the GNU Lesser General Public +/// License as published by the Free Software Foundation; either +/// version 2.1 of the License, or (at your option) any later version. +/// +/// This library is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +/// Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with this library; if not, write to the Free Software +/// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +/// MA 02110-1301 USA +///------------------------------------------------------------------------------------------------- + +#pragma once + +#ifdef TARGET_HAS_ThirdPartyBioSemiAPI + +#include <vector> +#include <cstdint> + +#define BIOSEMI_ACTIVETWO_MAXCHANNELCOUNT 256 +#define BIOSEMI_ACTIVETWO_EXCHANNELCOUNT 8 + +namespace OpenViBE { +enum EBioSemiError +{ + BioSemiError_NoError, + + BioSemiError_OSOpenFailed, + BioSemiError_OSCloseFailed, + + BioSemiError_EnableUSBHandshakeFailed, + BioSemiError_DisableUSBHandshakeFailed, + + BioSemiError_ReadPointerFailed, + + BioSemiError_DeviceTypeChanged, + BioSemiError_SpeedmodeChanged, + BioSemiError_InvalidSpeedmode, + + BioSemiError_NoData, + BioSemiError_NotEnoughDataInBuffer, + BioSemiError_NoSync, + BioSemiError_SyncLost, + BioSemiError_BufferOverflow +}; + + +class CBridgeBioSemiActiveTwo final +{ +public: + + CBridgeBioSemiActiveTwo(); + virtual ~CBridgeBioSemiActiveTwo(); + + bool isDeviceConnected(); + bool open(); + bool start(); + int read(); + bool discard(); + uint32_t getAvailableSampleCount(); + uint32_t getElectrodeChannelCount() const; + uint32_t getEXChannelCount() const; + uint32_t getSampleCount() const; + uint32_t getSpeedMode() const { return m_speedMode; } + size_t getChannelCount() const { return m_nChannel; } + bool consumeOneSamplePerChannel(float* pSampleBuffer, uint32_t uiBufferValueCount); + bool stop(); + bool close(); + + bool isSynced() const { return m_bridgeSyncedWithDevice; } + + bool getTrigger(const uint32_t index) const { return (index > m_triggers.size() ? false : m_triggers[index]); } + bool isCMSInRange() const { return m_cmsInRange; } + bool isBatteryLow() const { return m_batteryLow; } + bool isDeviceMarkII() const { return m_activeTwoMarkII; } + uint32_t getSamplingFrequency() const; + + uint32_t getLastError() const { return m_lastError; } + + bool isUseEXChannels() const { return m_useEXChannels; } + void setUseEXChannels(const bool useEXChannels) { m_useEXChannels = useEXChannels; } + +protected: + bool updateStatusFromValue(int value); + uint32_t getAvailableByteCount() const; + void consumeBytes(uint32_t count); + + // Handle to the device + void* m_hDevice = nullptr; + // Ring buffer + std::vector<char> m_buffers; + // 64bits buffer for USB_WRITE operations + std::vector<char> m_controlBuffers; + + /* deduced from the SYNC channel on first read */ + bool m_firstRead = false; + bool m_bridgeSyncedWithDevice = false; + uint32_t m_nChannel = 0; + uint32_t m_nInitialChannel = 0; + + /* From Status channel */ + std::vector<bool> m_triggers; + bool m_epochStarted = false; + bool m_cmsInRange = false; + bool m_batteryLow = false; + bool m_activeTwoMarkII = false; + bool m_initialActiveTwoMarkII = false; + uint32_t m_speedMode = 0; + uint32_t m_initialSpeedmode = 0; + + // ring buffer indices +#if TARGET_ARCHITECTURE_x64 + long long m_lastRingBufferByteIdx = 0; //Buffer filled up to this point in last read() +#else + uint32_t m_lastRingBufferByteIdx = 0; //Buffer filled up to this point in last read()] +#endif + uint32_t m_consumptionByteIdx = 0; //Next consume() should start here, it should ALWAYS be a SYNC byte. + + // just for stats + uint32_t m_nTotalByteRead = 0; + uint32_t m_lastError = 0; + bool m_useEXChannels = false; +}; +} // namespace OpenViBE + + +#endif // TARGET_HAS_ThirdPartyBioSemiAPI diff --git a/applications/platform/acquisition-server/src/OVASDrivers/biosemi-activetwo/ovasCConfigurationBioSemiActiveTwo.cpp b/applications/platform/acquisition-server/src/OVASDrivers/biosemi-activetwo/ovasCConfigurationBioSemiActiveTwo.cpp new file mode 100644 index 0000000000000000000000000000000000000000..3bd2c910c35c43b3faab9659dddec1c91f3d1ed7 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/biosemi-activetwo/ovasCConfigurationBioSemiActiveTwo.cpp @@ -0,0 +1,145 @@ +///------------------------------------------------------------------------------------------------- +/// \copyright Copyright (C) 2012, Mensia Technologies SA. All rights reserved. +/// +/// This library is free software; you can redistribute it and/or +/// modify it under the terms of the GNU Lesser General Public +/// License as published by the Free Software Foundation; either +/// version 2.1 of the License, or (at your option) any later version. +/// +/// This library is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +/// Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with this library; if not, write to the Free Software +/// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +/// MA 02110-1301 USA +///------------------------------------------------------------------------------------------------- + +#ifdef TARGET_HAS_ThirdPartyBioSemiAPI + +#include "ovasCConfigurationBioSemiActiveTwo.h" +#include "ovasIHeader.h" +#include "mCBridgeBioSemiActiveTwo.h" + +#include <system/ovCTime.h> + +#include <cstring> + +namespace OpenViBE { +namespace AcquisitionServer { + +static void gtk_combo_box_set_active_text(GtkComboBox* pComboBox, const gchar* sActiveText) +{ + GtkTreeModel* treeModel = gtk_combo_box_get_model(pComboBox); + GtkTreeIter it; + int index = 0; + gchar* entryName = nullptr; + if (gtk_tree_model_get_iter_first(treeModel, &it)) + { + do + { + gtk_tree_model_get(treeModel, &it, 0, &entryName, -1); + if (std::string(entryName) == std::string(sActiveText)) + { + gtk_combo_box_set_active(pComboBox, index); + return; + } + index++; + } while (gtk_tree_model_iter_next(treeModel, &it)); + } +} + +CConfigurationBioSemiActiveTwo::CConfigurationBioSemiActiveTwo(const char* gtkBuilderFilename, bool& useExChannels) + : CConfigurationBuilder(gtkBuilderFilename), m_useEXChannels(useExChannels) {} + +bool CConfigurationBioSemiActiveTwo::preConfigure() +{ + if (!CConfigurationBuilder::preConfigure()) { return false; } + + // deduced from connection to device, cannot be edited. + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_sampling_frequency")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_speed_mode")), false); + + CBridgeBioSemiActiveTwo bridge; + bool status = false; + if (bridge.open() && bridge.start()) + { + // to let the device send a first packet from which the bridge can deduce the SF and channel count + System::Time::sleep(500); + if (bridge.read() > 0) + { + gtk_image_set_from_stock(GTK_IMAGE(gtk_builder_get_object(m_builder, "image_status")),GTK_STOCK_YES, GTK_ICON_SIZE_BUTTON); + + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "spinbutton_number_of_channels")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_apply")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_change_channel_names")), true); + + // If this option is selected then 8 channels of the header are dedicated to the EX channels and they should be removed of the displayed channel count + if (m_useEXChannels) + { + gtk_adjustment_set_value( + GTK_ADJUSTMENT(gtk_builder_get_object(m_builder, "adjustment_channel_count")), + gtk_adjustment_get_value(GTK_ADJUSTMENT(gtk_builder_get_object(m_builder, "adjustment_channel_count"))) - 8); + } + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "checkbutton_ex_channel")), true); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_ex_channel")), m_useEXChannels); + + //Set maximum in function of the speedmode used + gtk_adjustment_set_upper(GTK_ADJUSTMENT(gtk_builder_get_object(m_builder, "adjustment_channel_count")), bridge.getElectrodeChannelCount()); + + std::stringstream ss; + ss << bridge.getSamplingFrequency(); + gtk_combo_box_set_active_text(GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_sampling_frequency")), ss.str().c_str()); + + ss.str(""); + ss << bridge.getSpeedMode(); + gtk_combo_box_set_active_text(GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_speed_mode")), ss.str().c_str()); + + gtk_label_set_markup( + GTK_LABEL(gtk_builder_get_object(m_builder, "label_device_mark")), + (bridge.isDeviceMarkII() ? "- <i>ActiveTwo Mark II</i> -" : "- <i>ActiveTwo Mark I</i> -")); + gtk_label_set_markup( + GTK_LABEL(gtk_builder_get_object(m_builder, "label_device_battery")), + (bridge.isBatteryLow() ? "<span color=\"red\"><b>LOW BATTERY</b></span> -" : "<b>BATTERY OK</b>")); + + // discard any data. + bridge.discard(); + + status = true; + } + bridge.stop(); + bridge.close(); + } + + if (!status) + { + gtk_combo_box_set_active_text(GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_sampling_frequency")), ""); + gtk_combo_box_set_active_text(GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_speed_mode")), ""); + gtk_image_set_from_stock(GTK_IMAGE(gtk_builder_get_object(m_builder, "image_status")),GTK_STOCK_NO, GTK_ICON_SIZE_BUTTON); + + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "spinbutton_number_of_channels")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_apply")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_change_channel_names")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "checkbutton_ex_channel")), false); + } + + + return true; +} + +bool CConfigurationBioSemiActiveTwo::postConfigure() +{ + if (m_applyConfig) + { + m_useEXChannels = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_ex_channel"))) ? true : false; + } + + if (!CConfigurationBuilder::postConfigure()) { return false; } + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif diff --git a/applications/platform/acquisition-server/src/OVASDrivers/biosemi-activetwo/ovasCConfigurationBioSemiActiveTwo.h b/applications/platform/acquisition-server/src/OVASDrivers/biosemi-activetwo/ovasCConfigurationBioSemiActiveTwo.h new file mode 100644 index 0000000000000000000000000000000000000000..8a2dee77bf8cbaac1514c58267437f1d79bf72f0 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/biosemi-activetwo/ovasCConfigurationBioSemiActiveTwo.h @@ -0,0 +1,46 @@ +///------------------------------------------------------------------------------------------------- +/// \copyright Copyright (C) 2012, Mensia Technologies SA. All rights reserved. +/// +/// This library is free software; you can redistribute it and/or +/// modify it under the terms of the GNU Lesser General Public +/// License as published by the Free Software Foundation; either +/// version 2.1 of the License, or (at your option) any later version. +/// +/// This library is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +/// Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with this library; if not, write to the Free Software +/// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +/// MA 02110-1301 USA +///------------------------------------------------------------------------------------------------- + +#pragma once + +#ifdef TARGET_HAS_ThirdPartyBioSemiAPI + +#include "../ovasCConfigurationBuilder.h" +#include <gtk/gtk.h> +#include <vector> + +namespace OpenViBE { +namespace AcquisitionServer { +class CConfigurationBioSemiActiveTwo final : public CConfigurationBuilder +{ +public: + + CConfigurationBioSemiActiveTwo(const char* gtkBuilderFilename, bool& useExChannels); + + bool preConfigure() override; + bool postConfigure() override; + +protected: + bool& m_useEXChannels; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + + +#endif // TARGET_HAS_ThirdPartyBioSemiAPI diff --git a/applications/platform/acquisition-server/src/OVASDrivers/biosemi-activetwo/ovasCDriverBioSemiActiveTwo.cpp b/applications/platform/acquisition-server/src/OVASDrivers/biosemi-activetwo/ovasCDriverBioSemiActiveTwo.cpp new file mode 100644 index 0000000000000000000000000000000000000000..e60526f97e7e39315fb5fa72fc16aaebbc815143 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/biosemi-activetwo/ovasCDriverBioSemiActiveTwo.cpp @@ -0,0 +1,548 @@ +///------------------------------------------------------------------------------------------------- +/// \copyright Copyright (C) 2012, Mensia Technologies SA. All rights reserved. +/// +/// This library is free software; you can redistribute it and/or +/// modify it under the terms of the GNU Lesser General Public +/// License as published by the Free Software Foundation; either +/// version 2.1 of the License, or (at your option) any later version. +/// +/// This library is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +/// Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with this library; if not, write to the Free Software +/// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +/// MA 02110-1301 USA +///------------------------------------------------------------------------------------------------- + +#ifdef TARGET_HAS_ThirdPartyBioSemiAPI + +#include "ovasCDriverBioSemiActiveTwo.h" +#include "ovasCConfigurationBioSemiActiveTwo.h" + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <time.h> + +#ifdef WIN32 +#include <windows.h> +#else +// linux, mac +#include <unistd.h> +#endif // WIN32 + +#include <toolkit/ovtk_all.h> +#include <system/ovCTime.h> + +namespace OpenViBE { +namespace AcquisitionServer { + +CDriverBioSemiActiveTwo::CDriverBioSemiActiveTwo(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_BioSemiActiveTwo", m_driverCtx.getConfigurationManager()) +{ + m_header.setSamplingFrequency(2048); + + // The amplifier can send up to 256+8 channels + // as a request from BioSemi, we will make available the maximum channel count + // User is able to select from 1 to MAX channels. If no data is present on the + // corresponding channels, zeros will be sent. + // The number of channels present in the data flow will still be displayed in + // the driver configuration window. Previously selected value will be saved + // with other settings. + m_header.setChannelCount(BIOSEMI_ACTIVETWO_MAXCHANNELCOUNT + BIOSEMI_ACTIVETWO_EXCHANNELCOUNT); + m_useEXChannel = true; + + m_triggers.resize(16, false); + + m_lastWarningTime = 0; + m_startTime = 0; + m_bCMCurrentlyInRange = true; + m_bBatteryCurrentlyOk = true; + + m_settings.add("Header", &m_header); + m_settings.add("UseEXChannel", &m_useEXChannel); + m_settings.load(); + m_bridge.setUseEXChannels(m_useEXChannel); +} + +void CDriverBioSemiActiveTwo::setupInformationWindow() +{ + if (!m_infoWindow) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Information window not allocated\n"; + return; + } + + std::lock_guard<std::mutex> lock(m_infoWindow->m_mutex); + + m_infoWindow->m_builder = gtk_builder_new(); + if (!gtk_builder_add_from_file(m_infoWindow->m_builder, Directories::getDataDir() + "/applications/acquisition-server/interface-BioSemi-ActiveTwo.ui", nullptr)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "File not found: " << Directories::getDataDir() << "/applications/acquisition-server/interface-BioSemi-ActiveTwo.ui\n"; + return; + } + + gtk_label_set_markup(GTK_LABEL(gtk_builder_get_object(m_infoWindow->m_builder, "label-device-type")), (m_bridge.isDeviceMarkII() ? "- <i>ActiveTwo Mark II</i> -" : "- <i>ActiveTwo Mark I</i> -")); + m_infoWindow->m_isCMSInRange = m_bridge.isCMSInRange(); + m_infoWindow->m_isBatteryLow = m_bridge.isBatteryLow(); + m_infoWindow->m_isChanged = true; + gtk_widget_show_all(GTK_WIDGET(gtk_builder_get_object(m_infoWindow->m_builder, "device-information"))); +} + +//___________________________________________________________________// +// // + +gint setup_information_window_callback(void* data) +{ + CDriverBioSemiActiveTwo* pTmp = static_cast<CDriverBioSemiActiveTwo*>(data); + + pTmp->setupInformationWindow(); + + return FALSE; // Don't run again +} + +gint information_window_callback(void* infoWindow) +{ + if (!infoWindow) + { + // Not initialized yet? + return TRUE; + } + SInformationWindow* window = reinterpret_cast<SInformationWindow*>(infoWindow); + std::lock_guard<std::mutex> lock(reinterpret_cast<SInformationWindow*>(infoWindow)->m_mutex); + // If nothing changed, directly return from the callback + if (!window->m_isChanged) { return TRUE; } + if (window->m_isAcquisitionEnded) + { + // If the acquisition is ended, delete the window + gtk_widget_destroy(GTK_WIDGET(gtk_builder_get_object(window->m_builder, "device-information"))); + g_object_unref(window->m_builder); + + // If we get here, we know that the other thread has passed uninitialize() and will no longer access Information Window. + delete window; + // The loop should now be stopped + return FALSE; + } + if (window->m_isBatteryLow) + { + gtk_label_set_markup(GTK_LABEL(gtk_builder_get_object(window->m_builder, "label-battery-level")), "- <i>Device battery is low !</i> -"); + gtk_image_set_from_stock(GTK_IMAGE(gtk_builder_get_object(window->m_builder, "image-battery-level")), GTK_STOCK_NO, GTK_ICON_SIZE_BUTTON); + } + else + { + gtk_label_set_markup(GTK_LABEL(gtk_builder_get_object(window->m_builder, "label-battery-level")), "- <i> Device battery is ok </i> -"); + gtk_image_set_from_stock(GTK_IMAGE(gtk_builder_get_object(window->m_builder, "image-battery-level")), GTK_STOCK_YES, GTK_ICON_SIZE_BUTTON); + } + + if (window->m_isCMSInRange) + { + gtk_label_set_markup(GTK_LABEL(gtk_builder_get_object(window->m_builder, "label-CMS-status")), "- <i>CMS/DRL is in range </i> -"); + gtk_image_set_from_stock(GTK_IMAGE(gtk_builder_get_object(window->m_builder, "image-CMS-status")), GTK_STOCK_YES, GTK_ICON_SIZE_BUTTON); + } + else + { + gtk_label_set_markup(GTK_LABEL(gtk_builder_get_object(window->m_builder, "label-CMS-status")), "- <i>CMS/DRL is not in range </i> -"); + gtk_image_set_from_stock(GTK_IMAGE(gtk_builder_get_object(window->m_builder, "image-CMS-status")), GTK_STOCK_NO, GTK_ICON_SIZE_BUTTON); + } + gtk_label_set_markup(GTK_LABEL(gtk_builder_get_object(window->m_builder, "label-error-message")), (window->m_sErrorMessage).c_str()); + + window->m_isChanged = false; + return TRUE; +} + +bool CDriverBioSemiActiveTwo::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + m_acquisitionStopped = false; + + if (m_driverCtx.isConnected()) { return false; } + + m_callback = &callback; + + if (!m_bridge.open()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Could not open the device.\n"; + return false; + } + + if (!m_bridge.start()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Could not start the device.\n"; + return false; + } + + // wait to be sure we get the first packet from which we deduce the actual channel count and other initial configuration. + System::Time::sleep(500); + + const int byteRead = m_bridge.read(); + if (byteRead < 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "An error occured while reading first data packet from device !\n"; + m_bridge.close(); + return false; + } + + if (!m_bridge.discard()) // we discard the samples. + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "An error occured while dropping unused samples at initialization time.\n"; + m_bridge.close(); + return false; + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Bridge initialized with: [SF:" << m_bridge.getSamplingFrequency() + << "] [CH:" << m_bridge.getChannelCount() + << "] [MKII:" << m_bridge.isDeviceMarkII() + << "] [CMInRange:" << m_bridge.isCMSInRange() + << "] [LowBat:" << m_bridge.isBatteryLow() << "]\n"; + + if (m_bridge.isBatteryLow()) { m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Device battery is low !\n"; } + + // the sample buffer is resized to get samples from ALL channels even if the user selected + // less channels. We will adjust the content when calling setSamples(...) + // in case the user required more channels than the number available in the stream, we will + // add 0-padding. + const size_t nChannelInStream = m_bridge.getChannelCount(); + const size_t nChannelRequested = m_header.getChannelCount(); + m_samples.clear(); + m_samples.resize(nChannelRequested, 0); + if (nChannelRequested > nChannelInStream) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << + "The required channel count cannot be reached in current device configuration (data stream contains " << m_bridge.getChannelCount() << + " channels). Please check the device speed mode and setup capabilities. Channels with no data will be filled with zeros.\n"; + } + + m_nSample = 0; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Driver initialized...\n"; + + //Check speed mode: speed modes 1, 2 and 3 should not be used for acquisition + if (m_bridge.getSpeedMode() < 4) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Speed modes 1 to 3 are designed to realize daisy chained montages, they should not be used for acquisition."; + return false; + } + + // Rename EX channels after settings were saved + if (m_bridge.isUseEXChannels()) + { + int j = 1; + for (size_t i = m_header.getChannelCount() - BIOSEMI_ACTIVETWO_EXCHANNELCOUNT; i < m_header.getChannelCount(); ++i, ++j) + { + m_header.setChannelName(i, ("EX " + std::to_string(j)).c_str()); + m_header.setChannelUnits(i, OVTK_UNIT_Volts, OVTK_FACTOR_Micro); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Channel name: " << m_header.getChannelName(i) << "\n"; + } + } + + m_infoWindow = new SInformationWindow(); + + // Initialize information window + // n.b. do all gtk stuff from callbacks to avoid threading issues. + gdk_threads_add_idle(setup_information_window_callback, this); + + //Launch idle loop: update the information window in a separate glib thread + gdk_threads_add_idle(information_window_callback, m_infoWindow); + + return true; +} + +bool CDriverBioSemiActiveTwo::start() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + m_startTime = System::Time::getTime(); + m_lastWarningTime = 0; + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Acquisition started...\n"; + return true; +} + +bool CDriverBioSemiActiveTwo::loop() +{ + if (m_acquisitionStopped || !m_driverCtx.isConnected()) { return true; } + + if (m_driverCtx.isStarted()) + { + //size_t nChannelInStream = m_bridge.getChannelCount(); + const size_t nChannelRequested = m_header.getChannelCount(); + + //uint32_t max = (nChannelRequested > nChannelInStream) ? nChannelRequested : nChannelInStream; + const uint32_t max = nChannelRequested; + const int byteRead = m_bridge.read(); + if (byteRead > 0) + { + for (uint32_t i = 0; i < m_bridge.getAvailableSampleCount(); ++i) + { + // we consume one sample per channel, values are given in uV + if (!m_bridge.consumeOneSamplePerChannel(&m_samples[0], max)) + { + std::lock_guard<std::mutex> lock(m_infoWindow->m_mutex); + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Something bad happened while consuming samples from device.\n"; + m_infoWindow->m_isChanged = true; + m_infoWindow->m_sErrorMessage = "<span color=\"darkred\">Something bad happened while consuming samples from device.</span>\n"; + if (m_bridge.getLastError() == BioSemiError_SyncLost) + { + m_infoWindow->m_sErrorMessage += "\t <span color=\"darkred\"> Synchronization lost during acquisition. Fiber optic may be loose or damaged.</span>"; + m_driverCtx.getLogManager() << "\t >Synchronization lost during acquisition. Fiber optic may be loose or damaged.\n"; + } + if (m_bridge.getLastError() == BioSemiError_BufferOverflow) + { + m_infoWindow->m_sErrorMessage += "\t <span color=\"darkred\"> Buffer overflow. Please check that you have enough CPU and memory available to run the acquisition server at full speed before retrying.</span>"; + m_driverCtx.getLogManager() << "\t > Buffer overflow. Please check that you have enough CPU and memory available to run the acquisition server at full speed before retrying.\n"; + } + m_acquisitionStopped = true; + return true; + } + + // this call uses the header's channel count, so it will naturally take the first samples (not necessarily all channels). + m_callback->setSamples(&m_samples[0], 1); + + // triggers: + // we simply send OVTK_StimulationId_Label_X where X is the trigger index between 1 and 16 + // We don't handle rising and falling edges. + for (uint32_t j = 0; j < m_triggers.size(); ++j) + { + if (m_bridge.getTrigger(j) != m_triggers[j]) + { + m_triggers[j] = m_bridge.getTrigger(j); + const uint64_t date = (1LL << 32) / m_bridge.getSamplingFrequency(); // date is relative to the buffer start. I only have one sample in the buffer so it's fairly simple + m_stimSet.push_back(OVTK_StimulationId_Label(j+1), date, 0); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Trigger " << j + 1 << "/16 has switched to " << m_triggers[j] << "\n"; + } + } + + // "CMS/DRL in range" warning, once every 2 seconds max + /* + From: Coen (BioSemi): + + The current flow via the DRL is constantly monitored by the safety circuitry inside the AD-box. The current flow is limited to 50 uA (IEC 601 safety limit). + If the current runs into the limit, the CMS/DRL circuit cannot keep the Common Mode value within its normal working range, and the blue LED turns off. + + The safety circuitry reacts on this error situation by shutting the power supply to ALL active electrodes off. Consequently, no meaningful signals can be measured so long as the blue LED is off. + The circuit operation described above implies that any electrode can be the cause of a CM out of range error. + Examples of errors are broken wires, bad connector contacts (pollution of connector with gel), defect IC inside the electrode, + bare electrode wire contacting the subject (damaged cable isolation) etc.. For example, if one of the active electrode wires is broken, + the electrode input circuit is not anymore biased correctly, and the input resistance may fall below its specified value of 10^12 Ohm. + The resultant extra input current is detected by the CMS/DRL circuit, and the blue LED goes off. + Save operation of the system is ensured because the power supply to the active electrodes is only restored if ALL electrodes connected to the subject work correctly. + In other words, both cap en EX electrodes can in principle cause CM out of range errors. + */ + + bool warningDisplayed = false; + if (!m_bridge.isCMSInRange()) + { + // we print a warning message once every 2secs maximum + if (System::Time::getTime() > m_lastWarningTime + 2000) + { + warningDisplayed = true; + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(" << ((System::Time::getTime() - m_startTime) / 1000) << "') CMS/DRL is not in range. For safety purpose, any active electrode connected has been shut down and signals should not be used.\n"; + m_driverCtx.getLogManager() << "\t The corresponding sample range has been tagged with OVTK_StimulationId_SegmentStart and OVTK_StimulationId_SegmentStop.\n"; + m_driverCtx.getLogManager() << "\t Possible causes include broken wires, damaged cable isolation, bad connector contacts, defect IC inside the electrode.\n"; + { + std::lock_guard<std::mutex> lock(m_infoWindow->m_mutex); + m_infoWindow->m_isCMSInRange = false; + m_infoWindow->m_isChanged = true; + } + } + + // the possibly incorrect sample range is tagged using OVTK_StimulationId_SegmentStart and OVTK_StimulationId_SegmentStop + // CM is now not in range + if (m_bCMCurrentlyInRange) + { + const uint64_t date = (1LL << 32) / m_bridge.getSamplingFrequency(); + m_stimSet.push_back(OVTK_StimulationId_SegmentStart, date, 0); + } + m_bCMCurrentlyInRange = false; + m_bCMSBackInRange = false; + } + else + { + // CMS/DRL is now back in range + if (!m_bCMCurrentlyInRange) + { + m_lastCmsBackInRange = System::Time::getTime(); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "isCMSInRange \n"; + const uint64_t date = (1LL << 32) / m_bridge.getSamplingFrequency(); + m_stimSet.push_back(OVTK_StimulationId_SegmentStop, date, 0); + m_bCMCurrentlyInRange = true; + } + // CMS is considered "back in range" if it stayed in range for more than 500ms + // -> avoids changing the gtk markup too often (which would not be readable for the user nor efficient) + else if (!m_bCMSBackInRange && (System::Time::getTime() > m_lastCmsBackInRange + 100)) + { + m_bCMSBackInRange = true; + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Back in range \n"; + { + std::lock_guard<std::mutex> lock(m_infoWindow->m_mutex); + m_infoWindow->m_isCMSInRange = true; + m_infoWindow->m_isChanged = true; + } + } + } + + if (m_bridge.isBatteryLow()) + { + // we print a warning message once every 2secs maximum + if (System::Time::getTime() > m_lastWarningTime + 2000) + { + warningDisplayed = true; + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(" << ((System::Time::getTime() - m_startTime) / 1000) << "') Device battery is low !\n"; + { + std::lock_guard<std::mutex> lock(m_infoWindow->m_mutex); + m_infoWindow->m_isBatteryLow = true; + m_infoWindow->m_isChanged = true; + } + } + m_bBatteryCurrentlyOk = false; + m_bBatteryBackOk = false; + } + else + { + if (!m_bBatteryCurrentlyOk) + { + m_lastBatteryLow = System::Time::getTime(); + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(" << ((System::Time::getTime() - m_startTime) / 1000) << "') Device battery seems ok.\n"; + m_bBatteryCurrentlyOk = true; + } + // CMS is considered "back in range" if it stayed in range for more than 500ms + // -> avoids changing the gtk markup too often (which would not be readable for the user nor efficient) + else if (!m_bBatteryBackOk && (System::Time::getTime() > m_lastBatteryLow + 100)) + { + m_bBatteryBackOk = true; + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Back in range \n"; + { + std::lock_guard<std::mutex> lock(m_infoWindow->m_mutex); + m_infoWindow->m_isBatteryLow = false; + m_infoWindow->m_isChanged = true; + } + } + } + + if (warningDisplayed) { m_lastWarningTime = System::Time::getTime(); } + + m_callback->setStimulationSet(m_stimSet); + m_stimSet.clear(); + } + } + if (byteRead < 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "An error occured while reading data from device !\n"; + m_acquisitionStopped = true; + { + std::lock_guard<std::mutex> lock(m_infoWindow->m_mutex); + m_infoWindow->m_sErrorMessage = "<span color=\"darkred\">An error occured while reading data from device !</span>"; + m_infoWindow->m_isChanged = true; + } + return true; + } + + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + } + else + { + // acquisition is not started, but device is. + int byteRead = m_bridge.read(); + while (byteRead > 0) + { + if (!m_bridge.discard()) // we discard the samples. + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "An error occured while dropping samples.\n"; + m_acquisitionStopped = true; + { + std::lock_guard<std::mutex> lock(m_infoWindow->m_mutex); + m_infoWindow->m_sErrorMessage = "<span color=\"darkred\">An error occured while dropping samples.</span>"; + m_infoWindow->m_isChanged = true; + } + return true; + } + byteRead = m_bridge.read(); + } + if (byteRead < 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "An error occured while reading data from device (drop)!\n"; + m_acquisitionStopped = true; + { + std::lock_guard<std::mutex> lock(m_infoWindow->m_mutex); + m_infoWindow->m_sErrorMessage = "<span color=\"darkred\">An error occured while reading data from device (drop)!</span>"; + m_infoWindow->m_isChanged = true; + } + return true; + } + } + + return true; +} + +bool CDriverBioSemiActiveTwo::stop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Acquisition stopped...\n"; + + return true; +} + +bool CDriverBioSemiActiveTwo::uninitialize() +{ + { + std::lock_guard<std::mutex> lock(m_infoWindow->m_mutex); + + m_infoWindow->m_isChanged = true; + m_infoWindow->m_isAcquisitionEnded = true; + m_infoWindow = nullptr; // The callback will free the memory + } + + // Rename EX channels as "" so that the names are not saved as settings + if (m_bridge.isUseEXChannels()) + { + for (size_t i = m_header.getChannelCount() - m_bridge.getEXChannelCount(); i < m_header.getChannelCount(); ++i) + { + m_header.setChannelName(i, ""); + m_header.setChannelUnits(i, OVTK_UNIT_Volts, OVTK_FACTOR_Micro); + } + } + + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + if (!m_bridge.close()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Could not close the device.\n"; + return false; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Driver uninitialized...\n"; + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverBioSemiActiveTwo::configure() +{ + CConfigurationBioSemiActiveTwo config(Directories::getDataDir() + "/applications/acquisition-server/interface-BioSemi-ActiveTwo.ui", m_useEXChannel); + + if (config.configure(m_header)) + { + m_bridge.setUseEXChannels(m_useEXChannel); + if (m_bridge.isUseEXChannels()) { m_header.setChannelCount(m_header.getChannelCount() + BIOSEMI_ACTIVETWO_EXCHANNELCOUNT); } + + m_settings.save(); + + return true; + } + return false; +} +/* +size_t CDriverBioSemiActiveTwo::getChannelCount() +{ + if(m_useEXChannel) + { + return m_header.getChannelCount() + m_bridge.getEXChannelCount(); + } + else { return m_header.getChannelCount(); } +} +*/ + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif diff --git a/applications/platform/acquisition-server/src/OVASDrivers/biosemi-activetwo/ovasCDriverBioSemiActiveTwo.h b/applications/platform/acquisition-server/src/OVASDrivers/biosemi-activetwo/ovasCDriverBioSemiActiveTwo.h new file mode 100644 index 0000000000000000000000000000000000000000..b331b5d6f1bffde2b2d525d1684b9584c8e7086e --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/biosemi-activetwo/ovasCDriverBioSemiActiveTwo.h @@ -0,0 +1,128 @@ +///------------------------------------------------------------------------------------------------- +/// \copyright Copyright (C) 2012, Mensia Technologies SA. All rights reserved. +/// +/// This library is free software; you can redistribute it and/or +/// modify it under the terms of the GNU Lesser General Public +/// License as published by the Free Software Foundation; either +/// version 2.1 of the License, or (at your option) any later version. +/// +/// This library is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +/// Lesser General Public License for more details. +/// +/// You should have received a copy of the GNU Lesser General Public +/// License along with this library; if not, write to the Free Software +/// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, +/// MA 02110-1301 USA +///------------------------------------------------------------------------------------------------- + +#pragma once + +#ifdef TARGET_HAS_ThirdPartyBioSemiAPI + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +#include "mCBridgeBioSemiActiveTwo.h" + +#include "gtk/gtk.h" + +#include <vector> +#include <thread> +#include <mutex> + +namespace OpenViBE { +namespace AcquisitionServer { +/** +* SInformationWindow: encapsulate the GtkBuilder used to build the window +* and the information that we want to display in it. +* The use of a structure allows to use a GLib idle loop. +*/ +typedef struct SInformationWindow +{ + SInformationWindow() {} + // Builder of the window + GtkBuilder* m_builder = nullptr; + // When set to true, the idle loop is stopped and the window is destroyed + bool m_isAcquisitionEnded = false; + // Set to true when at least one of the acquisition window member changed + bool m_isChanged = false; + bool m_isCMSInRange = false; + bool m_isBatteryLow = false; + std::string m_sErrorMessage = ""; + + // The window is changed in a idle loop in function of m_isCMSInRange, + // m_isBatteryLow and m_sErrorMessage that change in the driver loop + // A mutex is necessary to secure the access to the data + std::mutex m_mutex; +} SInformationWindow; + +/** + * \class CDriverBioSemiActiveTwo + * \author Mensia Technologies + */ +class CDriverBioSemiActiveTwo final : public IDriver +{ +public: + + explicit CDriverBioSemiActiveTwo(IDriverContext& ctx); + void release() { delete this; } + const char* getName() override { return "BioSemi Active Two (MkI and MkII)"; } + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override { return true; } + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + //size_t getChannelCount(); + + // Called from gtk callback + void setupInformationWindow(); + +protected: + + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + CHeader m_header; + + std::vector<uint32_t> m_impedances; + std::vector<float> m_samples; + + CStimulationSet m_stimSet; + + CBridgeBioSemiActiveTwo m_bridge; + + std::vector<bool> m_triggers; + uint64_t m_nSample = 0; + + bool m_bCMCurrentlyInRange = false; + bool m_bBatteryCurrentlyOk = false; + uint32_t m_lastWarningTime = 0; + // Used to determine for how long CMS was in range + uint32_t m_lastCmsBackInRange = 0; + uint32_t m_lastBatteryLow = 0; + // True if CMS is in range for more than 100ms + bool m_bCMSBackInRange = true; + bool m_bBatteryBackOk = true; + uint32_t m_startTime = 0; + bool m_useEXChannel = false; + // Set to true + bool m_acquisitionStopped = false; + + SInformationWindow* m_infoWindow = nullptr; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + + +#endif // TARGET_HAS_ThirdPartyBioSemiAPI diff --git a/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-actichamp/ovasCConfigurationBrainProductsActiCHamp.cpp b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-actichamp/ovasCConfigurationBrainProductsActiCHamp.cpp new file mode 100644 index 0000000000000000000000000000000000000000..2e5ff53e88869c83a75d5844c992241fb11309ce --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-actichamp/ovasCConfigurationBrainProductsActiCHamp.cpp @@ -0,0 +1,158 @@ +///------------------------------------------------------------------------------------------------- +/// \copyright Copyright (C) 2012, Mensia Technologies SA. All rights reserved. +/// Rights transferred to Inria, contract signed 21.11.2014 +///------------------------------------------------------------------------------------------------- + +#if defined TARGET_HAS_ThirdPartyBrainProductsAmplifierSDK + +#include "ovasCConfigurationBrainProductsActiCHamp.h" + +#include "ovasIHeader.h" + +#include <system/ovCTime.h> + +#include <iostream> +#include <sstream> + +namespace OpenViBE { +namespace AcquisitionServer { + +static void DeviceChangedCB(GtkComboBox* /*comboBox*/, gpointer data) +{ + reinterpret_cast<CConfigurationBrainProductsActiCHamp*>(data)->comboBoxDeviceChangedCB(); +} + +static void SampleRateChangeCB(GtkComboBox*, gpointer data) +{ + reinterpret_cast<CConfigurationBrainProductsActiCHamp*>(data)->labelSamplingRateChangedCB(); +} + +CConfigurationBrainProductsActiCHamp::CConfigurationBrainProductsActiCHamp(const char* gtkBuilderFilename, DeviceSelection& deviceSelection, + int32_t& activeShieldGain, uint32_t& nEEGChannels, bool& useAuxChannels, + uint32_t& goodImpedanceLimit, uint32_t& badImpedanceLimit): + CConfigurationBuilder(gtkBuilderFilename), m_deviceSelection(deviceSelection), + m_activeShieldGain(activeShieldGain), m_nEEGChannels(nEEGChannels), m_useAuxChannels(useAuxChannels), + m_goodImpedanceLimit(goodImpedanceLimit), m_badImpedanceLimit(badImpedanceLimit) {} + + +bool CConfigurationBrainProductsActiCHamp::preConfigure() +{ + if (!CConfigurationBuilder::preConfigure()) { + return false; + } + + m_comboBoxDeviceId = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_device_id")); + m_comboBoxSampleRate = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_sampling_frequency")); + m_comboBoxSubSampleDivisor = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_sub_sample_divisor")); + m_labelNominalSamplingFrequency = GTK_LABEL(gtk_builder_get_object(m_builder, "nominal_sampling_frequency")); + m_buttonActiveShieldGain = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_active_shield_gain")); + m_buttonChannelsEnabled = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_number_of_channels")); + m_buttonUseAuxChannels = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_aux_channels")); + m_buttonGoodImpedanceLimit = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_good_imp")); + m_buttonBadImpedanceLimit = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_bad_imp")); + + g_signal_connect(G_OBJECT(m_comboBoxDeviceId), "changed", G_CALLBACK(DeviceChangedCB), this); + g_signal_connect(G_OBJECT(m_comboBoxSampleRate), "changed", G_CALLBACK(SampleRateChangeCB), this); + g_signal_connect(G_OBJECT(m_comboBoxSubSampleDivisor), "changed", G_CALLBACK(SampleRateChangeCB), this); + + // autodetection of the connected device(s) + for (uint32_t i = 0; i < m_deviceSelection.devices.size(); ++i) { + gtk_combo_box_append_text(m_comboBoxDeviceId, m_deviceSelection.devices[i].id.c_str()); + if (m_deviceSelection.selectionIndex == i) { + gtk_combo_box_set_active(m_comboBoxDeviceId, i); + } + } + if (!m_deviceSelection.devices.empty() && gtk_combo_box_get_active(m_comboBoxDeviceId) < 0) { + gtk_combo_box_set_active(m_comboBoxDeviceId, 0); + } + + if (m_deviceSelection.devices.size() > m_deviceSelection.selectionIndex) { + gtk_spin_button_set_range(m_buttonChannelsEnabled, gdouble(1),static_cast<gdouble>(m_deviceSelection.devices[m_deviceSelection.selectionIndex].availableEEGChannels)); + } + + if (m_deviceSelection.devices.empty()) { + m_nEEGChannels = 0; + } + + gtk_spin_button_set_value(m_buttonChannelsEnabled, m_nEEGChannels); + gtk_toggle_button_set_active(m_buttonUseAuxChannels, m_useAuxChannels); + gtk_spin_button_set_value(m_buttonActiveShieldGain, m_activeShieldGain); + gtk_spin_button_set_value(m_buttonGoodImpedanceLimit, m_goodImpedanceLimit); + gtk_spin_button_set_value(m_buttonBadImpedanceLimit, m_badImpedanceLimit); + return true; +} + +bool CConfigurationBrainProductsActiCHamp::postConfigure() +{ + if (m_applyConfig) { + gtk_spin_button_update(GTK_SPIN_BUTTON(m_buttonChannelsEnabled)); + gtk_spin_button_update(GTK_SPIN_BUTTON(m_buttonActiveShieldGain)); + gtk_spin_button_update(GTK_SPIN_BUTTON(m_buttonGoodImpedanceLimit)); + gtk_spin_button_update(GTK_SPIN_BUTTON(m_buttonBadImpedanceLimit)); + + m_deviceSelection.selectionIndex = gtk_combo_box_get_active(m_comboBoxDeviceId); + m_deviceSelection.baseSampleRateSelectionIndex = static_cast<size_t>(gtk_combo_box_get_active(m_comboBoxSampleRate)); + m_deviceSelection.subSampleDivisorSelectionIndex = static_cast<size_t>(gtk_combo_box_get_active(m_comboBoxSubSampleDivisor)); + m_activeShieldGain = uint32_t(gtk_spin_button_get_value(m_buttonActiveShieldGain)); + m_goodImpedanceLimit = uint32_t(gtk_spin_button_get_value(m_buttonGoodImpedanceLimit)); + m_badImpedanceLimit = uint32_t(gtk_spin_button_get_value(m_buttonBadImpedanceLimit)); + m_nEEGChannels = uint32_t(gtk_spin_button_get_value(m_buttonChannelsEnabled)); + m_useAuxChannels = gtk_toggle_button_get_active(m_buttonUseAuxChannels) != 0; + } + + if (!CConfigurationBuilder::postConfigure()) { return false; } + return true; +} + +void CConfigurationBrainProductsActiCHamp::comboBoxDeviceChangedCB() +{ + m_selectedDeviceIndex = gtk_combo_box_get_active(m_comboBoxDeviceId); + + resetComboBox(m_comboBoxSampleRate, m_deviceSelection.devices[m_selectedDeviceIndex].baseSampleRates); + if ( m_deviceSelection.baseSampleRateSelectionIndex < m_deviceSelection.devices[m_selectedDeviceIndex].baseSampleRates.size()) { + gtk_combo_box_set_active(m_comboBoxSampleRate, m_deviceSelection.baseSampleRateSelectionIndex); + } else { + gtk_combo_box_set_active(m_comboBoxSampleRate, 0); + } + + resetComboBox(m_comboBoxSubSampleDivisor, m_deviceSelection.devices[m_selectedDeviceIndex].subSampleDivisors); + if (m_deviceSelection.subSampleDivisorSelectionIndex < m_deviceSelection.devices[m_selectedDeviceIndex].subSampleDivisors.size()) { + gtk_combo_box_set_active(m_comboBoxSubSampleDivisor, m_deviceSelection.subSampleDivisorSelectionIndex); + } else { + gtk_combo_box_set_active(m_comboBoxSubSampleDivisor, 0); + } +} + +void CConfigurationBrainProductsActiCHamp::labelSamplingRateChangedCB() { + std::stringstream ss; + ss << m_deviceSelection.devices[m_selectedDeviceIndex].baseSampleRates[gtk_combo_box_get_active(m_comboBoxSampleRate)] / m_deviceSelection.devices[m_selectedDeviceIndex].subSampleDivisors[gtk_combo_box_get_active(m_comboBoxSubSampleDivisor)]; + ss << " Hz"; + gtk_label_set_text(m_labelNominalSamplingFrequency, ss.str().c_str()); +} + +template <typename T, typename = typename std::enable_if<std::is_arithmetic<T>::value, T>::type> +void CConfigurationBrainProductsActiCHamp::resetComboBox(GtkComboBox *comboBox, std::vector<T>& values) +{ + // Clear + // Not pretty mechanism, but gtk_combo_box_get_has_entry() not available on x86 + int maxFreqOptions = 7; + while (maxFreqOptions > 0) { + maxFreqOptions--; + gtk_combo_box_remove_text(comboBox, 0); + } + + // Set new values + std::ostringstream val; + val.precision(0); + for (size_t i = 0; i < values.size(); ++i) { + if (comboBox != nullptr) { + val.str(""); + val << std::fixed << values[i]; + gtk_combo_box_append_text(comboBox, val.str().c_str()); + } + } +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyBrainProductsAmplifierSDK diff --git a/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-actichamp/ovasCConfigurationBrainProductsActiCHamp.h b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-actichamp/ovasCConfigurationBrainProductsActiCHamp.h new file mode 100644 index 0000000000000000000000000000000000000000..8ec0c52984fb0c4522f0eaac7e4c8522f2902642 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-actichamp/ovasCConfigurationBrainProductsActiCHamp.h @@ -0,0 +1,63 @@ +///------------------------------------------------------------------------------------------------- +/// \copyright Copyright (C) 2012, Mensia Technologies SA. All rights reserved. +/// Rights transferred to Inria, contract signed 21.11.2014 +///------------------------------------------------------------------------------------------------- + +#pragma once + +#if defined TARGET_HAS_ThirdPartyBrainProductsAmplifierSDK + +#include "../ovasCConfigurationBuilder.h" +#include "../brainproducts-base/CDriverBrainProductsBase.h" + +#include <gtk/gtk.h> + +namespace OpenViBE { +namespace AcquisitionServer { + + +struct BrainProductsAmp { + std::string id; + uint32_t availableModules; +}; + +class CConfigurationBrainProductsActiCHamp final : public CConfigurationBuilder +{ +public: + CConfigurationBrainProductsActiCHamp(const char* gtkBuilderFilename, DeviceSelection& deviceSelection, + int32_t& activeShieldGain, uint32_t& nEEGChannels, bool& useAuxChannels, + uint32_t& goodImpedanceLimit, uint32_t& badImpedanceLimit); + + bool preConfigure() override; + bool postConfigure() override; + + void comboBoxDeviceChangedCB(); + void labelSamplingRateChangedCB(); + +protected: + size_t m_selectedDeviceIndex; + + int32_t& m_activeShieldGain; + uint32_t& m_nEEGChannels; + bool& m_useAuxChannels; + uint32_t& m_goodImpedanceLimit; + uint32_t& m_badImpedanceLimit; + DeviceSelection& m_deviceSelection; + + GtkComboBox* m_comboBoxDeviceId = nullptr; + GtkComboBox* m_comboBoxSampleRate = nullptr; + GtkComboBox* m_comboBoxSubSampleDivisor = nullptr; + GtkLabel* m_labelNominalSamplingFrequency = nullptr; + GtkSpinButton* m_buttonActiveShieldGain = nullptr; + GtkSpinButton* m_buttonChannelsEnabled = nullptr; + GtkToggleButton* m_buttonUseAuxChannels = nullptr; + GtkSpinButton* m_buttonGoodImpedanceLimit = nullptr; + GtkSpinButton* m_buttonBadImpedanceLimit = nullptr; + + template <typename T, typename = typename std::enable_if<std::is_arithmetic<T>::value, T>::type> + void resetComboBox(GtkComboBox* comboBox, std::vector<T>& values); +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyBrainProductsAmplifierSDK diff --git a/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-actichamp/ovasCDriverBrainProductsActiCHamp.cpp b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-actichamp/ovasCDriverBrainProductsActiCHamp.cpp new file mode 100644 index 0000000000000000000000000000000000000000..a4e286ade780020799e85596da0e9dd2913474a6 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-actichamp/ovasCDriverBrainProductsActiCHamp.cpp @@ -0,0 +1,148 @@ +///------------------------------------------------------------------------------------------------- +/// \copyright Copyright (C) 2012, Mensia Technologies SA. All rights reserved. +/// Rights transferred to Inria, contract signed 21.11.2014 +///------------------------------------------------------------------------------------------------- + +#if defined TARGET_HAS_ThirdPartyBrainProductsAmplifierSDK + +#include "ovasCDriverBrainProductsActiCHamp.h" +#include "ovasCConfigurationBrainProductsActiCHamp.h" + +#include <toolkit/ovtk_all.h> +#include <system/ovCTime.h> + +namespace OpenViBE { +namespace AcquisitionServer { + +CDriverBrainProductsActiCHamp::CDriverBrainProductsActiCHamp(IDriverContext& ctx): + CDriverBrainProductsBase(ctx), + m_settings("AcquisitionServer_Driver_BrainProductsActiCHamp", m_driverCtx.getConfigurationManager()) +{ + + + m_settings.add( "ActiveShieldGain", &m_activeShieldGain); + m_settings.add( "EEGChannels", &m_nEEGChannels); + m_settings.add( "UseAuxChannels", &m_useAuxChannels); + m_settings.add("DeviceSelectionIndex", &m_deviceSelection.selectionIndex); + m_settings.add( "SampleFrequencyIdx", &m_deviceSelection.baseSampleRateSelectionIndex); + m_settings.add( "SubSampleDivisorIdx", &m_deviceSelection.subSampleDivisorSelectionIndex); + m_settings.add( "samplingFrequency", &m_samplingFrequencySetting); + m_settings.add("GoodImpedanceLimit", &m_goodImpedanceLimit); + m_settings.add("BadImpedanceLimit", &m_badImpedanceLimit); + + m_settings.load(); + + m_header.setSamplingFrequency(m_samplingFrequencySetting); + m_header.setChannelCount(m_nEEGChannels); + m_ampFamily = AmplifierFamily::eActiChampFamily; +} + +//___________________________________________________________________// +// // +bool CDriverBrainProductsActiCHamp::initializeSpecific() +{ + if (!setEnabledChannels()) { + return false; + } + + if (!setActiveShieldGain()){ + return false; + } + + return true; +} + +bool CDriverBrainProductsActiCHamp::setEnabledChannels() +{ + int32_t availableChannels; + int res = m_amplifier->GetProperty(availableChannels, DPROP_I32_AvailableChannels); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error + << "CDriverBrainProductsActiCHamp::setEnabledChannels: Cannot read AvailableChannels from device; error code = " + << res << "\n"; + return false; + } + + int32_t channelType; + size_t enableChannels = 0; + int enable; + for (size_t c = 0; c < availableChannels; ++c) { + res = m_amplifier->GetProperty(channelType, c, ChannelPropertyID::CPROP_I32_Type); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error + << "CDriverBrainProductsBase::getAvailableDevices: Cannot read AvailableChannels from device - channel " + << c << "; error code = " + << res << "\n"; + return false; + } + switch (channelType) { + case ChannelType::CT_EEG: + case ChannelType::CT_BIP: + enable = (enableChannels < m_nEEGChannels) ? 1 : 0; + enableChannels++; + break; + case ChannelType::CT_AUX: + enable = m_useAuxChannels ? 1 : 0; + break; + default: + enable = 0; + break; + } + res = m_amplifier->SetProperty(enable, c, ChannelPropertyID::CPROP_B32_RecordingEnabled); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error + << "CDriverBrainProductsBase::getAvailableDevices: Cannot set CPROP_B32_RecordingEnabled for channel " + << c << "; error code = " + << res << "\n"; + return false; + } + } + + return true; +} + +bool CDriverBrainProductsActiCHamp::setActiveShieldGain() +{ + // Set property DPROP_I32_ActiveShieldGain from m_activeShieldGain + int res = m_amplifier->SetProperty(m_activeShieldGain, DevicePropertyID::DPROP_I32_ActiveShieldGain); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "CDriverBrainProductsActiCHamp::setActiveShieldGain Failed to set Active shield gain to " << m_activeShieldGain + << "; error code: " << res << "\n"; + return false; + } + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverBrainProductsActiCHamp::configure() +{ + getAvailableDevices(); + + CConfigurationBrainProductsActiCHamp config(Directories::getDataDir() + "/applications/acquisition-server/interface-BrainProducts-ActiCHamp.ui", + m_deviceSelection, m_activeShieldGain, m_nEEGChannels, m_useAuxChannels, + m_goodImpedanceLimit, m_badImpedanceLimit); + + if (!config.configure(m_header)) { + return false; + } + + if (!m_deviceSelection.devices.empty()) { + size_t samplingFreq = m_deviceSelection.devices[m_deviceSelection.selectionIndex].baseSampleRates[m_deviceSelection.baseSampleRateSelectionIndex] / m_deviceSelection.devices[m_deviceSelection.selectionIndex].subSampleDivisors[m_deviceSelection.subSampleDivisorSelectionIndex]; + + m_header.setSamplingFrequency(samplingFreq); + m_header.setChannelCount(m_nEEGChannels + (m_useAuxChannels ? 8:0)); + + m_samplingFrequencySetting = samplingFreq; + } + + m_settings.save(); + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyBrainProductsAmplifierSDK diff --git a/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-actichamp/ovasCDriverBrainProductsActiCHamp.h b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-actichamp/ovasCDriverBrainProductsActiCHamp.h new file mode 100644 index 0000000000000000000000000000000000000000..f11f5b5f071cf3211a9fe5dda89051ea5f1fb9bb --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-actichamp/ovasCDriverBrainProductsActiCHamp.h @@ -0,0 +1,59 @@ +///------------------------------------------------------------------------------------------------- +/// \copyright Copyright (C) 2012, Mensia Technologies SA. All rights reserved. +/// Rights transferred to Inria, contract signed 21.11.2014 +///------------------------------------------------------------------------------------------------- + +#pragma once + +#if defined TARGET_HAS_ThirdPartyBrainProductsAmplifierSDK + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +#include "../ovasCSettingsHelper.h" +#include "../brainproducts-base/CDriverBrainProductsBase.h" + +#include <deque> + + + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverBrainProductsActiCHamp + * \author Mensia Technologies + */ +class CDriverBrainProductsActiCHamp final : public CDriverBrainProductsBase +{ +public: + explicit CDriverBrainProductsActiCHamp(IDriverContext& ctx); + void release() { delete this; } + const char* getName() override { return "Brain Products actiCHamp"; } + + bool initializeSpecific() override; + + bool isConfigurable() override { return true; } + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + +protected: + + bool setEnabledChannels(); + bool setActiveShieldGain(); + + SettingsHelper m_settings; + + int32_t m_activeShieldGain = 0; + uint32_t m_nEEGChannels = 0; + bool m_useAuxChannels = false; + + // sampling Freq. is handled by a Base and a divisor. + // This variable is only useful for setting saving/initialization purpose + size_t m_samplingFrequencySetting = 0; + + +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyBrainProductsAmplifierSDK diff --git a/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-base/CDriverBrainProductsBase.cpp b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-base/CDriverBrainProductsBase.cpp new file mode 100644 index 0000000000000000000000000000000000000000..22ccfac222d4319733946e199bff050c725db4d4 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-base/CDriverBrainProductsBase.cpp @@ -0,0 +1,719 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CDriverBrainProductsBase.cpp +/// \author Thomas Prampart (Inria) +/// \copyright Copyright (C) 2022 Inria +/// +/// This program is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Affero General Public License as published +/// by the Free Software Foundation, either version 3 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Affero General Public License for more details. +/// +/// You should have received a copy of the GNU Affero General Public License +/// along with this program. If not, see <https://www.gnu.org/licenses/>. +/// +///------------------------------------------------------------------------------------------------- + +#if defined TARGET_HAS_ThirdPartyBrainProductsAmplifierSDK + +#include "CDriverBrainProductsBase.h" + + +namespace OpenViBE { +namespace AcquisitionServer { + +CDriverBrainProductsBase::CDriverBrainProductsBase(IDriverContext &ctx) : + IDriver(ctx), + m_amplifier(std::make_unique<CAmplifier>()) +{ + +} + +bool CDriverBrainProductsBase::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback &callback) +{ + m_nSamplePerSentBlock = nSamplePerSentBlock; + m_callback = &callback; + + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "[INIT] Initialization has been started. " << "\n"; + + if (m_driverCtx.isConnected() || !m_header.isChannelCountSet() || !m_header.isSamplingFrequencySet()) { + return false; + } + + if (!openAmplifier()) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] Failed to open amplifier \n"; + return false; + } + + if (!configureAmplifier()) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] Failed to configure amplifier \n"; + return false; + } + + if (!initializeSpecific()) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] Failed to perform specific amplifier initialization \n"; + return false; + } + + if (m_driverCtx.isImpedanceCheckRequested()) { + if (!configureImpedanceMeasure()) { + return false; + } + } + + if (!m_driverCtx.isImpedanceCheckRequested()) { + m_sampleSize = getAmplifierSampleSize(); + resetBuffers(); + } else { + const int res = m_amplifier->StartAcquisition(m_recordingMode); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << " [Impedance] Device Handle = NULL.\n"; + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Impedance Acquisition started...\n"; + } + + return true; +} + +void CDriverBrainProductsBase::resetBuffers() +{ + m_sampleBuffer.clear(); + m_sampleBuffer.resize(m_sampleSize * m_header.getSamplingFrequency() / 4); // 250ms of sampling for all channels + m_sendBuffers.clear(); + m_samples.clear(); + m_samples.resize(m_header.getChannelCount() * m_nSamplePerSentBlock);// allocate for all analog signals / channels +} + +bool CDriverBrainProductsBase::uninitialize() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Uninitialized called.\n"; + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { + return false; + } + + // ... + // uninitialize hardware here + // ... + if (m_amplifier != nullptr) { + int res = m_amplifier->StopAcquisition(); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Uninitialized called. stopping acquisition:" << res << "\n"; + } + + res = m_amplifier->Close(); + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Uninitialized called. Closing the device:" << res << "\n"; + } + + m_sampleBuffer.clear(); + m_callback = nullptr; + m_samples.clear(); + + return true; +} + +bool CDriverBrainProductsBase::stop() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Stop called.\n"; + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { + return false; + } + + // ... + // request the hardware to stop + // sending data + // ... + if (m_amplifier != nullptr) { + const int res = m_amplifier->StopAcquisition(); + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Stopping the acquisition:" << res << "\n"; + } + + return true; +} + +bool CDriverBrainProductsBase::loop() +{ + if (!m_driverCtx.isConnected()) { + return false; + } + + if (m_driverCtx.isStarted()) { + std::vector<std::vector<float>> buffers(1, std::vector<float>(1)); + while (true) { + // receive samples from hardware + // put them the correct way in the sample array + // whether the buffer is full, send it to the acquisition server + + const size_t nSample = getData(buffers); + if (nSample < 1) { + return true; + } + + for (size_t sample = 0; sample < nSample; ++sample) { + m_sendBuffers.push_back(buffers[sample]); + } + const int readyToSend = int(m_sendBuffers.size()) - int(m_nSamplePerSentBlock); // must check buffer size in that way !!! + if (readyToSend > 0) { + + for (size_t ch = 0, i = 0; ch < m_header.getChannelCount(); ++ch) { + for (size_t sample = 0; sample < m_nSamplePerSentBlock; ++sample) { + m_samples[i++] = m_sendBuffers[sample][ch]; + } + } + + for (size_t sample = 0; sample < m_nSamplePerSentBlock; ++sample) { // check triggers: + for (size_t t = 0; t < m_triggerIndices.size(); ++t) { + const uint16_t trigg = uint16_t(m_sendBuffers[sample][m_triggerIndices[t]]); + if (trigg != m_lastTriggerStates[t]) { + const uint64_t time = CTime(m_header.getSamplingFrequency(), sample).time(); + m_stimSet.push_back(OVTK_StimulationId_Label(trigg), time, 0); // send the same time as the 'sample' + m_lastTriggerStates[t] = trigg; + } + } + } + + // send acquired data... + m_callback->setSamples(&m_samples[0], m_nSamplePerSentBlock); + m_callback->setStimulationSet(m_stimSet); + + m_samples.clear(); + m_stimSet.clear(); + // When your sample buffer is fully loaded, + // it is advised to ask the acquisition server + // to correct any drift in the acquisition automatically. + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + + // delete sent samples + m_sendBuffers.erase(m_sendBuffers.begin(), m_sendBuffers.begin() + m_nSamplePerSentBlock); + break; + } + } + } + else if (m_driverCtx.isImpedanceCheckRequested()) //impedance measurement + { + if (m_recordingMode != RM_IMPEDANCE) { + return true; + } // go out of the loop + checkImpedance(); + } + + return true; +} + +bool CDriverBrainProductsBase::getAvailableDevices() +{ + // Interface type + std::string hwi("ANY"); + // container for Device address + std::string deviceAddress = ""; + + if (m_devicesEnumerated) { + return true; + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info + << "CDriverBrainProductsBase::getAvailableDevices: Amp family: "<< ((m_ampFamily == eActiChampFamily) ? "Actichamp":"LiveAmp") << "\n"; + SetAmplifierFamily(m_ampFamily); + + // Clear list before filling it again. + m_deviceSelection.devices.clear(); + + m_amplifier->Close(); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info + << "CDriverBrainProductsBase::getAvailableDevices: Enumerate devices\n"; + int res = EnumerateDevices(&hwi[0], int32_t(hwi.size()), deviceAddress.data(), 0); + if (res == 0) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "CDriverBrainProductsBase::getAvailableDevices: No amplifier connected! \n"; + return false; + } + if (res < 0) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error + << "CDriverBrainProductsBase::getAvailableDevices: Error enumerating devices ; error code= " + << res << "\n"; + return false; + } + + const int numDevices = res; + for (int i = 0; i < numDevices; ++i) { + BrainProductsDevice dev; + dev.availableEEGChannels = 0; + dev.availableAUXChannels = 0; + dev.availableACCChannels = 0; + dev.subSampleDivisors.clear(); + dev.baseSampleRates.clear(); + + res = m_amplifier->Open(i); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error + << "CDriverBrainProductsBase::getAvailableDevices: Cannot open device # " + << i << "; error code = " << res << "\n"; + return false; + } + + //Get Device ID + res = m_amplifier->GetProperty(dev.id, DevicePropertyID::DPROP_CHR_SerialNumber); // get serial number + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error + << "CDriverBrainProductsBase::getAvailableDevices: Cannot read Serial number from device # " + << i << "; error code = " + << res << "\n"; + return false; + } + + // Get Device Sample Rate + PropertyRange<float> availableSampleRates; + res = m_amplifier->GetPropertyRange(availableSampleRates, DPROP_F32_BaseSampleRate); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error + << "CDriverBrainProductsBase::getAvailableDevices: Cannot read BaseSampleRate range from device # " + << i << "; error code = " + << res << "\n"; + } + for (int j = 0; j < availableSampleRates.ByteLength / sizeof(float); ++j) { + dev.baseSampleRates.push_back(availableSampleRates.RangeArray[j]); + } + + // Get device Sub Sample Divisor + PropertyRange<float> availableSubSampleDivisors; + res = m_amplifier->GetPropertyRange(availableSubSampleDivisors, DPROP_F32_SubSampleDivisor); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error + << "CDriverBrainProductsBase::getAvailableDevices: Cannot read SubSampleDivisor range from device # " + << i << "; error code = " + << res << "\n"; + } + for (int j = 0; j < availableSubSampleDivisors.ByteLength / sizeof(float); ++j) { + dev.subSampleDivisors.push_back(availableSubSampleDivisors.RangeArray[j]); + } + + // Get device channel details + int32_t availableChannels; + res = m_amplifier->GetProperty(availableChannels, DPROP_I32_AvailableChannels); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error + << "CDriverBrainProductsBase::getAvailableDevices: Cannot read AvailableChannels from device # " + << i << "; error code = " + << res << "\n"; + return false; + } + + int32_t channelType; + for (size_t c = 0; c < availableChannels; ++c) { + res = m_amplifier->GetProperty(channelType, c, ChannelPropertyID::CPROP_I32_Type); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error + << "CDriverBrainProductsBase::getAvailableDevices: Cannot read AvailableChannels from device # " + << i << " - channel "<< c << "; error code = " + << res << "\n"; + return false; + } + switch(channelType) { + case ChannelType::CT_EEG: + case ChannelType::CT_BIP: + dev.availableEEGChannels++; + break; + case ChannelType::CT_AUX: + char channelFunction[20]; + res = m_amplifier->GetProperty(channelFunction, c, ChannelPropertyID::CPROP_CHR_Function); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[Check] GetProperty CPROP_CHR_Function #1 error: " << res << "\n"; + return false; + } + + if (channelFunction[0] == 'X' || channelFunction[0] == 'Y' || channelFunction[0] == 'Z' || + channelFunction[0] == 'x' || channelFunction[0] == 'y' || channelFunction[0] == 'z') { + dev.availableACCChannels++; + } else { + dev.availableAUXChannels++; + } + break; + default: + break; + } + } + + // Add device to selection list + m_deviceSelection.devices.push_back(dev); + + res = m_amplifier->Close(); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error + << "CDriverBrainProductsBase::getAvailableDevices: Cannot close the device # " + << i << "; error code = " << res << "\n"; + return false; + } + } + + m_devicesEnumerated = true; + return true; +} + +bool CDriverBrainProductsBase::openAmplifier() { + m_amplifier->Close(); + + if (!m_devicesEnumerated) { + getAvailableDevices(); + } + + int res = m_amplifier->Open(m_deviceSelection.selectionIndex); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[InitializeAmplifier] Cannot open the device # " << m_deviceSelection.selectionIndex << ": " << m_deviceSelection.devices[m_deviceSelection.selectionIndex].id << "; error code = " << res << "\n"; + return false; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "[InitializeAmplifier] Opened Device # " << m_deviceSelection.selectionIndex << ": " << m_deviceSelection.devices[m_deviceSelection.selectionIndex].id << "\n"; + + + return true; +} + +bool CDriverBrainProductsBase::configureAmplifier() { + // amplifier configuration + float sampleRate; + float subSampleDivisor; + bool hasSubSampleDivisor; + if (m_ampFamily == eLiveAmpFamily) { + sampleRate = float(m_header.getSamplingFrequency()); + subSampleDivisor = 1.0; + hasSubSampleDivisor = false; + } else { + sampleRate = m_deviceSelection.devices[m_deviceSelection.selectionIndex].baseSampleRates[m_deviceSelection.baseSampleRateSelectionIndex]; + subSampleDivisor = m_deviceSelection.devices[m_deviceSelection.selectionIndex].subSampleDivisors[m_deviceSelection.subSampleDivisorSelectionIndex]; + hasSubSampleDivisor = true; + } + + + PropertyRange<float> availableSubSampleDivisors; + // get the available values for this property + int res = m_amplifier->GetPropertyRange(availableSubSampleDivisors, DPROP_F32_SubSampleDivisor); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[Config] Error in GetPropertyRange SubSampleDivisor: " << res << "\n"; + return false; + } + + if (availableSubSampleDivisors.ByteLength == 0) + { + hasSubSampleDivisor = false; + subSampleDivisor = 1.0; + } + + res = m_amplifier->SetProperty(sampleRate, DevicePropertyID::DPROP_F32_BaseSampleRate); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[Config] Error setting sampling rate, error code:" << res << "\n"; + return false; + } + + float tmp; + res = m_amplifier->GetProperty(tmp, DevicePropertyID::DPROP_F32_BaseSampleRate); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[Config] Error reading back sampling rate: " << res << "\n"; + return false; + } else { + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "[Config] Set sampling frequency: " << tmp << "\n"; + } + + if (hasSubSampleDivisor) { + res = m_amplifier->SetProperty(subSampleDivisor, DPROP_F32_SubSampleDivisor); + if (res != AMP_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[Config] Error in SetProperty SubSampleDivisor: " << res << "\n"; + return false; + } + + res = m_amplifier->GetProperty(tmp, DPROP_F32_SubSampleDivisor); + if (res != AMP_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[Config] Error reading back sub sampling divisor: " << res << "\n"; + return false; + } + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "[Config] Current Effective Sampling Rate: " << (sampleRate / subSampleDivisor) << "\n"; + + m_recordingMode = RM_NORMAL; // initialize acquisition mode: standard/normal + res = m_amplifier->SetProperty(m_recordingMode, DevicePropertyID::DPROP_I32_RecordingMode); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[Config] Error setting acquisition mode, error code: " << res << "\n"; + return false; + } + + // set good and bad impedance level + res = m_amplifier->SetProperty(m_goodImpedanceLimit, DevicePropertyID::DPROP_I32_GoodImpedanceLevel); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[Config] Error setting DPROP_I32_GoodImpedanceLevel, error code: " << res << "\n"; + return false; + } + + res = m_amplifier->SetProperty(m_badImpedanceLimit, DevicePropertyID::DPROP_I32_BadImpedanceLevel); + if (res != AMP_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[Config] Error setting DPROP_I32_BadImpedanceLevel, error code: " << res << "\n"; + return false; + } + + return true; +} + +uint32_t CDriverBrainProductsBase::getAmplifierSampleSize() { + int availableChannels, dataType; + float resolution; + int byteSize = 0; + + m_dataTypes.clear(); + m_resolutions.clear(); + m_nUsedChannels = 0; + + // iterate through all enabled channels + int res = m_amplifier->GetProperty(availableChannels, DevicePropertyID::DPROP_I32_AvailableChannels); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " [getLiveAmpSampleSize] GetProperty AvailableChannels - error code= " << res << "\n"; + } + for (int c = 0; c < availableChannels; ++c) { + int enabled; + res = m_amplifier->GetProperty(enabled, c, ChannelPropertyID::CPROP_B32_RecordingEnabled); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " [getLiveAmpSampleSize] GetProperty Channel RecordingEnabled - error code= " << res << "\n"; + } + if (enabled) { + // get the type of channel + res = m_amplifier->GetProperty(dataType, c, ChannelPropertyID::CPROP_I32_DataType); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " [getLiveAmpSampleSize] GetProperty Channel DataType - error code= " << res << "\n"; + } + m_dataTypes.push_back(dataType); + res = m_amplifier->GetProperty(resolution, c, ChannelPropertyID::CPROP_F32_Resolution); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " [getLiveAmpSampleSize] GetProperty Channel Resolution - error code= " << res << "\n"; + } + m_resolutions.push_back(resolution); + m_nUsedChannels++; + + switch (dataType) { + case DT_INT16: + case DT_UINT16: + byteSize += 2; + break; + case DT_INT32: + case DT_UINT32: + case DT_FLOAT32: + byteSize += 4; + break; + case DT_INT64: + case DT_UINT64: + case DT_FLOAT64: + byteSize += 8; + break; + default: + break; + } + } + } + + byteSize += 8; // add the sample counter size + + return byteSize; +} + +bool CDriverBrainProductsBase::start() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { + return false; + } + + if (m_amplifier == nullptr) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[start] Device Handle not initialised\n"; + } + + int res = m_amplifier->GetProperty(m_recordingMode, DevicePropertyID::DPROP_I32_RecordingMode); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " [start] GetProperty RecordingMode error code = " << res << "\n"; + } + + if (m_recordingMode != RM_NORMAL) { + res = m_amplifier->StopAcquisition(); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " [start] StopAcquisition error code = " << res << "\n"; + } + + // Maybe redundant as the new API gets the recording mode from the StartAcquisition call. + m_recordingMode = RM_NORMAL; + m_amplifier->SetProperty(m_recordingMode, DevicePropertyID::DPROP_I32_RecordingMode); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " [start] SetProperty RecordingMode error code = " << res << "\n"; + } + } + + res = m_amplifier->StartAcquisition(m_recordingMode); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " [start] ampStartAcquisition error code = " << res << "\n"; + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "[start] Acquisition started...\n"; + + return true; +} + +size_t CDriverBrainProductsBase::getData(std::vector<std::vector<float>>& extractedData) +{ + size_t offset; + float sample = 0.0; + + const int ret = m_amplifier->GetData(&m_sampleBuffer[0], static_cast<int32_t>(m_sampleBuffer.size()), 0); + if (ret < 1) { + return ret; + } + + size_t samplesRead = ret / m_sampleSize; + + extractedData.clear(); + extractedData.resize(samplesRead); + + for (size_t s = 0; s < samplesRead; ++s) { + offset = 8; // Sample count offset + + extractedData[s].resize(m_nUsedChannels); + + for (uint32_t i = 0; i < m_nUsedChannels; ++i) { + switch (m_dataTypes[i]) { + case DT_INT16: + { + const int16_t tmp = reinterpret_cast<int16_t&>(m_sampleBuffer[s * m_sampleSize + offset]); + sample = float(tmp) * m_resolutions[i]; + offset += 2; + break; + } + case DT_UINT16: + { + const uint16_t tmp = reinterpret_cast<uint16_t&>(m_sampleBuffer[s * m_sampleSize + offset]); + sample = float(tmp) * m_resolutions[i]; + offset += 2; + break; + } + case DT_INT32: + { + const int tmp = reinterpret_cast<int&>(m_sampleBuffer[s * m_sampleSize + offset]); + sample = float(tmp) * m_resolutions[i]; + offset += 4; + break; + } + case DT_UINT32: + { + const uint32_t tmp = reinterpret_cast<uint32_t&>(m_sampleBuffer[s * m_sampleSize + offset]); + sample = float(tmp) * m_resolutions[i]; + offset += 4; + break; + } + case DT_FLOAT32: + { + const float tmp = reinterpret_cast<float&>(m_sampleBuffer[s * m_sampleSize + offset]); + sample = tmp * m_resolutions[i]; + offset += 4; + break; + } + case DT_INT64: + { + const int64_t tmp = reinterpret_cast<int64_t&>(m_sampleBuffer[s * m_sampleSize + offset]); + sample = float(tmp) * m_resolutions[i]; + offset += 8; + break; + } + case DT_UINT64: + { + const uint64_t tmp = reinterpret_cast<uint64_t&>(m_sampleBuffer[s * m_sampleSize + offset]); + sample = float(tmp) * m_resolutions[i]; + offset += 8; + break; + } + case DT_FLOAT64: + { + const double tmp = reinterpret_cast<double&>(m_sampleBuffer[s * m_sampleSize + offset]); + sample = float(tmp) * m_resolutions[i]; + offset += 8; + break; + } + default: + break; + } + + extractedData[s][i] = sample; + } + } + + return samplesRead; +} + +bool CDriverBrainProductsBase::configureImpedanceMeasure() +{ + if (!m_driverCtx.isImpedanceCheckRequested()) { + return true; + } + + // Set Impedance mode + m_recordingMode = RM_IMPEDANCE; + int res = m_amplifier->SetProperty(m_recordingMode, DevicePropertyID::DPROP_I32_RecordingMode); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[configureImpedanceMeasure] Error setting impedance mode, error code: " << res << "\n"; + return false; + } + + // for impedance measurements use only EEG and Bip channels + int availableChannels; + res = m_amplifier->GetProperty(availableChannels, DevicePropertyID::DPROP_I32_AvailableChannels); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[configureImpedanceMeasure] Get available channels, error code: " << res << "\n"; + return false; + } + + m_impedanceChannels = 0; + for (int c = 0; c < availableChannels; ++c) { + int enabled = 0; + int impedanceSupported = 0; + + res = m_amplifier->GetProperty(enabled, c, ChannelPropertyID::CPROP_B32_RecordingEnabled); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " [configureImpedanceMeasure] Cannot read enable channel: " << c << "; error code: " << res << "\n"; + return false; + } + + if (enabled) { + // Check if this channel can do impedance and add it! + res = m_amplifier->GetProperty(impedanceSupported, c, ChannelPropertyID::CPROP_B32_ImpedanceMeasurement); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " [configureImpedanceMeasure] Cannot read channel impedance support: " << c << "; error code: " << res << "\n"; + return false; + } + if (impedanceSupported) { + m_impedanceChannels++; + } + } + } + + return true; +} + +void CDriverBrainProductsBase::checkImpedance() { + + m_impedanceBuffer.clear(); + m_impedanceBuffer.resize(m_impedanceChannels * 2 + 2, -1.0); // 2 fields per impedance + 2 for REF and GND + + const int bytesRead = m_amplifier->GetData(&m_impedanceBuffer[0], m_impedanceBuffer.size() * sizeof(float), m_impedanceBuffer.size() * sizeof(float)); + + if (bytesRead < 1) { + return; + } + + for (size_t ch = 0, i = 2; i < m_impedanceBuffer.size(); i += 2, ++ch) { + double impedance = m_impedanceBuffer[i] - ((m_impedanceBuffer[i+1] < 0) ? 0.0 : m_impedanceBuffer[i+1]); + m_driverCtx.updateImpedance(ch, impedance); + } +} + +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyBrainProductsAmplifierSDK diff --git a/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-base/CDriverBrainProductsBase.h b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-base/CDriverBrainProductsBase.h new file mode 100644 index 0000000000000000000000000000000000000000..5af6d6fa50ed3ebe57e562d50f235391916060a0 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-base/CDriverBrainProductsBase.h @@ -0,0 +1,171 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CDriverBrainProductsBase.h +/// \author Thomas Prampart (Inria) +/// \copyright Copyright (C) 2022 Inria +/// +/// This program is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Affero General Public License as published +/// by the Free Software Foundation, either version 3 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Affero General Public License for more details. +/// +/// You should have received a copy of the GNU Affero General Public License +/// along with this program. If not, see <https://www.gnu.org/licenses/>. +/// +///------------------------------------------------------------------------------------------------- +#pragma once + +#if defined TARGET_HAS_ThirdPartyBrainProductsAmplifierSDK + +#include <memory> +#include <vector> +#include <string> + +#include "SDK.h" + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +class CAmplifier; + +namespace OpenViBE { +namespace AcquisitionServer { + +struct BrainProductsDevice { + std::string id; + std::vector<float> baseSampleRates; + std::vector<float> subSampleDivisors; + size_t availableEEGChannels; + size_t availableAUXChannels; + size_t availableACCChannels; +}; + +struct DeviceSelection { + size_t selectionIndex = 0; ///< index of selected device + size_t baseSampleRateSelectionIndex = 0; ///< index of sample rate selected for device + size_t subSampleDivisorSelectionIndex = 0; ///< index of sub sample divisor selected for device + std::vector<BrainProductsDevice> devices; ///< List of devices to select from +}; + +class CDriverBrainProductsBase : public IDriver +{ + +public: + explicit CDriverBrainProductsBase(IDriverContext &ctx); + + bool start() override; + + bool initialize(uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool stop() override; + bool loop() override; + + const IHeader* getHeader() override { return &m_header; } + +protected: + + /** + * \brief Method to override by child class and called during initialize() + * \return true on success, false otherwise + */ + virtual bool initializeSpecific() + { + return true; + }; + + /** + * \brief Method to override by child class and called when enough data was received to process. + * \return true on success, false otherwise + */ + virtual bool processData() { + return true; + }; + /** + * \brief Get available amplifiers informations + * \return True if info could be extracted, False otherwise + */ + bool getAvailableDevices(); + + /** + * \Brief Opens selected amplifier + * \return True if amplifier was opened successfully, false otherwise + */ + bool openAmplifier(); + + /** + * \brief Configure LiveAmp, sampling rate and mode. + * \return True if LiveAmp is successful configured. + */ + bool configureAmplifier(); + + /** + * \brief Calcualtes the size of 'one' sample the amplifier delivers. It is actually a sum of the one sample per each channel that will be acquired. + This information is needed to read data from buffer, in order to access to each sample of each channel. + * \return Size of 'one' acquired sample. + */ + uint32_t getAmplifierSampleSize(); + + /** + * \brief Reads and parses data from amplifier + * \param extractedData [out] vector of samples as a vector of one sample per channel. + * \return the amount of samples read. + */ + size_t getData(std::vector<std::vector<float>>& extractedData); + + /** + * brief Clears and re-initialises buffers storing data from the device + */ + void resetBuffers(); + + /** + * \brief Retrieve from device the channels providing impedance data + * \return True on success, false otherwise + */ + bool configureImpedanceMeasure(); + + /** + * \brief Update acquisition server with impedance data + */ + void checkImpedance(); + + + IDriverCallback* m_callback = nullptr; + CHeader m_header; + std::vector<uint16_t> m_dataTypes; + uint32_t m_nSamplePerSentBlock = 0; + + std::unique_ptr<CAmplifier> m_amplifier = nullptr; + AmplifierFamily m_ampFamily; + DeviceSelection m_deviceSelection; + bool m_devicesEnumerated = false; + + RecordingMode m_recordingMode = RM_STOPPED; + + std::vector<BYTE> m_sampleBuffer; //< Stores data on each API call + std::vector<std::vector<float>> m_sendBuffers; //< Store data received from device after each read + size_t m_sampleSize = 0; + uint32_t m_nUsedChannels = 0; + std::vector<float> m_resolutions; + std::vector<uint16_t> m_triggerIndices; + std::vector<uint16_t> m_lastTriggerStates; + + // Data to send to acq. server + std::vector<float> m_samples; + CStimulationSet m_stimSet; + + std::vector<float> m_impedanceBuffer; + uint32_t m_impedanceChannels = 0; + uint32_t m_goodImpedanceLimit = 5000; + uint32_t m_badImpedanceLimit = 10000; +}; + +} // AcquisitionServer +} // OpenViBE + +#endif // TARGET_HAS_ThirdPartyBrainProductsAmplifierSDK diff --git a/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-brainampseries/ovasCConfigurationBrainProductsBrainampSeries.cpp b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-brainampseries/ovasCConfigurationBrainProductsBrainampSeries.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d108f50c91d9712a6c56c7408f6fb0b5f167b66d --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-brainampseries/ovasCConfigurationBrainProductsBrainampSeries.cpp @@ -0,0 +1,283 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file ovasCConfigurationBrainProductsBrainampSeries.cpp +/// \brief Brain Products Brainamp Series driver for OpenViBE +/// \author Yann Renard +/// \copyright Copyright (C) 2022 Inria +/// +/// This program is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Affero General Public License as published +/// by the Free Software Foundation, either version 3 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Affero General Public License for more details. +/// +/// You should have received a copy of the GNU Affero General Public License +/// along with this program. If not, see <https://www.gnu.org/licenses/>. +/// +///------------------------------------------------------------------------------------------------- + +#include "ovasCConfigurationBrainProductsBrainampSeries.h" + +#include "ovasIHeader.h" + +#if defined TARGET_OS_Windows + +#include "ovasCDriverBrainProductsBrainampSeries.h" + +#include <iostream> +#include <windows.h> + +namespace OpenViBE { +namespace AcquisitionServer { + + +static EParameter toIndex(const uint32_t value) +{ + switch (value) { + case 1: return DecimationFactor_None; + case 2: return DecimationFactor_2; + case 4: return DecimationFactor_4; + case 5: return DecimationFactor_5; + case 8: return DecimationFactor_8; + case 10: return DecimationFactor_10; + default: return DecimationFactor_None; + } +} + +static uint32_t toValue(const EParameter parameter) +{ + switch (parameter) { + case DecimationFactor_None: return 1; + case DecimationFactor_2: return 2; + case DecimationFactor_4: return 4; + case DecimationFactor_5: return 5; + case DecimationFactor_8: return 8; + case DecimationFactor_10: return 10; + default: return 1; + } +} + + +static void ChannelDetailsPressedCB(GtkButton* /*button*/, void* data) +{ + static_cast<CConfigurationBrainProductsBrainampSeries*>(data)->buttonChannelDetailsPressedCB(); +} + +static void ComboboxDeviceChangedCB(GtkComboBox* /*comboBox*/, void* data) +{ + static_cast<CConfigurationBrainProductsBrainampSeries*>(data)->comboBoxDeviceChangedCB(); +} + +CConfigurationBrainProductsBrainampSeries::CConfigurationBrainProductsBrainampSeries( + CDriverBrainProductsBrainampSeries& driver, const char* gtkBuilderFileName, uint32_t& usbIdx, uint32_t& decimationFactor, + EParameter* channelSelected, EParameter* lowPassFilterFull, EParameter* resolutionFull, EParameter* dcCouplingFull, + EParameter& lowPass, EParameter& resolution, EParameter& dcCoupling, EParameter& impedance) + : CConfigurationBuilder(gtkBuilderFileName), m_driver(driver), m_usbIdx(usbIdx), + m_decimationFactor(decimationFactor), m_channelSelected(channelSelected), + m_lowPassFilterFull(lowPassFilterFull), m_resolutionFull(resolutionFull), + m_dcCouplingFull(dcCouplingFull), m_lowPass(lowPass), m_resolution(resolution), + m_dcCoupling(dcCoupling), m_impedance(impedance) {} + +bool CConfigurationBrainProductsBrainampSeries::preConfigure() +{ + if (!CConfigurationBuilder::preConfigure()) { return false; } + + GtkComboBox* device = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_device")); + GtkComboBox* lowPass = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_lowpass_filter")); + GtkComboBox* decimation = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_decimation_factor")); + GtkComboBox* resolution = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_resolution")); + GtkComboBox* dcCoupling = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_dc_coupling")); + GtkComboBox* impedance = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_impedance")); + + g_signal_connect(gtk_builder_get_object(m_builder, "button_channel_details"), "pressed", G_CALLBACK(ChannelDetailsPressedCB), this); + g_signal_connect(gtk_builder_get_object(m_builder, "combobox_device"), "changed", G_CALLBACK(ComboboxDeviceChangedCB), this); + + char buffer[1024]; + int count = 0; + bool selected = false; + + // autodetection of the connected device(s) + for (uint32_t i = 0; i < 16; ++i) { + if (m_driver.getDeviceDetails(i, nullptr, nullptr)) { + sprintf(buffer, "USB port %i", i); + gtk_combo_box_append_text(device, buffer); + { + if (m_usbIdx == i) { + gtk_combo_box_set_active(device, count); + selected = true; + } + } + count++; + } + } + + if (!selected && count != 0) { gtk_combo_box_set_active(device, 0); } + + gtk_combo_box_set_active(lowPass, m_lowPass); + gtk_combo_box_set_active(decimation, toIndex(m_decimationFactor)); + gtk_combo_box_set_active(resolution, m_resolution); + gtk_combo_box_set_active(dcCoupling, m_dcCoupling); + gtk_combo_box_set_active(impedance, m_impedance); + + return true; +} + +bool CConfigurationBrainProductsBrainampSeries::postConfigure() +{ + GtkComboBox* comboBox = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_device")); + + if (m_applyConfig) { + GtkComboBox* device = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_device")); + GtkComboBox* lowPass = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_lowpass_filter")); + GtkComboBox* decimation = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_decimation_factor")); + GtkComboBox* resolution = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_resolution")); + GtkComboBox* dcCoupling = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_dc_coupling")); + GtkComboBox* impedance = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_impedance")); + + uint32_t usbIdx = 0; + const char* usbIndex = gtk_combo_box_get_active_text(device); + if (usbIndex) { if (sscanf(usbIndex, "USB port %i", &usbIdx) == 1) { m_usbIdx = usbIdx; } } + + m_lowPass = EParameter(gtk_combo_box_get_active(lowPass)); + m_decimationFactor = (toValue(EParameter(gtk_combo_box_get_active(decimation)))); + m_resolution = EParameter(gtk_combo_box_get_active(resolution)); + m_dcCoupling = EParameter(gtk_combo_box_get_active(dcCoupling)); + m_impedance = EParameter(gtk_combo_box_get_active(impedance)); + } + + if (!CConfigurationBuilder::postConfigure()) { return false; } + return true; +} + +void CConfigurationBrainProductsBrainampSeries::buttonChannelDetailsPressedCB() +{ + GtkBuilder* builder = gtk_builder_new(); + gtk_builder_add_from_file(builder, m_gtkBuilderFilename.c_str(), nullptr); + + GtkDialog* dialogChannelDetails = GTK_DIALOG(gtk_builder_get_object(builder, "dialog_channel_details")); + GtkTable* dialogChannelDetailsTable = GTK_TABLE(gtk_builder_get_object(builder, "table_content")); + + GtkTreeModel* treeModelLowPassFilterFull = GTK_TREE_MODEL(gtk_builder_get_object(builder, "model_lowpass_filter_full")); + GtkTreeModel* treeModelResolutionFull = GTK_TREE_MODEL(gtk_builder_get_object(builder, "model_resolution_full")); + GtkTreeModel* treeModelDcCouplingFull = GTK_TREE_MODEL(gtk_builder_get_object(builder, "model_dc_coupling_full")); + + gtk_table_resize(dialogChannelDetailsTable, 1, 5); + gtk_table_resize(dialogChannelDetailsTable, 1 + m_header->getChannelCount(), 5); + for (size_t i = 1; i < 1 + m_header->getChannelCount(); ++i) { + GtkLabel* widgetIdx = GTK_LABEL(gtk_label_new((std::to_string(i) + ":").c_str())); + gtk_label_set_justify(widgetIdx, GTK_JUSTIFY_LEFT); + gtk_widget_show(GTK_WIDGET(widgetIdx)); + + GtkLabel* widgetChannelName = GTK_LABEL(gtk_label_new(m_header->getChannelName(i-1))); + gtk_label_set_justify(widgetChannelName, GTK_JUSTIFY_LEFT); + // We hide this label as the channel name is not accurate + // The update of the channel rename configuration (moved to the main application) + // has broken this feature in the driver: real channel names are not passed to the driver + // but are only kept at the server level. This problem should be adressed in future version. + gtk_widget_hide(GTK_WIDGET(widgetChannelName)); + //::gtk_widget_show(GTK_WIDGET(l_pWidgetChannelName)); + + GtkBox* widgetChannel = GTK_BOX(gtk_hbox_new(false, 2)); + gtk_box_pack_start(widgetChannel, GTK_WIDGET(widgetIdx), true, true, 0); + gtk_box_pack_start(widgetChannel, GTK_WIDGET(widgetChannelName), true, true, 0); + gtk_widget_show(GTK_WIDGET(widgetChannel)); + gtk_table_attach_defaults(dialogChannelDetailsTable, GTK_WIDGET(widgetChannel), 0, 1, i, i + 1); + + GtkToggleButton* widgetChannelSelected = GTK_TOGGLE_BUTTON(gtk_check_button_new()); + gtk_toggle_button_set_active(widgetChannelSelected, m_channelSelected[i - 1] == Channel_Selected); + gtk_widget_show(GTK_WIDGET(widgetChannelSelected)); + gtk_table_attach_defaults(dialogChannelDetailsTable, GTK_WIDGET(widgetChannelSelected), 1, 2, i, i + 1); + + GtkComboBox* widgetLowPassFilterFull = GTK_COMBO_BOX(gtk_combo_box_new_text()); + gtk_combo_box_set_model(widgetLowPassFilterFull, treeModelLowPassFilterFull); + gtk_combo_box_set_active(widgetLowPassFilterFull, gint(m_lowPassFilterFull[i - 1] + 1)); + gtk_widget_show(GTK_WIDGET(widgetLowPassFilterFull)); + gtk_table_attach_defaults(dialogChannelDetailsTable, GTK_WIDGET(widgetLowPassFilterFull), 2, 3, i, i + 1); + + GtkComboBox* widgetResolutionFull = GTK_COMBO_BOX(gtk_combo_box_new_text()); + gtk_combo_box_set_model(widgetResolutionFull, treeModelResolutionFull); + gtk_combo_box_set_active(widgetResolutionFull, gint(m_resolutionFull[i - 1] + 1)); + gtk_widget_show(GTK_WIDGET(widgetResolutionFull)); + gtk_table_attach_defaults(dialogChannelDetailsTable, GTK_WIDGET(widgetResolutionFull), 3, 4, i, i + 1); + + GtkComboBox* widgetDcCouplingFull = GTK_COMBO_BOX(gtk_combo_box_new_text()); + gtk_combo_box_set_model(widgetDcCouplingFull, treeModelDcCouplingFull); + gtk_combo_box_set_active(widgetDcCouplingFull, gint(m_dcCouplingFull[i - 1] + 1)); + gtk_widget_show(GTK_WIDGET(widgetDcCouplingFull)); + gtk_table_attach_defaults(dialogChannelDetailsTable, GTK_WIDGET(widgetDcCouplingFull), 4, 5, i, i + 1); + } + + if (gtk_dialog_run(dialogChannelDetails) == GTK_RESPONSE_APPLY) { + for (GList* list = dialogChannelDetailsTable->children; list; list = list->next) { + GtkTableChild* tableChild = (GtkTableChild*)list->data; + if (tableChild) { + const gint i = tableChild->top_attach - 1; + if (i >= 0) { + switch (tableChild->left_attach) { + case 1: m_channelSelected[i] = EParameter(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tableChild->widget))); + break; + case 2: m_lowPassFilterFull[i] = EParameter(gtk_combo_box_get_active(GTK_COMBO_BOX(tableChild->widget)) - 1); + break; + case 3: m_resolutionFull[i] = EParameter(gtk_combo_box_get_active(GTK_COMBO_BOX(tableChild->widget)) - 1); + break; + case 4: m_dcCouplingFull[i] = EParameter(gtk_combo_box_get_active(GTK_COMBO_BOX(tableChild->widget)) - 1); + break; + default: break; + } + } + } + } + } + + gtk_widget_hide(GTK_WIDGET(dialogChannelDetails)); + + g_object_unref(builder); +} + +void CConfigurationBrainProductsBrainampSeries::comboBoxDeviceChangedCB() +{ + GtkComboBox* comboBoxDevice = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_device")); + const char* usbIndex = gtk_combo_box_get_active_text(comboBoxDevice); + if (usbIndex) { + uint32_t usbIdx = -1; + if (sscanf(usbIndex, "USB port %i", &usbIdx) == 1) { + uint32_t amplifierType[4]; + uint32_t nAmplifier = 0; + if (m_driver.getDeviceDetails(usbIdx, &nAmplifier, amplifierType)) { + bool correctMontage = true; + m_header->setChannelCount(nAmplifier * 32); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_nChannels), nAmplifier * 32); + + for (uint32_t i = 0; i < BrainAmp_MaximumAmplifierCount; ++i) { + const std::string name = "label_multiamp_montage_" + std::to_string(i + 1); + GtkLabel* multiampMontage = GTK_LABEL(gtk_builder_get_object(m_builder, name.c_str())); + gtk_label_set_label(multiampMontage, getDeviceType(amplifierType[i])); + if (i >= 1 && amplifierType[i - 1] == AmplifierType_None && amplifierType[i] != AmplifierType_None) { correctMontage = false; } + } + + GtkWidget* montageTable = GTK_WIDGET(gtk_builder_get_object(m_builder, "table_multiamp_montage")); + GtkWidget* montageIcon = GTK_WIDGET(gtk_builder_get_object(m_builder, "image_montage_status_icon")); + if (correctMontage) { + const char* text = "The multi amplifier montage is correct"; + gtk_image_set_from_stock(GTK_IMAGE(montageIcon), GTK_STOCK_YES, GTK_ICON_SIZE_BUTTON); + gtk_widget_set_tooltip_markup(montageIcon, text); + gtk_widget_set_tooltip_markup(montageTable, text); + } + else { + const char* text = "The multi amplifier montage is not correct - avoid empty slots before filled slots"; + gtk_image_set_from_stock(GTK_IMAGE(montageIcon), GTK_STOCK_NO, GTK_ICON_SIZE_BUTTON); + gtk_widget_set_tooltip_markup(montageIcon, text); + gtk_widget_set_tooltip_markup(montageTable, text); + } + } + } + } +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_OS_Windows diff --git a/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-brainampseries/ovasCConfigurationBrainProductsBrainampSeries.h b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-brainampseries/ovasCConfigurationBrainProductsBrainampSeries.h new file mode 100644 index 0000000000000000000000000000000000000000..f7c1b8e6bc5a0994ab631e2b6399760e7cdb4df5 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-brainampseries/ovasCConfigurationBrainProductsBrainampSeries.h @@ -0,0 +1,71 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file ovasCConfigurationBrainProductsBrainampSeries.h +/// \brief Brain Products Brainamp Series driver for OpenViBE +/// \author Yann Renard +/// \copyright Copyright (C) 2022 Inria +/// +/// This program is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Affero General Public License as published +/// by the Free Software Foundation, either version 3 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Affero General Public License for more details. +/// +/// You should have received a copy of the GNU Affero General Public License +/// along with this program. If not, see <https://www.gnu.org/licenses/>. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include <ovasCConfigurationBuilder.h> + +#if defined TARGET_OS_Windows + +#include "ovas_defines_brainamp_series.h" + +#include <gtk/gtk.h> + +namespace OpenViBE { +namespace AcquisitionServer { +class CDriverBrainProductsBrainampSeries; + +class CConfigurationBrainProductsBrainampSeries final : public CConfigurationBuilder +{ +public: + CConfigurationBrainProductsBrainampSeries(CDriverBrainProductsBrainampSeries& driver, const char* gtkBuilderFileName, uint32_t& usbIdx, + uint32_t& decimationFactor, EParameter* channelSelected, EParameter* lowPassFilterFull, + EParameter* resolutionFull, EParameter* dcCouplingFull, EParameter& lowPass, EParameter& resolution, + EParameter& dcCoupling, EParameter& impedance); + + bool preConfigure() override; + bool postConfigure() override; + + void buttonChannelDetailsPressedCB(); + void comboBoxDeviceChangedCB(); + +protected: + CDriverBrainProductsBrainampSeries& m_driver; + uint32_t& m_usbIdx; + uint32_t& m_decimationFactor; + EParameter* m_channelSelected = nullptr; + EParameter* m_lowPassFilterFull = nullptr; + EParameter* m_resolutionFull = nullptr; + EParameter* m_dcCouplingFull = nullptr; + EParameter& m_lowPass; + EParameter& m_resolution; + EParameter& m_dcCoupling; + EParameter& m_impedance; + + // private: + // GtkWidget* m_calibrateDialog = nullptr; + // bool m_calibrationDone = false; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_OS_Windows diff --git a/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-brainampseries/ovasCDriverBrainProductsBrainampSeries.cpp b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-brainampseries/ovasCDriverBrainProductsBrainampSeries.cpp new file mode 100644 index 0000000000000000000000000000000000000000..a51ae601745e6f5277cb5c4400aaaccfc6efc157 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-brainampseries/ovasCDriverBrainProductsBrainampSeries.cpp @@ -0,0 +1,582 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file ovasCDriverBrainProductsBrainampSeries.cpp +/// \brief Brain Products Brainamp Series driver for OpenViBE +/// \author Yann Renard +/// \copyright Copyright (C) 2022 Inria +/// +/// This program is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Affero General Public License as published +/// by the Free Software Foundation, either version 3 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Affero General Public License for more details. +/// +/// You should have received a copy of the GNU Affero General Public License +/// along with this program. If not, see <https://www.gnu.org/licenses/>. +/// +///------------------------------------------------------------------------------------------------- + +#include "ovasCDriverBrainProductsBrainampSeries.h" + +#if defined TARGET_OS_Windows + +#include <toolkit/ovtk_all.h> + +#include <system/ovCTime.h> + +#include <list> + +#include <windows.h> +#include <WinIoCtl.h> + +namespace OpenViBE { +namespace AcquisitionServer { + +char* CDriverBrainProductsBrainampSeries::getErrorMessage(const uint32_t error) +{ + const uint32_t code = error & 0xffff; + switch (code) { + case 0: break; + case 1: return + "Connection between Brainamp and USB 2 Adapter / PCI is broken.\n" + "Please check connectors, switch and battery power. After the\n" + "connection is established and if you wish to continue the\n" + "recording, please press the Start/Resume Recording button.\n" + "If problem still persists, contact us at techsup@brainproducts.com"; + case 2: return + "The voltage in the amplifier is too low!\n" + "Check the batteries!"; + case 3: return + "Could not establish communication with the amplifier.\n" + "Check the connectors and the battery power!"; + case 4: return + "Out of synch, Barker words missing!"; + case 5: return + "Connection between USB 2 Adapter and Computer is broken.\n" + "Monitoring or recording was interrupted. Please check\n" + "the USB connectors. If problem still persists, contact\n" + "us at techsup@brainproducts.com"; + default: return "Unknown Amplifier Error\n"; + } + return ""; +} + +const Kernel::ELogLevel LogLevel_TraceAPI = Kernel::LogLevel_None; + +//___________________________________________________________________// +// // + +CDriverBrainProductsBrainampSeries::CDriverBrainProductsBrainampSeries(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_BrainAmpSeries", m_driverCtx.getConfigurationManager()), m_headerAdapter(m_header, m_channelSelected) +{ + // char* channelName[]={"Fp1", "Fp2", "F3", "F4", "C3", "C4", "P3", "P4", "O1", "O2", "F7", "F8", "T7", "T8", "P7", "P8", "Fz", "Cz", "Pz", "FC1", "FC2", "CP1", "CP2", "FC5", "FC6", "CP5", "CP6", "TP9", "TP10", "Eog", "Ekg1", "Ekg2", }; + //char* channelNameActiCap32 [] = { "Fp1", "Fp2", "F7", "F3", "Fz", "F4", "F8", "FC5", "FC1", "FC2", "FC6", "T7", "C3", "Cz", "C4", "T8", "TP9", "CP5", "CP1", "CP2", "CP6", "TP10", "P7", "P3", "Pz", "P4", "P8", "PO9", "O1", "Oz", "O2", "PO10" }; + //char* channelNameActiCap64 [] = { + // "Fp1", "Fp2", "F7", "F3", "Fz", "F4", "F8", "FC5", "FC1", "FC2", "FC6", "T7", "C3", "Cz", "C4", "T8", "TP9", "CP5", "CP1", "CP2", "CP6", "TP10", "P7", "P3", "Pz", "P4", "P8", "PO9", "O1", "Oz", "O2", "PO10", + // "AF7", "AF3", "AF4", "AF8", "F5", "F1", "F2", "F6", "FT9", "FT7", "FC3", "FC4", "FT8", "FT10", "C5", "C1", "C2", "C6", "TP7", "CP3", "CPz", "CP4", "TP8", "P5", "P1", "P2", "P6", "PO7", "PO3", "POz", "PO4", "PO8", + //}; + char* channelNameActiCap128[] = { + "Fp1", "Fp2", "F7", "F3", "Fz", "F4", "F8", "FC5", "FC1", "FC2", "FC6", "T7", "C3", "Cz", "C4", "T8", "TP9", "CP5", "CP1", "CP2", "CP6", "TP10", "P7", + "P3", "Pz", "P4", "P8", "PO9", "O1", "Oz", "O2", "PO10", + "AF7", "AF3", "AF4", "AF8", "F5", "F1", "F2", "F6", "FT9", "FT7", "FC3", "FC4", "FT8", "FT10", "C5", "C1", "C2", "C6", "TP7", "CP3", "CPz", "CP4", + "TP8", "P5", "P1", "P2", "P6", "PO7", "PO3", "POz", "PO4", "PO8", + "FPz", "F9", "AFF5h", "AFF1h", "AFF2h", "AFF6h", "F10", "FTT9h", "FTT7h", "FCC5h", "FCC3h", "FCC1h", "FCC2h", "FCC4h", "FCC6h", "FTT8h", "FTT10h", + "TPP9h", "TPP7h", "CPP5h", "CPP3h", "CPP1h", "CPP2h", "CPP4h", "CPP6h", "TPP8h", "TPP10h", "POO9h", "POO1", "POO2", "POO10h", "Iz", + "AFp1", "AFp2", "FFT9h", "FFT7h", "FFC5h", "FFC3h", "FFC1h", "FFC2h", "FFC4h", "FFC6h", "FFT8h", "FFT10h", "TTP7h", "CCP5h", "CCP3h", "CCP1h", "CCP2h", + "CCP4h", "CCP6h", "TTP8h", "P9", "PPO9h", "PPO5h", "PPO1h", "PPO2h", "PPO6h", "PPO10h", "P10", "I1", "OI1h", "OI2h", "I2", + }; + char** channelName = channelNameActiCap128; + + uint32_t nAmplifier = 1; + this->getDeviceDetails(m_usbIdx, &nAmplifier, nullptr); + + m_header.setSamplingFrequency(500); + m_header.setChannelCount(nAmplifier * 32); + for (uint32_t i = 0; i < 256; ++i) { + m_header.setChannelName(i, (i < sizeof(channelNameActiCap128) / sizeof(void*) ? channelName[i] : "")); + m_channelSelected[i] = Channel_Selected; + m_lowPassFilterFull[i] = Parameter_Default; + m_resolutionFull[i] = Parameter_Default; + m_dcCouplingFull[i] = Parameter_Default; + } + + for (uint32_t i = 0; i < 256; ++i) { m_header.setChannelUnits(i, OVTK_UNIT_Volts, OVTK_FACTOR_Micro); } + + m_settings.add("Header", &m_header); + m_settings.add("USBIndex", &m_usbIdx); + m_settings.add("DecimationFactor", &m_decimationFactor); + m_settings.add("ChannelSelected", m_channelSelected); + m_settings.add("LowPassFilterFull", &m_lowPassFilterFull); + m_settings.add("ResolutionFull", &m_resolutionFull); + m_settings.add("DCCouplingFull", &m_dcCouplingFull); + m_settings.add("LowPass", &m_lowPass); + m_settings.add("Resolution", &m_resolution); + m_settings.add("DCCoupling", &m_dcCoupling); + m_settings.add("Impedance", &m_impedance); + m_settings.load(); +} + +//___________________________________________________________________// +// // + +bool CDriverBrainProductsBrainampSeries::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + // #define nSamplePerSentBlock 20*5 + + + if (m_driverCtx.isConnected()) { return false; } + + // -- + const std::string name = "\\\\.\\BrainAmpUSB" + std::to_string(m_usbIdx); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Preparing device [" << name << "]\n"; + + // -- Gets amplifiers type + + uint32_t nAmplifier = BrainAmp_MaximumAmplifierCount; + uint32_t types[BrainAmp_MaximumAmplifierCount]; + if (!this->getDeviceDetails(m_usbIdx, &nAmplifier, types)) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not get amplifier(s) type - got error " << size_t(GetLastError()) << "\n"; + return false; + } + + for (size_t i = 0; i < BrainAmp_MaximumAmplifierCount; ++i) { + CString type(getDeviceType(types[i])); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << " - Amplifier " << i + 1 << " : " << type << "\n"; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Found " << nAmplifier << " amplifier(s)\n"; + + // -- Opens device + + m_Device = ::CreateFile(name.c_str(), GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH, nullptr); + if (m_Device == INVALID_HANDLE_VALUE) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not open device [" << name << "]\n"; + return false; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Opened device [" << name << "]\n"; + + // -- Gets driver version from device + + char driverVersion[1024]; + uint32_t version = 0; + m_driverCtx.getLogManager() << LogLevel_TraceAPI << "BRAINAMP_DRIVERVERSION\n"; + if (!DeviceIoControl(m_Device, BRAINAMP_DRIVERVERSION, nullptr, 0, &version, sizeof(version), &m_nBytesReturned, nullptr)) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not get driver version from device - got error " << size_t(GetLastError()) << "\n"; + CloseHandle(m_Device); + return false; + } + const uint32_t versionPatch = version % 10000; + const uint32_t versionMinor = (version % 1000000) / 10000; + const uint32_t versionMajor = (version) / 1000000; + sprintf(driverVersion, "%i.%02i.%04i", versionMajor, versionMinor, versionPatch); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Found driver version [" << CString(driverVersion) << "]\n"; + + // -- Gets serial number from device + + char deviceSerialNumber[1024]; + uint32_t serialNumber = 0; + m_driverCtx.getLogManager() << LogLevel_TraceAPI << "BRAINAMP_GET_SERIALNUMBER\n"; + if (!DeviceIoControl(m_Device, BRAINAMP_GET_SERIALNUMBER, nullptr, 0, &serialNumber, sizeof(serialNumber), &m_nBytesReturned, nullptr)) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not get serial number from device - got error " << size_t(GetLastError()) << "\n"; + CloseHandle(m_Device); + return false; + } + if (m_nBytesReturned != 0) { + sprintf(deviceSerialNumber, "0x%08x", serialNumber); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Found serial number [" << CString(deviceSerialNumber) << "]\n"; + } + + // -- Sets callibration settings + + m_deviceCalibrationSettings = new CBrainampCalibrationSettings; + // m_deviceCalibrationSettings->waveForm=WaveForm_Ramp; + // m_deviceCalibrationSettings->waveForm=WaveForm_Triangle; + // m_deviceCalibrationSettings->waveForm=WaveForm_Square; + m_deviceCalibrationSettings->waveForm = WaveForm_SineWave; + m_deviceCalibrationSettings->frequency = 5; + + m_driverCtx.getLogManager() << LogLevel_TraceAPI << "BRAINAMP_CALIBRATION_SETTINGS\n"; + if (!DeviceIoControl(m_Device, BRAINAMP_CALIBRATION_SETTINGS, m_deviceCalibrationSettings, + sizeof(CBrainampCalibrationSettings), nullptr, 0, &m_nBytesReturned, nullptr)) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not set calibration settings - got error " << size_t(GetLastError()) << "\n"; + CloseHandle(m_Device); + return false; + } + + // -- Configures device according to what has been enterd in the configuration dialog + + bool lowPassWarning = false; + float resolution[] = { 0.1F, 0.5F, 10.0F, 152.6F }; + + m_deviceSetup = new CBrainampSetup; + memset(m_deviceSetup, 0, sizeof(CBrainampSetup)); + m_deviceSetup->nChannel = m_headerAdapter.getChannelCount(); + m_deviceSetup->holdValue = 0x0; // Value without trigger + m_deviceSetup->nSamplePerSentBlock = nSamplePerSentBlock * m_decimationFactor; + m_deviceSetup->lowImpedance = uint8_t(m_impedance); + for (size_t j = 0, i = 0; i < m_header.getChannelCount(); ++i) { + if (m_channelSelected[i] == Channel_Selected) { + // Should I care about j being greater than + m_deviceSetup->channelLookup[j] = i; + m_deviceSetup->lowPassFilter[j] = uint8_t(m_lowPassFilterFull[i] == Parameter_Default ? m_lowPass : m_lowPassFilterFull[i]); // 0 - 1000Hz, 1 - 250Hz + m_deviceSetup->resolution[j] = uint8_t(m_resolutionFull[i] == Parameter_Default ? m_resolution : m_resolutionFull[i]); // 0 - 100 nV, 1 - 500 nV, 2 - 10 uV, 3 - 152.6 uV + m_deviceSetup->dcCoupling[j] = uint8_t(m_dcCouplingFull[i] == Parameter_Default ? m_dcCoupling : m_dcCouplingFull[i]); // 0 - AC, 1 - DC + + m_resolutionFactor[j] = resolution[m_deviceSetup->resolution[j]]; + + if (!lowPassWarning && m_decimationFactor != 1 && (m_lowPass == LowPass_1000 || m_lowPassFilterFull[i] == LowPass_1000)) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Using 1000 Hz low pass filter...\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Using a decimation factor of " << m_decimationFactor << " (resulting in " << + 5000 / m_decimationFactor << " Hz sampling rate)\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "This is probably not safe. Signal quality will suffer.\n"; + lowPassWarning = true; + } + + j++; + } + } + + m_driverCtx.getLogManager() << LogLevel_TraceAPI << "BRAINAMP_SETUP\n"; + if (!DeviceIoControl(m_Device, BRAINAMP_SETUP, m_deviceSetup, sizeof(CBrainampSetup), nullptr, 0, &m_nBytesReturned, nullptr)) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not send setup parameters to device - got error " << size_t(GetLastError()) << "\n"; + CloseHandle(m_Device); + return false; + } + + // -- Allocates sample array and intermediate buffer + + m_sample = new float[m_headerAdapter.getChannelCount() * nSamplePerSentBlock]; + m_buffer = new int16_t[(m_headerAdapter.getChannelCount() + 1) * nSamplePerSentBlock * m_decimationFactor]; + if (!m_sample || !m_buffer) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not allocate memory for sample array / intermediate buffer\n"; + delete [] m_sample; + delete [] m_buffer; + m_sample = nullptr; + m_buffer = nullptr; + CloseHandle(m_Device); + return false; + } + + // -- Everything is up and ready to work + + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + m_marker = 0; + + // -- Optionally starts impedance check + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Impedance " << (m_driverCtx.isImpedanceCheckRequested() ? "will" : "won't") << " be checked\n"; + if (m_driverCtx.isImpedanceCheckRequested()) { if (!this->startImpedanceCheck()) { return false; } } + + return true; +} + +bool CDriverBrainProductsBrainampSeries::start() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + // -- Optionally stops impedance check + if (m_driverCtx.isImpedanceCheckRequested()) { if (!this->stopImpedanceCheck()) { return false; } } + + // -- Configures pull up/down for triggers + + uint16_t pullUp = 0; + m_driverCtx.getLogManager() << LogLevel_TraceAPI << "BRAINAMP_DIGITALINPUT_PULL_UP\n"; + if (!DeviceIoControl(m_Device, BRAINAMP_DIGITALINPUT_PULL_UP, &pullUp, sizeof(pullUp), nullptr, 0, &m_nBytesReturned, nullptr)) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not switch pull up\n"; + CloseHandle(m_Device); + return false; + } + + // -- Starts acquisition + + uint32_t type = uint32_t(AcquisitionType_EEG); + // uint32_t type=uint32_t(AcquisitionType_TestSignal); + m_driverCtx.getLogManager() << LogLevel_TraceAPI << "BRAINAMP_START\n"; + if (!DeviceIoControl(m_Device, BRAINAMP_START, &type, sizeof(uint32_t), nullptr, 0, &m_nBytesReturned, nullptr)) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not start acquisition\n"; + return false; + } + + return true; +} + +bool CDriverBrainProductsBrainampSeries::loop() +{ + if (!m_driverCtx.isConnected()) { return false; } + if (!m_driverCtx.isStarted() && !m_driverCtx.isImpedanceCheckRequested()) { return true; } + + + // -- Gets error code from device + + uint32_t error = 0; + m_driverCtx.getLogManager() << LogLevel_TraceAPI << "BRAINAMP_ERROR_STATE\n"; + if (!DeviceIoControl(m_Device, BRAINAMP_ERROR_STATE, nullptr, 0, &error, sizeof(error), &m_nBytesReturned, nullptr)) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not retrieve error state\n"; + return false; + } + + // -- Checks error code + + if (error != 0) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Received error state " << error << " from device\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Full error text :\n" << this->getErrorMessage(error) << "\n"; + return false; + } + + // -- Loops until the buffer is read + + do { + // -- Reads intermediate buffer from device + + if (!ReadFile(m_Device, m_buffer, (m_headerAdapter.getChannelCount() + 1) * m_nSamplePerSentBlock * m_decimationFactor * sizeof(int16_t), &m_nBytesReturned, nullptr)) { + const uint32_t lastError = GetLastError(); + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Could not read from device - Got error " << lastError << " " + << (lastError == ERROR_MORE_DATA ? "(buffer overflow)" : "") << "\n"; + return true; + } + + if (m_nBytesReturned == 0) { System::Time::sleep(2); } + } while (m_nBytesReturned == 0); + +#if 0 + // -- Gets buffer filling state + + static uint32_t lastBufferFillingState=0; + static uint32_t bufferFillingState=0; + m_driverCtx.getLogManager() << LogLevel_TraceAPI << "BRAINAMP_BUFFERFILLING_STATE\n"; + if (!::DeviceIoControl(m_Device, BRAINAMP_BUFFERFILLING_STATE, nullptr, 0, &bufferFillingState, sizeof(bufferFillingState), &m_nBytesReturned, nullptr)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not retrieve buffer filling state\n"; + return false; + } + if(bufferFillingState!=lastBufferFillingState) + { + lastBufferFillingState=bufferFillingState; + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Buffer filling state : " << bufferFillingState << "\n"; + } +#endif + + if (!m_driverCtx.isStarted()) { + // -- Converts the intermediate buffer in instant impedances + const double scale = 1000 * (m_impedance == Impedance_High ? 2.1e-3 : 2.13219e-4); + for (size_t i = 0; i < m_headerAdapter.getChannelCount(); ++i) { + int16_t minValue = 32767; + int16_t maxValue = -32767; + int16_t* buffer = m_buffer + i; + for (size_t j = 0; j < m_nSamplePerSentBlock * m_decimationFactor; ++j) { + if (*buffer > maxValue) { maxValue = *buffer; } + if (*buffer < minValue) { minValue = *buffer; } + buffer += m_headerAdapter.getChannelCount() + 1; + } + m_impedances[i] = (maxValue - minValue) * scale - 1. + .5; + } + + // -- Backups this impedance in the impedance buffer and limit this buffer size + + m_impedanceBuffers.push_back(m_impedances); + if (m_impedanceBuffers.size() > m_impedanceCheckSignalFrequency) { m_impedanceBuffers.pop_front(); } + + // -- Averages the impedances over last measures and send them to the acquisition server + + for (size_t i = 0; i < m_headerAdapter.getChannelCount(); ++i) { + double average = 0; + for (auto it = m_impedanceBuffers.begin(); it != m_impedanceBuffers.end(); ++it) { average += (*it)[i]; } + average /= m_impedanceBuffers.size(); + + m_driverCtx.updateImpedance(i, average); + } + } + else { + // -- Converts the intermediate buffer in acquisition server convenient format + + float* samples = m_sample; + int16_t* buffer; + for (size_t i = 0; i < m_headerAdapter.getChannelCount(); ++i) { + buffer = m_buffer + i; + for (size_t j = 0; j < m_nSamplePerSentBlock; ++j) { + *samples = float(*buffer) * m_resolutionFactor[i]; + + samples += 1; + buffer += m_decimationFactor * (m_headerAdapter.getChannelCount() + 1); + } + } + + CStimulationSet stimSet; + buffer = m_buffer + m_headerAdapter.getChannelCount(); + for (size_t j = 0; j < m_nSamplePerSentBlock * m_decimationFactor; ++j) { + uint32_t marker = *buffer; + marker ^= m_deviceSetup->holdValue; + if (marker != m_marker) { + m_marker = marker; + stimSet.push_back(OVTK_StimulationId_Label(m_marker), CTime(m_header.getSamplingFrequency() * m_decimationFactor, uint64_t(j)).time(), 0); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Got stim code " << m_marker << " at sample " << j << "\n"; + } + buffer += m_headerAdapter.getChannelCount() + 1; + } + + // -- Sends data to the acquisition server + + m_callback->setSamples(m_sample, m_nSamplePerSentBlock); + m_callback->setStimulationSet(stimSet); + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + } + + return true; +} + +bool CDriverBrainProductsBrainampSeries::stop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + + // -- Stops acquisition + + m_driverCtx.getLogManager() << LogLevel_TraceAPI << "BRAINAMP_STOP\n"; + if (!DeviceIoControl(m_Device, BRAINAMP_STOP, nullptr, 0, nullptr, 0, &m_nBytesReturned, nullptr)) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not stop acquisition\n"; + } + + // -- Optionally starts impedance check + + if (m_driverCtx.isImpedanceCheckRequested()) { if (!this->startImpedanceCheck()) { return false; } } + + return true; +} + +bool CDriverBrainProductsBrainampSeries::uninitialize() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + // -- Optionally stops impedance check + + if (m_driverCtx.isImpedanceCheckRequested()) { if (!this->stopImpedanceCheck()) { return false; } } + + // -- Deletes device setup object + + delete m_deviceSetup; + m_deviceSetup = nullptr; + + // -- Closes handle to device + + CloseHandle(m_Device); + m_Device = nullptr; + + // -- Deletes sample array and intermediate buffer + + delete [] m_sample; + delete [] m_buffer; + m_sample = nullptr; + m_buffer = nullptr; + m_callback = nullptr; + + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverBrainProductsBrainampSeries::startImpedanceCheck() +{ + if (!m_driverCtx.isImpedanceCheckRequested()) { return true; } + + // Configures impedance frequency + + m_impedanceCheckSignalFrequency = 5000 / (m_nSamplePerSentBlock * m_decimationFactor); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Imepdance check sampling frequency set to " << m_impedanceCheckSignalFrequency << " Hz\n"; + + m_driverCtx.getLogManager() << LogLevel_TraceAPI << "BRAINAMP_IMPEDANCE_FREQUENCY\n"; + if (!DeviceIoControl(m_Device, BRAINAMP_IMPEDANCE_FREQUENCY, &m_impedanceCheckSignalFrequency, sizeof(uint32_t), nullptr, 0, &m_nBytesReturned, nullptr)) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not set impedance frequency - got error " << size_t(GetLastError()) << "\n"; + return false; + } + + // Starts acquiring impedance signal + uint32_t type = uint32_t(AcquisitionType_Impedance); + m_driverCtx.getLogManager() << LogLevel_TraceAPI << "BRAINAMP_START\n"; + if (!DeviceIoControl(m_Device, BRAINAMP_START, &type, sizeof(uint32_t), nullptr, 0, &m_nBytesReturned, nullptr)) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not start acquisition\n"; + return false; + } + + // Configures impedance group range + uint32_t group = (m_impedance == Impedance_High ? 0 : 1); + m_driverCtx.getLogManager() << LogLevel_TraceAPI << "BRAINAMP_IMPEDANCE_GROUPRANGE\n"; + if (!DeviceIoControl(m_Device, BRAINAMP_IMPEDANCE_GROUPRANGE, &group, sizeof(uint32_t), nullptr, 0, &m_nBytesReturned, nullptr)) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could set impedance group range\n"; + return false; + } + + // Prepares impedance buffers + + m_impedances.resize(m_headerAdapter.getChannelCount()); + m_impedanceBuffers.clear(); + + return true; +} + +bool CDriverBrainProductsBrainampSeries::stopImpedanceCheck() +{ + if (!m_driverCtx.isImpedanceCheckRequested()) { return true; } + + // Stops impedance acquisition + m_driverCtx.getLogManager() << LogLevel_TraceAPI << "BRAINAMP_STOP\n"; + if (!DeviceIoControl(m_Device, BRAINAMP_STOP, nullptr, 0, nullptr, 0, &m_nBytesReturned, nullptr)) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not stop acquisition\n"; + } + + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverBrainProductsBrainampSeries::configure() +{ + CConfigurationBrainProductsBrainampSeries config( + *this, Directories::getDataDir() + "/applications/acquisition-server/interface-BrainProducts-BrainampSeries.ui", m_usbIdx, m_decimationFactor, + m_channelSelected, m_lowPassFilterFull, m_resolutionFull, m_dcCouplingFull, m_lowPass, m_resolution, m_dcCoupling, m_impedance); + + config.configure(m_header); + + m_settings.save(); + + m_header.setSamplingFrequency(5000 / m_decimationFactor); + return true; +} + +bool CDriverBrainProductsBrainampSeries::getDeviceDetails(const uint32_t index, uint32_t* nAmplifier, uint32_t* amplifierType) +{ + const std::string name = ("\\\\.\\BrainAmpUSB" + std::to_string(index)); + // -- Opens device + void* device = ::CreateFile(name.c_str(), GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_WRITE_THROUGH, nullptr); + if (device == INVALID_HANDLE_VALUE) { return false; } + + // -- Gets amplifiers type + uint16_t type[BrainAmp_MaximumAmplifierCount]; + m_driverCtx.getLogManager() << LogLevel_TraceAPI << "BRAINAMP_AMPLIFIER_TYPE\n"; + if (!DeviceIoControl(device, BRAINAMP_AMPLIFIER_TYPE, nullptr, 0, type, sizeof(type), &m_nBytesReturned, nullptr)) { + CloseHandle(device); + return false; + } + + // -- Closes device + CloseHandle(device); + + // -- Formats result + size_t count = BrainAmp_MaximumAmplifierCount; + for (size_t i = 0; i < BrainAmp_MaximumAmplifierCount; ++i) { + if (amplifierType) { amplifierType[i] = type[i]; } + if (count == BrainAmp_MaximumAmplifierCount && type[i] == AmplifierType_None) { count = i; } + } + if (nAmplifier) { *nAmplifier = count; } + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_OS_Windows diff --git a/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-brainampseries/ovasCDriverBrainProductsBrainampSeries.h b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-brainampseries/ovasCDriverBrainProductsBrainampSeries.h new file mode 100644 index 0000000000000000000000000000000000000000..f57a0336257cacef46e108aba0b4beef57842ac4 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-brainampseries/ovasCDriverBrainProductsBrainampSeries.h @@ -0,0 +1,141 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file ovasCDriverBrainProductsBrainampSeries.h +/// \brief Brain Products Brainamp Series driver for OpenViBE +/// \author Yann Renard +/// \copyright Copyright (C) 2022 Inria +/// +/// This program is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Affero General Public License as published +/// by the Free Software Foundation, either version 3 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Affero General Public License for more details. +/// +/// You should have received a copy of the GNU Affero General Public License +/// along with this program. If not, see <https://www.gnu.org/licenses/>. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +#if defined TARGET_OS_Windows + +#include "ovas_defines_brainamp_series.h" + +#include "ovasCConfigurationBrainProductsBrainampSeries.h" +#include "ovasCHeaderAdapterBrainProductsBrainampSeries.h" + +#include <vector> +#include <list> + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverBrainProductsBrainampSeries + * \author Mensia Technologies + */ +class CDriverBrainProductsBrainampSeries final : public IDriver +{ +public: + friend class CConfigurationBrainProductsBrainampSeries; + + static char* getErrorMessage(uint32_t error); + + explicit CDriverBrainProductsBrainampSeries(IDriverContext& ctx); + void release() { delete this; } + const char* getName() override { return "Brain Products BrainAmp Series"; } + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool start() override; + bool loop() override; + bool stop() override; + bool uninitialize() override; + + bool startImpedanceCheck(); + bool stopImpedanceCheck(); + + bool isConfigurable() override { return true; } + bool configure() override; + const IHeader* getHeader() override { return &m_headerAdapter; } + +protected: + bool getDeviceDetails(uint32_t index, uint32_t* nAmplifier, uint32_t* amplifierType); + + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + CHeader m_header; + CHeaderAdapterBrainProductsBrainampSeries m_headerAdapter; + + void* m_Device = nullptr; + CBrainampSetup* m_deviceSetup = nullptr; + CBrainampCalibrationSettings* m_deviceCalibrationSettings = nullptr; + + uint32_t m_impedanceCheckSignalFrequency = 0; + uint32_t m_decimationFactor = 10; + uint32_t m_nSamplePerSentBlock = 0; + float* m_sample = nullptr; + int16_t* m_buffer = nullptr; + uint16_t m_marker = 0; + + std::list<std::vector<double>> m_impedanceBuffers; + std::vector<double> m_impedances; + + unsigned long m_nBytesReturned; + + uint32_t m_usbIdx = 1; + float m_resolutionFactor[256]; + EParameter m_channelSelected[256]; + EParameter m_lowPassFilterFull[256]; + EParameter m_resolutionFull[256]; + EParameter m_dcCouplingFull[256]; + EParameter m_lowPass = LowPass_250; + EParameter m_resolution = Resolution_100nV; + EParameter m_dcCoupling = DCCouping_AC; + EParameter m_impedance = Impedance_Low; +}; + +inline std::ostream& operator<<(std::ostream& out, const EParameter& var) +{ + out << int(var); + return out; +} + +inline std::istream& operator>>(std::istream& in, EParameter& var) +{ + int tmp; + in >> tmp; + var = EParameter(tmp); + return in; +} + +inline std::ostream& operator<<(std::ostream& out, const EParameter var[256]) +{ + for (int i = 0; i < 256; ++i) { out << int(var[i]) << " "; } + return out; +} + +inline std::istream& operator>>(std::istream& in, EParameter var[256]) +{ + int tmp; + for (int i = 0; i < 256; ++i) { + in >> tmp; + var[i] = EParameter(tmp); + } + + return in; +} +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_OS_Windows diff --git a/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-brainampseries/ovasCHeaderAdapterBrainProductsBrainampSeries.cpp b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-brainampseries/ovasCHeaderAdapterBrainProductsBrainampSeries.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f9171be754d76829d27edd0fd81d55b01124e77a --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-brainampseries/ovasCHeaderAdapterBrainProductsBrainampSeries.cpp @@ -0,0 +1,51 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file ovasCHeaderAdapterBrainProductsBrainampSeries.cpp +/// \brief Brain Products Brainamp Series driver for OpenViBE +/// \author Yann Renard +/// \copyright Copyright (C) 2022 Inria +/// +/// This program is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Affero General Public License as published +/// by the Free Software Foundation, either version 3 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Affero General Public License for more details. +/// +/// You should have received a copy of the GNU Affero General Public License +/// along with this program. If not, see <https://www.gnu.org/licenses/>. +/// +///------------------------------------------------------------------------------------------------- + +#include "ovasCHeaderAdapterBrainProductsBrainampSeries.h" + +#if defined TARGET_OS_Windows + +namespace OpenViBE { +namespace AcquisitionServer { + +size_t CHeaderAdapterBrainProductsBrainampSeries::getChannelCount() const +{ + size_t j = 0; + for (size_t i = 0; i < m_header.getChannelCount(); ++i) { if (m_ChannelSelected[i] == Channel_Selected) { j++; } } + return j; +} + +const char* CHeaderAdapterBrainProductsBrainampSeries::getChannelName(const size_t index) const +{ + size_t j = 0; + for (size_t i = 0; i < m_header.getChannelCount(); ++i) { + if (m_ChannelSelected[i] == Channel_Selected) { + if (j == index) { return m_header.getChannelName(i); } + j++; + } + } + return ""; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_OS_Windows diff --git a/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-brainampseries/ovasCHeaderAdapterBrainProductsBrainampSeries.h b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-brainampseries/ovasCHeaderAdapterBrainProductsBrainampSeries.h new file mode 100644 index 0000000000000000000000000000000000000000..8094eefdb4aec9cfef0ddab440c71e10d0609314 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-brainampseries/ovasCHeaderAdapterBrainProductsBrainampSeries.h @@ -0,0 +1,50 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file ovasCHeaderAdapterBrainProductsBrainampSeries.h +/// \brief Brain Products Brainamp Series driver for OpenViBE +/// \author Yann Renard +/// \copyright Copyright (C) 2022 Inria +/// +/// This program is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Affero General Public License as published +/// by the Free Software Foundation, either version 3 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Affero General Public License for more details. +/// +/// You should have received a copy of the GNU Affero General Public License +/// along with this program. If not, see <https://www.gnu.org/licenses/>. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "../ovasCHeader.h" + +#if defined TARGET_OS_Windows + +#include "ovas_defines_brainamp_series.h" + +namespace OpenViBE { +namespace AcquisitionServer { +class CHeaderAdapterBrainProductsBrainampSeries final : public CHeaderAdapter +{ +public: + CHeaderAdapterBrainProductsBrainampSeries(IHeader& adaptedHeader, EParameter* channelSelected) + : CHeaderAdapter(adaptedHeader), m_ChannelSelected(channelSelected) {} + + bool setChannelCount(const size_t /*nChannel*/) override { return false; } + bool setChannelName(const size_t /*index*/, const char* /*name*/) override { return false; } + + size_t getChannelCount() const override; + const char* getChannelName(const size_t index) const override; + + EParameter* m_ChannelSelected = nullptr; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_OS_Windows diff --git a/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-brainampseries/ovas_defines_brainamp_series.h b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-brainampseries/ovas_defines_brainamp_series.h new file mode 100644 index 0000000000000000000000000000000000000000..da6050ef38ff1317e943b263cced8c37ef306aef --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-brainampseries/ovas_defines_brainamp_series.h @@ -0,0 +1,203 @@ +#pragma once + +// __________________________________________________________________// +// // +// File created from BrainAmpIoCtl.h in Brain Products low level SDK // +// More compliant with OpenViBE coding rules // +// __________________________________________________________________// +// // + +// Send setup, Parameter [IN]: BA_SETUP struct. +#define BRAINAMP_SETUP CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_WRITE_DATA) + +// Start acquisition, Parameter [IN]: long nType, 0 = Impedance check, 1 = Data aquisition, 2 = test signal +#define BRAINAMP_START CTL_CODE(FILE_DEVICE_UNKNOWN, 0x802, METHOD_BUFFERED, FILE_WRITE_DATA) + +// Stop acquisition +#define BRAINAMP_STOP CTL_CODE(FILE_DEVICE_UNKNOWN, 0x803, METHOD_BUFFERED, FILE_WRITE_DATA) + +// Get buffer filling state, Parameter [OUT]: long nState, < 0 = Overflow, 0 - 100 = Filling state in percent. +#define BRAINAMP_BUFFERFILLING_STATE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x804, METHOD_BUFFERED, FILE_READ_DATA) + +// Get battery voltage of one unit, Parameter [IN]: USHORT nUnit, Parameter [OUT]: long nVoltage in millivolts +#define BRAINAMP_BATTERY_VOLTAGE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x805, METHOD_BUFFERED, FILE_WRITE_DATA | FILE_READ_DATA) + +// Set impedance check sine wave frequency, Parameter [IN]: LONG nFrequency in Hertz +#define BRAINAMP_IMPEDANCE_FREQUENCY CTL_CODE(FILE_DEVICE_UNKNOWN, 0x806, METHOD_BUFFERED, FILE_WRITE_DATA) + +// Set impedance test mode, i.e. even in recording mode, the amplifier is still in impedance check mode +// Parameter [IN]: long bTestMode, != 0 testmode, 0 normal mode +#define BRAINAMP_IMPEDANCE_TESTMODE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x807, METHOD_BUFFERED, FILE_WRITE_DATA) + +// Set impedance group and range +// Parameter [IN]: long nGroupRange, 0 = 100kOhm Data (IMP1 | CAL), 1 = 10kOhm Data (IMP1), +// 2 = 100 kOhm Reference (IMP2 | CAL), 3 = 10 kOhm Reference (IMP2) +// 4 = Ground (IMP2) +#define BRAINAMP_IMPEDANCE_GROUPRANGE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x808, METHOD_BUFFERED, FILE_WRITE_DATA) + +// Get error state, Parameter [OUT]: long nState, +// Highword (amplifier): Bit 0 - 3: amplifier number(s) +// Loword: (error code): 0 = no error, 1 = loss lock, 2 = low power, +// 3 = can't establish communication at start. +// 4 = synchronisation error +#define BRAINAMP_ERROR_STATE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x809, METHOD_BUFFERED, FILE_READ_DATA) + +// Disable DC offset correction for testing purposes. +// Parameter [IN]: long bTestMode, != 0 DC offset correction off, 0 normal mode +#define BRAINAMP_DCOFFSET_TESTMODE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x80A, METHOD_BUFFERED, FILE_WRITE_DATA) + +// Send calibration settings, Parameter [IN]: BA_CALIBRATION_SETTINGS struct. +#define BRAINAMP_CALIBRATION_SETTINGS CTL_CODE(FILE_DEVICE_UNKNOWN, 0x80B, METHOD_BUFFERED, FILE_WRITE_DATA) + +// Set pullup/pulldown resistors for the digital input (default is pulldown). +// This can not be done for each bit, but for 2 groups. +// Parameter [IN]: USHORT bPullup, (low byte for bit 0 - 7, high byte for bit 8 - 15) +// != 0 pullup, 0 pulldown +#define BRAINAMP_DIGITALINPUT_PULL_UP CTL_CODE(FILE_DEVICE_UNKNOWN, 0x80C, METHOD_BUFFERED, FILE_WRITE_DATA) + +// Get digital input value, Parameter [OUT]: USHORT nValue +#define BRAINAMP_DIGITALINPUT_VALUE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x80D, METHOD_BUFFERED, FILE_READ_DATA) + +// Get driver version, Parameter [OUT]: ULONG nValue +// The version is coded as Major.Minor.DLL. +// The "DLL" part is used for intermediate versions and contains 4 digits. +// The minor part contains 2 digits. +// The number 1010041 for example means version 1.01.0041. +// If the highest bit (bit 31) is set, it means "test version". +#define BRAINAMP_DRIVERVERSION CTL_CODE(FILE_DEVICE_UNKNOWN, 0x80E, METHOD_BUFFERED, FILE_READ_DATA) + +// Send Commands during recording +// Parameter [IN]: USHORT nCommand (1 = DC Correction), USHORT nChannel (-1 = all channels) +#define BRAINAMP_COMMAND CTL_CODE(FILE_DEVICE_UNKNOWN, 0x80F, METHOD_BUFFERED, FILE_WRITE_DATA) + +// Set Control register directly (WRCON) +// Parameter [IN]: USHORT nAddress, ulong[4] channel mask +#define BRAINAMP_CONTROLREGISTER CTL_CODE(FILE_DEVICE_UNKNOWN, 0x810, METHOD_BUFFERED, FILE_WRITE_DATA) + +// Set DC offset value for potentiometer A (coarse) +// Parameter [IN]: USHORT nChannel, UCHAR nValue +#define BRAINAMP_DCOFFSET_COARSE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x811, METHOD_BUFFERED, FILE_WRITE_DATA) + +// Do DC Offset correction for potentiometer A (coarse) +#define BRAINAMP_DCOFFSET_CORRECTION_COARSE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x812, METHOD_NEITHER, FILE_WRITE_DATA) + +// Set DC offset value for potentiometer B (fine) +// Parameter [IN]: USHORT nChannel, UCHAR nValue +#define BRAINAMP_DCOFFSET_FINE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x813, METHOD_BUFFERED, FILE_WRITE_DATA) + +// Do DC Offset correction for potentiometer B (fine) +#define BRAINAMP_DCOFFSET_CORRECTION_FINE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x814, METHOD_NEITHER, FILE_WRITE_DATA) + +// Set Cal, Imp1, and Imp2 lines (testing only!) +// Parameter [IN]: BYTE Cal, BYTE, Imp1, Byte Imp2 +#define BRAINAMP_SET_CAL_IMP_LINES CTL_CODE(FILE_DEVICE_UNKNOWN, 0x815, METHOD_BUFFERED, FILE_WRITE_DATA) + +// Get amplifier type of all 4 units, +// Parameter [IN]: USHORT nUnit, Parameter [OUT]: USHORT Type[4]: 0 no Amp, 1 BrainAmp, 2 MR, 3 DC +#define BRAINAMP_AMPLIFIER_TYPE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x816, METHOD_BUFFERED, FILE_WRITE_DATA | FILE_READ_DATA) + +// Do DC Offset correction, no parameters +#define BRAINAMP_DCOFFSET_CORRECTION CTL_CODE(FILE_DEVICE_UNKNOWN, 0x817, METHOD_NEITHER, FILE_WRITE_DATA) + +// Retrieve serial number of device. Parameter [OUT]: ULONG +#define BRAINAMP_GET_SERIALNUMBER CTL_CODE(FILE_DEVICE_UNKNOWN, 0x818, METHOD_BUFFERED, FILE_READ_DATA) + +// Retrieve number of supported amplifiers for the device. Parameter [OUT]: USHORT +#define BRAINAMP_GET_SUPPORTED_AMPLIFIERS CTL_CODE(FILE_DEVICE_UNKNOWN, 0x819, METHOD_BUFFERED, FILE_READ_DATA) + +// Prestart, used only if more than one device is involved. +#define BRAINAMP_PRESTART CTL_CODE(FILE_DEVICE_UNKNOWN, 0x81a, METHOD_BUFFERED, FILE_WRITE_DATA) + +// Poststart, used only if more than one device is involved. +#define BRAINAMP_POSTSTART CTL_CODE(FILE_DEVICE_UNKNOWN, 0x81b, METHOD_BUFFERED, FILE_WRITE_DATA) + +// Disable busmastering +#define BRAINAMP_DISABLE_BUSMASTERING CTL_CODE(FILE_DEVICE_UNKNOWN, 0x81c, METHOD_BUFFERED, FILE_WRITE_DATA) + +namespace OpenViBE { +namespace AcquisitionServer { +#pragma pack(1) + +// Brainamp Setup +typedef struct +{ + uint32_t nChannel; // Number of channels - was /*long*/ + uint8_t channelLookup[256]; // Channel lookup table, -1 to -8 means PolyBox channels - was /*CHAR*/ + uint32_t nSamplePerSentBlock; // Number of points per block - was /*long*/ + uint16_t holdValue; // Hold value for digital input - was /*USHORT*/ + + // Version 1.01.0003 and higher + // The following tables are based on logical channel positions + uint8_t lowPassFilter[256]; // Low pass 250 Hz (0 = 1000Hz) - was /*UCHAR*/ + uint8_t resolution[256]; // 0 = 100 nV, 1 = 500 nV, 2 = 10 uV, 3 = 152.6 uV - was /*UCHAR*/ + uint8_t dcCoupling[256]; // DC coupling (0 = AC) - was /*UCHAR*/ + uint8_t lowImpedance; // Low impedance i.e. 10 MOhm, (0 = > 100MOhm) - was /*UCHAR*/ +} CBrainampSetup; + +// Brainamp Calibration Settings (default: square waves, 5 Hz) +typedef struct +{ + uint16_t waveForm; // 0 = ramp, 1 = triangle, 2 = square, 3 = sine wave - was /*USHORT*/ + uint32_t frequency; // Frequency in millihertz - was /*ULONG*/ +} CBrainampCalibrationSettings; + +#pragma pack() + +// Brainamp Parameter Types +typedef enum +{ + Parameter_Default=-1, + + Channel_Unselected=0, + Channel_Selected=1, + + DecimationFactor_None=0, + DecimationFactor_2=1, + DecimationFactor_4=2, + DecimationFactor_5=3, + DecimationFactor_8=4, + DecimationFactor_10=5, + + LowPass_1000=0, + LowPass_250=1, + + Resolution_100nV=0, + Resolution_500nV=1, + Resolution_10uV=2, + Resolution_152uV=3, + + DCCouping_AC=0, + DCCouping_DC=1, + + Impedance_High=0, + Impedance_Low=1, + + AcquisitionType_Impedance=0, + AcquisitionType_EEG=1, + AcquisitionType_TestSignal=2, + + WaveForm_Ramp=0, + WaveForm_Triangle=1, + WaveForm_Square=2, + WaveForm_SineWave=3, + + AmplifierType_None=0, + AmplifierType_BrainAmp=1, + AmplifierType_BrainAmpMR=2, + AmplifierType_BrainAmpDC=3, +} EParameter; + +inline const char* getDeviceType(const uint32_t type) +{ + switch (type) { + case AmplifierType_None: return "-- Not found --"; + case AmplifierType_BrainAmp: return "BrainAmp Standard"; + case AmplifierType_BrainAmpMR: return "BrainAmp MR"; + case AmplifierType_BrainAmpDC: return "BrainAmp DC / MR Plus"; + default: return "-- Unknown --"; + } +} + +#define BrainAmp_MaximumAmplifierCount 4 +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-liveamp/ovasCConfigurationBrainProductsLiveAmp.cpp b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-liveamp/ovasCConfigurationBrainProductsLiveAmp.cpp new file mode 100644 index 0000000000000000000000000000000000000000..55a7b4ff87300a69ecd53179e1d7069bea86b202 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-liveamp/ovasCConfigurationBrainProductsLiveAmp.cpp @@ -0,0 +1,147 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file ovasCConfigurationBrainProductsLiveAmp.cpp +/// \brief Brain Products LiveAmp driver for OpenViBE +/// \author Ratko Petrovic +/// \copyright Copyright (C) 2017 Brain Products +/// +/// This library is free software; you can redistribute it and/or +/// modify it under the terms of the GNU Library General Public +/// License as published by the Free Software Foundation; either +/// version 2 of the License, or (at your option) any later version. +/// +/// This library is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +/// Library General Public License for more details. +/// +/// You should have received a copy of the GNU Library General Public +/// License along with this library; if not, write to the +/// Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +/// Boston, MA 02110-1301, USA. +/// +///------------------------------------------------------------------------------------------------- + +/********************************************************************* +* History +* [2017-03-29] ver 1.0 - RP +* [2017-05-02] ver 1.1 Due to support for LiveAmp 8 and 16 channels, +* a new variable "m_nBip" added - RP +* +*********************************************************************/ + +#if defined TARGET_HAS_ThirdPartyBrainProductsAmplifierSDK + +#include "ovasCConfigurationBrainProductsLiveAmp.h" + +namespace OpenViBE { +namespace AcquisitionServer { + +/*_________________________________________________ + +Insert callback to specific widget here +Example with a button that launch a calibration of the device: + +//Callback connected to a dedicated gtk button: +static void button_calibrate_pressed_cb(GtkButton* button, void* data) +{ + CConfigurationBrainProductsLiveAmp* config=static_cast<CConfigurationBrainProductsLiveAmp*>(data); + config->buttonCalibratePressedCB(); +} +_________________________________________________*/ + +// If you added more reference attribute, initialize them here +CConfigurationBrainProductsLiveAmp::CConfigurationBrainProductsLiveAmp(const char* gtkBuilderFilename, uint32_t& physicalSampling, + uint32_t& rCountEEG, uint32_t& rCountBip, uint32_t& rCountAUX, uint32_t& rCountACC, bool& rUseAccChannels, + uint32_t& goodImpedanceLimit, uint32_t& badImpedanceLimit, DeviceSelection& deviceSelection, bool& rUseBipolarChannels) + : CConfigurationBuilder(gtkBuilderFilename), m_physicalSampling(physicalSampling), m_nEEG(rCountEEG), + m_nBip(rCountBip), m_nAUX(rCountAUX), m_nACC(rCountACC), m_useAccChannels(rUseAccChannels), m_useBipolarChannels(rUseBipolarChannels), + m_goodImpedanceLimit(goodImpedanceLimit), m_badImpedanceLimit(badImpedanceLimit), + m_triggers(badImpedanceLimit), m_deviceSelection(deviceSelection) {} + +bool CConfigurationBrainProductsLiveAmp::preConfigure() +{ + if (! CConfigurationBuilder::preConfigure()) { return false; } + + m_comboBoxSerialNumber = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "entrySerialNr")); + m_comboBoxPhysicalSampleRate = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_sampling_frequency")); + + m_buttonNEEGChannels = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_number_of_channels")); + m_buttonNBipolar = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_number_of_bipolar")); + m_buttonNAUXChannels = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spbBtnAUXchn")); + + m_enableACCChannels = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_acc")); + m_enableBipolarChannels = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_use_bipolar_channels")); + + if (gtk_builder_get_object(m_builder, "checkbutton_impedance")) { + m_impedanceCheck = GTK_WIDGET(gtk_builder_get_object(m_builder, "checkbutton_impedance")); + } + + m_buttonGoodImpedanceLimit = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_good_imp")); + m_buttonBadImpedanceLimit = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_bad_imp")); + + // Connect here all callbacks + // Example: + // g_signal_connect(gtk_builder_get_object(m_builder, "button_calibrate"), "pressed", G_CALLBACK(button_calibrate_pressed_cb), this); + + // Insert here the pre-configure code. + // For example, you may want to check if a device is currently connected + // and if more than one are connected. Then you can list in a dedicated combo-box + // the device currently connected so the user can choose which one he wants to acquire from. + + for (auto dev: m_deviceSelection.devices) { + gtk_combo_box_append_text(m_comboBoxSerialNumber, dev.id.c_str()); + } + + gtk_combo_box_set_active(m_comboBoxSerialNumber, static_cast<gint>(m_deviceSelection.selectionIndex)); + + gtk_combo_box_set_active(m_comboBoxPhysicalSampleRate, static_cast<gint>(m_physicalSampling)); + gtk_spin_button_set_value(m_buttonNEEGChannels, m_nEEG); + gtk_spin_button_set_value(m_buttonNBipolar, m_nBip); + gtk_spin_button_set_value(m_buttonNAUXChannels, m_nAUX); + gtk_spin_button_set_value(m_buttonGoodImpedanceLimit, m_goodImpedanceLimit); + gtk_spin_button_set_value(m_buttonBadImpedanceLimit, m_badImpedanceLimit); + gtk_toggle_button_set_active(m_enableACCChannels, m_useAccChannels); + + return true; +} + +bool CConfigurationBrainProductsLiveAmp::postConfigure() +{ + if (m_applyConfig) { + // If the user pressed the "apply" button, you need to save the changes made in the configuration. + // For example, you can save the connection ID of the selected device: + // m_connectionID = <value-from-gtk-widget> + gtk_spin_button_update(GTK_SPIN_BUTTON(m_buttonGoodImpedanceLimit)); + gtk_spin_button_update(GTK_SPIN_BUTTON(m_buttonGoodImpedanceLimit)); + gtk_spin_button_update(GTK_SPIN_BUTTON(m_buttonNEEGChannels)); + gtk_spin_button_update(GTK_SPIN_BUTTON(m_buttonNBipolar)); + gtk_spin_button_update(GTK_SPIN_BUTTON(m_buttonNAUXChannels)); + + m_physicalSampling = gtk_combo_box_get_active(m_comboBoxPhysicalSampleRate); + GtkTreeModel* widget = gtk_combo_box_get_model(m_comboBoxPhysicalSampleRate); + + m_nEEG = uint32_t(gtk_spin_button_get_value(m_buttonNEEGChannels)); + m_nBip = uint32_t(gtk_spin_button_get_value(m_buttonNBipolar)); + m_nAUX = uint32_t(gtk_spin_button_get_value(m_buttonNAUXChannels)); + + m_useAccChannels = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_enableACCChannels)) != 0; + + if (m_useAccChannels) { m_nACC = 3; } // can be 3 or 6 + else { m_nACC = 0; } + + m_goodImpedanceLimit = uint32_t(gtk_spin_button_get_value(m_buttonGoodImpedanceLimit)); + m_badImpedanceLimit = uint32_t(gtk_spin_button_get_value(m_buttonBadImpedanceLimit)); + + m_deviceSelection.selectionIndex = static_cast<size_t>(gtk_combo_box_get_active(m_comboBoxSerialNumber)); + } + + // normal header is filled (Subject ID, Age, Gender, channels, sampling frequency), ressources are realesed + if (! CConfigurationBuilder::postConfigure()) { return false; } + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyBrainProductsAmplifierSDK diff --git a/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-liveamp/ovasCConfigurationBrainProductsLiveAmp.h b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-liveamp/ovasCConfigurationBrainProductsLiveAmp.h new file mode 100644 index 0000000000000000000000000000000000000000..e38b03cd63f159e93171bf45d6b112ed949aff23 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-liveamp/ovasCConfigurationBrainProductsLiveAmp.h @@ -0,0 +1,64 @@ +#pragma once + +#ifdef TARGET_HAS_ThirdPartyBrainProductsAmplifierSDK + +#include "../ovasCConfigurationBuilder.h" +#include "../brainproducts-base/CDriverBrainProductsBase.h" + +#include <gtk/gtk.h> + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CConfigurationBrainProductsLiveAmp + * \author Ratko Petrovic (Brain Products GmbH) + * \date Mon Nov 21 14:57:37 2016 + * \brief The CConfigurationBrainProductsLiveAmp handles the configuration dialog specific to the Brain Products LiveAmp device. + * + * TODO: details + * + * \sa CDriverBrainProductsLiveAmp + */ +class CConfigurationBrainProductsLiveAmp final : public CConfigurationBuilder +{ +public: + // you may have to add to your constructor some reference parameters + // for example, a connection ID: + CConfigurationBrainProductsLiveAmp(const char* gtkBuilderFilename, uint32_t& physicalSampling, uint32_t& rCountEEG, + uint32_t& rCountBip, uint32_t& rCountAUX, uint32_t& rCountACC, bool& rUseAccChannels, uint32_t& goodImpedanceLimit, + uint32_t& badImpedanceLimit, DeviceSelection& deviceSelection, bool& rUseBipolarChannels); + + bool preConfigure() override; + bool postConfigure() override; + +protected: + + uint32_t& m_physicalSampling; + uint32_t& m_nEEG; + uint32_t& m_nBip; + uint32_t& m_nAUX; + uint32_t& m_nACC; + bool& m_useAccChannels; + bool& m_useBipolarChannels; + + uint32_t& m_goodImpedanceLimit; + uint32_t& m_badImpedanceLimit; + uint32_t& m_triggers; + + DeviceSelection& m_deviceSelection; + + GtkComboBox* m_comboBoxPhysicalSampleRate = nullptr; + GtkSpinButton* m_buttonGoodImpedanceLimit = nullptr; + GtkSpinButton* m_buttonBadImpedanceLimit = nullptr; + + GtkSpinButton* m_buttonNEEGChannels = nullptr; + GtkSpinButton* m_buttonNBipolar = nullptr; + GtkSpinButton* m_buttonNAUXChannels = nullptr; + GtkToggleButton* m_enableACCChannels = nullptr; + GtkToggleButton* m_enableBipolarChannels = nullptr; + GtkComboBox* m_comboBoxSerialNumber = nullptr; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyBrainProductsAmplifierSDK diff --git a/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-liveamp/ovasCDriverBrainProductsLiveAmp.cpp b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-liveamp/ovasCDriverBrainProductsLiveAmp.cpp new file mode 100644 index 0000000000000000000000000000000000000000..6caebf61b61cb354a75adb96f5667fd5718ccfea --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-liveamp/ovasCDriverBrainProductsLiveAmp.cpp @@ -0,0 +1,425 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file ovasCDriverBrainProductsLiveAmp.cpp +/// \brief Brain Products LiveAmp driver for OpenViBE +/// \author Ratko Petrovic +/// \copyright Copyright (C) 2017 Brain Products +/// +/// This library is free software; you can redistribute it and/or +/// modify it under the terms of the GNU Library General Public +/// License as published by the Free Software Foundation; either +/// version 2 of the License, or (at your option) any later version. +/// +/// This library is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +/// Library General Public License for more details. +/// +/// You should have received a copy of the GNU Library General Public +/// License along with this library; if not, write to the +/// Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, +/// Boston, MA 02110-1301, USA. +/// +///------------------------------------------------------------------------------------------------- + +/********************************************************************* +* History +* [2017-03-29] ver 1.0 - RP +* [2017-04-04] ver 1.1 Cosmetic changes: int/uint32_t, static_cast<>... - RP +* Function loop: optimized buffer copying. +* [2017-04-28] ver 1.2 LiveAmp8 and LiveAmp16 channles support added. - RP +* Introduced checking of Bipolar channels. +* +*********************************************************************/ +#if defined TARGET_HAS_ThirdPartyBrainProductsAmplifierSDK + +#include <algorithm> + +#include "ovasCDriverBrainProductsLiveAmp.h" +#include "ovasCConfigurationBrainProductsLiveAmp.h" + +#include <toolkit/ovtk_all.h> +#include <SDK.h> + +namespace OpenViBE { +namespace AcquisitionServer { + +CDriverBrainProductsLiveAmp::CDriverBrainProductsLiveAmp(IDriverContext& ctx): + CDriverBrainProductsBase(ctx), + m_settings("AcquisitionServer_Driver_BrainProductsLiveAmp", m_driverCtx.getConfigurationManager()) +{ + // set default sampling rates: + m_samplings.push_back(250); + m_samplings.push_back(500); + m_samplings.push_back(1000); + + m_header.setSamplingFrequency(250); // init for the first time + + // The following class allows saving and loading driver settings from the acquisition server .conf file + m_settings.add("EEGchannels", &m_nEEG); + m_settings.add("AUXchannels", &m_nAux); + m_settings.add("ACCchannels", &m_nACC); + m_settings.add("BipolarChannels", &m_nBipolar); + m_settings.add("IncludeACC", &m_useAccChannels); + + m_settings.add("SerialNr", &m_sSerialNumber); + m_settings.add("GoodImpedanceLimit", &m_goodImpedanceLimit); + m_settings.add("BadImpedanceLimit", &m_badImpedanceLimit); + m_settings.add("Header", &m_header); + m_settings.add("UseBipolarChannels", &m_useBipolarChannels); //m_settings.add("SettingName", &variable); + + // To save your custom driver settings, register each variable to the SettingsHelper + m_settings.load(); + + m_physicalSampling = m_header.getSamplingFrequency(); + m_header.setChannelCount(m_nEEG + m_nBipolar + m_nAux + m_nACC); + + // Tells SDK which DLL to use. + m_ampFamily = AmplifierFamily::eLiveAmpFamily; +} + +// Empty destructor required here for unique_ptr default_delete to work with forward declaration in header. +CDriverBrainProductsLiveAmp::~CDriverBrainProductsLiveAmp() {} + +//___________________________________________________________________// +// // +bool CDriverBrainProductsLiveAmp::initializeSpecific() +{ + // must disable all channels, then only enable the ones that will be used. + if (!checkAvailableChannels() || !disableAllAvailableChannels() || !getChannelIndices()) { + return false; + } + + +} + +bool CDriverBrainProductsLiveAmp::isConfigurable() +{ + return true; // change to false if your device is not configurable +} + +bool CDriverBrainProductsLiveAmp::configure() +{ + m_amplifier->Close(); + + // get sampling rate index: + uint32_t sampRateIndex = -1; + for (uint32_t i = 0; i < m_samplings.size(); ++i) { + if (m_physicalSampling == m_samplings[i]) { + sampRateIndex = i; + } + } + + /* Warning: + * An error occurs when doing the following: + * Connecting -> Disconnecting -> Changing device -> Connecting + * The last connection fails, unless EnumerateDevices is called before. + * Therefore, this call needs to happen each time + */ + getAvailableDevices(); + + for (size_t i = 0; i < m_deviceSelection.devices.size(); ++i) { + if (m_deviceSelection.devices[i].id == m_sSerialNumber) { + m_deviceSelection.selectionIndex = i; + break; + } + } + + // Change this line if you need to specify some references to your driver attribute that need configuration, e.g. the connection ID. + CConfigurationBrainProductsLiveAmp config(Directories::getDataDir() + "/applications/acquisition-server/interface-BrainProductsLiveAmp.ui", + sampRateIndex, m_nEEG, m_nBipolar, m_nAux, m_nACC, m_useAccChannels, + m_goodImpedanceLimit, m_badImpedanceLimit, m_deviceSelection, m_useBipolarChannels); + if (!config.configure(m_header)) { + return false; + } + + // update sampling rate + if (sampRateIndex >= 0 && sampRateIndex < m_samplings.size()) { + m_physicalSampling = m_samplings[sampRateIndex]; + } + + m_header.setSamplingFrequency(m_physicalSampling); + m_header.setChannelCount(m_nEEG + m_nBipolar + m_nAux + m_nACC); + + + m_sSerialNumber = m_deviceSelection.devices[m_deviceSelection.selectionIndex].id; + + m_settings.save(); + + return true; +} + +bool CDriverBrainProductsLiveAmp::checkAvailableChannels() +{ + // check the "LiveAmp_Channel" version: LiveAmp8, LiveAmp16, LiveAmp32 or LiveAmp64 + uint32_t moduleChannels; // check number of channels that are allowed! + // Module number set to 0 as per code example, but not sure what modules are and how they are numbered + int res = m_amplifier->GetProperty(moduleChannels, 0, ModulePropertyID::MPROP_I32_UseableChannels); + + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "#1 MPROP_I32_UseableChannels, error code= " << res << "\n"; + return false; + } + + // checks available channels, gets the count of each channel type + uint32_t availableEEG = 0; + uint32_t availableAUX = 0; + uint32_t availableACC = 0; + uint32_t availableTrig = 0; + + + int availableChannels; + m_amplifier->GetProperty(availableChannels, DevicePropertyID::DPROP_I32_AvailableChannels); + for (int c = 0; c < availableChannels; ++c) { + int channelType; + res = m_amplifier->GetProperty(channelType, c, ChannelPropertyID::CPROP_I32_Type); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[Check] GetProperty type error: " << res << "\n"; + return false; + } + + if (channelType == CT_AUX) { + char channelFunction[20]; + res = m_amplifier->GetProperty(channelFunction, c, ChannelPropertyID::CPROP_CHR_Function); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[Check] GetProperty CPROP_CHR_Function #1 error: " << res << "\n"; + return false; + } + + if (channelFunction[0] == 'X' || channelFunction[0] == 'Y' || channelFunction[0] == 'Z' || + channelFunction[0] == 'x' || channelFunction[0] == 'y' || channelFunction[0] == 'z') { + availableACC++; + } else { + availableAUX++; + } + } + + else if (channelType == CT_EEG || channelType == CT_BIP) { + availableEEG++; + } else if (channelType == CT_TRG || channelType == CT_DIG) { + char channelFunction[20]; + res = m_amplifier->GetProperty(channelFunction, c, ChannelPropertyID::CPROP_CHR_Function); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[Check] GetProperty CPROP_CHR_Function #2 error: " << res << "\n"; + return false; + } + if (strcmp("Trigger Input", channelFunction) == 0) { availableTrig += 1 + 8; } // One LiveAmp trigger input + 8 digital inputs from AUX box + } + } + + + //********************************************************************************* + // very important check !!! EEG + Bipolar must match configuration limitations + //********************************************************************************* + if (moduleChannels == 32) { + // if there is any Bipolar channel, it means that last 8 physical channels must be Bipolar + if (m_nBipolar > 0 && m_nEEG > (32 - 8)) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[Check] Number of EEG channels:" << m_nEEG << " and Bipolar channels: " << + m_nBipolar << " don't match the LiveAmp configuration !!!\n"; + return false; + } + } + + // Used EEG channels: + if (m_nEEG + m_nBipolar > moduleChannels) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[Check] Number of used EEG and Bip. channels '" << (m_nEEG + m_nBipolar) << + "' don't match with number of channels from LiveAmp Channel configuration '" << moduleChannels << "\n"; + return false; + } + if (m_nEEG + m_nBipolar > availableEEG) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[Check] Number of available EEG channels '" << availableEEG << + "' don't match with number of channels from Device configuration '" << m_nEEG << "\n"; + return false; + } + if (m_header.getSamplingFrequency() >= 1000 && moduleChannels >= 32 && (m_nEEG + m_nBipolar) > 24) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << + "If the sampling rate is 1000Hz, there should be 24 EEG (or 21 EEG and 3 AUX) channels used, to avoid sample loss due to Bluetooth connection.\n"; + return false; + } + + + if (m_nAux > availableAUX) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Number of input AUX channeles (" << m_nAux << + ") don't match available number of AUX channels (" << availableAUX << ") \n"; + return false; + } + + if (m_header.getSamplingFrequency() >= 1000 && moduleChannels >= 32 && (m_nEEG + m_nBipolar + m_nAux + m_nACC) > 24) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << + "If the sampling rate is 1000Hz, there should be 24 EEG (or 21 EEG and 3 AUX) channels used, to avoid sample loss due to Bluetooth connection. \n "; + return false; + } + + return true; +} + +bool CDriverBrainProductsLiveAmp::disableAllAvailableChannels() +{ + // disables all channle first. It is better to do so, than to enable only the channels that will be used, according to the driver settings. + int availableChannels; + int res = m_amplifier->GetProperty(availableChannels, DevicePropertyID::DPROP_I32_AvailableChannels); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " Get available channels, error code= " << res << "\n"; + return false; + } + + + // now disable all channel first, + for (int c = 0; c < availableChannels; ++c) { + BOOL disabled = false; + int channelType = 0; + + res = m_amplifier->GetProperty(channelType, c, ChannelPropertyID::CPROP_I32_Type); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " Error: ampGetProperty for channel type, channel= " << c << "; error code= " << res << + "\n"; + return false; + } + + // can not disable trigger and digital channels. + if (channelType == CT_DIG || channelType == CT_TRG) { + continue; + } + + res = m_amplifier->SetProperty(disabled, c, ChannelPropertyID::CPROP_B32_RecordingEnabled); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " Error: ampGetProperty for channel type, channel= " << c << "; error code= " << res << "\n"; + return false; + } + } + return true; +} + + +bool CDriverBrainProductsLiveAmp::getChannelIndices() +{ + int enable = 1; + m_nEnabledChannels = 0; + m_triggerIndices.clear(); + + int availableChannels; + int res = m_amplifier->GetProperty(availableChannels, DevicePropertyID::DPROP_I32_AvailableChannels); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "#3 Get available channels, error code= " << res << "\n"; + return false; + } + + // check the "LiveAmp_Channel" version: LiveAmp8, LiveAmp16, LiveAmp32 or LiveAmp64 + uint32_t moduleChannels; + res = m_amplifier->GetProperty(moduleChannels, 0, ModulePropertyID::MPROP_I32_UseableChannels); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "#2 MPROP_I32_UseableChannels, error code= " << res << "\n"; + return false; + } + + // enable channels and get indexes of channels to be used! + // The order of physical channels by LiveAmp: EEGs, BIPs, AUXs, ACCs, TRIGs + uint32_t nEEG = 0; + uint32_t nBip = 0; + uint32_t nAux = 0; + uint32_t nAcc = 0; + + for (int c = 0; c < availableChannels; ++c) { + int channelType; + res = m_amplifier->GetProperty(channelType, c, ChannelPropertyID::CPROP_I32_Type); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[Check] GetProperty type error: " << res << "\n"; + return false; + } + + // type of channel is first EEG. After one of the channle is re-typed as Bipolar, that the rest of 8 channels in the group of 32 will be Bipolar as well + if (channelType == CT_EEG || channelType == CT_BIP) { + if (nEEG < m_nEEG) { + res = m_amplifier->SetProperty(enable, c, ChannelPropertyID::CPROP_B32_RecordingEnabled); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " Cannot enable channel: " << c << "; error code= " << res << "\n"; + return false; + } + + m_nEnabledChannels++; + nEEG++; + } else if (nBip < m_nBipolar) { + //********************************************************************************* + // If Bipolar channel will be used, set the type to Bipolar here!!! + // Still it works for LiveAmp8, LiveAmp16 and LiveAmp32. + // Bipolar channels can be only phisical channels from index 24 - 31 !!! + //********************************************************************************* + if ((c > 23 && c < 32) || (moduleChannels > 32 && c > 55 && c < 64)) {// last 8 channels of 32ch module can be bipolar channels + res = m_amplifier->SetProperty(enable, c, ChannelPropertyID::CPROP_B32_RecordingEnabled); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " Cannot enable channel: " << c << "; error code= " << res << "\n"; + return false; + } + + int cType = CT_BIP; + res = m_amplifier->SetProperty(cType, c, ChannelPropertyID::CPROP_I32_Type); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[Check] SetProperty type CT_BIP error: " << res << "\n"; + return false; + } + + m_nEnabledChannels++; + nBip++; + } + } + + } else if (channelType == CT_AUX) { + char channelFunction[20]; + res = m_amplifier->GetProperty(channelFunction, c, ChannelPropertyID::CPROP_CHR_Function); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[Check] GetProperty CPROP_CHR_Function #1 error: " << res << "\n"; + return false; + } + + // detect ACC channels + if (channelFunction[0] == 'X' || channelFunction[0] == 'Y' || channelFunction[0] == 'Z' || + channelFunction[0] == 'x' || channelFunction[0] == 'y' || channelFunction[0] == 'z') { + if (nAcc < m_nACC) { + res = m_amplifier->SetProperty(enable, c, ChannelPropertyID::CPROP_B32_RecordingEnabled); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " Cannot enable channel: " << c << "; error code= " << res << "\n"; + return false; + } + + m_nEnabledChannels++; + nAcc++; + } + } else { + if (nAux < m_nAux) { + res = m_amplifier->SetProperty(enable, c, ChannelPropertyID::CPROP_B32_RecordingEnabled); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " Cannot enable channel: " << c << "; error code= " << res << "\n"; + return false; + } + + m_nEnabledChannels++; + nAux++; + } + } + } else if (channelType == CT_TRG || channelType == CT_DIG) { // those channels are always enabled! + char channelFunction[20]; + res = m_amplifier->GetProperty(channelFunction, c, ChannelPropertyID::CPROP_CHR_Function); + if (res != AMP_OK) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " GetProperty CPROP_CHR_Function error by Trigger, error code= " << res << "\n"; + return false; + } + + if (strcmp("Trigger Input", channelFunction) == 0) { + m_triggerIndices.push_back(m_nEnabledChannels); + } + + m_nEnabledChannels++; // Trigger and digital channels are always enabled! + } + } + + // initialize trigger states + for (uint32_t i = 0; i < m_triggerIndices.size(); ++i) { + m_lastTriggerStates.push_back(0); + } + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyBrainProductsAmplifierSDK diff --git a/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-liveamp/ovasCDriverBrainProductsLiveAmp.h b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-liveamp/ovasCDriverBrainProductsLiveAmp.h new file mode 100644 index 0000000000000000000000000000000000000000..b75a880c18a5244f8262071dd468fd93b7e2a9f0 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-liveamp/ovasCDriverBrainProductsLiveAmp.h @@ -0,0 +1,90 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyBrainProductsAmplifierSDK + +#include <openvibe/ov_all.h> + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" +#include "../brainproducts-base/CDriverBrainProductsBase.h" + +#include <deque> + +#ifndef BYTE +typedef unsigned char BYTE; +#endif + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverBrainProductsLiveAmp + * \author Ratko Petrovic (Brain Products GmbH) + * \date Mon Nov 21 14:57:37 2016 + * \brief The CDriverBrainProductsLiveAmp allows the acquisition server to acquire data from a Brain Products LiveAmp device. + * + * TODO: details + * + * \sa CConfigurationBrainProductsLiveAmp + */ +class CDriverBrainProductsLiveAmp final : public CDriverBrainProductsBase +{ +public: + explicit CDriverBrainProductsLiveAmp(IDriverContext& ctx); + ~CDriverBrainProductsLiveAmp() override; + + const char* getName() override { return "Brain Products LiveAmp"; } + + bool isConfigurable() override; + bool configure() override; + + bool initializeSpecific() override; + + bool isFlagSet(const EDriverFlag flag) const override + { + if (flag == EDriverFlag::IsUnstable) { return false; } // switch to "Stable" on 3.5.2017 - RP + return false; // No flags are set + } + +private: + SettingsHelper m_settings; + + uint32_t m_physicalSampling = 250; + bool m_useAccChannels = false; + bool m_useBipolarChannels = false; + uint32_t m_nEnabledChannels = 0; + + uint32_t m_nChannel = 0; + uint32_t m_nEEG = 32; + uint32_t m_nAux = 0; + uint32_t m_nACC = 0; + uint32_t m_nBipolar = 0; + uint32_t m_nTriggersIn = 0; + + std::string m_sSerialNumber = ""; + + std::vector<size_t> m_samplings; + + /** + * \brief Check how many available channels has LiveAmp. Get count of EEG,AUX and ACC channels. + Compares the count with the amplifier/driver settings. + * \return True if checking is successful. + */ + bool checkAvailableChannels(); + + /** + * \brief Disable all available channels + * \return True if function is successful. + */ + bool disableAllAvailableChannels(); + + /** + * \brief Get indexes of the channel that will be used for acquisition. + * \return True if function is successful. + */ + bool getChannelIndices(); + +}; +} //namespace AcquisitionServer +} //namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyBrainProductsAmplifierSDK diff --git a/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-vamp/ovasCConfigurationBrainProductsVAmp.cpp b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-vamp/ovasCConfigurationBrainProductsVAmp.cpp new file mode 100644 index 0000000000000000000000000000000000000000..5eaabd67809736c2043c67272cc00256319b36db --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-vamp/ovasCConfigurationBrainProductsVAmp.cpp @@ -0,0 +1,519 @@ +#include "ovasCConfigurationBrainProductsVAmp.h" +#include "ovasCHeaderBrainProductsVAmp.h" + +#if defined TARGET_HAS_ThirdPartyUSBFirstAmpAPI + +namespace OpenViBE { +namespace AcquisitionServer { + +gboolean idle_check_service(gpointer data) +{ + GtkBuilder* builder = static_cast<GtkBuilder*>(data); + + SC_HANDLE scm = OpenSCManager(nullptr, nullptr, SC_MANAGER_ALL_ACCESS); + SC_HANDLE service = nullptr; + if (scm != nullptr && scm != INVALID_HANDLE_VALUE) + { + service = OpenService(scm, "VampService", SERVICE_ALL_ACCESS); + if (service != nullptr) + { + SERVICE_STATUS status; + QueryServiceStatus(service, &status); + + if (status.dwCurrentState == SERVICE_RUNNING) + { + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "button_start_service")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "button_stop_service")), true); + gtk_label_set(GTK_LABEL(gtk_builder_get_object(builder, "label_service")), "VampService is Enabled"); + gtk_image_set_from_stock(GTK_IMAGE(gtk_builder_get_object(builder, "image_service")),GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_BUTTON); + CloseServiceHandle(scm); + CloseServiceHandle(service); + return true; + } + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "button_start_service")), true); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "button_stop_service")), false); + gtk_label_set(GTK_LABEL(gtk_builder_get_object(builder, "label_service")), "VampService is Disabled"); + gtk_image_set_from_stock(GTK_IMAGE(gtk_builder_get_object(builder, "image_service")),GTK_STOCK_APPLY, GTK_ICON_SIZE_BUTTON); + CloseServiceHandle(scm); + CloseServiceHandle(service); + return true; + } + } + + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "button_start_service")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(builder, "button_stop_service")), false); + gtk_label_set(GTK_LABEL(gtk_builder_get_object(builder, "label_service")), (scm != nullptr && scm != INVALID_HANDLE_VALUE) + ? "VampService has not been Detected" + : "Service Manager not Available (you must be administrator)"); + gtk_image_set_from_stock(GTK_IMAGE(gtk_builder_get_object(builder, "image_service")),GTK_STOCK_DIALOG_ERROR, GTK_ICON_SIZE_BUTTON); + return false; +} +//____________________________________________________________________________________ +// +static void StartServiceCB(GtkButton* /*button*/, void* data) { static_cast<CConfigurationBrainProductsVAmp*>(data)->buttonStartServiceCB(); } +static void StopServiceCB(GtkButton* /*button*/, void* data) { static_cast<CConfigurationBrainProductsVAmp*>(data)->buttonStopServiceCB(); } +static void FastModeSettingsCB(GtkButton* /*button*/, void* data) { static_cast<CConfigurationBrainProductsVAmp*>(data)->buttonFastModeSettingsCB(); } +static void ChannelCountChangedCB(GtkComboBox* /*box*/, void* data) { static_cast<CConfigurationBrainProductsVAmp*>(data)->channelCountChangedCB(); } + +static void GTKComboBoxSetActiveText(GtkComboBox* box, const gchar* text) +{ + GtkTreeModel* treeModel = gtk_combo_box_get_model(box); + GtkTreeIter it; + int index = 0; + gchar* name = nullptr; + if (gtk_tree_model_get_iter_first(treeModel, &it)) + { + do + { + gtk_tree_model_get(treeModel, &it, 0, &name, -1); + if (std::string(name) == std::string(text)) + { + gtk_combo_box_set_active(box, index); + return; + } + index++; + } while (gtk_tree_model_iter_next(treeModel, &it)); + } +} + +//____________________________________________________________________________________ + +// Inits the combo box, and sets the active value +// Warning : active value must be 7 8 9 10 or -1. +void initFastModeSettingsComboBox(GtkWidget* comboBox, const uint32_t value, const bool initComboBox = true) +{ + if (initComboBox) + { + //-1 + gtk_combo_box_append_text(GTK_COMBO_BOX(comboBox), "-1"); + //7-10 + for (size_t i = 7; i < 11; ++i) + { + const std::string tmp = std::to_string(i); + gtk_combo_box_append_text(GTK_COMBO_BOX(comboBox), tmp.c_str()); + } + } + const std::string tmp = std::to_string(value); + GTKComboBoxSetActiveText(GTK_COMBO_BOX(comboBox), tmp.c_str()); +} + +//____________________________________________________________________________________ + +CConfigurationBrainProductsVAmp::CConfigurationBrainProductsVAmp(IDriverContext& ctx, const char* gtkBuilderFilename, + CHeaderBrainProductsVAmp* headerBrainProductsVAmp, bool& acquireAuxiliaryAsEEG, + bool& acquireTriggerAsEEG) + : CConfigurationBuilder(gtkBuilderFilename), m_driverCtx(ctx), m_headerBrainProductsVAmp(headerBrainProductsVAmp), + m_rAcquireAuxiliaryAsEEG(acquireAuxiliaryAsEEG), m_rAcquireTriggerAsEEG(acquireTriggerAsEEG) { m_giIdleID = 0; } + +bool CConfigurationBrainProductsVAmp::preConfigure() +{ + if (!CConfigurationBuilder::preConfigure()) { return false; } + + // Finds all the widgets + m_dialogFastModeSettings = GTK_WIDGET(gtk_builder_get_object(m_builder, "dialog_fast_mode_settings")); + + // the acquisition mode combo box in the main interface + m_acquisitionMode = GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_acquisition_mode")); + + // the device combo box autofilled with all connected device + m_Device = GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_device")); + + // the toggle button for aux channels and triggers + m_auxiliaryChannels = GTK_WIDGET(gtk_builder_get_object(m_builder, "checkbutton_aux")); + m_triggerChannels = GTK_WIDGET(gtk_builder_get_object(m_builder, "checkbutton_trigger")); + + // the 8 spin buttons for the settings in the "fast mode settings" interface + m_pair1PositiveInputs = GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_pair1_positive_input")); + m_pair1NegativeInputs = GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_pair1_negative_input")); + + m_pair2PositiveInputs = GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_pair2_positive_input")); + m_pair2NegativeInputs = GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_pair2_negative_input")); + + m_pair3PositiveInputs = GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_pair3_positive_input")); + m_pair3NegativeInputs = GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_pair3_negative_input")); + + m_pair4PositiveInputs = GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_pair4_positive_input")); + m_pair4NegativeInputs = GTK_WIDGET(gtk_builder_get_object(m_builder, "combobox_pair4_negative_input")); + + // hide the Change Channel Names button (for compatibility with original contributor (Mensia Technologies) base code) +#if defined TARGET_Is_Mensia_Acquisition_Server + gtk_widget_set_visible(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_change_channel_names")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_change_channel_names")), false); +#endif + + // connects callbacks to buttons + g_signal_connect(gtk_builder_get_object(m_builder,"button_fast_mode_settings"), "pressed", G_CALLBACK(FastModeSettingsCB), this); + g_signal_connect(gtk_builder_get_object(m_builder,"combobox_acquisition_mode"), "changed", G_CALLBACK(ChannelCountChangedCB), this); + g_signal_connect(gtk_builder_get_object(m_builder,"checkbutton_aux"), "toggled", G_CALLBACK(ChannelCountChangedCB), this); + g_signal_connect(gtk_builder_get_object(m_builder,"checkbutton_trigger"), "toggled", G_CALLBACK(ChannelCountChangedCB), this); + g_signal_connect(gtk_builder_get_object(m_builder,"button_start_service"), "pressed", G_CALLBACK(StartServiceCB), this); + g_signal_connect(gtk_builder_get_object(m_builder,"button_stop_service"), "pressed", G_CALLBACK(StopServiceCB), this); + + // start the idle function that checks the VampService + m_giIdleID = g_idle_add(idle_check_service, m_builder); + + // Configures interface with given values + //Data mode + gtk_combo_box_set_active(GTK_COMBO_BOX(m_acquisitionMode), m_headerBrainProductsVAmp->getAcquisitionMode()); + + //Device(s) + uint32_t nDevice = 0; + uint32_t nRetries = 0; + + // We try to get the last opened device, (max 5 tries, 500ms sleep between tries) + while (nRetries++ < 5) + { + nDevice = faGetCount(); // Get the last opened Device id. + if (nDevice < 1) { Sleep(500); } + else { break; } + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "VAmp Configuration: " << nDevice << " device(s) connected.\n"; + + if (nDevice != 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "VAmp Configuration: Device(s) information :\n"; + + t_faInformation info; + GtkComboBox* comboBox = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_device")); + + for (uint32_t i = 0; i < nDevice; ++i) + { + int deviceId = faGetId(i); + faGetInformation(deviceId, &info); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << " device#" << i << " > Model(" << (info.Model == 1 ? "VAmp 16" : "VAmp 8") << ") | SN(" << info + .SerialNumber << ")\n"; + const std::string buffer = "device#" + std::to_string(i); + gtk_combo_box_append_text(comboBox, buffer.c_str()); + } + // active = the last opened device + gtk_combo_box_set_active(comboBox, nDevice - 1); + } + else + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "[INIT] VAmp Driver: faGetCount() returned [" << faGetCount() << "]. No device detected.\n"; + gtk_widget_set_sensitive(m_dialogFastModeSettings, false); + gtk_widget_set_sensitive(m_acquisitionMode, false); + gtk_widget_set_sensitive(m_Device, false); + gtk_widget_set_sensitive(m_auxiliaryChannels, false); + gtk_widget_set_sensitive(m_triggerChannels, false); + gtk_widget_set_sensitive(m_pair1PositiveInputs, false); + gtk_widget_set_sensitive(m_pair1NegativeInputs, false); + gtk_widget_set_sensitive(m_pair2PositiveInputs, false); + gtk_widget_set_sensitive(m_pair2NegativeInputs, false); + gtk_widget_set_sensitive(m_pair3PositiveInputs, false); + gtk_widget_set_sensitive(m_pair3NegativeInputs, false); + gtk_widget_set_sensitive(m_pair4PositiveInputs, false); + gtk_widget_set_sensitive(m_pair4NegativeInputs, false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_change_channel_names")), false); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "checkbutton_impedance")), false); + } + + m_iDeviceCount = nDevice; + + // acquisition mode + gtk_combo_box_set_active(GTK_COMBO_BOX(m_acquisitionMode), m_headerBrainProductsVAmp->getAcquisitionMode()); + + // aux channels and triggers + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_auxiliaryChannels), m_rAcquireAuxiliaryAsEEG); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(m_triggerChannels), m_rAcquireTriggerAsEEG); + + // channel count (widget is hidden but is read when clicnking on "channel names..." + gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_nChannels), m_header->getChannelCount()); + + //SETTINGS: + //Adding all possible settings : 7/8/9/10 and -1 + // and setting active text + //_______________________________________________________ + + initFastModeSettingsComboBox(m_pair1PositiveInputs, m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsPos[0]); + initFastModeSettingsComboBox(m_pair1NegativeInputs, m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsNeg[0]); + initFastModeSettingsComboBox(m_pair2PositiveInputs, m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsPos[1]); + initFastModeSettingsComboBox(m_pair2NegativeInputs, m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsNeg[1]); + initFastModeSettingsComboBox(m_pair3PositiveInputs, m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsPos[2]); + initFastModeSettingsComboBox(m_pair3NegativeInputs, m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsNeg[2]); + initFastModeSettingsComboBox(m_pair4PositiveInputs, m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsPos[3]); + initFastModeSettingsComboBox(m_pair4NegativeInputs, m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsNeg[3]); + + return true; +} + +bool CConfigurationBrainProductsVAmp::postConfigure() +{ + if (m_applyConfig) + { + m_headerBrainProductsVAmp->setAcquisitionMode(static_cast<enum EAcquisitionModes>(gtk_combo_box_get_active(GTK_COMBO_BOX(m_acquisitionMode)))); + int usbIdx = 0; + + // Device number + if (m_iDeviceCount != 0) + { + int number; + GtkComboBox* comboBox = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_device")); + if (sscanf(gtk_combo_box_get_active_text(comboBox), "device#%i", &number) == 1) + { + m_headerBrainProductsVAmp->setDeviceId(faGetId(uint32_t(number))); + } + } + + // aux and triggers: update the references + m_rAcquireAuxiliaryAsEEG = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_auxiliaryChannels)) != 0; + m_rAcquireTriggerAsEEG = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_triggerChannels)) != 0; + } + +#if 0 + // Code from CConfigurationBuilder::postConfigure() in order to have the channel names before making the pairs ! + if(m_applyConfig) + { + m_header->setChannelCount(gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(m_nChannels))); + + for (size_t i=0; i!=m_header->getChannelCount(); ++i) + { + if(m_channelNames[i]!="") + { + m_header->setChannelName(i, m_channelNames[i].c_str()); + } + } + } +#endif + + //releasing ressources as we dont need it anymore + gtk_widget_hide(m_dialogFastModeSettings); + + // making the pairs names + if (m_headerBrainProductsVAmp->getAcquisitionMode() == VAmp4Fast) + { + size_t nPair = 0; + std::vector<size_t> pairIdx; // if the user has n<4 pairs but not in the n first settings, we need the indexes + for (size_t i = 0; i < 4; ++i) + { + if (m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsPos[i] != -1 + || m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsNeg[i] != -1) + { + nPair++; + pairIdx.push_back(i); + } + } + + m_headerBrainProductsVAmp->setPairCount(nPair); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << nPair << " channel pairs used.\n"; + + // we need to rename the 4 first channels, in order to match the pairs + std::vector<std::string> pairNames; + + for (size_t i = 0; i < nPair; ++i) + { + std::string positiveChannelName, negativeChannelName, pairName; + bool positiveChannelSet = false; + bool negativeChannelSet = false; + + if (m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsPos[pairIdx[i]] != -1) + { + positiveChannelName = m_header->getChannelName(m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsPos[pairIdx[i]]); + if (positiveChannelName == "") + { + int val = m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsPos[pairIdx[i]]; + positiveChannelName = std::to_string(val); + } + positiveChannelSet = true; + } + + if (m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsNeg[pairIdx[i]] != -1) + { + negativeChannelName = m_header->getChannelName(m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsNeg[pairIdx[i]]); + if (negativeChannelName == "") + { + int val = m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsNeg[pairIdx[i]]; + negativeChannelName = std::to_string(val); + } + negativeChannelSet = true; + } + + if (negativeChannelSet && positiveChannelSet) { pairName = "Differential (" + positiveChannelName + " - " + negativeChannelName + ")"; } + + if (!negativeChannelSet && positiveChannelSet) { pairName = "Monopolar(+) " + positiveChannelName; } + if (negativeChannelSet && !positiveChannelSet) { pairName = "Monopolar(-) " + negativeChannelName; } + + pairNames.push_back(pairName); + } + + for (size_t i = 0; i < nPair; ++i) { m_headerBrainProductsVAmp->setPairName(i, pairNames[i].c_str()); } + } + + //remove the idle function for the service check + if (m_giIdleID != 0) g_source_remove(m_giIdleID); + + if (!CConfigurationBuilder::postConfigure()) { return false; } // normal header is filled, ressources are realesed + + // Force sampling frequency +#if 0 + m_headerBrainProductsVAmp->setSamplingFrequency(m_headerBrainProductsVAmp->getAcquisitionMode()==EAcquisitionModes::VAmp4Fast?20000:2000); +#else + // Signal is now decimated down to 512Hz whatever input sampling frequency was acquired + m_headerBrainProductsVAmp->setSamplingFrequency(512); +#endif + + return true; +} + +//____________________________________________________________________________________// + +void CConfigurationBrainProductsVAmp::buttonFastModeSettingsCB() +{ + GtkDialog* dialog = GTK_DIALOG(gtk_builder_get_object(m_builder, "dialog_fast_mode_settings")); + int response; + do + { + response = gtk_dialog_run(dialog); + switch (response) + { + case GTK_RESPONSE_APPLY: + { + t_faDataModeSettings settings; + settings.Mode20kHz4Channels.ChannelsPos[0] = atoi(gtk_combo_box_get_active_text(GTK_COMBO_BOX(m_pair1PositiveInputs))); + settings.Mode20kHz4Channels.ChannelsNeg[0] = atoi(gtk_combo_box_get_active_text(GTK_COMBO_BOX(m_pair1NegativeInputs))); + + settings.Mode20kHz4Channels.ChannelsPos[1] = atoi(gtk_combo_box_get_active_text(GTK_COMBO_BOX(m_pair2PositiveInputs))); + settings.Mode20kHz4Channels.ChannelsNeg[1] = atoi(gtk_combo_box_get_active_text(GTK_COMBO_BOX(m_pair2NegativeInputs))); + + settings.Mode20kHz4Channels.ChannelsPos[2] = atoi(gtk_combo_box_get_active_text(GTK_COMBO_BOX(m_pair3PositiveInputs))); + settings.Mode20kHz4Channels.ChannelsNeg[2] = atoi(gtk_combo_box_get_active_text(GTK_COMBO_BOX(m_pair3NegativeInputs))); + + settings.Mode20kHz4Channels.ChannelsPos[3] = atoi(gtk_combo_box_get_active_text(GTK_COMBO_BOX(m_pair4PositiveInputs))); + settings.Mode20kHz4Channels.ChannelsNeg[3] = atoi(gtk_combo_box_get_active_text(GTK_COMBO_BOX(m_pair4NegativeInputs))); + + m_headerBrainProductsVAmp->setFastModeSettings(settings); + GTKComboBoxSetActiveText(GTK_COMBO_BOX(m_acquisitionMode), "Fast"); + + break; + } + case GTK_RESPONSE_CANCEL: + { + //Data mode + gtk_combo_box_set_active(GTK_COMBO_BOX(m_acquisitionMode), m_headerBrainProductsVAmp->getAcquisitionMode()); + + //Settings + initFastModeSettingsComboBox(m_pair1PositiveInputs, m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsPos[0], false); + initFastModeSettingsComboBox(m_pair1NegativeInputs, m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsNeg[0], false); + initFastModeSettingsComboBox(m_pair2PositiveInputs, m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsPos[1], false); + initFastModeSettingsComboBox(m_pair2NegativeInputs, m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsNeg[1], false); + initFastModeSettingsComboBox(m_pair3PositiveInputs, m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsPos[2], false); + initFastModeSettingsComboBox(m_pair3NegativeInputs, m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsNeg[2], false); + initFastModeSettingsComboBox(m_pair4PositiveInputs, m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsPos[3], false); + initFastModeSettingsComboBox(m_pair4NegativeInputs, m_headerBrainProductsVAmp->getFastModeSettings().Mode20kHz4Channels.ChannelsNeg[3], false); + + break; + } + default: break; + } + } while (response != GTK_RESPONSE_APPLY && response != GTK_RESPONSE_CANCEL); + + gtk_widget_hide(GTK_WIDGET(dialog)); +} + +void CConfigurationBrainProductsVAmp::channelCountChangedCB() +{ + const bool acquireAuxiliaryAsEEG = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_auxiliaryChannels)) != 0; + const bool acquireTriggerAsEEG = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_triggerChannels)) != 0; + const gint acquisitionMode = gtk_combo_box_get_active(GTK_COMBO_BOX(m_acquisitionMode)); + + uint32_t nChannel = m_headerBrainProductsVAmp->getEEGChannelCount(acquisitionMode); + nChannel += (acquireTriggerAsEEG ? m_headerBrainProductsVAmp->getTriggerChannelCount(acquisitionMode) : 0); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_nChannels), nChannel); + + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_change_channel_names")), acquisitionMode != VAmp4Fast); + gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(m_builder, "button_fast_mode_settings")), acquisitionMode == VAmp4Fast); +} + +bool CConfigurationBrainProductsVAmp::controlVampService(bool start) +{ + SC_HANDLE scm = OpenSCManager(nullptr, nullptr, SC_MANAGER_ALL_ACCESS); + SC_HANDLE service = nullptr; + //bool bReturn = false; + //DWORD dwReturn = NO_ERROR; + + if (scm == nullptr || scm == INVALID_HANDLE_VALUE) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " [VampService] The driver was unable to create the handler to the SCManager (err code " + << uint32_t(GetLastError()) << ".\n"; + return false; + } + try + { + service = OpenService(scm, "VampService", SERVICE_ALL_ACCESS); + if (service != nullptr) + { + SERVICE_STATUS status; + QueryServiceStatus(service, &status); + if (start) + { + if (status.dwCurrentState != SERVICE_RUNNING) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << " [VampService] Starting VampService...\n"; + if (!StartService(service, 0, nullptr)) // handle to service, number of arguments, no arguments + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " [VampService] The driver was unable to restart the service (err code " << + size_t(GetLastError()) << ".\n"; + return false; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << " [VampService] VampService started successfully.\n"; + return true; + } + } + else // try to stop service + { + if (status.dwCurrentState != SERVICE_STOPPED) + { + ControlService(service, SERVICE_CONTROL_STOP, &status); + bool stopped = false; + for (int i = 0; i < 5 && !stopped; ++i) // about 5 seconds + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << " [VampService] Checking the VampService...\n"; + Sleep(1000); + ControlService(service, SERVICE_CONTROL_INTERROGATE, &status); + if (status.dwCurrentState == SERVICE_STOPPED) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << " [VampService] VampService stopped successfully.\n"; + stopped = true; + } + } + if (!stopped) m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << " [VampService] After 5 seconds check, VampService did not stop.\n"; + } + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << " [VampService] Closing handlers.\n"; + CloseServiceHandle(service); + service = nullptr; + CloseServiceHandle(scm); + scm = nullptr; + } + else + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " [VampService] The driver was unable to create the handler to VampService (err code " + << uint32_t(GetLastError()) << ".\n"; + return false; + } + } + catch (...) + { + if (service != nullptr) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " [VampService] An error occurred with the VampService handler (err code " + << uint32_t(GetLastError()) << ".\n"; + CloseServiceHandle(service); + service = nullptr; + } + if (scm != nullptr) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << " [VampService] An error occurred with the SCManager handler (err code " + << uint32_t(GetLastError()) << ".\n"; + CloseServiceHandle(scm); + scm = nullptr; + } + return false; + } + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyUSBFirstAmpAPI diff --git a/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-vamp/ovasCConfigurationBrainProductsVAmp.h b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-vamp/ovasCConfigurationBrainProductsVAmp.h new file mode 100644 index 0000000000000000000000000000000000000000..8a63105571c447bd27d69aae8d0e7de174c0e795 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-vamp/ovasCConfigurationBrainProductsVAmp.h @@ -0,0 +1,76 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyUSBFirstAmpAPI + +#include "../ovasCConfigurationBuilder.h" +#include "ovasIDriver.h" +#include "ovasCHeaderBrainProductsVAmp.h" + +#include <gtk/gtk.h> + +#include <windows.h> +#include <FirstAmp.h> + +namespace OpenViBE { +namespace AcquisitionServer { + +/** + * \class CConfigurationBrainProductsVAmp + * \author Laurent Bonnet (INRIA) + * \date 16 nov 2009 + * \erief The CConfigurationBrainProductsVAmp handles the configuration dialog specific to the VAmp device. + * + * User can configure the acquisition mode (normal/fast) and the fast mode settings (monopolar or differential pair). + * + * \sa CDriverBrainProductsVAmp + */ +class CConfigurationBrainProductsVAmp final : public CConfigurationBuilder +{ +public: + + CConfigurationBrainProductsVAmp(IDriverContext& ctx, const char* gtkBuilderFilename, CHeaderBrainProductsVAmp* headerBrainProductsVAmp, + bool& acquireAuxiliaryAsEEG, bool& acquireTriggerAsEEG); + + bool preConfigure() override; + bool postConfigure() override; + + void buttonFastModeSettingsCB(); + void buttonStartServiceCB() { controlVampService(true); } + void buttonStopServiceCB() { controlVampService(false); } + void channelCountChangedCB(); + +protected: + + IDriverContext& m_driverCtx; + int m_iDeviceCount = 0; + + CHeaderBrainProductsVAmp* m_headerBrainProductsVAmp = nullptr; + + bool& m_rAcquireAuxiliaryAsEEG; + bool& m_rAcquireTriggerAsEEG; + + //widgets + GtkWidget* m_dialogFastModeSettings = nullptr; + GtkWidget* m_Device = nullptr; + GtkWidget* m_acquisitionMode = nullptr; + GtkWidget* m_auxiliaryChannels = nullptr; + GtkWidget* m_triggerChannels = nullptr; + GtkWidget* m_pair1PositiveInputs = nullptr; + GtkWidget* m_pair1NegativeInputs = nullptr; + GtkWidget* m_pair2PositiveInputs = nullptr; + GtkWidget* m_pair2NegativeInputs = nullptr; + GtkWidget* m_pair3PositiveInputs = nullptr; + GtkWidget* m_pair3NegativeInputs = nullptr; + GtkWidget* m_pair4PositiveInputs = nullptr; + GtkWidget* m_pair4NegativeInputs = nullptr; + +private: + bool controlVampService(bool state); + //DWORD startWindowsService(SC_HANDLE hService); + //gboolean idleCheckVampService(gpointer data); + gint m_giIdleID = 0; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyUSBFirstAmpAPI diff --git a/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-vamp/ovasCDriverBrainProductsVAmp.cpp b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-vamp/ovasCDriverBrainProductsVAmp.cpp new file mode 100644 index 0000000000000000000000000000000000000000..172e529a3e47fb225859ec8f98a50010353088bf --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-vamp/ovasCDriverBrainProductsVAmp.cpp @@ -0,0 +1,705 @@ +#if defined TARGET_HAS_ThirdPartyUSBFirstAmpAPI + +#include "ovasCDriverBrainProductsVAmp.h" +#include "ovasCConfigurationBrainProductsVAmp.h" +#include "ovasCHeaderBrainProductsVAmp.h" + +#include <system/ovCTime.h> +#include <windows.h> +#include <FirstAmp.h> + +#include <cstdlib> +#include <cstring> + +#include <iostream> +#include <vector> + +namespace OpenViBE { +namespace AcquisitionServer { + +#define OVAS_Driver_VAmp_ImpedanceMask_BaseComponent 127 + +namespace { +// Low pass FIR filters before downsampling +// +// Computed with python and scipy +// References : +// http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.tofile.html +// http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.firwin.html +// +// The following filters have roughly 50ms delay as described in "2.1.4 What is the +// delay of a linear-phase FIR?" at http://www.dspguru.com/book/export/html/3 : +// n = 200, Fs = 2000, delay = (n-1)/(2*Fs) = 0.04975 +// n = 2000, Fs = 20000, delay = (n-1)/(2*Fs) = 0.049975 +// +// In order to correct this delay, filtering should be done as a two steps process with a forward filter +// followed by a backward filter. However, this leads to an n square complexity where a linear complexity is +// sufficient in forward only filtering (using 100kHz input signal, n=10000 taps !) +// +// To avoid such complexity, it is chosen to antedate acquired samples by 50ms cheating the drift correction +// process. Indeed, the acquisition server application monitors the drifting of the acquisition process and +// corrects this drift upon demand. It is up to the driver to require this correction and it can be chosen not +// to fit the 0 drift, but to fit an arbitrary fixed drift instead. +// +// The offset for this correction is stored in the m_nDriftOffsetSample variable + +/* --------------------------------------------------------------------------------------------------------------- +from scipy import signal + +N = 200 +signal.firwin(N, cutoff= 256./(0.5*2000.), window='hamming').tofile("f64_2k_512.bin") +signal.firwin(N, cutoff= 128./(0.5*2000.), window='hamming').tofile("f64_2k_256.bin") +signal.firwin(N, cutoff= 64./(0.5*2000.), window='hamming').tofile("f64_2k_128.bin") + +N = 2000 +signal.firwin(N, cutoff=2048./(0.5*20000.), window='hamming').tofile("f64_20k_4096.bin") +signal.firwin(N, cutoff=1024./(0.5*20000.), window='hamming').tofile("f64_20k_2048.bin") +signal.firwin(N, cutoff= 512./(0.5*20000.), window='hamming').tofile("f64_20k_1024.bin") +signal.firwin(N, cutoff= 256./(0.5*20000.), window='hamming').tofile("f64_20k_512.bin") +signal.firwin(N, cutoff= 128./(0.5*20000.), window='hamming').tofile("f64_20k_256.bin") +signal.firwin(N, cutoff= 64./(0.5*20000.), window='hamming').tofile("f64_20k_128.bin") + +--------------------------------------------------------------------------------------------------------------- */ + +bool loadFilter(const char* filename, std::vector<double>& filters) +{ + FILE* file = fopen(filename, "rb"); + if (!file) + { + filters.clear(); + filters.push_back(1); + return false; + } + fseek(file, 0, SEEK_END); + const size_t len = ftell(file); + fseek(file, 0, SEEK_SET); + filters.resize(len / sizeof(double)); + fread(&filters[0], len, 1, file); + fclose(file); + return true; +} +} // namespace + + +//___________________________________________________________________// +// // + +CDriverBrainProductsVAmp::CDriverBrainProductsVAmp(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_BrainProducts-VAmp", m_driverCtx.getConfigurationManager()) +{ + // default mode is VAmp 16, aux and trigger depending on the config tokens + m_header.setAcquisitionMode(VAmp16); + + m_nEEGChannel = m_header.getEEGChannelCount(VAmp16); + m_nAuxiliaryChannel = (m_acquireAuxiliaryAsEEG ? m_header.getAuxiliaryChannelCount(VAmp16) : 0); + m_nTriggerChannel = (m_acquireTriggerAsEEG ? m_header.getTriggerChannelCount(VAmp16) : 0); + m_header.setChannelCount(m_nEEGChannel + m_nAuxiliaryChannel + m_nTriggerChannel); + + if (m_acquireAuxiliaryAsEEG) + { + m_header.setChannelName(m_nEEGChannel, "Aux 1"); + m_header.setChannelName(m_nEEGChannel + 1, "Aux 2"); + } + if (m_acquireTriggerAsEEG) { m_header.setChannelName(m_nEEGChannel + m_nAuxiliaryChannel, "Trigger line"); } + + m_header.setSamplingFrequency(512); + + t_faDataModeSettings settings; + settings.Mode20kHz4Channels.ChannelsPos[0] = 7; + settings.Mode20kHz4Channels.ChannelsNeg[0] = -1; + settings.Mode20kHz4Channels.ChannelsPos[1] = 8; + settings.Mode20kHz4Channels.ChannelsNeg[1] = -1; + settings.Mode20kHz4Channels.ChannelsPos[2] = 9; + settings.Mode20kHz4Channels.ChannelsNeg[2] = -1; + settings.Mode20kHz4Channels.ChannelsPos[3] = 10; + settings.Mode20kHz4Channels.ChannelsNeg[3] = -1; + + m_header.setFastModeSettings(settings); + m_header.setDeviceId(FA_ID_INVALID); + + // @note m_header is CHeaderBrainProductsVAmp, whereas the current interface supports only IHeader. Thus, some info may not be loaded/saved. + m_settings.add("Header", &m_header); + m_settings.add("AcquireAuxiliaryAsEEG", &m_acquireAuxiliaryAsEEG); + m_settings.add("AcquireTriggerAsEEG", &m_acquireTriggerAsEEG); + m_settings.load(); +} + +CDriverBrainProductsVAmp::~CDriverBrainProductsVAmp() {} + +const char* CDriverBrainProductsVAmp::getName() { return "Brain Products V-Amp / First-Amp"; } + +//___________________________________________________________________// +// // + +bool CDriverBrainProductsVAmp::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "INIT called.\n"; + if (m_driverCtx.isConnected()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] VAmp Driver: Driver already initialized.\n"; + return false; + } + + if (m_acquireAuxiliaryAsEEG) m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "[INIT] VAmp Driver: will acquire aux as EEG\n"; + else m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "[INIT] VAmp Driver: will NOT acquire aux as EEG\n"; + if (m_acquireTriggerAsEEG) m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "[INIT] VAmp Driver: will acquire trigger as EEG\n"; + else m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "[INIT] VAmp Driver: will NOT acquire trigger as EEG\n"; + + m_acquisitionMode = m_header.getAcquisitionMode(); + m_nEEGChannel = m_header.getEEGChannelCount(m_acquisitionMode); + m_nAuxiliaryChannel = (m_acquireAuxiliaryAsEEG ? m_header.getAuxiliaryChannelCount(m_acquisitionMode) : 0); + m_nTriggerChannel = (m_acquireTriggerAsEEG ? m_header.getTriggerChannelCount(m_acquisitionMode) : 0); + + m_header.setChannelCount(m_nEEGChannel + m_nAuxiliaryChannel + m_nTriggerChannel); + + if (m_acquireAuxiliaryAsEEG) + { + if (strlen(m_header.getChannelName(m_nEEGChannel)) == 0 || strcmp(m_header.getChannelName(m_nEEGChannel), "Trigger line") == 0) + { + m_header.setChannelName(m_nEEGChannel, "Aux 1"); + } + if (strlen(m_header.getChannelName(m_nEEGChannel + 1)) == 0) { m_header.setChannelName(m_nEEGChannel + 1, "Aux 2"); } + } + if (m_acquireTriggerAsEEG) { m_header.setChannelName(m_nEEGChannel + m_nAuxiliaryChannel, "Trigger line"); } + + if (!m_header.isChannelCountSet() || !m_header.isSamplingFrequencySet()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] VAmp Driver: Channel count or frequency not set.\n"; + return false; + } + + // Builds up physical sampling rate + switch (m_acquisitionMode) + { + case VAmp16: m_physicalSamplingHz = 2000; + break; + case VAmp8: m_physicalSamplingHz = 2000; + break; + case VAmp4Fast: m_physicalSamplingHz = 20000; + break; + default: m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] Vamp Driver: Unsupported acquisition mode [" << m_acquisitionMode << "].\n"; + return false; + } + + // Loading low pass filter for decimation + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "[INIT] Vamp Driver: Setting up the FIR filter for signal decimation (physical rate " << + m_physicalSamplingHz << " > driver rate " << m_header.getSamplingFrequency() << ").\n"; + switch (m_physicalSamplingHz) + { + case 2000: loadFilter(Directories::getDataDir() + "applications/acquisition-server/filters/f64_2k_512.bin", m_filters); + break; + case 20000: loadFilter(Directories::getDataDir() + "applications/acquisition-server/filters/f64_20k_512.bin", m_filters); + break; + default: m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] Vamp Driver: Unsupported physical sampling rate [" << m_physicalSamplingHz << "].\n"; + return false; + } + + // Builds up a buffer to store acquired samples. This buffer will be sent to the acquisition server later. + m_samples.clear(); + m_samples.resize(m_header.getChannelCount()); + m_resolutions.clear(); + m_resolutions.resize(m_header.getChannelCount()); + + // Prepares cache for filtering + m_sampleCaches.clear(); + for (size_t i = 0; i < m_filters.size(); ++i) { m_sampleCaches.push_back(m_samples); } + + // Setting the inner latency as described in the beginning of the file + m_nDriftOffsetSample = int64_t(m_header.getSamplingFrequency() * 50) / 1000; + m_driverCtx.setInnerLatencySampleCount(-m_nDriftOffsetSample); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Driver inner latency set to 50ms to compensate FIR filtering.\n"; + + // Prepares downsampling + m_counter = 0; + m_counterStep = (uint64_t(m_header.getSamplingFrequency()) << 32) / m_physicalSamplingHz; + + // Gets device Id + int deviceId = m_header.getDeviceId(); + + //__________________________________ + // Hardware initialization + + // if no device selected with the properties dialog + // we take the last device connected + if (deviceId == FA_ID_INVALID) + { + // We try to get the last opened device, + uint32_t lastOpenedDeviceID = faGetCount(); // Get the last opened Device id. + + if (lastOpenedDeviceID == FA_ID_INVALID) // failed + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] VAmp Driver: faGetCount failed to get last opened device.\n"; + return false; + } + + deviceId = faGetId(lastOpenedDeviceID - 1); + m_header.setDeviceId(deviceId); + } + + if (deviceId != FA_ID_INVALID) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "[INIT] VAmp Driver: Active device ID(" << m_header.getDeviceId() << ").\n"; + } + else + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] VAmp Driver: No device connected !\n"; + return false; + } + + // Open the device. + int openReturn = faOpen(deviceId); + if (openReturn != FA_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] VAmp Driver: faOpen(" << deviceId << ") FAILED(" << openReturn << ").\n"; + return false; + } + + if (m_acquisitionMode == VAmp4Fast) { faSetDataMode(deviceId, dm20kHz4Channels, &(m_header.getFastModeSettings())); } + else { faSetDataMode(deviceId, dmNormal, nullptr); } + + if (m_driverCtx.isImpedanceCheckRequested()) + { + faStart(deviceId); + faStartImpedance(deviceId); + } + + if (!m_driverCtx.isImpedanceCheckRequested()) + { + HBITMAP bitmap = HBITMAP(LoadImage(nullptr, Directories::getDataDir() + "/applications/acquisition-server/vamp-standby.bmp",IMAGE_BITMAP, 0, 0, + LR_LOADFROMFILE)); + if (bitmap == nullptr || faSetBitmap(m_header.getDeviceId(), bitmap) != FA_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "[LOOP] VAmp Driver: BMP load failed.\n"; + } + } + + + // Gets properties + t_faProperty properties; + if (faGetProperty(m_header.getDeviceId(), &properties)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not get properties - Got error \n"; + return false; + } + + size_t j = 0; + for (size_t i = 0; i < m_nEEGChannel; i++, j++) m_resolutions[j] = m_header.getChannelGain(i) * properties.ResolutionEeg * 1E6f; // converts to uV + for (size_t i = 0; i < m_nAuxiliaryChannel; i++, j++) m_resolutions[j] = properties.ResolutionAux * 1E6f; // converts to uV + + for (size_t i = 0; i < m_nEEGChannel; i++, j++) { m_header.setChannelUnits(i, OVTK_UNIT_Volts, OVTK_FACTOR_Micro); } + for (size_t i = 0; i < m_nAuxiliaryChannel; i++, j++) + { + m_header.setChannelUnits(i, OVTK_UNIT_Volts, OVTK_FACTOR_Micro); // converts to uV + } + + //__________________________________ + // Saves parameters + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + + return true; +} + +bool CDriverBrainProductsVAmp::start() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "START called.\n"; + if (!m_driverCtx.isConnected()) { return false; } + + if (m_driverCtx.isStarted()) { return false; } + + m_firstStart = true; + uint32_t error = FA_ERR_OK; + int deviceId = m_header.getDeviceId(); + + if (m_driverCtx.isImpedanceCheckRequested()) + { + faStopImpedance(deviceId); + // stops the impedance mode, but not the acquisition + } + else + { + // we did not start the acquisition yet, let's do it now. + error = faStart(deviceId); + } + + if (error != FA_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[START] VAmp Driver: faStart FAILED(" << error << "). Closing device.\n"; + faClose(deviceId); + return false; + } + + //The bonus... + HBITMAP bitmap = HBITMAP(LoadImage(nullptr, Directories::getDataDir() + "/applications/acquisition-server/vamp-acquiring.bmp",IMAGE_BITMAP, 0, 0, + LR_LOADFROMFILE)); + if (bitmap == nullptr || faSetBitmap(m_header.getDeviceId(), bitmap) != FA_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "[START] VAmp Driver: BMP load failed.\n"; + } + + return true; +} + +bool CDriverBrainProductsVAmp::loop() +{ + if (!m_driverCtx.isConnected()) { return false; } + + t_faDataModel16 bufferVAmp16; // buffer for the next block in normal mode + uint32_t lengthVAmp16 = sizeof(t_faDataModel16); + + t_faDataModel8 bufferVAmp8; // buffer for the next block in normal mode + uint32_t lengthVAmp8 = sizeof(t_faDataModel8); + + t_faDataFormatMode20kHz bufferVamp4Fast; // buffer for fast mode acquisition + uint32_t lengthVAmp4Fast = sizeof(t_faDataFormatMode20kHz); + + uint32_t status = 0; + + int deviceId = m_header.getDeviceId(); + + if (m_driverCtx.isStarted()) + { + uint32_t nReceivedSamples = 0; +#if DEBUG + uint32_t nReadError = 0; + uint32_t nReadSuccess = 0; + uint32_t nReadZero = 0; +#endif + if (m_firstStart) + { + //empty buffer + switch (m_acquisitionMode) + { + case VAmp16: while (faGetData(deviceId, &bufferVAmp16, lengthVAmp16) > 0); + status = bufferVAmp16.Status; + break; + case VAmp8: while (faGetData(deviceId, &bufferVAmp8, lengthVAmp8) > 0); + status = bufferVAmp8.Status; + break; + case VAmp4Fast: while (faGetData(deviceId, &bufferVamp4Fast, lengthVAmp4Fast) > 0); + status = bufferVamp4Fast.Status; + break; + default: break; + } + // Trigger: Digital inputs (bits 0 - 8) + output (bit 9) state + 22 MSB reserved bits + // The trigger value received is in [0-255] + status &= 0x000000ff; + m_lastTrigger = status; + m_firstStart = false; + } + + bool finished = false; + while (!finished) + { + // we need to "getData" with the right output structure according to acquisition mode + + int returnLength; + signed int* eegArray; + signed int* auxiliaryArray = nullptr; + status = 0; + switch (m_acquisitionMode) + { + case VAmp16: returnLength = faGetData(deviceId, &bufferVAmp16, lengthVAmp16); + eegArray = bufferVAmp16.Main; + auxiliaryArray = bufferVAmp16.Aux; + status = bufferVAmp16.Status; + break; + + case VAmp8: returnLength = faGetData(deviceId, &bufferVAmp8, lengthVAmp8); + eegArray = bufferVAmp8.Main; + auxiliaryArray = bufferVAmp8.Aux; + status = bufferVAmp8.Status; + break; + + case VAmp4Fast: returnLength = faGetData(deviceId, &bufferVamp4Fast, lengthVAmp4Fast); + eegArray = bufferVamp4Fast.Main; + // auxiliaryArray = bufferVamp4Fast.Aux; + status = bufferVamp4Fast.Status; + break; + + default: m_driverCtx.getLogManager() << Kernel::LogLevel_ImportantWarning << "[LOOP] VAmp Driver: unsupported acquisition mode, this should never happen\n"; + return false; + } + // Trigger: Digital inputs (bits 0 - 8) + output (bit 9) state + 22 MSB reserved bits + // The trigger value received is in [0-255] + status &= 0x000000ff; + + if (returnLength > 0) + { +#if DEBUG + nReadSuccess++; +#endif + + // Stores acquired sample + for (size_t i = 0; i < m_nEEGChannel; ++i) { m_samples[i] = float((eegArray[i] - eegArray[m_nEEGChannel]) * m_resolutions[i]); } + for (size_t i = 0; i < m_nAuxiliaryChannel; ++i) { m_samples[m_nEEGChannel + i] = float(auxiliaryArray[i] * m_resolutions[i]); } + for (size_t i = 0; i < m_nTriggerChannel; ++i) { m_samples[m_nEEGChannel + m_nAuxiliaryChannel + i] = float(status); } + + // Updates cache + //m_sampleCaches.erase(m_sampleCaches.begin()); + m_sampleCaches.pop_front(); + m_sampleCaches.push_back(m_samples); + + // Every time that a trigger has changed, we send a stimulation. + if (status != m_lastTrigger) + { + // The date is relative to the last buffer start time (cf the setSamples before setStimulationSet) + const uint64_t date = CTime(m_physicalSamplingHz, m_nTotalSample).time(); + // Code of stimulation = OVTK_StimulationId_LabelStart + value of the trigger bytes. + m_stimSet.push_back(OVTK_StimulationId_Label(status), 0, 0); + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "[LOOP] VAmp Driver: Send stimulation: " << status << " at date: " << date << ".\n"; + m_lastTrigger = status; + } + + m_counter += m_counterStep; + if (m_counter >= (1LL << 32)) + { + m_counter -= (1LL << 32); + + // Filters last samples + for (size_t i = 0; i < m_samples.size(); ++i) + { + m_samples[i] = 0; + auto it = m_sampleCaches.begin(); + for (size_t j = 0; j < m_filters.size(); ++j) + { + //m_samples[i]+=m_filters[j]*m_sampleCaches[j][i]; + m_samples[i] += float(m_filters[j] * (*it)[i]); + ++it; + } + } + + m_callback->setSamples(&m_samples[0], 1); + m_callback->setStimulationSet(m_stimSet); + m_stimSet.clear(); + } + nReceivedSamples++; + } + else if (returnLength == 0) + { + finished = true; + System::Time::sleep(2); + } +#if DEBUG + if(returnLength < 0) + { + nReadError++; + finished = true; + } + if(returnLength == 0) + { + nReadZero++; + finished = true; + } +#endif + } +#if DEBUG + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "[LOOP] VAmp Driver: stats for the current block : Success="<<l_uint32ReadSuccessCount<<" Error="<<l_uint32ReadErrorCount<<" Zero="<<nReadZero<<"\n"; +#endif + //____________________________ + + // As described in at the begining of this file, the drift + // correction process is altered to consider the ~ 50ms delay + // of the single way filtering process + // Inner latency was set accordingly. + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + } + else + { + // we drop any data in internal buffer + switch (m_acquisitionMode) + { + case VAmp16: while (faGetData(deviceId, &bufferVAmp16, lengthVAmp16) > 0); + break; + case VAmp8: while (faGetData(deviceId, &bufferVAmp8, lengthVAmp8) > 0); + break; + case VAmp4Fast: while (faGetData(deviceId, &bufferVamp4Fast, lengthVAmp4Fast) > 0); + break; + default: break; + } + + if (m_driverCtx.isImpedanceCheckRequested()) + { + // Reads impedances + std::vector<uint32_t> buffer; + buffer.resize(20, 0); // all possible channels + ground electrode + uint32_t error = faGetImpedance(deviceId, &buffer[0], 20 * sizeof(uint32_t)); + if (error != FA_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[LOOP] Can not read impedances on device id " << deviceId << " - faGetImpedance FAILED(" << + error << ")\n"; + } + else + { + // Updates impedances + + const uint64_t goodImpedanceLimit = m_driverCtx.getConfigurationManager().expandAsUInteger("${AcquisitionServer_DefaultImpedanceLimit}", 5000); + // as with the default acticap settings (values provided by Brain Products) : + const uint64_t badImpedanceLimit = 2 * goodImpedanceLimit; + + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Impedances are [ "; + for (uint32_t j = 0; j < m_nEEGChannel; ++j)//we do not update the last impedance (ground) + { + m_driverCtx.updateImpedance(j, buffer[j]); + m_driverCtx.getLogManager() << buffer[j] << " "; + } + m_driverCtx.getLogManager() << "]\n"; + + //print impedances on the LCD screen + HBITMAP bitmapHandler = HBITMAP(LoadImage(nullptr, Directories::getDataDir() + "/applications/acquisition-server/vamp-impedance-mask.bmp", + IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE | LR_CREATEDIBSECTION)); + if (bitmapHandler) + { + BITMAP bitmap; + GetObject(bitmapHandler, sizeof(bitmap), &bitmap); + //uint32_t width = bitmap.bmWidth; + const uint32_t height = bitmap.bmHeight; + BYTE* bytePtr = static_cast<BYTE*>(bitmap.bmBits); // 3 bytes per pixel for RGB values + + //printf("H x W : %u x %u with %u per scan\n", height, width, bitmap.bmWidthBytes); + + for (uint32_t y = 0; y < height; ++y) // scan lines + { + uint32_t x = 0; + for (uint32_t byteIdx = 0; byteIdx < uint32_t(bitmap.bmWidthBytes); byteIdx += 3) + { + x++; + unsigned char* b = (bytePtr + bitmap.bmWidthBytes * y + byteIdx); + unsigned char* g = (bytePtr + bitmap.bmWidthBytes * y + byteIdx + 1); + unsigned char* r = (bytePtr + bitmap.bmWidthBytes * y + byteIdx + 2); + // The impedance mask is a BLACK and WHITE bitmap with grey squares for the channels. + // For each channel, the grey RGB components are equal to OVAS_Driver_VAmp_ImpedanceMask_BaseComponent - channel index - 1 + // e.g. with 16 channels and base at 127, the 5th channel square as RGB components to 127 - 5 = 122 + // Every pixel in the grey range is a channel square and needs repaint according to impedance. + if (*r < OVAS_Driver_VAmp_ImpedanceMask_BaseComponent && *r >= OVAS_Driver_VAmp_ImpedanceMask_BaseComponent - m_nEEGChannel + && *g < OVAS_Driver_VAmp_ImpedanceMask_BaseComponent && *g >= OVAS_Driver_VAmp_ImpedanceMask_BaseComponent - m_nEEGChannel + && *b < OVAS_Driver_VAmp_ImpedanceMask_BaseComponent && *b >= OVAS_Driver_VAmp_ImpedanceMask_BaseComponent - m_nEEGChannel) + { + const uint32_t idx = OVAS_Driver_VAmp_ImpedanceMask_BaseComponent - *r - 1; //0-based + if (buffer[idx] <= goodImpedanceLimit) + { + // good impedance: green + *r = 0x00; + *g = 0xff; + *b = 0x00; + } + else if (buffer[idx] <= badImpedanceLimit) + { + // unsufficient impedance: yellow + *r = 0xff; + *g = 0xff; + *b = 0x00; + } + else + { + // bad impedance: red + *r = 0xff; + *g = 0x00; + *b = 0x00; + } + } + } + } + } + + if (bitmapHandler == nullptr || faSetBitmap(m_header.getDeviceId(), bitmapHandler) != FA_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "[LOOP] VAmp Driver: BMP load failed.\n"; + } + } + } + } + + return true; +} + +bool CDriverBrainProductsVAmp::stop() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "STOP called.\n"; + if (!m_driverCtx.isConnected()) { return false; } + + if (!m_driverCtx.isStarted()) { return false; } + + if (m_driverCtx.isImpedanceCheckRequested()) { faStartImpedance(m_header.getDeviceId()); } + + m_firstStart = false; + if (!m_driverCtx.isImpedanceCheckRequested()) + { + HBITMAP bitmap = (HBITMAP)LoadImage(nullptr, Directories::getDataDir() + "/applications/acquisition-server/vamp-standby.bmp",IMAGE_BITMAP, 0, 0, + LR_LOADFROMFILE); + if (bitmap == nullptr || faSetBitmap(m_header.getDeviceId(), bitmap) != FA_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "[STOP] VAmp Driver: BMP load failed.\n"; + } + } + + return true; +} + +bool CDriverBrainProductsVAmp::uninitialize() +{ + if (!m_driverCtx.isConnected()) { return false; } + + if (m_driverCtx.isStarted()) { return false; } + + uint32_t error = faStop(m_header.getDeviceId()); + if (error != FA_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[UINIT] VAmp Driver: faStop FAILED(" << error << ").\n"; + faClose(m_header.getDeviceId()); + return false; + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Uninitialize called. Closing the device.\n"; + + + // for a black bitmap use : + //HDC hDC = CreateCompatibleDC(NULL); + //HBITMAP bitmap = CreateCompatibleBitmap(l_hDC, 320, 240); + // Default bitmap : BP image (provided by N. Soldati) + HBITMAP bitmap = HBITMAP(LoadImage(nullptr, Directories::getDataDir() + "/applications/acquisition-server/vamp-default.bmp",IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE)); + if (faSetBitmap(m_header.getDeviceId(), bitmap) != FA_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "[UINIT] VAmp Driver: BMP load failed.\n"; + } + + + error = faClose(m_header.getDeviceId()); + if (error != FA_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[UINIT] VAmp Driver: faClose FAILED(" << error << ").\n"; + return false; + } + + m_callback = nullptr; + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverBrainProductsVAmp::configure() +{ + // the specific header is passed into the specific configuration + CConfigurationBrainProductsVAmp config(m_driverCtx, Directories::getDataDir() + "/applications/acquisition-server/interface-BrainProducts-VAmp.ui", + &m_header, m_acquireAuxiliaryAsEEG, m_acquireTriggerAsEEG); + + if (!config.configure(*(m_header.getBasicHeader()))) { return false; } // the basic configure will use the basic header + + m_settings.save(); + + if (m_acquisitionMode == VAmp4Fast) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Pair names :\n"; + for (uint32_t i = 0; i < m_header.getPairCount(); ++i) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << " Pair " << i << " > " << m_header.getPairName(i) << "\n"; + } + } + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyUSBFirstAmpAPI diff --git a/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-vamp/ovasCDriverBrainProductsVAmp.h b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-vamp/ovasCDriverBrainProductsVAmp.h new file mode 100644 index 0000000000000000000000000000000000000000..fb941e5b9b6dfbe2244a9fc14c103de293e28bc8 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-vamp/ovasCDriverBrainProductsVAmp.h @@ -0,0 +1,89 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyUSBFirstAmpAPI + +#include "ovasIDriver.h" +#include "ovasCHeaderBrainProductsVAmp.h" +#include <openvibe/ov_all.h> + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +#include <vector> +#include <deque> + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverBrainProductsVAmp + * \author Laurent Bonnet (INRIA) + * \date 16 nov 2009 + * \erief The CDriverBrainProductsVAmp allows the acquisition server to acquire data from a USB-VAmp-16 amplifier (BrainProducts GmbH). + * + * The driver allows 2 different acquisition modes: normal (2kHz sampling frequency - max 16 electrodes) + * or fast (20kHz sampling frequency, 4 monopolar or differential channels). + * The driver uses a dedicated Header. + * + * \sa CHeaderBrainProductsVAmp + */ +class CDriverBrainProductsVAmp final : public IDriver +{ +public: + + explicit CDriverBrainProductsVAmp(IDriverContext& ctx); + ~CDriverBrainProductsVAmp() override; + const char* getName() override; + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override { return true; } + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + +protected: + + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + + bool m_acquireAuxiliaryAsEEG = false; + bool m_acquireTriggerAsEEG = false; + + CHeaderBrainProductsVAmp m_header; + + EAcquisitionModes m_acquisitionMode = VAmp16; + uint32_t m_nSamplePerSentBlock = 0; + uint32_t m_nTotalSample = 0; + uint32_t m_nEEGChannel = 0; + uint32_t m_nAuxiliaryChannel = 0; + uint32_t m_nTriggerChannel = 0; + + std::vector<size_t> m_stimulationIDs; + std::vector<size_t> m_stimulationDates; + std::vector<size_t> m_stimulationSamples; + CStimulationSet m_stimSet; + uint32_t m_lastTrigger = 0; + + std::deque<std::vector<float>> m_sampleCaches; + std::vector<float> m_samples; + std::vector<double> m_filters; + std::vector<float> m_resolutions; + + int64_t m_nDriftOffsetSample = 0; + uint32_t m_physicalSamplingHz = 0; + uint64_t m_counterStep = 0; + uint64_t m_counter = 0; + +private: + + bool m_firstStart = false; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyUSBFirstAmpAPI diff --git a/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-vamp/ovasCHeaderBrainProductsVAmp.cpp b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-vamp/ovasCHeaderBrainProductsVAmp.cpp new file mode 100644 index 0000000000000000000000000000000000000000..7f58eee4b194799410734dec1a99f4d38a1028df --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-vamp/ovasCHeaderBrainProductsVAmp.cpp @@ -0,0 +1,262 @@ +#include "ovasCHeaderBrainProductsVAmp.h" +#include "ovasCConfigurationBrainProductsVAmp.h" + +#if defined TARGET_HAS_ThirdPartyUSBFirstAmpAPI + +#include <windows.h> +#include <FirstAmp.h> + +#include <map> +#include <string> + +#define _NoValueI_ 0xffffffff + +namespace OpenViBE { +namespace AcquisitionServer { + +static size_t eegChannelCounts[] = { 16, 8, 4 }; +static size_t auxiliaryChannelCounts[] = { 2, 2, 0 }; +static size_t triggerChannelCounts[] = { 1, 1, 1 }; + +//___________________________________________________________________// +// // + +CHeaderBrainProductsVAmp::CHeaderBrainProductsVAmp() +{ + m_basicHeader = new CHeader(); + + // additional information + m_deviceID = -1; + m_acquisitionMode = VAmp16; + + // Pair information + m_nPair = 0; +} + +void CHeaderBrainProductsVAmp::reset() +{ + m_basicHeader->reset(); + m_deviceID = FA_ID_INVALID; + + // Pair information + m_nPair = 0; +} + +//___________________________________________________________________// +// // + +size_t CHeaderBrainProductsVAmp::getEEGChannelCount(const size_t acquisitionMode) { return eegChannelCounts[acquisitionMode]; } +size_t CHeaderBrainProductsVAmp::getAuxiliaryChannelCount(const size_t acquisitionMode) { return auxiliaryChannelCounts[acquisitionMode]; } +size_t CHeaderBrainProductsVAmp::getTriggerChannelCount(const size_t acquisitionMode) { return triggerChannelCounts[acquisitionMode]; } + +// Pair information + +bool CHeaderBrainProductsVAmp::setPairCount(const size_t count) +{ + m_nPair = count; + m_names.clear(); + m_gains.clear(); + return m_nPair != size_t(-1); +} + +bool CHeaderBrainProductsVAmp::setPairName(const size_t index, const char* name) +{ + m_names[index] = name; + return index < m_nPair; +} + +bool CHeaderBrainProductsVAmp::setPairGain(const size_t index, const float gain) +{ + m_gains[index] = gain; + return index < m_nPair; +} + +bool CHeaderBrainProductsVAmp::setPairUnits(const size_t index, const size_t unit, const size_t factor) +{ + m_units[index] = std::pair<size_t, size_t>(unit, factor); + return index < m_nPair; +} + +bool CHeaderBrainProductsVAmp::setFastModeSettings(t_faDataModeSettings settings) +{ + m_tFastModeSettings = settings; + return isFastModeSettingsSet(); +} + +const char* CHeaderBrainProductsVAmp::getPairName(const size_t index) const +{ + const auto i = m_names.find(index); + if (i == m_names.end()) { return ""; } + return i->second.c_str(); +} + +float CHeaderBrainProductsVAmp::getPairGain(const size_t index) const +{ + const auto i = m_gains.find(index); + if (i == m_gains.end()) { return (index < m_nPair ? 1.0f : 0.0f); } + return i->second; +} + +bool CHeaderBrainProductsVAmp::getPairUnits(const size_t index, size_t& unit, size_t& factor) const +{ + const auto i = m_units.find(index); + if (i == m_units.end()) + { + unit = OVTK_UNIT_Unspecified; + factor = OVTK_FACTOR_Base; + + return false; + } + unit = (i->second).first; + factor = (i->second).second; + + return true; +} + +//___________________________________________________________________// +// // + +bool CHeaderBrainProductsVAmp::setDeviceId(const int id) +{ + m_deviceID = id; + return m_deviceID != _NoValueI_; +} + +bool CHeaderBrainProductsVAmp::isDeviceIdSet() const { return m_deviceID != _NoValueI_; } + +bool CHeaderBrainProductsVAmp::isFastModeSettingsSet() const +{ + return (m_tFastModeSettings.Mode20kHz4Channels.ChannelsPos[0] == _NoValueI_ + || m_tFastModeSettings.Mode20kHz4Channels.ChannelsNeg[0] == _NoValueI_ + || m_tFastModeSettings.Mode20kHz4Channels.ChannelsPos[1] == _NoValueI_ + || m_tFastModeSettings.Mode20kHz4Channels.ChannelsNeg[1] == _NoValueI_ + || m_tFastModeSettings.Mode20kHz4Channels.ChannelsPos[2] == _NoValueI_ + || m_tFastModeSettings.Mode20kHz4Channels.ChannelsNeg[2] == _NoValueI_ + || m_tFastModeSettings.Mode20kHz4Channels.ChannelsPos[3] == _NoValueI_ + || m_tFastModeSettings.Mode20kHz4Channels.ChannelsNeg[3] == _NoValueI_); +} + +//___________________________________________________________________// +// // + +// Channel information + +bool CHeaderBrainProductsVAmp::setChannelCount(const size_t nChannel) +{ + if (m_acquisitionMode == VAmp4Fast) + { + // in fast mode the channel count is the pair count (to display in the designer as a "channel") + return this->setPairCount(nChannel); + } + return m_basicHeader->setChannelCount(nChannel); +} + +bool CHeaderBrainProductsVAmp::setChannelName(const size_t index, const char* name) +{ + if (m_acquisitionMode == VAmp4Fast) + { + // in fast mode the channel count is the pair count (to display in the designer as a "channel") + return this->setPairName(index, name); + } + return m_basicHeader->setChannelName(index, name); +} + +bool CHeaderBrainProductsVAmp::setChannelGain(const size_t index, const float gain) +{ + if (m_acquisitionMode == VAmp4Fast) + { + // in fast mode the channel count is the pair count (to display in the designer as a "channel") + return this->setPairGain(index, gain); + } + return m_basicHeader->setChannelGain(index, gain); +} + +bool CHeaderBrainProductsVAmp::setChannelUnits(const size_t index, const size_t unit, const size_t factor) +{ + if (m_acquisitionMode == VAmp4Fast) + { + // in fast mode the channel count is the pair count (to display in the designer as a "channel") + return this->setPairUnits(index, unit, factor); + } + return m_basicHeader->setChannelUnits(index, unit, factor); +} + +size_t CHeaderBrainProductsVAmp::getChannelCount() const +{ + if (m_acquisitionMode == VAmp4Fast) + { + // in fast mode the channel count is the pair count (to display in the designer as a "channel") + return this->getPairCount(); + } + return m_basicHeader->getChannelCount(); +} + +const char* CHeaderBrainProductsVAmp::getChannelName(const size_t index) const +{ + if (m_acquisitionMode == VAmp4Fast) + { + // in fast mode the channel count is the pair count (to display in the designer as a "channel") + return this->getPairName(index); + } + return m_basicHeader->getChannelName(index); +} + +float CHeaderBrainProductsVAmp::getChannelGain(const size_t index) const +{ + if (m_acquisitionMode == VAmp4Fast) + { + // in fast mode the channel count is the pair count (to display in the designer as a "channel") + return this->getPairGain(index); + } + return m_basicHeader->getChannelGain(index); +} + +bool CHeaderBrainProductsVAmp::getChannelUnits(const size_t index, size_t& unit, size_t& factor) const +{ + if (m_acquisitionMode == VAmp4Fast) { return this->getPairUnits(index, unit, factor); } + return m_basicHeader->getChannelUnits(index, unit, factor); +} + +bool CHeaderBrainProductsVAmp::isChannelCountSet() const +{ + if (m_acquisitionMode == VAmp4Fast) + { + // in fast mode the channel count is the pair count (to display in the designer as a "channel") + return this->isPairCountSet(); + } + return m_basicHeader->isChannelCountSet(); +} + +bool CHeaderBrainProductsVAmp::isChannelNameSet() const +{ + if (m_acquisitionMode == VAmp4Fast) + { + // in fast mode the channel count is the pair count (to display in the designer as a "channel") + return this->isPairNameSet(); + } + return m_basicHeader->isChannelNameSet(); +} + +bool CHeaderBrainProductsVAmp::isChannelGainSet() const +{ + if (m_acquisitionMode == VAmp4Fast) + { + // in fast mode the channel count is the pair count (to display in the designer as a "channel") + return this->isPairGainSet(); + } + return m_basicHeader->isChannelGainSet(); +} + +bool CHeaderBrainProductsVAmp::isChannelUnitSet() const +{ + if (m_acquisitionMode == VAmp4Fast) + { + // in fast mode the channel count is the pair count (to display in the designer as a "channel") + return this->isPairUnitSet(); + } + return m_basicHeader->isChannelUnitSet(); +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyUSBFirstAmpAPI diff --git a/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-vamp/ovasCHeaderBrainProductsVAmp.h b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-vamp/ovasCHeaderBrainProductsVAmp.h new file mode 100644 index 0000000000000000000000000000000000000000..308c4aec5d83d11cb51780003286d64cf299b11b --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/brainproducts-vamp/ovasCHeaderBrainProductsVAmp.h @@ -0,0 +1,128 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyUSBFirstAmpAPI + +#include "../ovasCHeader.h" + +#include <windows.h> +#include <FirstAmp.h> + +#include<map> + +namespace OpenViBE { +namespace AcquisitionServer { + +enum EAcquisitionModes { VAmp16 = 0, VAmp8 = 1, VAmp4Fast = 2 }; + +/** + * \class CHeaderBrainProductsVAmp + * \author Laurent Bonnet (INRIA) + * \date 16 nov 2009 + * \erief The CHeaderBrainProductsVAmp is an Adaptator for the VAmp device. + * + * It contains basic functions using the basic header behaviour, and a set of specific functions to handle the Fast Mode data. + * + * \sa CDriverBrainProductsVAmp + */ +class CHeaderBrainProductsVAmp final : public IHeader +{ +public: + + CHeaderBrainProductsVAmp(); + ~CHeaderBrainProductsVAmp() override { delete m_basicHeader; } + void reset() override; + + // Experiment information + bool setExperimentID(const size_t experimentID) override { return m_basicHeader->setExperimentID(experimentID); } + bool setSubjectAge(const size_t subjectAge) override { return m_basicHeader->setSubjectAge(subjectAge); } + bool setSubjectGender(const size_t subjectGender) override { return m_basicHeader->setSubjectGender(subjectGender); } + + size_t getExperimentID() const override { return m_basicHeader->getExperimentID(); } + size_t getSubjectAge() const override { return m_basicHeader->getSubjectAge(); } + size_t getSubjectGender() const override { return m_basicHeader->getSubjectGender(); } + + bool isExperimentIDSet() const override { return m_basicHeader->isExperimentIDSet(); } + bool isSubjectAgeSet() const override { return m_basicHeader->isSubjectAgeSet(); } + bool isSubjectGenderSet() const override { return m_basicHeader->isSubjectGenderSet(); } + + void setImpedanceCheckRequested(const bool state) override { m_basicHeader->setImpedanceCheckRequested(state); } + bool isImpedanceCheckRequested() const override { return m_basicHeader->isImpedanceCheckRequested(); } + size_t getImpedanceLimit() const override { return m_impedanceLimit; } + + void setImpedanceLimit(const size_t limit) override { m_impedanceLimit = limit; } + + // Channel information + bool setChannelCount(const size_t nChannel) override; + bool setChannelName(const size_t index, const char* name) override; + bool setChannelGain(const size_t index, const float gain) override; + bool setChannelUnits(const size_t index, const size_t unit, const size_t factor) override; + + size_t getChannelCount() const override; + const char* getChannelName(const size_t index) const override; + float getChannelGain(const size_t index) const override; + bool getChannelUnits(const size_t index, size_t& unit, size_t& factor) const override; + + bool isChannelCountSet() const override; + bool isChannelNameSet() const override; + bool isChannelGainSet() const override; + bool isChannelUnitSet() const override; + + // Samples information + bool setSamplingFrequency(const size_t sampling) override { return m_basicHeader->setSamplingFrequency(sampling); } + size_t getSamplingFrequency() const override { return m_basicHeader->getSamplingFrequency(); } + bool isSamplingFrequencySet() const override { return m_basicHeader->isSamplingFrequencySet(); } + + //------------- SPECIFIC FUNCTIONS ------------- + + EAcquisitionModes getAcquisitionMode() const { return m_acquisitionMode; } + void setAcquisitionMode(const EAcquisitionModes mode) { m_acquisitionMode = mode; } + + static size_t getEEGChannelCount(size_t acquisitionMode); + static size_t getAuxiliaryChannelCount(size_t acquisitionMode); + static size_t getTriggerChannelCount(size_t acquisitionMode); + + // Pair information + bool setPairCount(const size_t count); + bool setPairName(const size_t index, const char* name); + bool setPairGain(const size_t index, const float gain); + bool setPairUnits(const size_t index, const size_t unit, const size_t factor); + bool setDeviceId(int id); + bool setFastModeSettings(t_faDataModeSettings settings); + + size_t getPairCount() const { return m_nPair; } + const char* getPairName(const size_t index) const; + float getPairGain(const size_t index) const; + bool getPairUnits(const size_t index, size_t& unit, size_t& factor) const; + int getDeviceId() const { return m_deviceID; } + t_faDataModeSettings getFastModeSettings() const { return m_tFastModeSettings; } + + bool isPairCountSet() const { return m_nPair != size_t(-1) && m_nPair != 0; } + bool isPairNameSet() const { return isPairCountSet(); } + bool isPairGainSet() const { return isPairCountSet(); } + bool isPairUnitSet() const { return isPairCountSet(); } + bool isDeviceIdSet() const; + bool isFastModeSettingsSet() const; + + CHeader* getBasicHeader() const { return m_basicHeader; } + +protected: + + CHeader* m_basicHeader = nullptr; // the basic header + + // additional information + int m_deviceID = 0; + EAcquisitionModes m_acquisitionMode = VAmp16; + t_faDataModeSettings m_tFastModeSettings; + + // Pair information + size_t m_nPair = 0; + std::map<size_t, std::string> m_names; + std::map<size_t, float> m_gains; + std::map<size_t, std::pair<size_t, size_t>> m_units; + + size_t m_impedanceLimit = 5000; // 5kOhm +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyGUSBampCAPI diff --git a/applications/platform/acquisition-server/src/OVASDrivers/egi-ampserver/ovasCConfigurationEGIAmpServer.cpp b/applications/platform/acquisition-server/src/OVASDrivers/egi-ampserver/ovasCConfigurationEGIAmpServer.cpp new file mode 100644 index 0000000000000000000000000000000000000000..6830042b8b937c83c4960827f1ac137e57fe99b9 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/egi-ampserver/ovasCConfigurationEGIAmpServer.cpp @@ -0,0 +1,41 @@ +#include "ovasCConfigurationEGIAmpServer.h" + +#include <toolkit/ovtk_all.h> + +#include <iostream> + +namespace OpenViBE { +namespace AcquisitionServer { + +bool CConfigurationEGIAmpServer::preConfigure() +{ + const bool res = CConfigurationBuilder::preConfigure(); + + m_pHostName = GTK_WIDGET(gtk_builder_get_object(m_builder, "entry_host_name")); + m_pCommandPort = GTK_WIDGET(gtk_builder_get_object(m_builder, "spinbutton_command_port")); + m_pStreamPort = GTK_WIDGET(gtk_builder_get_object(m_builder, "spinbutton_stream_port")); + + gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_pCommandPort), m_commandPort); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(m_pStreamPort), m_streamPort); + + gtk_entry_set_text(GTK_ENTRY(m_pHostName), m_hostName.toASCIIString()); + + return res; +} + +bool CConfigurationEGIAmpServer::postConfigure() +{ + if (m_applyConfig) { + gtk_spin_button_update(GTK_SPIN_BUTTON(m_pStreamPort)); + gtk_spin_button_update(GTK_SPIN_BUTTON(m_pCommandPort)); + + m_streamPort = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(m_pStreamPort)); + m_commandPort = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(m_pCommandPort)); + m_hostName = gtk_entry_get_text(GTK_ENTRY(m_pHostName)); + } + + return CConfigurationBuilder::postConfigure(); +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASDrivers/egi-ampserver/ovasCConfigurationEGIAmpServer.h b/applications/platform/acquisition-server/src/OVASDrivers/egi-ampserver/ovasCConfigurationEGIAmpServer.h new file mode 100644 index 0000000000000000000000000000000000000000..758ddad82f2e72f50324a35a9440b698dae58cbf --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/egi-ampserver/ovasCConfigurationEGIAmpServer.h @@ -0,0 +1,38 @@ +#pragma once + +#include "../ovasCConfigurationBuilder.h" + +namespace OpenViBE { +namespace AcquisitionServer { +class CConfigurationEGIAmpServer final : public CConfigurationBuilder +{ +public: + explicit CConfigurationEGIAmpServer(const char* gtkBuilderFilename) : CConfigurationBuilder(gtkBuilderFilename) { } + ~CConfigurationEGIAmpServer() override { } + + void setHostName(const CString& hostName) { m_hostName = hostName; } + void setCommandPort(const uint32_t commandPort) { m_commandPort = commandPort; } + void setStreamPort(const uint32_t streamPort) { m_streamPort = streamPort; } + + CString getHostName() const { return m_hostName; } + uint32_t getCommandPort() const { return m_commandPort; } + uint32_t getStreamPort() const { return m_streamPort; } + + +protected: + bool preConfigure() override; + bool postConfigure() override; + +private: + CConfigurationEGIAmpServer() = delete; + +protected: + GtkWidget* m_pHostName = nullptr; + GtkWidget* m_pCommandPort = nullptr; + GtkWidget* m_pStreamPort = nullptr; + CString m_hostName = "localhost"; + uint32_t m_commandPort = 9877; + uint32_t m_streamPort = 9879; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASDrivers/egi-ampserver/ovasCDriverEGIAmpServer.cpp b/applications/platform/acquisition-server/src/OVASDrivers/egi-ampserver/ovasCDriverEGIAmpServer.cpp new file mode 100644 index 0000000000000000000000000000000000000000..7ab873d4162925886cf20259acc7c6464881a0df --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/egi-ampserver/ovasCDriverEGIAmpServer.cpp @@ -0,0 +1,294 @@ +#include "ovasCDriverEGIAmpServer.h" +#include "ovasCConfigurationEGIAmpServer.h" + +#include <toolkit/ovtk_all.h> + +#include <system/ovCMemory.h> + +#include <cstring> +#include <cstdio> +#include <iostream> + +namespace OpenViBE { +namespace AcquisitionServer { + +CDriverEGIAmpServer::CDriverEGIAmpServer(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_EGIAmpServer", m_driverCtx.getConfigurationManager()) +{ + m_serverHostName = "localhost"; + m_commandPort = 9877; + m_streamPort = 9879; + + m_header.setSamplingFrequency(1000); + m_header.setChannelCount(280); + + m_settings.add("Header", &m_header); + m_settings.add("AmpServerHostName", &m_serverHostName); + m_settings.add("CommandPort", &m_commandPort); + m_settings.add("StreamPort", &m_streamPort); + m_settings.load(); +} + +//___________________________________________________________________// +// // + +#define COMMAND_SIZE 4096 + +class CCommandConnectionHandler +{ +public: + explicit CCommandConnectionHandler(CDriverEGIAmpServer& driver, Socket::IConnection* connection = nullptr) + : m_Driver(driver), m_Connection(connection ? *connection : *driver.m_command), m_ListenToResponse(connection == nullptr) { } + + ~CCommandConnectionHandler() { } + + bool send(const char* cmd) const + { + m_Driver.m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Sending command >> [" << CString(cmd) << "]\n"; + m_Connection.sendBufferBlocking(cmd, strlen(cmd)); + m_Connection.sendBufferBlocking("\n", 1); + if (m_ListenToResponse) { + size_t i, l = 0; + char buffer[COMMAND_SIZE]; + do { + i = m_Connection.receiveBuffer(const_cast<char*>(buffer + l), 1); + if (i > 0) { l += i; } + } while (i == 0 || (i > 0 && buffer[l - 1] != '\0' && buffer[l - 1] != '\n')); + buffer[l > 1 ? l - 1 : l] = '\0'; + m_Driver.m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Received answer << [" << CString(buffer) << "]\n"; + } + return true; + } + + CDriverEGIAmpServer& m_Driver; + Socket::IConnection& m_Connection; + bool m_ListenToResponse; +}; + +#pragma pack(1) +typedef struct +{ + int64_t amplifierID; + uint64_t size; +} SAmpServerPacketHeader; +#pragma pack() + +// cmdHandler.send("(sendCommand cmd_NumberOfAmps -1 -1 -1)"); +// cmdHandler.send("(sendCommand cmd_SetPower 0 -1 1)"); +// cmdHandler.send("(sendCommand cmd_GetAmpDetails 0 -1 -1)"); +// cmdHandler.send("(sendCommand cmd_GetAmpStatus 0 -1 -1)"); +// cmdHandler.send("(sendCommand cmd_DefaultAcquisitionState 0 -1 -1)"); +// cmdHandler.send("(sendCommand cmd_DefaultSignalGeneration 0 -1 -1)"); +// cmdHandler.send("(sendCommand cmd_SetWaveShape 0 -1 1)"); +// cmdHandler.send("(sendCommand cmd_SetCalibrationSignalRange 0 -1 -1)"); +// cmdHandler.send("(sendCommand cmd_SetCalibrationSignalAmplitude 0 -1 -1)"); +// cmdHandler.send("(sendCommand cmd_SetCalibrationSignalFreq 0 -1 10)"); +// cmdHandler.send("(sendCommand cmd_TurnAllDriveSignals 0 -1 1)"); +// streamHandler.send("(sendCommand cmd_GetStatus -1 -1 -1)"); +// streamHandler.send("(sendCommand cmd_InstallEGINA300TestAmp -1 -1 -1)"); + +// cmdHandler.send("(sendCommand cmd_SetPower 0 -1 0)"); +// cmdHandler.send("(sendCommand cmd_Exit -1 -1 -1)"); + +bool CDriverEGIAmpServer::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + if (m_driverCtx.isConnected()) { return false; } + + m_command = Socket::createConnectionClient(); + if (!m_command->connect(m_serverHostName.toASCIIString(), m_commandPort)) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not connect to AmpServer command port [" + << m_serverHostName << ":" << m_commandPort << "]\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Please check the driver configuration and the firewall configuration\n"; + m_command->close(); + m_command->release(); + m_command = nullptr; + return false; + } + + m_stream = Socket::createConnectionClient(); + if (!m_stream->connect(m_serverHostName.toASCIIString(), m_streamPort)) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not connect to AmpServer stream port [" + << m_serverHostName << ":" << m_streamPort << "]\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Please check the driver configuration and the firewall configuration\n"; + m_stream->close(); + m_stream->release(); + m_stream = nullptr; + m_command->close(); + m_command->release(); + m_command = nullptr; + return false; + } + + m_buffer = new float[m_header.getChannelCount() * nSamplePerSentBlock]; + if (!m_buffer) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Memory allocation error.\n"; + m_stream->close(); + m_stream->release(); + m_stream = nullptr; + m_command->close(); + m_command->release(); + m_command = nullptr; + return false; + } + + this->execute(Directories::getDataDir() + "/applications/acquisition-server/scripts/egi-default-initialize.script"); + + const CCommandConnectionHandler cmdHandler(*this); + cmdHandler.send("(sendCommand cmd_Start 0 -1 -1)"); + + const CCommandConnectionHandler streamHandler(*this, m_stream); + streamHandler.send("(sendCommand cmd_ListenToAmp 0 -1 -1)"); + + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + m_sampleIdx = 0; + m_nChannel = m_header.getChannelCount(); + + return true; +} + +bool CDriverEGIAmpServer::start() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + this->execute(Directories::getDataDir() + "/applications/acquisition-server/scripts/egi-default-start.script"); + + return true; +} + +bool CDriverEGIAmpServer::loop() +{ + bool completedBuffer = false; + + if (!m_driverCtx.isConnected()) { return false; } + // if(!m_driverCtx.isStarted()) { return true; } + + SAmpServerPacketHeader header; + SAmpServerPacketHeader headerSwap; + + while (m_stream->isReadyToReceive() && !completedBuffer) { + m_stream->receiveBufferBlocking(reinterpret_cast<char*>(&headerSwap), sizeof(headerSwap)); + System::Memory::bigEndianToHost(reinterpret_cast<const uint8_t*>(&headerSwap.amplifierID), &header.amplifierID); + System::Memory::bigEndianToHost(reinterpret_cast<const uint8_t*>(&headerSwap.size), &header.size); + + if (header.size) { + float* bufferSwap = new float[size_t(header.size / sizeof(float))]; + m_stream->receiveBufferBlocking(reinterpret_cast<char*>(bufferSwap), uint32_t(header.size)); + + if (m_driverCtx.isStarted()) { + const uint32_t nSample = uint32_t(header.size / 1152); + for (uint32_t i = 0; i < nSample; ++i) { + for (uint32_t j = 0; j < m_nChannel; ++j) { + System::Memory::bigEndianToHost(reinterpret_cast<const uint8_t*>(bufferSwap + 8 + i * 288 + j), + m_buffer + j * m_nSamplePerSentBlock + m_sampleIdx); + } + + m_sampleIdx++; + if (m_sampleIdx == m_nSamplePerSentBlock) { + completedBuffer = true; + m_sampleIdx = 0; + m_callback->setSamples(m_buffer); + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + } + } + } + + delete [] bufferSwap; + } + } + + return true; +} + +bool CDriverEGIAmpServer::stop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + + this->execute(Directories::getDataDir() + "/applications/acquisition-server/scripts/egi-default-stop.script"); + + return true; +} + +bool CDriverEGIAmpServer::uninitialize() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + if (m_buffer) { + delete [] m_buffer; + m_buffer = nullptr; + } + + if (m_stream) { + const CCommandConnectionHandler handler(*this, m_stream); + handler.send("(sendCommand cmd_StopListeningToAmp 0 -1 -1)"); + + m_stream->close(); + m_stream->release(); + m_stream = nullptr; + } + + if (m_command) { + const CCommandConnectionHandler handler(*this); + handler.send("(sendCommand cmd_Stop 0 -1 -1)"); + + this->execute(Directories::getDataDir() + "/applications/acquisition-server/scripts/egi-default-uninitialize.script"); + + m_command->close(); + m_command->release(); + m_command = nullptr; + } + + m_callback = nullptr; + + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverEGIAmpServer::configure() +{ + CConfigurationEGIAmpServer config(Directories::getDataDir() + "/applications/acquisition-server/interface-egi-ampserver.ui"); + + config.setHostName(m_serverHostName); + config.setCommandPort(m_commandPort); + config.setStreamPort(m_streamPort); + + if (config.configure(m_header)) { + m_serverHostName = config.getHostName(); + m_commandPort = config.getCommandPort(); + m_streamPort = config.getStreamPort(); + m_settings.save(); + return true; + } + return false; +} + +//___________________________________________________________________// +// // + +bool CDriverEGIAmpServer::execute(const char* sScriptFilename) +{ + FILE* file = fopen(sScriptFilename, "rb"); + if (!file) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Could not find script [" << CString(sScriptFilename) << "]\n"; + return false; + } + + const CCommandConnectionHandler cmdHandler(*this); + while (!feof(file)) { + char buffer[4096]; + char* line = fgets(buffer, sizeof(buffer), file); + if (line) { + line[strlen(line) - 1] = '\0'; // replaces \n with \0 (\n is automatically added by the command handler) + cmdHandler.send(line); + } + } + + fclose(file); + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASDrivers/egi-ampserver/ovasCDriverEGIAmpServer.h b/applications/platform/acquisition-server/src/OVASDrivers/egi-ampserver/ovasCDriverEGIAmpServer.h new file mode 100644 index 0000000000000000000000000000000000000000..1845af160abe5ee86f95dfd3f31553a6bd9f0614 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/egi-ampserver/ovasCDriverEGIAmpServer.h @@ -0,0 +1,61 @@ +#pragma once + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +#include <socket/IConnectionClient.h> + +namespace OpenViBE { +namespace AcquisitionServer { +class CCommandConnectionHandler; + +/** + * \class CDriverEGIAmpServer + * \author Yann Renard (Inria) + */ +class CDriverEGIAmpServer final : public IDriver +{ +public: + friend class CCommandConnectionHandler; + + explicit CDriverEGIAmpServer(IDriverContext& ctx); + void release() { delete this; } + const char* getName() override { return "EGI Net Amps 300 (through AmpServer)"; } + + bool isFlagSet(const EDriverFlag flag) const override { return flag == EDriverFlag::IsUnstable; } + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override { return true; } + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + +protected: + bool execute(const char* sScriptFilename); + + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + CHeader m_header; + + Socket::IConnectionClient* m_command = nullptr; + Socket::IConnectionClient* m_stream = nullptr; + uint32_t m_nSamplePerSentBlock = 0; + uint32_t m_sampleIdx = 0; + uint32_t m_nChannel = 0; + float* m_buffer = nullptr; + + CString m_serverHostName = "localhost"; + uint32_t m_commandPort = 9877; + uint32_t m_streamPort = 9879; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASDrivers/emotiv-epoc/ovasCConfigurationEmotivEPOC.cpp b/applications/platform/acquisition-server/src/OVASDrivers/emotiv-epoc/ovasCConfigurationEmotivEPOC.cpp new file mode 100644 index 0000000000000000000000000000000000000000..221cd3ca45eb63450d7fe1d9e92d25205d58e20d --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/emotiv-epoc/ovasCConfigurationEmotivEPOC.cpp @@ -0,0 +1,54 @@ +#if defined TARGET_HAS_ThirdPartyEmotivAPI + +#include "ovasCConfigurationEmotivEPOC.h" + +namespace OpenViBE { +namespace AcquisitionServer { + +CConfigurationEmotivEPOC::CConfigurationEmotivEPOC(IDriverContext& ctx, const char* gtkBuilderFilename, bool& rUseGyroscope, CString& rPathToEmotivResearchSDK, uint32_t& rUserID) + : CConfigurationBuilder(gtkBuilderFilename), m_driverCtx(ctx), m_useGyroscope(rUseGyroscope), m_rPathToEmotivResearchSDK(rPathToEmotivResearchSDK), m_userID(rUserID) {} + +bool CConfigurationEmotivEPOC::preConfigure() +{ + if (! CConfigurationBuilder::preConfigure()) { return false; } + + GtkToggleButton* gyro = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_gyro")); + gtk_toggle_button_set_active(gyro, m_useGyroscope); + + GtkFileChooser* fileChooser = GTK_FILE_CHOOSER(gtk_builder_get_object(m_builder, "filechooserbutton")); + gtk_file_chooser_set_current_folder(fileChooser, m_rPathToEmotivResearchSDK.toASCIIString()); + + GtkSpinButton* userID = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_userid")); + gtk_spin_button_set_value(userID, m_userID); + return true; +} + +bool CConfigurationEmotivEPOC::postConfigure() +{ + if (m_applyConfig) + { + GtkToggleButton* gyro = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_gyro")); + m_useGyroscope = gtk_toggle_button_get_active(gyro) ? true : false; + + GtkSpinButton* userID = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_userid")); + gtk_spin_button_update(userID); + m_userID = uint32_t(gtk_spin_button_get_value(userID)); + + GtkFileChooser* fileChooser = GTK_FILE_CHOOSER(gtk_builder_get_object(m_builder, "filechooserbutton")); + gchar* dir = gtk_file_chooser_get_filename(fileChooser); + std::string tmpDstDir(dir); + for (auto it = tmpDstDir.begin(); it < tmpDstDir.end(); ++it) { if ((*it) == '\\') { tmpDstDir.replace(it, it + 1, 1, '/'); } } + tmpDstDir.push_back('/'); + m_rPathToEmotivResearchSDK = tmpDstDir.c_str(); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Path to Emotiv Research SDK is set to [" << m_rPathToEmotivResearchSDK.toASCIIString() << "]\n"; + } + + if (! CConfigurationBuilder::postConfigure()) { return false; } // normal header is filled, ressources are realesed + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyEmotivAPI diff --git a/applications/platform/acquisition-server/src/OVASDrivers/emotiv-epoc/ovasCConfigurationEmotivEPOC.h b/applications/platform/acquisition-server/src/OVASDrivers/emotiv-epoc/ovasCConfigurationEmotivEPOC.h new file mode 100644 index 0000000000000000000000000000000000000000..c1129e2df46273844244c259fb4f57e00fef9a85 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/emotiv-epoc/ovasCConfigurationEmotivEPOC.h @@ -0,0 +1,44 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyEmotivAPI + +#include "../ovasCConfigurationBuilder.h" +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +#include <gtk/gtk.h> + +#if defined TARGET_OS_Windows +#include <windows.h> +#endif + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CConfigurationEmotivEPOC + * \author Laurent Bonnet (INRIA) + * \date 21 july 2010 + * \erief The CConfigurationEmotivEPOC handles the configuration dialog specific to the Emotiv EPOC headset. + * + * \sa CDriverEmotivEPOC + */ +class CConfigurationEmotivEPOC final : public CConfigurationBuilder +{ +public: + + CConfigurationEmotivEPOC(IDriverContext& ctx, const char* gtkBuilderFilename, bool& rUseGyroscope, CString& rPathToEmotivResearchSDK, uint32_t& rUserID); + + bool preConfigure() override; + bool postConfigure() override; + +protected: + + IDriverContext& m_driverCtx; + bool& m_useGyroscope; + CString& m_rPathToEmotivResearchSDK; + uint32_t& m_userID; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyEmotivAPI diff --git a/applications/platform/acquisition-server/src/OVASDrivers/emotiv-epoc/ovasCDriverEmotivEPOC.cpp b/applications/platform/acquisition-server/src/OVASDrivers/emotiv-epoc/ovasCDriverEmotivEPOC.cpp new file mode 100644 index 0000000000000000000000000000000000000000..8ee45ada0eebfd3e7149e5cd0ab89ca198741b13 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/emotiv-epoc/ovasCDriverEmotivEPOC.cpp @@ -0,0 +1,422 @@ +#if defined TARGET_HAS_ThirdPartyEmotivAPI + +#include "ovasCDriverEmotivEPOC.h" +#include "ovasCConfigurationEmotivEPOC.h" + +#include <system/ovCTime.h> + +#include <cstdlib> +#include <cstring> + +#include <iostream> +#include <vector> + +#if defined(TARGET_OS_Windows) +#include <delayimp.h> +#endif + +namespace OpenViBE { +namespace AcquisitionServer { + + +#if defined(TARGET_HAS_ThirdPartyEmotivResearchAPI3x) +static const IEE_DataChannel_t CHANNEL_LIST[] = +{ + IED_AF3, IED_F7, IED_F3, IED_FC5, IED_T7, IED_P7, IED_O1, IED_O2, IED_P8, IED_T8, IED_FC6, IED_F4, IED_F8, IED_AF4, + IED_GYROX, IED_GYROY, + IED_COUNTER, + IED_TIMESTAMP, + IED_FUNC_ID, IED_FUNC_VALUE, + IED_MARKER, + IED_SYNC_SIGNAL +}; +#else +// Old API +static const EE_DataChannel_t CHANNEL_LIST[] = +{ + ED_AF3, ED_F7, ED_F3, ED_FC5, ED_T7, ED_P7, ED_O1, ED_O2, ED_P8, ED_T8, ED_FC6, ED_F4, ED_F8, ED_AF4, + ED_GYROX, ED_GYROY, + ED_COUNTER, + ED_TIMESTAMP, + ED_FUNC_ID, ED_FUNC_VALUE, + ED_MARKER, + ED_SYNC_SIGNAL +}; +#endif + +CDriverEmotivEPOC::CDriverEmotivEPOC(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_EmotivEPOC", m_driverCtx.getConfigurationManager()) +{ + m_useGyroscope = false; + m_pathToEmotivSDK = ""; + m_cmdForPathModification = ""; + + m_userID = 0; + m_readyToCollect = false; + m_firstStart = true; + + m_settings.add("Header", &m_header); + m_settings.add("UseGyroscope", &m_useGyroscope); + m_settings.add("PathToEmotivSDK", &m_pathToEmotivSDK); + m_settings.add("UserID", &m_userID); + m_settings.load(); +} + +CDriverEmotivEPOC::~CDriverEmotivEPOC() {} + +const char* CDriverEmotivEPOC::getName() { return "Emotiv EPOC"; } + +bool CDriverEmotivEPOC::restoreState() +{ + // Restore the previous path + if (m_oldPath.length() > 0) { _putenv_s("PATH", m_oldPath); } + +#if defined TARGET_OS_Windows + __FUnloadDelayLoadedDLL2("edk.dll"); +#endif + + return true; +} + +bool CDriverEmotivEPOC::buildPath() +{ + char* path = getenv("PATH"); + if (path == nullptr) { return false; } + + m_oldPath = path; + + const std::string str = std::string(path); + const size_t found = str.find(m_pathToEmotivSDK.toASCIIString()); + + if (found == std::string::npos) + { + // If the emotiv component is not part of the path, we add it. + m_cmdForPathModification = path + CString(";") + m_pathToEmotivSDK; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "[INIT] Emotiv Driver: Building new Windows PATH.\n"; + } + else + { + // If we found the emotiv component in path already, keep the path as-is. + m_cmdForPathModification = CString(path); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "[INIT] Emotiv Driver: Using the existing PATH.\n"; + } + + + return true; +} + +//___________________________________________________________________// +// // +bool CDriverEmotivEPOC::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + m_eventHandle = nullptr; + + //we need to add the path to Emotiv SDK to PATH: done in external function + //because SEH (__try/__except) does not allow the use of local variables with destructor. + if (!this->buildPath()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] Emotiv Driver: Failed to get the ENV variable PATH.\n"; + return false; + } + +#if defined TARGET_OS_Windows + // m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "[INIT] Emotiv Driver: Setting PATH as " << m_cmdForPathModification << "\n"; + + if (_putenv_s("PATH", m_cmdForPathModification) != 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] Emotiv Driver: Failed to modify the environment PATH with the Emotiv SDK path.\n"; + return false; + } +#endif + + m_header.setChannelCount(14); + if (m_useGyroscope) + { + m_header.setChannelCount(16); // 14 + 2 REF + 2 Gyro + } + + m_header.setChannelName(0, "AF3"); + m_header.setChannelName(1, "F7"); + m_header.setChannelName(2, "F3"); + m_header.setChannelName(3, "FC5"); + m_header.setChannelName(4, "T7"); + m_header.setChannelName(5, "P7"); + m_header.setChannelName(6, "O1"); + m_header.setChannelName(7, "O2"); + m_header.setChannelName(8, "P8"); + m_header.setChannelName(9, "T8"); + m_header.setChannelName(10, "FC6"); + m_header.setChannelName(11, "F4"); + m_header.setChannelName(12, "F8"); + m_header.setChannelName(13, "AF4"); + + if (m_useGyroscope) + { + m_header.setChannelName(14, "Gyro-X"); + m_header.setChannelName(15, "Gyro-Y"); + } + + m_header.setSamplingFrequency(128); // let's hope so... + + // Set channel units + // Various sources (e.g. http://emotiv.com/forum/forum15/topic879/messages/?PAGEN_1=3 + // and http://www.bci2000.org/wiki/index.php/Contributions:Emotiv ) suggested + // that the units from the device are in microvolts, but with a typical DC offset around 4000. + // Hard to find official source. + for (uint32_t c = 0; c < 14; ++c) { m_header.setChannelUnits(c, OVTK_UNIT_Volts, OVTK_FACTOR_Micro); } + if (m_useGyroscope) + { + // Even less sure about the units of these, leaving as unspecified. + m_header.setChannelUnits(14, OVTK_UNIT_Unspecified, OVTK_FACTOR_Base); + m_header.setChannelUnits(15, OVTK_UNIT_Unspecified, OVTK_FACTOR_Base); + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "INIT called.\n"; + if (m_driverCtx.isConnected()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] Emotiv Driver: Driver already initialized.\n"; + restoreState(); + return false; + } + + if (!m_header.isChannelCountSet() || !m_header.isSamplingFrequencySet()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] Emotiv Driver: Channel count or frequency not set.\n"; + restoreState(); + return false; + } + + //--------------------------------------------------------- + // Builds up a buffer to store acquired samples. This buffer will be sent to the acquisition server later. + + m_sample = new float[m_header.getChannelCount()]; + //m_Buffer=new double[m_header.getChannelCount()*nSamplePerSentBlock]; + if (!m_sample /*|| !m_Buffer*/) + { + delete [] m_sample; + //delete [] m_Buffer; + m_sample = nullptr; + //m_Buffer= nullptr; + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] Emotiv Driver: Samples allocation failed.\n"; + restoreState(); + return false; + } + + //__________________________________ + // Hardware initialization + + m_readyToCollect = false; +#if defined TARGET_OS_Windows + // First call to a function from EDK.DLL: guard the call with __try/__except clauses. + __try +#elif defined TARGET_OS_Linux + try +#endif + { + m_eventHandle = IEE_EmoEngineEventCreate(); + m_lastErrorCode = IEE_EngineConnect(); + } +#if defined TARGET_OS_Windows + __except (EXCEPTION_EXECUTE_HANDLER) +#elif defined TARGET_OS_Linux + catch(...) +#endif + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] Emotiv Driver: First call to 'edk.dll' failed.\n" + << "\tThis driver needs Emotiv SDK Research Edition (or better)\n" + << "\tinstalled on your computer.\n" + << "\tYou have configured the driver to use path [" << m_pathToEmotivSDK << "].\n" + << "\tIf there is an 'edk.dll' there, its version may be incompatible.\n" + << "\tThis driver was built against 32-bit (x86) Emotiv SDK v " +#if defined(TARGET_HAS_ThirdPartyEmotivResearchAPI3x) + << "3.x.x.\n"; +#else + << "1.x.x.\n"; +#endif + + restoreState(); + return false; + } + + if (m_lastErrorCode != EDK_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] Emotiv Driver: Can't connect to EmoEngine. EDK Error Code [" << m_lastErrorCode << "]\n"; + restoreState(); + return false; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "[INIT] Emotiv Driver: Connection to EmoEngine successful.\n"; + +#if defined(TARGET_HAS_ThirdPartyEmotivResearchAPI) + unsigned long hwVersion = 0; + unsigned long buildNum = 0; + char version[16]; + + IEE_HardwareGetVersion(m_userID, &hwVersion); + IEE_SoftwareGetVersion(version, 16, &buildNum); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Emotiv Driver: " + << "headset version " << uint64_t(hwVersion && 0xFFFF) << " / " << uint64_t(hwVersion >> 16) + << ", software " << version << ", build " << uint64_t(buildNum) << "\n"; +#endif + + //__________________________________ + // Saves parameters + + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + + return true; +} + +bool CDriverEmotivEPOC::start() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "START called.\n"; + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + m_dataHandle = IEE_DataCreate(); + //float sec = (float)m_nSamplePerSentBlock/(float)m_header.getSamplingFrequency(); + float sec = 1; + m_lastErrorCode = IEE_DataSetBufferSizeInSec(sec); + if (m_lastErrorCode != EDK_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[START] Emotiv Driver: Set buffer size to [" << sec << "] sec failed. EDK Error Code [" << m_lastErrorCode << "]\n"; + return false; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "[START] Emotiv Driver: Data Handle created. Buffer size set to [" << sec << "] sec.\n"; + + return true; +} + +bool CDriverEmotivEPOC::loop() +{ + if (!m_driverCtx.isConnected()) { return false; } + + if (m_driverCtx.isStarted()) + { + // we enable the acquisiton for every new headset (user) ever added + if (IEE_EngineGetNextEvent(m_eventHandle) == EDK_OK) + { + IEE_Event_t type = IEE_EmoEngineEventGetType(m_eventHandle); + + + if (type == IEE_UserAdded) + { + uint32_t id; + IEE_EmoEngineEventGetUserId(m_eventHandle, &id); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "[LOOP] Emotiv Driver: User #" << id << " registered.\n"; + m_lastErrorCode = IEE_DataAcquisitionEnable(id, true); + if (m_lastErrorCode != EDK_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[LOOP] Emotiv Driver: Enabling acquisition failed. EDK Error Code [" << m_lastErrorCode << "]\n"; + return false; + } + // but we are ready to acquire the samples only if the requested headset is detected + m_readyToCollect = m_readyToCollect || (m_userID == id); + } + } + + if (m_readyToCollect) + { + uint32_t nSamplesTaken = 0; + m_lastErrorCode = IEE_DataUpdateHandle(m_userID, m_dataHandle); + if (m_lastErrorCode != EDK_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[LOOP] Emotiv Driver: An error occurred while updating the DataHandle. EDK Error Code [" << m_lastErrorCode << "]\n"; + return false; + } + m_lastErrorCode = IEE_DataGetNumberOfSample(m_dataHandle, &nSamplesTaken); + if (m_lastErrorCode != EDK_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[LOOP] Emotiv Driver: An error occurred while getting new samples from device. EDK Error Code [" << m_lastErrorCode << "]\n"; + return false; + } + // warning : if you connect/disconnect then reconnect, the internal buffer may be full of samples, thus maybe nSamplesTaken > m_nSamplePerSentBlock + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "EMOTIV EPOC >>> received [" << nSamplesTaken << "] samples per channel from device with user #" << m_userID << ".\n"; + + /* + for (size_t i=0; i<m_header.getChannelCount(); ++i) + { + for (uint32_t s=0;s<nSamplesTaken;s++) + { + double* buffer = new double[nSamplesTaken]; + m_lastErrorCode = IEE_DataGet(m_dataHandle, CHANNEL_LIST[i], buffer, nSamplesTaken); + if(m_lastErrorCode != EDK_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[LOOP] Emotiv Driver: An error occurred while getting new samples from device. EDK Error Code [" << m_lastErrorCode << "]\n"; + return false; + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "EMOTIV EPOC >>> adding sample with value ["<< buffer[s] <<"]\n"; + m_sample[i*m_nSamplePerSentBlock + s] = (float)buffer[s]; + delete [] buffer; + } + m_callback->setSamples(m_sample); + } + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + */ + + double* buffer = new double[nSamplesTaken]; + for (uint32_t s = 0; s < nSamplesTaken; ++s) + { + for (size_t i = 0; i < m_header.getChannelCount(); ++i) + { + m_lastErrorCode = IEE_DataGet(m_dataHandle, CHANNEL_LIST[i], buffer, nSamplesTaken); + if (m_lastErrorCode != EDK_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[LOOP] Emotiv Driver: An error occurred while getting new samples from device. EDK Error Code [" << m_lastErrorCode << "]\n"; + return false; + } + m_sample[i] = float(buffer[s]); + if (s == 0) m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "EMOTIV EPOC >>> sample received has value [" << buffer[s] << "]\n"; + //m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "EMOTIV EPOC >>> sample stored has value ["<< m_sample[i] <<"]\n"; + } + m_callback->setSamples(m_sample, 1); + } + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + delete [] buffer; + } + } + + return true; +} + +bool CDriverEmotivEPOC::stop() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "STOP called.\n"; + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + + IEE_DataFree(m_dataHandle); + + return true; +} + +bool CDriverEmotivEPOC::uninitialize() +{ + IEE_EngineDisconnect(); + + if (m_eventHandle) + { + IEE_EmoEngineEventFree(m_eventHandle); + m_eventHandle = nullptr; + } + + restoreState(); + + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverEmotivEPOC::configure() +{ + CConfigurationEmotivEPOC config(m_driverCtx, Directories::getDataDir() + "/applications/acquisition-server/interface-Emotiv-EPOC.ui", m_useGyroscope, m_pathToEmotivSDK, m_userID); + + if (!config.configure(m_header)) { return false; } + m_settings.save(); + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyEmotivAPI diff --git a/applications/platform/acquisition-server/src/OVASDrivers/emotiv-epoc/ovasCDriverEmotivEPOC.h b/applications/platform/acquisition-server/src/OVASDrivers/emotiv-epoc/ovasCDriverEmotivEPOC.h new file mode 100644 index 0000000000000000000000000000000000000000..e52cea1e84ca6e2067e63e1392332dd920946eb4 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/emotiv-epoc/ovasCDriverEmotivEPOC.h @@ -0,0 +1,110 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyEmotivAPI + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +#include <openvibe/ov_all.h> + +#if defined(TARGET_HAS_ThirdPartyEmotivResearchAPI3x) +#include "IEmoStateDLL.h" +#include "Iedk.h" +#include "IedkErrorCode.h" +#include "IEegData.h" +#else +// Old API +#include "EmoStateDLL.h" +#include "edk.h" +#include "edkErrorCode.h" + +#define IEE_DataAcquisitionEnable EE_DataAcquisitionEnable +#define IEE_DataCreate EE_DataCreate +#define IEE_DataFree EE_DataFree +#define IEE_DataGet EE_DataGet +#define IEE_DataGetNumberOfSample EE_DataGetNumberOfSample +#define IEE_DataSetBufferSizeInSec EE_DataSetBufferSizeInSec +#define IEE_DataUpdateHandle EE_DataUpdateHandle +#define IEE_EmoEngineEventCreate EE_EmoEngineEventCreate +#define IEE_EmoEngineEventFree EE_EmoEngineEventFree +#define IEE_EmoEngineEventGetType EE_EmoEngineEventGetType +#define IEE_EmoEngineEventGetUserId EE_EmoEngineEventGetUserId +#define IEE_EngineConnect EE_EngineConnect +#define IEE_EngineDisconnect EE_EngineDisconnect +#define IEE_EngineGetNextEvent EE_EngineGetNextEvent +#define IEE_Event_t EE_Event_t +#define IEE_UserAdded EE_UserAdded +#endif + +#include <vector> + +#if defined TARGET_OS_Windows +#include <windows.h> +#endif + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverEmotivEPOC + * \author Laurent Bonnet (INRIA) + * \date 21 july 2010 + * \erief The CDriverEmotivEPOC allows the acquisition server to acquire data from a Emotiv EPOC amplifier, Research Edition or above. + * + */ +class CDriverEmotivEPOC final : public IDriver +{ +public: + + explicit CDriverEmotivEPOC(IDriverContext& ctx); + ~CDriverEmotivEPOC() override; + const char* getName() override; + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override { return true; } + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + +protected: + + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + + CHeader m_header; + + uint32_t m_nSamplePerSentBlock = 0; + uint32_t m_nTotalSample = 0; + float* m_sample = nullptr; + //double* m_Buffer; + +private: + bool buildPath(); + bool restoreState(); + + uint32_t m_lastErrorCode = 0; + + EmoEngineEventHandle m_eventHandle; + uint32_t m_userID = 0; + bool m_readyToCollect = false; + + DataHandle m_dataHandle; + bool m_firstStart = false; + + bool m_useGyroscope = false; + CString m_pathToEmotivSDK; + CString m_cmdForPathModification; + CString m_oldPath; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyEmotivAPI diff --git a/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_100k_1024.bin b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_100k_1024.bin new file mode 100644 index 0000000000000000000000000000000000000000..ea8e325858a8e63bff8ef79b5193e03eca5b9c03 Binary files /dev/null and b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_100k_1024.bin differ diff --git a/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_100k_128.bin b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_100k_128.bin new file mode 100644 index 0000000000000000000000000000000000000000..f74394375993ee455f572cfacc8ea2ed858cc35a Binary files /dev/null and b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_100k_128.bin differ diff --git a/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_100k_2048.bin b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_100k_2048.bin new file mode 100644 index 0000000000000000000000000000000000000000..016dbfd085fbcf0c80d0ab5e0e821dee62fbaa11 Binary files /dev/null and b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_100k_2048.bin differ diff --git a/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_100k_256.bin b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_100k_256.bin new file mode 100644 index 0000000000000000000000000000000000000000..08170f8220d76bd2fb55b1f6a6db1d347033fe55 Binary files /dev/null and b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_100k_256.bin differ diff --git a/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_100k_4096.bin b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_100k_4096.bin new file mode 100644 index 0000000000000000000000000000000000000000..dc55f62ad95a1a8d80e72bac63aac1b4647cd0a9 Binary files /dev/null and b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_100k_4096.bin differ diff --git a/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_100k_512.bin b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_100k_512.bin new file mode 100644 index 0000000000000000000000000000000000000000..993a2a90952724944c39f45323a9ce8885824503 Binary files /dev/null and b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_100k_512.bin differ diff --git a/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_10k_1024.bin b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_10k_1024.bin new file mode 100644 index 0000000000000000000000000000000000000000..f9a33d26a913e385e24b1a940f2e3a7014939b8f Binary files /dev/null and b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_10k_1024.bin differ diff --git a/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_10k_128.bin b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_10k_128.bin new file mode 100644 index 0000000000000000000000000000000000000000..ed2c5bdfd7574406adc38c6d10efe5f9a4743770 Binary files /dev/null and b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_10k_128.bin differ diff --git a/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_10k_2048.bin b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_10k_2048.bin new file mode 100644 index 0000000000000000000000000000000000000000..913aaf7a511d4070fd868a2b6961c562d1bfd40c Binary files /dev/null and b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_10k_2048.bin differ diff --git a/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_10k_256.bin b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_10k_256.bin new file mode 100644 index 0000000000000000000000000000000000000000..64cf1c6f4d323df62265ee7fdf7bcfc23f91631d Binary files /dev/null and b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_10k_256.bin differ diff --git a/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_10k_4096.bin b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_10k_4096.bin new file mode 100644 index 0000000000000000000000000000000000000000..263fe8ecc8241be63c48fc91cb897000c94ead14 Binary files /dev/null and b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_10k_4096.bin differ diff --git a/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_10k_512.bin b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_10k_512.bin new file mode 100644 index 0000000000000000000000000000000000000000..7a9276e78acf18c3498f1a5d3358ee3c9821cef4 Binary files /dev/null and b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_10k_512.bin differ diff --git a/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_25k_1024.bin b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_25k_1024.bin new file mode 100644 index 0000000000000000000000000000000000000000..f068dda8eb0774de9971a3c8d9991a83301bdfd7 Binary files /dev/null and b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_25k_1024.bin differ diff --git a/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_25k_128.bin b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_25k_128.bin new file mode 100644 index 0000000000000000000000000000000000000000..8d9e39698169e3b03096c9dd81ba48333d2bfe41 Binary files /dev/null and b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_25k_128.bin differ diff --git a/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_25k_2048.bin b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_25k_2048.bin new file mode 100644 index 0000000000000000000000000000000000000000..e09ebf5f70cb57fc643ed73d04e81bed1ecc1775 Binary files /dev/null and b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_25k_2048.bin differ diff --git a/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_25k_256.bin b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_25k_256.bin new file mode 100644 index 0000000000000000000000000000000000000000..95b35af223264fabacd815f54ac532ba75255700 Binary files /dev/null and b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_25k_256.bin differ diff --git a/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_25k_4096.bin b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_25k_4096.bin new file mode 100644 index 0000000000000000000000000000000000000000..5d27ee9895a73312052a7e743fb27e71d0e6104c Binary files /dev/null and b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_25k_4096.bin differ diff --git a/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_25k_512.bin b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_25k_512.bin new file mode 100644 index 0000000000000000000000000000000000000000..bb6d53cdbac8b55e28781cd297206e9c7306bbc6 Binary files /dev/null and b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_25k_512.bin differ diff --git a/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_50k_1024.bin b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_50k_1024.bin new file mode 100644 index 0000000000000000000000000000000000000000..baf1be93b65bd1d689d1b4125bee31c635c2fff3 Binary files /dev/null and b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_50k_1024.bin differ diff --git a/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_50k_128.bin b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_50k_128.bin new file mode 100644 index 0000000000000000000000000000000000000000..a8700dbf4504c17ea84760bd392341f8da3bdaa3 Binary files /dev/null and b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_50k_128.bin differ diff --git a/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_50k_2048.bin b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_50k_2048.bin new file mode 100644 index 0000000000000000000000000000000000000000..552e326bda1721184a4d7589dbb5b969c8945cd2 Binary files /dev/null and b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_50k_2048.bin differ diff --git a/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_50k_256.bin b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_50k_256.bin new file mode 100644 index 0000000000000000000000000000000000000000..f5d0738be0a1af138c248805a11be9e6ecef413e Binary files /dev/null and b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_50k_256.bin differ diff --git a/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_50k_4096.bin b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_50k_4096.bin new file mode 100644 index 0000000000000000000000000000000000000000..0bbc6561f9a4bba91e72c5c74cdc12afcb8d8889 Binary files /dev/null and b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_50k_4096.bin differ diff --git a/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_50k_512.bin b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_50k_512.bin new file mode 100644 index 0000000000000000000000000000000000000000..86ab9dbe37ed60487a5920a2b035661135639b94 Binary files /dev/null and b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_50k_512.bin differ diff --git a/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_5k_1024.bin b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_5k_1024.bin new file mode 100644 index 0000000000000000000000000000000000000000..443b7537bacef7199e4584f2fd0581dbe92ffca5 Binary files /dev/null and b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_5k_1024.bin differ diff --git a/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_5k_128.bin b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_5k_128.bin new file mode 100644 index 0000000000000000000000000000000000000000..1afe689bcdc1a343ab48c140a61e0c1d13e8ee34 Binary files /dev/null and b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_5k_128.bin differ diff --git a/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_5k_2048.bin b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_5k_2048.bin new file mode 100644 index 0000000000000000000000000000000000000000..df8fca2d133a460a71a9327ec2f98c978da88f13 Binary files /dev/null and b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_5k_2048.bin differ diff --git a/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_5k_256.bin b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_5k_256.bin new file mode 100644 index 0000000000000000000000000000000000000000..e2cb574c04d9a40e9fe539ce938d5fdc34be71e0 Binary files /dev/null and b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_5k_256.bin differ diff --git a/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_5k_4096.bin b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_5k_4096.bin new file mode 100644 index 0000000000000000000000000000000000000000..53482ee65a31b1f24e395dbb1071324c27ccc733 Binary files /dev/null and b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_5k_4096.bin differ diff --git a/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_5k_512.bin b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_5k_512.bin new file mode 100644 index 0000000000000000000000000000000000000000..9b6a08e6fa99d52988c8790f74f1b59cf870e7cd Binary files /dev/null and b/applications/platform/acquisition-server/src/OVASDrivers/filters/f64_5k_512.bin differ diff --git a/applications/platform/acquisition-server/src/OVASDrivers/generic-oscillator/ovasCDriverGenericOscillator.cpp b/applications/platform/acquisition-server/src/OVASDrivers/generic-oscillator/ovasCDriverGenericOscillator.cpp new file mode 100644 index 0000000000000000000000000000000000000000..831c97b5b72ace6c6dc13247609cc7f1dc2ccaf3 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/generic-oscillator/ovasCDriverGenericOscillator.cpp @@ -0,0 +1,163 @@ +#include "ovasCDriverGenericOscillator.h" + +#include <toolkit/ovtk_all.h> + +#include <system/ovCTime.h> + +#include <cmath> + +namespace OpenViBE { +namespace AcquisitionServer { + +CDriverGenericOscillator::CDriverGenericOscillator(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_GenericOscillator", m_driverCtx.getConfigurationManager()), m_stimulationInterval(1.0) +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericOscillator::CDriverGenericOscillator\n"; + + m_header.setSamplingFrequency(512); + m_header.setChannelCount(4); + + m_settings.add("Header", &m_header); + m_settings.add("SendPeriodicStimulations", &m_sendPeriodicStimulations); + m_settings.add("StimulationInterval", &m_stimulationInterval); + m_settings.load(); +} + +void CDriverGenericOscillator::release() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericOscillator::release\n"; + delete this; +} + +const char* CDriverGenericOscillator::getName() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericOscillator::getName\n"; + return "Generic Oscillator"; +} + +//___________________________________________________________________// +// // + +bool CDriverGenericOscillator::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericOscillator::initialize\n"; + if (m_driverCtx.isConnected() || !m_header.isChannelCountSet() || !m_header.isSamplingFrequencySet()) { return false; } + + for (size_t i = 0; i < m_header.getChannelCount(); ++i) { + m_header.setChannelUnits(i, OVTK_UNIT_Volts, OVTK_FACTOR_Base); + if (CString(m_header.getChannelName(i)) == CString("")) { + std::stringstream ss; + ss << "Oscillator " << (i + 1); + m_header.setChannelName(i, ss.str().c_str()); + } + } + + m_samples.resize(m_header.getChannelCount() * nSamplePerSentBlock); + + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + + m_stimSet.resize(1); + m_stimSet.setId(0, OVTK_StimulationId_Label_00); + m_stimSet.setDate(0, 0); + m_stimSet.setDuration(0, 0); + + return true; +} + +bool CDriverGenericOscillator::start() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericOscillator::start\n"; + + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + m_nTotalSample = 0; + m_startTime = System::Time::zgetTime(); + m_nTotalStim = 0; + + return true; +} + +bool CDriverGenericOscillator::loop() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "CDriverGenericOscillator::loop\n"; + + if (!m_driverCtx.isConnected()) { return false; } + + if (m_driverCtx.isStarted()) { + // Generate the contents we want to send next + const uint64_t elapsed = System::Time::zgetTime() - m_startTime; + const uint64_t samplesNeededSoFar = CTime(elapsed).toSampleCount(m_header.getSamplingFrequency()); + if (samplesNeededSoFar <= m_nTotalSample) { + // Too early + return true; + } + const size_t remainingSamples = size_t(samplesNeededSoFar - m_nTotalSample); + if (remainingSamples * m_header.getChannelCount() > m_samples.size()) { m_samples.resize(remainingSamples * m_header.getChannelCount()); } + + // std::cout << "At " << CTime(elapsed).toSeconds() * 1000 << "ms, remaining " << remainingSamples << " samples\n"; + for (size_t i = 0; i < remainingSamples; ++i) { + for (size_t j = 0; j < m_header.getChannelCount(); ++j) { + const double value = sin((m_nTotalSample * (j + 1) * 12.3) / m_header.getSamplingFrequency()) + + sin((m_nTotalSample * (j + 1) * 4.5) / m_header.getSamplingFrequency()) + + sin((m_nTotalSample * (j + 1) * 67.8) / m_header.getSamplingFrequency()); + m_samples[j * remainingSamples + i] = float(value); + } + m_nTotalSample++; + } + + m_callback->setSamples(&m_samples[0], remainingSamples); + + if (m_sendPeriodicStimulations && elapsed >= m_nTotalStim * CTime(m_stimulationInterval).time()) { + m_callback->setStimulationSet(m_stimSet); + m_nTotalStim++; + } + + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + } + else { if (m_driverCtx.isImpedanceCheckRequested()) { for (size_t j = 0; j < m_header.getChannelCount(); ++j) { m_driverCtx.updateImpedance(j, 1); } } } + + return true; +} + +bool CDriverGenericOscillator::stop() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericOscillator::stop\n"; + return (m_driverCtx.isConnected() && m_driverCtx.isStarted()); +} + +bool CDriverGenericOscillator::uninitialize() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericOscillator::uninitialize\n"; + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + m_callback = nullptr; + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverGenericOscillator::isConfigurable() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericOscillator::isConfigurable\n"; + return false; +} + +bool CDriverGenericOscillator::configure() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericOscillator::configure\n"; + + /*CConfigurationDriverGenericOscillator config(m_driverCtx, Directories::getDataDir() + "/applications/acquisition-server/interface-Generic-Oscillator.ui", + m_sendPeriodicStimulations, m_stimulationInterval); + + if (config.configure(m_header)) { + m_settings.save(); + return true; + } + + return false;*/ + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASDrivers/generic-oscillator/ovasCDriverGenericOscillator.h b/applications/platform/acquisition-server/src/OVASDrivers/generic-oscillator/ovasCDriverGenericOscillator.h new file mode 100644 index 0000000000000000000000000000000000000000..ee29a2dd8a4986d63e7e3f94215e01e930e5295d --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/generic-oscillator/ovasCDriverGenericOscillator.h @@ -0,0 +1,52 @@ +#pragma once + +#include "ovasIDriver.h" +#include "ovasCSettingsHelper.h" +#include "../ovasCHeader.h" + + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverGenericOscillator + * \author Yann Renard (INRIA) + */ +class CDriverGenericOscillator final : public IDriver +{ +public: + explicit CDriverGenericOscillator(IDriverContext& ctx); + void release(); + const char* getName() override; + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override; + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + +protected: + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + CHeader m_header; + + uint32_t m_nSamplePerSentBlock = 0; + std::vector<float> m_samples; + + uint32_t m_nTotalSample = 0; + uint64_t m_nTotalStim = 0; + uint64_t m_startTime = 0; + + CStimulationSet m_stimSet; + +private: + bool m_sendPeriodicStimulations = false; + double m_stimulationInterval = 0; // Seconds +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASDrivers/generic-raw-reader/ovasCConfigurationGenericRawReader.cpp b/applications/platform/acquisition-server/src/OVASDrivers/generic-raw-reader/ovasCConfigurationGenericRawReader.cpp new file mode 100644 index 0000000000000000000000000000000000000000..e969eecd3e4e15e02e7238eada142c6aa44d6c41 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/generic-raw-reader/ovasCConfigurationGenericRawReader.cpp @@ -0,0 +1,63 @@ +#include "ovasCConfigurationGenericRawReader.h" + +namespace OpenViBE { +namespace AcquisitionServer { + +CConfigurationGenericRawReader::CConfigurationGenericRawReader(const char* gtkBuilderFilename, bool& limitSpeed, uint32_t& sampleFormat, uint32_t& sampleEndian, + uint32_t& startSkip, uint32_t& headerSkip, uint32_t& footerSkip, CString& filename) + : CConfigurationNetworkBuilder(gtkBuilderFilename), m_limitSpeed(limitSpeed), m_sampleFormat(sampleFormat), m_sampleEndian(sampleEndian), + m_startSkip(startSkip), m_headerSkip(headerSkip), m_footerSkip(footerSkip), m_filename(filename) {} + +bool CConfigurationGenericRawReader::preConfigure() +{ + if (!CConfigurationNetworkBuilder::preConfigure()) { return false; } + + GtkToggleButton* speedLimit = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_limit_speed")); + GtkEntry* filename = GTK_ENTRY(gtk_builder_get_object(m_builder, "entry_filename")); + GtkComboBox* endianness = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_endianness")); + GtkComboBox* sampleType = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_sample_type")); + GtkSpinButton* startSize = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_start_size")); + GtkSpinButton* headerSize = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_header_size")); + GtkSpinButton* footerSize = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_footer_size")); + + gtk_toggle_button_set_active(speedLimit, m_limitSpeed ? TRUE : FALSE); + gtk_entry_set_text(filename, m_filename.toASCIIString()); + gtk_combo_box_set_active(endianness, m_sampleEndian); + gtk_combo_box_set_active(sampleType, m_sampleFormat); + gtk_spin_button_set_value(startSize, m_startSkip); + gtk_spin_button_set_value(headerSize, m_headerSkip); + gtk_spin_button_set_value(footerSize, m_footerSkip); + + return true; +} + +bool CConfigurationGenericRawReader::postConfigure() +{ + if (m_applyConfig) { + GtkToggleButton* speedLimit = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_limit_speed")); + GtkEntry* filename = GTK_ENTRY(gtk_builder_get_object(m_builder, "entry_filename")); + GtkComboBox* endianness = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_endianness")); + GtkComboBox* sampleType = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_sample_type")); + GtkSpinButton* startSize = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_start_size")); + GtkSpinButton* headerSize = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_header_size")); + GtkSpinButton* footerSize = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_footer_size")); + + gtk_spin_button_update(startSize); + gtk_spin_button_update(headerSize); + gtk_spin_button_update(footerSize); + + m_limitSpeed = gtk_toggle_button_get_active(speedLimit) ? true : false; + m_filename = gtk_entry_get_text(filename); + m_sampleEndian = uint32_t(gtk_combo_box_get_active(endianness)); + m_sampleFormat = uint32_t(gtk_combo_box_get_active(sampleType)); + m_startSkip = uint32_t(gtk_spin_button_get_value(startSize)); + m_headerSkip = uint32_t(gtk_spin_button_get_value(headerSize)); + m_footerSkip = uint32_t(gtk_spin_button_get_value(footerSize)); + } + + if (!CConfigurationNetworkBuilder::postConfigure()) { return false; } + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASDrivers/generic-raw-reader/ovasCConfigurationGenericRawReader.h b/applications/platform/acquisition-server/src/OVASDrivers/generic-raw-reader/ovasCConfigurationGenericRawReader.h new file mode 100644 index 0000000000000000000000000000000000000000..47cc2b3f1630b7a25b8ba0e9ff4818733ade51b1 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/generic-raw-reader/ovasCConfigurationGenericRawReader.h @@ -0,0 +1,26 @@ +#pragma once + +#include "../ovasCConfigurationNetworkBuilder.h" + +namespace OpenViBE { +namespace AcquisitionServer { +class CConfigurationGenericRawReader final : public CConfigurationNetworkBuilder +{ +public: + CConfigurationGenericRawReader(const char* gtkBuilderFilename, bool& limitSpeed, uint32_t& sampleFormat, uint32_t& sampleEndian, + uint32_t& startSkip, uint32_t& headerSkip, uint32_t& footerSkip, CString& filename); + +protected: + bool preConfigure() override; + bool postConfigure() override; + + bool& m_limitSpeed; + uint32_t& m_sampleFormat; + uint32_t& m_sampleEndian; + uint32_t& m_startSkip; + uint32_t& m_headerSkip; + uint32_t& m_footerSkip; + CString& m_filename; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASDrivers/generic-raw-reader/ovasCDriverGenericRawFileReader.cpp b/applications/platform/acquisition-server/src/OVASDrivers/generic-raw-reader/ovasCDriverGenericRawFileReader.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d18418520d7592ca1eac533e2db33f3a7e9e706e --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/generic-raw-reader/ovasCDriverGenericRawFileReader.cpp @@ -0,0 +1,68 @@ +#include "ovasCDriverGenericRawFileReader.h" +#include "ovasCConfigurationGenericRawReader.h" + +namespace OpenViBE { +namespace AcquisitionServer { + +CDriverGenericRawFileReader::CDriverGenericRawFileReader(IDriverContext& ctx) + : CDriverGenericRawReader(ctx), m_settings("AcquisitionServer_Driver_GenericRawFileReader", m_driverCtx.getConfigurationManager()) +{ + m_filename = "/tmp/some_raw_file"; + + // Relay configuration properties to the configuration manager + + m_settings.add("Header", &m_header); + m_settings.add("LimitSpeed", &m_limitSpeed); + m_settings.add("SampleFormat", &m_sampleFormat); + m_settings.add("SampleEndian", &m_sampleEndian); + m_settings.add("StartSkip", &m_startSkip); + m_settings.add("HeaderSkip", &m_headerSkip); + m_settings.add("FooterSkip", &m_footerSkip); + m_settings.add("FileName", &m_filename); + m_settings.load(); +} + +bool CDriverGenericRawFileReader::configure() +{ + CConfigurationGenericRawReader config(Directories::getDataDir() + "/applications/acquisition-server/interface-Generic-RawFileReader.ui", m_limitSpeed, + m_sampleFormat, m_sampleEndian, m_startSkip, m_headerSkip, m_footerSkip, m_filename); + + if (!config.configure(m_header)) { return false; } + m_settings.save(); + return true; +} + +bool CDriverGenericRawFileReader::open() +{ + m_file = fopen(m_filename.toASCIIString(), "rb"); + if (!m_file) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not open file [" << m_filename << "]\n"; + return false; + } + if (fseek(m_file, m_startSkip, SEEK_SET) != 0) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not seek to " << m_startSkip << " bytes from the file beginning\n"; + fclose(m_file); + return false; + } + return true; +} + +bool CDriverGenericRawFileReader::close() +{ + if (m_file) { + fclose(m_file); + m_file = nullptr; + } + return true; +} + +bool CDriverGenericRawFileReader::read() +{ + if (!m_file) { return false; } + const bool res = (fread(m_dataFrame, 1, m_dataFrameSize, m_file) == m_dataFrameSize); + if (!res && feof(m_file)) { m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "End of file reached.\n"; } + return res; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASDrivers/generic-raw-reader/ovasCDriverGenericRawFileReader.h b/applications/platform/acquisition-server/src/OVASDrivers/generic-raw-reader/ovasCDriverGenericRawFileReader.h new file mode 100644 index 0000000000000000000000000000000000000000..9330846287cf0f6b74d2221dd1f6e2ed94ab99ab --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/generic-raw-reader/ovasCDriverGenericRawFileReader.h @@ -0,0 +1,34 @@ +#pragma once + +#include "ovasCDriverGenericRawReader.h" + +#include "../ovasCSettingsHelper.h" + +#include <cstdio> + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverGenericRawFileReader + * \author Yann Renard (INRIA) + */ +class CDriverGenericRawFileReader final : public CDriverGenericRawReader +{ +public: + explicit CDriverGenericRawFileReader(IDriverContext& ctx); + + const char* getName() override { return "Generic Raw File Reader"; } + bool isConfigurable() override { return true; } + bool configure() override; + +protected: + bool open() override; + bool close() override; + bool read() override; + + SettingsHelper m_settings; + FILE* m_file = nullptr; + CString m_filename; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASDrivers/generic-raw-reader/ovasCDriverGenericRawReader.cpp b/applications/platform/acquisition-server/src/OVASDrivers/generic-raw-reader/ovasCDriverGenericRawReader.cpp new file mode 100644 index 0000000000000000000000000000000000000000..17b8bb9750cdd8cd59bfde6e5bcaf5b103f3be03 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/generic-raw-reader/ovasCDriverGenericRawReader.cpp @@ -0,0 +1,200 @@ +/* + * The raw reader expects the data to be formatted as follows + * + * [START][BLOCK0][BLOCK1][BLOCK2]... + * skip parse parse parse ... + * + * where each block is [===========BLOCKX=================] + * is read as [===========dataFrameSize==========] + * breaks to [header====][sample====][footer====] + * equals [headerSize][sampleSize][footerSize] + * means skip keep skip + * + * For correct parsing, user must provide the exact sizes of the skipped parts "start", "header" and "footer" in bytes. + * + */ + +#include "ovasCDriverGenericRawReader.h" +#include "../ovasCConfigurationBuilder.h" + +#include <toolkit/ovtk_all.h> + +#include <system/ovCMemory.h> +#include <system/ovCTime.h> + +namespace OpenViBE { +namespace AcquisitionServer { + +// #define OPENVIBE_DEBUG_RAW_READER + +template <class T> +static float decode_little_endian(const uint8_t* buffer) +{ + T t; + System::Memory::littleEndianToHost(buffer, &t); + return float(t); +} + +template <class T> +static float decode_big_endian(const uint8_t* buffer) +{ + T t; + System::Memory::bigEndianToHost(buffer, &t); + return float(t); +} + +CDriverGenericRawReader::CDriverGenericRawReader(IDriverContext& ctx) : IDriver(ctx) +{ + m_header.setSamplingFrequency(512); + m_header.setChannelCount(16); +} + +//___________________________________________________________________// +// // + +bool CDriverGenericRawReader::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + if (m_driverCtx.isConnected()) { return false; } + + switch (m_sampleFormat) { + case Format_UnsignedInteger8: + case Format_SignedInteger8: m_sampleSize = 1; + break; + case Format_UnsignedInteger16: + case Format_SignedInteger16: m_sampleSize = 2; + break; + case Format_UnsignedInteger32: + case Format_SignedInteger32: + case Format_Float32: m_sampleSize = 4; + break; + case Format_Float64: m_sampleSize = 8; + break; + default: m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unsupported data format " << m_sampleFormat << "\n"; + return false; + } + + m_dataFrameSize = m_sampleSize * m_header.getChannelCount(); + m_dataFrameSize += m_headerSkip; + m_dataFrameSize += m_footerSkip; + + m_sample = new float[m_header.getChannelCount()]; + m_dataFrame = new uint8_t[m_dataFrameSize]; + if (!m_sample || !m_dataFrame) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not allocate memory !\n"; + return false; + } + + // open() should skip m_startSkip worth of bytes already + if (!this->open()) { return false; } + + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + + return true; +} + +bool CDriverGenericRawReader::start() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + m_nTotalSample = 0; + m_startTime = System::Time::zgetTime(); + return true; +} + +bool CDriverGenericRawReader::loop() +{ + if (!m_driverCtx.isConnected()) { return false; } + // if(!m_driverCtx.isStarted()) { return true; } + + const uint64_t time = CTime(m_header.getSamplingFrequency(), m_nTotalSample).time(); + if (m_limitSpeed && (time > System::Time::zgetTime() - m_startTime)) { return true; } + +#ifdef OPENVIBE_DEBUG_RAW_READER + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Decoded : "; +#endif + + for (uint32_t j = 0; j < m_nSamplePerSentBlock; ++j) { + if (!this->read()) { return false; } + + for (size_t i = 0; i < m_header.getChannelCount(); ++i) { + uint8_t* dataFrame = m_dataFrame + m_headerSkip + i * m_sampleSize; + switch (m_sampleEndian) { + case Endian_Little: switch (m_sampleFormat) { + case Format_UnsignedInteger8: m_sample[i] = *dataFrame; + break; + case Format_UnsignedInteger16: m_sample[i] = decode_little_endian<uint16_t>(dataFrame); + break; + case Format_UnsignedInteger32: m_sample[i] = decode_little_endian<uint32_t>(dataFrame); + break; + case Format_SignedInteger8: m_sample[i] = *dataFrame; + break; + case Format_SignedInteger16: m_sample[i] = decode_little_endian<int16_t>(dataFrame); + break; + case Format_SignedInteger32: m_sample[i] = decode_little_endian<int>(dataFrame); + break; + case Format_Float32: m_sample[i] = decode_little_endian<float>(dataFrame); + break; + case Format_Float64: m_sample[i] = decode_little_endian<double>(dataFrame); + break; + default: break; + } + break; + + case Endian_Big: switch (m_sampleFormat) { + case Format_UnsignedInteger8: m_sample[i] = *dataFrame; + break; + case Format_UnsignedInteger16: m_sample[i] = decode_big_endian<uint16_t>(dataFrame); + break; + case Format_UnsignedInteger32: m_sample[i] = decode_big_endian<uint32_t>(dataFrame); + break; + case Format_SignedInteger8: m_sample[i] = *dataFrame; + break; + case Format_SignedInteger16: m_sample[i] = decode_big_endian<int16_t>(dataFrame); + break; + case Format_SignedInteger32: m_sample[i] = decode_big_endian<int>(dataFrame); + break; + case Format_Float32: m_sample[i] = decode_big_endian<float>(dataFrame); + break; + case Format_Float64: m_sample[i] = decode_big_endian<double>(dataFrame); + break; + default: break; + } + break; + default: break; + } +#ifdef OPENVIBE_DEBUG_RAW_READER + m_driverCtx.getLogManager() << m_sample[i] << " "; +#endif + } + if (m_driverCtx.isStarted()) { m_callback->setSamples(m_sample, 1); } + } +#ifdef OPENVIBE_DEBUG_RAW_READER + m_driverCtx.getLogManager() << "\n"; +#endif + + if (m_driverCtx.isStarted()) { m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); } + m_nTotalSample += m_nSamplePerSentBlock; + return true; +} + +bool CDriverGenericRawReader::stop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + return true; +} + +bool CDriverGenericRawReader::uninitialize() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted() || !this->close()) { return false; } + + delete [] m_sample; + delete [] m_dataFrame; + m_sample = nullptr; + m_dataFrame = nullptr; + m_callback = nullptr; + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASDrivers/generic-raw-reader/ovasCDriverGenericRawReader.h b/applications/platform/acquisition-server/src/OVASDrivers/generic-raw-reader/ovasCDriverGenericRawReader.h new file mode 100644 index 0000000000000000000000000000000000000000..0893b0a4430f8357acc7bf3e55d3754dfa6b8a64 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/generic-raw-reader/ovasCDriverGenericRawReader.h @@ -0,0 +1,64 @@ +#pragma once + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverGenericRawReader + * \author Yann Renard (INRIA) + */ +class CDriverGenericRawReader : public IDriver +{ +public: + enum EParameter + { + Endian_Little = 0, + Endian_Big = 1, + + Format_UnsignedInteger8 = 0, + Format_UnsignedInteger16 = 1, + Format_UnsignedInteger32 = 2, + Format_SignedInteger8 = 3, + Format_SignedInteger16 = 4, + Format_SignedInteger32 = 5, + Format_Float32 = 6, + Format_Float64 = 7, + }; + + explicit CDriverGenericRawReader(IDriverContext& ctx); + virtual void release() { delete this; } + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + const IHeader* getHeader() override { return &m_header; } + +protected: + virtual bool open() = 0; + virtual bool close() = 0; + virtual bool read() = 0; + + IDriverCallback* m_callback = nullptr; + CHeader m_header; + uint32_t m_nSamplePerSentBlock = 0; + uint32_t m_sampleSize = 0; + uint32_t m_sampleFormat = Format_SignedInteger32; + uint32_t m_sampleEndian = 0; + uint32_t m_startSkip = 0; + uint32_t m_headerSkip = 0; + uint32_t m_footerSkip = 20; + uint32_t m_dataFrameSize = 0; + bool m_limitSpeed = false; + uint8_t* m_dataFrame = nullptr; + float* m_sample = nullptr; + uint64_t m_startTime = 0; + uint64_t m_nTotalSample = 0; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASDrivers/generic-raw-reader/ovasCDriverGenericRawTelnetReader.cpp b/applications/platform/acquisition-server/src/OVASDrivers/generic-raw-reader/ovasCDriverGenericRawTelnetReader.cpp new file mode 100644 index 0000000000000000000000000000000000000000..2fdcadae591567e6ddf83041b689910d5249f93c --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/generic-raw-reader/ovasCDriverGenericRawTelnetReader.cpp @@ -0,0 +1,84 @@ +#include "ovasCDriverGenericRawTelnetReader.h" +#include "ovasCConfigurationGenericRawReader.h" + +namespace OpenViBE { +namespace AcquisitionServer { + +CDriverGenericRawTelnetReader::CDriverGenericRawTelnetReader(IDriverContext& ctx) + : CDriverGenericRawReader(ctx), m_settings("AcquisitionServer_Driver_GenericRawTelnetReader", m_driverCtx.getConfigurationManager()) +{ + m_hostName = "localhost"; + m_hostPort = 1337; + + // Relay configuration properties to the configuration manager + m_settings.add("Header", &m_header); + m_settings.add("LimitSpeed", &m_limitSpeed); + m_settings.add("SampleFormat", &m_sampleFormat); + m_settings.add("SampleEndian", &m_sampleEndian); + m_settings.add("StartSkip", &m_startSkip); + m_settings.add("HeaderSkip", &m_headerSkip); + m_settings.add("FooterSkip", &m_footerSkip); + m_settings.add("HostName", &m_hostName); + m_settings.add("HostPort", &m_hostPort); + m_settings.load(); +} + +bool CDriverGenericRawTelnetReader::configure() +{ + CString filename; + CConfigurationGenericRawReader config(Directories::getDataDir() + "/applications/acquisition-server/interface-Generic-RawTelnetReader.ui", + m_limitSpeed, m_sampleFormat, m_sampleEndian, m_startSkip, m_headerSkip, m_footerSkip, filename); + + config.setHostName(m_hostName); + config.setHostPort(m_hostPort); + + if (!config.configure(m_header)) { return false; } + + m_hostName = config.getHostName(); + m_hostPort = config.getHostPort(); + + m_settings.save(); + + return true; +} + +bool CDriverGenericRawTelnetReader::open() +{ + m_connection = Socket::createConnectionClient(); + if (!m_connection) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not create client connection\n"; + return false; + } + if (!m_connection->connect(m_hostName.toASCIIString(), m_hostPort)) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not connect to server [" << m_hostName << ":" << m_hostPort << "]\n"; + return false; + } + char* buffer = new char[m_startSkip]; + if (m_startSkip > 0 && !m_connection->receiveBufferBlocking(buffer, m_startSkip)) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unable to skip " << m_startSkip << " bytes at the beginning\n"; + delete[] buffer; + return false; + } + delete[] buffer; + + return true; +} + +bool CDriverGenericRawTelnetReader::close() +{ + if (m_connection) { + m_connection->close(); + m_connection->release(); + m_connection = nullptr; + } + return true; +} + +bool CDriverGenericRawTelnetReader::read() +{ + if (!m_connection) { return false; } + return m_connection->receiveBufferBlocking(m_dataFrame, m_dataFrameSize); +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASDrivers/generic-raw-reader/ovasCDriverGenericRawTelnetReader.h b/applications/platform/acquisition-server/src/OVASDrivers/generic-raw-reader/ovasCDriverGenericRawTelnetReader.h new file mode 100644 index 0000000000000000000000000000000000000000..3e7ef32e3a730d0a91946dea87e6a31a295b81c5 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/generic-raw-reader/ovasCDriverGenericRawTelnetReader.h @@ -0,0 +1,35 @@ +#pragma once + +#include "ovasCDriverGenericRawReader.h" + +#include "../ovasCSettingsHelper.h" + +#include <socket/IConnectionClient.h> + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverGenericRawTelnetReader + * \author Yann Renard (INRIA) + */ +class CDriverGenericRawTelnetReader final : public CDriverGenericRawReader +{ +public: + explicit CDriverGenericRawTelnetReader(IDriverContext& ctx); + + const char* getName() override { return "Generic Raw Telnet Reader"; } + bool isConfigurable() override { return true; } + bool configure() override; + +protected: + bool open() override; + bool close() override; + bool read() override; + + SettingsHelper m_settings; + Socket::IConnectionClient* m_connection = nullptr; + CString m_hostName = "localhost"; + uint32_t m_hostPort = 1337; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASDrivers/generic-sawtooth/ovasCDriverGenericSawTooth.cpp b/applications/platform/acquisition-server/src/OVASDrivers/generic-sawtooth/ovasCDriverGenericSawTooth.cpp new file mode 100644 index 0000000000000000000000000000000000000000..15fdfa06ce221f62ad719cdf8e613b8c12aa3e12 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/generic-sawtooth/ovasCDriverGenericSawTooth.cpp @@ -0,0 +1,121 @@ +#include "ovasCDriverGenericSawTooth.h" + +#include <toolkit/ovtk_all.h> + +#include <system/ovCTime.h> + +namespace OpenViBE { +namespace AcquisitionServer { + +CDriverGenericSawTooth::CDriverGenericSawTooth(IDriverContext& ctx) + : IDriver(ctx) +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericSawTooth::CDriverGenericSawTooth\n"; + + m_header.setSamplingFrequency(512); + m_header.setChannelCount(1); + m_header.setChannelName(0, "Sawtooth"); + m_header.setChannelUnits(0, OVTK_UNIT_Volts, OVTK_FACTOR_Base); +} + +void CDriverGenericSawTooth::release() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericSawTooth::release\n"; + delete this; +} + +const char* CDriverGenericSawTooth::getName() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericSawTooth::getName\n"; + return "Generic Saw Tooth"; +} + +//___________________________________________________________________// +// // + +bool CDriverGenericSawTooth::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericSawTooth::initialize\n"; + if (m_driverCtx.isConnected() || !m_header.isChannelCountSet() || !m_header.isSamplingFrequencySet()) { return false; } + + m_samples.resize(m_header.getChannelCount() * nSamplePerSentBlock); + m_callback = &callback; + m_externalBlockSize = nSamplePerSentBlock; + + return true; +} + +bool CDriverGenericSawTooth::start() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericSawTooth::start\n"; + + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + m_nTotalSample = 0; + m_startTime = System::Time::zgetTime(); + + return true; +} + +bool CDriverGenericSawTooth::loop() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "CDriverGenericSawTooth::loop\n"; + + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return true; } + + // Find out how many samples to send + const uint64_t elapsed = System::Time::zgetTime() - m_startTime; + const uint64_t samplesNeededSoFar = CTime(elapsed).toSampleCount(m_header.getSamplingFrequency()); + if (samplesNeededSoFar <= m_nTotalSample) { + // Too early + return true; + } + const size_t remainingSamples = size_t(samplesNeededSoFar - m_nTotalSample); + if (remainingSamples * m_header.getChannelCount() > m_samples.size()) { m_samples.resize(remainingSamples * m_header.getChannelCount()); } + + // Generate the data + // The result should be a linear ramp between [0,1] for each block sent *out* by the acquisition server + for (size_t i = 0; i < remainingSamples; ++i) { + for (size_t j = 0; j < m_header.getChannelCount(); ++j) { + m_samples[j * remainingSamples + i] = float(m_nTotalSample % m_externalBlockSize) / float(m_externalBlockSize - 1); + } + m_nTotalSample++; + } + + m_callback->setSamples(&m_samples[0], remainingSamples); + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + return true; +} + +bool CDriverGenericSawTooth::stop() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericSawTooth::stop\n"; + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + return true; +} + +bool CDriverGenericSawTooth::uninitialize() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericSawTooth::uninitialize\n"; + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + m_callback = nullptr; + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverGenericSawTooth::isConfigurable() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericSawTooth::isConfigurable\n"; + return false; +} + +bool CDriverGenericSawTooth::configure() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericSawTooth::configure\n"; + return false; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASDrivers/generic-sawtooth/ovasCDriverGenericSawTooth.h b/applications/platform/acquisition-server/src/OVASDrivers/generic-sawtooth/ovasCDriverGenericSawTooth.h new file mode 100644 index 0000000000000000000000000000000000000000..556ea24cc0df487db2a8070e78f3033d0ade8b12 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/generic-sawtooth/ovasCDriverGenericSawTooth.h @@ -0,0 +1,41 @@ +#pragma once + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverGenericSawTooth + * \author Yann Renard (INRIA) + */ +class CDriverGenericSawTooth final : public IDriver +{ +public: + explicit CDriverGenericSawTooth(IDriverContext& ctx); + void release(); + const char* getName() override; + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override; + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + +protected: + IDriverCallback* m_callback = nullptr; + CHeader m_header; + + uint32_t m_externalBlockSize = 0; + std::vector<float> m_samples; + + uint64_t m_nTotalSample = 0; + uint64_t m_startTime = 0; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASDrivers/generic-time-signal/ovasCConfigurationGenericTimeSignal.cpp b/applications/platform/acquisition-server/src/OVASDrivers/generic-time-signal/ovasCConfigurationGenericTimeSignal.cpp new file mode 100755 index 0000000000000000000000000000000000000000..234f8c430d9b40c708394c3c9cbc3883079858f0 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/generic-time-signal/ovasCConfigurationGenericTimeSignal.cpp @@ -0,0 +1,15 @@ +#include "ovasCConfigurationGenericTimeSignal.h" + +namespace OpenViBE { +namespace AcquisitionServer { + +CConfigurationGenericTimeSignal::CConfigurationGenericTimeSignal(IDriverContext& ctx, const char* gtkBuilderFilename) + : CConfigurationBuilder(gtkBuilderFilename), m_driverCtx(ctx) {} + +bool CConfigurationGenericTimeSignal::preConfigure() { return CConfigurationBuilder::preConfigure(); } + +// normal header is filled (Subject ID, Age, Gender, channels, sampling frequency) +bool CConfigurationGenericTimeSignal::postConfigure() { return CConfigurationBuilder::postConfigure(); } + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASDrivers/generic-time-signal/ovasCConfigurationGenericTimeSignal.h b/applications/platform/acquisition-server/src/OVASDrivers/generic-time-signal/ovasCConfigurationGenericTimeSignal.h new file mode 100755 index 0000000000000000000000000000000000000000..6956cb24fdb73bce187034dd6005c5755b5473de --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/generic-time-signal/ovasCConfigurationGenericTimeSignal.h @@ -0,0 +1,24 @@ +#pragma once + +#include "../ovasCConfigurationBuilder.h" +#include "ovasIDriver.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CConfigurationGenericTimeSignal + * \sa CDriverGenericTimeSignal + */ +class CConfigurationGenericTimeSignal final : public CConfigurationBuilder +{ +public: + CConfigurationGenericTimeSignal(IDriverContext& ctx, const char* gtkBuilderFilename); + + bool preConfigure() override; + bool postConfigure() override; + +protected: + IDriverContext& m_driverCtx; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASDrivers/generic-time-signal/ovasCDriverGenericTimeSignal.cpp b/applications/platform/acquisition-server/src/OVASDrivers/generic-time-signal/ovasCDriverGenericTimeSignal.cpp new file mode 100755 index 0000000000000000000000000000000000000000..1328786a6ba93ea42c1c85bc9c412d5c4a9c3660 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/generic-time-signal/ovasCDriverGenericTimeSignal.cpp @@ -0,0 +1,113 @@ +#include "ovasCDriverGenericTimeSignal.h" +#include "../ovasCConfigurationBuilder.h" + +#include "ovasCConfigurationGenericTimeSignal.h" + +#include <toolkit/ovtk_all.h> + +#include <system/ovCTime.h> + +namespace OpenViBE { +namespace AcquisitionServer { + +CDriverGenericTimeSignal::CDriverGenericTimeSignal(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_GenericTimeSignal", m_driverCtx.getConfigurationManager()) +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericTimeSignal::CDriverGenericTimeSignal\n"; + + m_header.setSamplingFrequency(512); + m_header.setChannelCount(1); + m_header.setChannelName(0, "Time(s)"); + m_header.setChannelUnits(0, OVTK_UNIT_Second, OVTK_FACTOR_Base); + + m_settings.add("Header", &m_header); + m_settings.load(); +} + +void CDriverGenericTimeSignal::release() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericTimeSignal::release\n"; + delete this; +} + +const char* CDriverGenericTimeSignal::getName() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericTimeSignal::getName\n"; + return "Generic Time Signal"; +} + +//___________________________________________________________________// +// // + +bool CDriverGenericTimeSignal::initialize(const uint32_t /*nSamplePerSentBlock*/, IDriverCallback& callback) +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericTimeSignal::initialize\n"; + if (m_driverCtx.isConnected() || !m_header.isChannelCountSet() || !m_header.isSamplingFrequencySet()) { return false; } + + m_callback = &callback; + return true; +} + +bool CDriverGenericTimeSignal::start() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericTimeSignal::start\n"; + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + m_nTotalSample = 0; + m_startTime = System::Time::zgetTime(); + return true; +} + +bool CDriverGenericTimeSignal::loop() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "CDriverGenericTimeSignal::loop\n"; + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return true; } + + // Find out how many samples to send; note that we always just send 1 at a time with this driver + const uint64_t now = System::Time::zgetTime(); + const uint64_t elapsed = now - m_startTime; + const uint64_t neededSoFar = (m_header.getSamplingFrequency() * elapsed) >> 32; + if (neededSoFar <= m_nTotalSample) { return true; } // Too early + + const float timeNow = float(CTime(now).toSeconds()); + m_callback->setSamples(&timeNow, 1); + m_nTotalSample++; + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + return true; +} + +bool CDriverGenericTimeSignal::stop() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericTimeSignal::stop\n"; + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + return true; +} + +bool CDriverGenericTimeSignal::uninitialize() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericTimeSignal::uninitialize\n"; + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + m_callback = nullptr; + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverGenericTimeSignal::isConfigurable() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericTimeSignal::isConfigurable\n"; + return true; +} + +bool CDriverGenericTimeSignal::configure() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverGenericTimeSignal::configure\n"; + CConfigurationGenericTimeSignal config(m_driverCtx, Directories::getDataDir() + "/applications/acquisition-server/interface-Generic-TimeSignal.ui"); + if (!config.configure(m_header)) { return false; } + m_settings.save(); + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASDrivers/generic-time-signal/ovasCDriverGenericTimeSignal.h b/applications/platform/acquisition-server/src/OVASDrivers/generic-time-signal/ovasCDriverGenericTimeSignal.h new file mode 100755 index 0000000000000000000000000000000000000000..763407f020e75023916b37fb24988dba711e0aa6 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/generic-time-signal/ovasCDriverGenericTimeSignal.h @@ -0,0 +1,46 @@ +#pragma once + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +#include "../ovasCSettingsHelper.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverGenericTimeSignal + * \author Jussi Lindgren (Inria) + * + * This driver may have some utility in debugging. For each sample, it returns the + * current time as obtained from openvibe's System::Time:zgettime() converted to float seconds. + * + */ +class CDriverGenericTimeSignal final : public IDriver +{ +public: + explicit CDriverGenericTimeSignal(IDriverContext& ctx); + void release(); + const char* getName() override; + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override; + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + +protected: + IDriverCallback* m_callback = nullptr; + CHeader m_header; + + SettingsHelper m_settings; + + uint64_t m_nTotalSample = 0; + uint64_t m_startTime = 0; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASDrivers/labstreaminglayer/examples/SendToLSL.m b/applications/platform/acquisition-server/src/OVASDrivers/labstreaminglayer/examples/SendToLSL.m new file mode 100755 index 0000000000000000000000000000000000000000..bd30d14257b8a11367e03240a960b42719864d8b --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/labstreaminglayer/examples/SendToLSL.m @@ -0,0 +1,54 @@ +% +% A matlab example of sending data to OpenViBE via LabStreamingLayer. You need to have the LSL matlab stuff recursively on Matlab's Path. +% +% At the time of writing this, OpenViBE only supports numeric markers. +% +nChannels = 8; +samplingFreq = 100; + +disp('Loading LSL library...'); +lib = lsl_loadlib(); + +% make a new stream outlet +disp('Creating a new signal stream ...'); +info = lsl_streaminfo(lib,'ACMEAmp','EEG',nChannels,samplingFreq,'cf_float32','abcdefgh'); + +disp('Opening a signal outlet...'); +outlet = lsl_outlet(info); + +disp('Creating a new marker stream ...'); +markerInfo = lsl_streaminfo(lib,'ACMEMarkers','Markers',1,0,'cf_int32','myuniquesourceid23443'); + +disp('Opening a marker outlet...'); +markerOutlet = lsl_outlet(markerInfo); + +disp('Sending data...'); +t=0; +value = -1; +while true + + % If current time is even, sample is positive. When sample value changes to positive, send a marker. + sendMarker = 0; + if(mod(floor(t),2)==0) + if(value~=1) + sendMarker=1; + end + value = 1; + else + value = -1; + end + + % Push a sample + outlet.push_sample(value*(1:nChannels),t); + + % Push a marker? + if(sendMarker>0) + disp('push marker') + markerOutlet.push_sample(777,t); + end + + % step time, wait + t=t+(1/samplingFreq); + pause(1/samplingFreq); +end + diff --git a/applications/platform/acquisition-server/src/drivers/labstreaminglayer/ovasCConfigurationLabStreamingLayer.cpp b/applications/platform/acquisition-server/src/OVASDrivers/labstreaminglayer/ovasCConfigurationLabStreamingLayer.cpp similarity index 100% rename from applications/platform/acquisition-server/src/drivers/labstreaminglayer/ovasCConfigurationLabStreamingLayer.cpp rename to applications/platform/acquisition-server/src/OVASDrivers/labstreaminglayer/ovasCConfigurationLabStreamingLayer.cpp diff --git a/applications/platform/acquisition-server/src/drivers/labstreaminglayer/ovasCConfigurationLabStreamingLayer.h b/applications/platform/acquisition-server/src/OVASDrivers/labstreaminglayer/ovasCConfigurationLabStreamingLayer.h similarity index 100% rename from applications/platform/acquisition-server/src/drivers/labstreaminglayer/ovasCConfigurationLabStreamingLayer.h rename to applications/platform/acquisition-server/src/OVASDrivers/labstreaminglayer/ovasCConfigurationLabStreamingLayer.h diff --git a/applications/platform/acquisition-server/src/OVASDrivers/labstreaminglayer/ovasCDriverLabStreamingLayer.cpp b/applications/platform/acquisition-server/src/OVASDrivers/labstreaminglayer/ovasCDriverLabStreamingLayer.cpp new file mode 100755 index 0000000000000000000000000000000000000000..5020549d2657dc743ab327b897e7e60e55605c6d --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/labstreaminglayer/ovasCDriverLabStreamingLayer.cpp @@ -0,0 +1,498 @@ +#if defined(TARGET_HAS_ThirdPartyLSL) + +/* + * + * Notes: This code should be kept compatible with changes to LSL Output plugin in OpenViBE Acquisition Server, + * and LSL Export box in Designer. + * + * This driver makes a few assumptions: + * + * Signal streams + * - are float + * - dense, i.e. there are no dropped or extra samples in them + * - the driver fills a sample block consequently until either the block has been filled or + * time runs out. In case of the latter, the chunk is padded with NaNs. + * Markers + * - are int + * - not dense + * - markers are retimed wrt the current signal chunk + * + * Other notes: Due to network delays, it may be better to disable drift correction or + * set the drift tolerance to high. This is because + * 1) Signals are assumed dense, i.e. LSL pull results in samples stamped t,t+1,t+2,... + * 2) However, Acquisition Server works in real time, so if there is a network delay between + * the samples stamped t and t+1, this delay does not indicate a delay in the original signal + * and it might not be correct to pad the corresponding signal block during the delay. + * + * Todo. It might make sense to improve this driver in the future to take into account the LSL + * stamps when constructing each signal block. This is currently not done. + * + + * + * + * + */ + +#include <limits> // for NaN + +#include "ovasCDriverLabStreamingLayer.h" +#include "ovasCConfigurationLabStreamingLayer.h" + +#include <system/ovCTime.h> + +#include <lsl_cpp.h> + +#include <cmath> +#include <algorithm> + +namespace OpenViBE { +namespace AcquisitionServer { + +// In seconds +static const double LSL_SAMPLING_ESTIMATATION_DURATION = 2.0; +static const double LSL_RESOLVE_TIME_OUT = 2.0; +static const double LSL_OPEN_TIME_OUT = 2.0; +static const double LSL_READ_TIME_OUT = 2.0; + +static uint32_t getClosestMultipleOf25(const uint32_t value) { return uint32_t(((value + 12) / 25) * 25); } + +static uint32_t getClosestPowerOf2(const uint32_t value) +{ + uint32_t bitShiftCount = 0; + while ((1LL << bitShiftCount) < value) { bitShiftCount++; } + + if (bitShiftCount > 0) { + const uint32_t greater = uint32_t(1LL << bitShiftCount); + const uint32_t lesser = greater >> 1; + if (greater - value < value - lesser) { return greater; } + return lesser; + } + + return uint32_t(1LL << bitShiftCount); +} + +static uint32_t getSmartFallbackSamplingRateEstimate(const uint32_t lslSampling, const bool roundToPowerOfTwoAndMultiple25 = true) +{ + if (roundToPowerOfTwoAndMultiple25) { + const uint32_t closestMultipleOf25 = getClosestMultipleOf25(lslSampling); + const uint32_t closestPowerOfTwo = getClosestPowerOf2(lslSampling); + const uint32_t closestMultipleOf25Diff = uint32_t(std::abs(int(closestMultipleOf25) - int(lslSampling))); + const uint32_t closestPowerOfTwoDiff = uint32_t(std::abs(int(closestPowerOfTwo) - int(lslSampling))); + if (closestMultipleOf25Diff < closestPowerOfTwoDiff) { return closestMultipleOf25; } + return closestPowerOfTwo; + } + return lslSampling; +} + +//___________________________________________________________________// +// // + +CDriverLabStreamingLayer::CDriverLabStreamingLayer(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_LabStreamingLayer", m_driverCtx.getConfigurationManager()) +{ + // The following class allows saving and loading driver settings from the acquisition server .conf file + m_settings.add("Header", &m_header); + // To save your custom driver settings, register each variable to the SettingsHelper + m_settings.add("LimitSpeed", &m_limitSpeed); + m_settings.add("SignalStreamName", &m_sSignalStream); + m_settings.add("SignalStreamID", &m_sSignalStreamID); + m_settings.add("MarkerStreamName", &m_sMarkerStream); + m_settings.add("MarkerStreamID", &m_sMarkerStreamID); + m_settings.add("FallbackSamplingRate", &m_fallbackSampling); + m_settings.load(); + + /* + for (uint32_t i = 1; i < 260; ++i) + { + ctx.getLogManager() << Kernel::LogLevel_Error << i << " --> " << getSmartFallbackSamplingRateEstimate(i) << "\n"; + } + */ +} + +CDriverLabStreamingLayer::~CDriverLabStreamingLayer() {} + +const char* CDriverLabStreamingLayer::getName() { return "LabStreamingLayer (LSL)"; } + +//___________________________________________________________________// +// // + +bool CDriverLabStreamingLayer::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + if (m_driverCtx.isConnected()) { return false; } + + // Find the signal stream + const std::vector<lsl::stream_info> streams = lsl::resolve_stream("name", m_sSignalStream.toASCIIString(), 1, LSL_RESOLVE_TIME_OUT); + if (streams.empty()) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Error resolving signal stream with name [" << m_sSignalStream.toASCIIString() << "]\n"; + return false; + } + for (uint32_t i = 0; i < streams.size(); ++i) { + m_oSignalStream = streams[i]; + if (streams[i].source_id() == std::string(m_sSignalStreamID.toASCIIString())) { + // This is the best one + break; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Finally resolved signal stream to " << m_oSignalStream.name() + << ", id " << m_oSignalStream.source_id().c_str() << "\n"; + } + + // Find the marker stream + if (m_sMarkerStream != CString("None")) { + const std::vector<lsl::stream_info> markerStreams = lsl::resolve_stream("name", m_sMarkerStream.toASCIIString(), 1, LSL_RESOLVE_TIME_OUT); + if (markerStreams.empty()) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Error resolving marker stream with name [" << m_sMarkerStream.toASCIIString() << "]\n"; + return false; + } + for (uint32_t i = 0; i < markerStreams.size(); ++i) { + m_oMarkerStream = markerStreams[i]; + if (markerStreams[i].source_id() == std::string(m_sMarkerStreamID.toASCIIString())) { + // This is the best one + break; + } + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Finally resolved marker stream to " << m_oMarkerStream.name() + << ", id " << m_oMarkerStream.source_id().c_str() << "\n"; + } + else { + // We do not have a marker stream. This is ok. + } + + // Get the channel names. We open a temporary inlet for this, it will be closed after going out of scope. The actual inlet will be opened in start(). + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Polling channel names\n"; + lsl::stream_inlet tmpInlet(m_oSignalStream, 360, 0, false); + try { tmpInlet.open_stream(LSL_OPEN_TIME_OUT); } + catch (...) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Failed to open signal stream with name [" << m_oSignalStream.name() + << "] for polling channel names\n"; + return false; + } + + lsl::stream_info fullInfo; + try { fullInfo = tmpInlet.info(LSL_READ_TIME_OUT); } + catch (...) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Timeout reading full stream info for [" << m_oSignalStream.name() + << "] for polling channel names\n"; + return false; + } + + // Now sets channel count and names + m_header.setChannelCount(m_oSignalStream.channel_count()); + + const lsl::xml_element channels = fullInfo.desc().child("channels"); + lsl::xml_element channel = channels.child("channel"); + for (size_t i = 0; i < m_header.getChannelCount(); ++i) { + const char* label = channel.child_value("label"); + + if (label) { m_header.setChannelName(i, label); } + + channel = channel.next_sibling("channel"); + } + + // Buffer to store a single sample + m_buffer = new float[m_header.getChannelCount()]; + if (!m_buffer) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Memory allocation problem\n"; + return false; + } + + // Buffer to store the signal chunk + m_sample = new float[m_header.getChannelCount() * nSamplePerSentBlock]; + if (!m_sample) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Memory allocation problem\n"; + return false; + } + + // Now sets sampling rate + + uint32_t sampling = uint32_t(m_oSignalStream.nominal_srate()); + if (sampling == 0) { + // Check GUI fallback + if (m_fallbackSampling != 0) { + sampling = m_fallbackSampling; + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "LSL sampling rate is not defined, falls back to [" + << sampling << "] - You can change this in the driver settings\n"; + } + else { + // Autodetection was requested, let`s go for a round + m_driverCtx.getLogManager() << Kernel::LogLevel_Info + << "LSL sampling rate is not defined, falls back to [Autodetection] - You can change this in the driver settings\n"; + + try { + tmpInlet.open_stream(LSL_OPEN_TIME_OUT); + + // First drop all available samples + while (tmpInlet.samples_available() != 0) { tmpInlet.pull_sample(m_buffer, m_header.getChannelCount(), LSL_READ_TIME_OUT); } + + // Now capture incoming samples over a period of 2 secs + uint32_t nSample = 0; + const double startCaptureTime = tmpInlet.pull_sample(m_buffer, m_header.getChannelCount(), LSL_READ_TIME_OUT); + double currentCaptureTime = startCaptureTime; + while (currentCaptureTime != 0.0 && currentCaptureTime - startCaptureTime < LSL_SAMPLING_ESTIMATATION_DURATION) { + const double pulledSampleTime = tmpInlet.pull_sample(m_buffer, m_header.getChannelCount(), LSL_READ_TIME_OUT); + if (pulledSampleTime != 0) { + nSample++; + currentCaptureTime = pulledSampleTime; + } + else { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error + << "Timed out while receiving samples from LSL stream, avoiding auto detection.\n"; + delete[] m_buffer; + delete[] m_sample; + return false; + } + } + + // Finally set estimated sampling rate + const double duration = currentCaptureTime - startCaptureTime; + const uint32_t lslSampling = uint32_t(nSample / duration); + const uint32_t smartLSLSampling = getSmartFallbackSamplingRateEstimate(lslSampling); + + if (smartLSLSampling != lslSampling) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Acquired " << nSample << " on a duration of " << duration + << " seconds, sampling rate might be approx " << lslSampling << " hz (adjusted to " + << smartLSLSampling << " hz to conform with typical EEG sampling rates).\n"; + } + else { + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Acquired " << nSample << " on a duration of " << duration + << " seconds, sampling rate might be approx " << smartLSLSampling << " hz.\n"; + } + + sampling = smartLSLSampling; + } + catch (...) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Failed to detected actual LSL sampling rate\n"; + delete [] m_buffer; + delete [] m_sample; + return false; + } + } + } + + m_header.setSamplingFrequency(sampling); + + if (sampling != m_oSignalStream.nominal_srate()) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Opened an LSL stream with " << m_oSignalStream.channel_count() + << " channels and a nominal rate of " << m_oSignalStream.nominal_srate() << " hz.\n"; + } + else { + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Opened an LSL stream with " << m_oSignalStream.channel_count() + << " channels and a nominal rate of " << m_oSignalStream.nominal_srate() << " hz" << " adjusted to " << sampling << " hz.\n"; + } + + // Stores parameters + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + return true; +} + +bool CDriverLabStreamingLayer::start() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + m_pSignalInlet = new lsl::stream_inlet(m_oSignalStream, 360, 0, false); + if (!m_pSignalInlet) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Error getting signal inlet for [" << m_oSignalStream.name() << "]\n"; + return false; + } + + try { m_pSignalInlet->open_stream(LSL_OPEN_TIME_OUT); } + catch (...) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Failed to open signal stream with name [" << m_oSignalStream.name() << "]\n"; + return false; + } + + if (m_sMarkerStream != CString("None")) { + m_pMarkerInlet = new lsl::stream_inlet(m_oMarkerStream, 360, 0, false); + if (!m_pMarkerInlet) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Error getting marker inlet for [" << m_oMarkerStream.name() << "]\n"; + return false; + } + + try { m_pMarkerInlet->open_stream(LSL_OPEN_TIME_OUT); } + catch (...) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Failed to open marker stream with name [" << m_oSignalStream.name() << "]\n"; + return false; + } + } + + m_startTime = System::Time::zgetTime(); + m_nSample = 0; + + return true; +} + +bool CDriverLabStreamingLayer::loop() +{ + if (!m_driverCtx.isConnected()) { return false; } + if (!m_driverCtx.isStarted()) { return true; } + + const size_t nChannels = m_header.getChannelCount(); + + bool timeOut = false; + uint32_t timeOutAt = 0; + bool blockStartTimeSet = false; + double blockStartTime = 0; + + // receive signal from the stream + for (uint32_t i = 0; i < m_nSamplePerSentBlock; ++i) { + double captureTime; + try { captureTime = m_pSignalInlet->pull_sample(m_buffer, nChannels, LSL_READ_TIME_OUT); } + catch (...) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Failed to get signal sample from [" << m_oSignalStream.name() << "]\n"; + return false; + } + if (captureTime != 0) { + if (!blockStartTimeSet) { + blockStartTimeSet = true; + blockStartTime = captureTime; + //m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "First cap time is " << captureTime << "\n"; + } + + // Sample ok, fill + for (uint32_t j = 0; j < nChannels; ++j) { m_sample[j * m_nSamplePerSentBlock + i] = m_buffer[j]; } + } + else { + // Timeout + timeOutAt = i; + timeOut = true; + break; + } + } + + if (timeOut) { + // We fill the rest of the buffer with NaNs + for (uint32_t i = timeOutAt; i < m_nSamplePerSentBlock; ++i) { + for (uint32_t j = 0; j < nChannels; ++j) { m_sample[j * m_nSamplePerSentBlock + i] = std::numeric_limits<float>::quiet_NaN(); } + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Timeout reading sample from " << timeOutAt << ", filled rest of block with NaN\n"; + } + + if (m_limitSpeed) { + // If we were faster than what the AS expects, sleep. + // n.b. This sleep may not be accurate on Windows (it may oversleep) + const uint64_t timeNow = System::Time::zgetTime() - m_startTime; + const uint64_t timeLimitForBuffer = CTime(m_header.getSamplingFrequency(), m_nSample + m_nSamplePerSentBlock).time(); + + if (timeNow < timeLimitForBuffer) { + const uint64_t timeToSleep = timeLimitForBuffer - timeNow; + + // std::cout << "PostNap " << CTime(timeToSleep).toSeconds()*1000 << "ms at " << m_nSample+m_nSamplePerSentBlock << "\n"; + + System::Time::zsleep(timeToSleep); + } + } + + m_nSample += m_nSamplePerSentBlock; + + m_callback->setSamples(m_sample); + + // receive and pass markers. Markers are timed wrt the beginning of the signal block. + CStimulationSet stimulationSet; + if (m_pMarkerInlet) { + while (true) { + int marker; + double captureTime; + try { + captureTime = m_pMarkerInlet->pull_sample(&marker, 1, 0); // timeout is 0 here on purpose, either we have markers or not + } + catch (...) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Failed to get marker from [" << m_oMarkerStream.name() << "]\n"; + return false; + } + if (captureTime == 0) { + // no more markers available at the moment + break; + } + // double correction = m_pMarkerInlet->time_correction(); + // double stimTime = captureTime + correction - firstCaptureTime; + + // For openvibe, we need to set the stimulus time relative to the start of the chunk + static bool warningPrinted = false; + if (captureTime < blockStartTime && !warningPrinted) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Received marker from LSL date from before the start of the current chunk." + " Adjusting stamp to start of current chunk. Will not warn again.\n"; + warningPrinted = true; + } + const double stimTime = (captureTime > blockStartTime ? captureTime - blockStartTime : 0); + + // m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Got a marker " << marker << " at " << captureTime << " -> " + // << stimTime << "s." + // << "\n"; + + stimulationSet.push_back(uint64_t(marker), CTime(stimTime).time(), 0); + // std::cout << "date " << stimTime << "\n"; + } + } + + m_callback->setStimulationSet(stimulationSet); + + // LSL is not forcing the sample stream to confirm to the nominal sample rate. Hence, data may be incoming + // with slower or faster speed than implied by the rate (a little like reading from a file). In some + // cases it may be meaningful to disable the following drift correction from the AS settings. + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + + return true; +} + +bool CDriverLabStreamingLayer::stop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + + if (m_pSignalInlet) { + m_pSignalInlet->close_stream(); + + delete m_pSignalInlet; + m_pSignalInlet = nullptr; + } + + if (m_pMarkerInlet) { + m_pMarkerInlet->close_stream(); + + delete m_pMarkerInlet; + m_pMarkerInlet = nullptr; + } + + return true; +} + +bool CDriverLabStreamingLayer::uninitialize() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + if (m_buffer) { + delete[] m_buffer; + m_buffer = nullptr; + } + + if (m_sample) { + delete[] m_sample; + m_sample = nullptr; + } + + m_callback = nullptr; + + return true; +} + +//___________________________________________________________________// +// // +bool CDriverLabStreamingLayer::isConfigurable() +{ + return true; // change to false if your device is not configurable +} + +bool CDriverLabStreamingLayer::configure() +{ + // Change this line if you need to specify some references to your driver attribute that need configuration, e.g. the connection ID. + CConfigurationLabStreamingLayer config(m_driverCtx, Directories::getDataDir() + "/applications/acquisition-server/interface-LabStreamingLayer.ui", + m_header, m_limitSpeed, m_sSignalStream, m_sSignalStreamID, m_sMarkerStream, m_sMarkerStreamID, m_fallbackSampling); + + if (!config.configure(m_header)) { return false; } + m_settings.save(); + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyLSL diff --git a/applications/platform/acquisition-server/src/OVASDrivers/labstreaminglayer/ovasCDriverLabStreamingLayer.h b/applications/platform/acquisition-server/src/OVASDrivers/labstreaminglayer/ovasCDriverLabStreamingLayer.h new file mode 100755 index 0000000000000000000000000000000000000000..d82346aacca5a664df703de39a404d1907c0ba1f --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/labstreaminglayer/ovasCDriverLabStreamingLayer.h @@ -0,0 +1,75 @@ +#pragma once + +#if defined(TARGET_HAS_ThirdPartyLSL) + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" +#include <openvibe/ov_all.h> + +#include <lsl_cpp.h> + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverLabStreamingLayer + * \author Jussi T. Lindgren / Inria + * \date Wed Oct 15 09:41:18 2014 + * \brief The CDriverLabStreamingLayer allows the acquisition server to acquire data from a LabStreamingLayer (LSL) device. + * + * \sa CConfigurationLabStreamingLayer + */ +class CDriverLabStreamingLayer final : public IDriver +{ +public: + explicit CDriverLabStreamingLayer(IDriverContext& ctx); + ~CDriverLabStreamingLayer() override; + const char* getName() override; + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override; + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + + bool isFlagSet(const EDriverFlag flag) const override { return flag == EDriverFlag::IsUnstable; } + +protected: + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + + CHeader m_header; + +private: + uint32_t m_nSamplePerSentBlock = 0; + uint32_t m_fallbackSampling = 0; + float* m_sample = nullptr; + float* m_buffer = nullptr; + + uint64_t m_startTime = 0; + uint64_t m_nSample = 0; + + lsl::stream_info m_oSignalStream; + lsl::stream_inlet* m_pSignalInlet = nullptr; + + lsl::stream_info m_oMarkerStream; + lsl::stream_inlet* m_pMarkerInlet = nullptr; + + bool m_limitSpeed = false; + CString m_sSignalStream; + CString m_sSignalStreamID; + CString m_sMarkerStream; + CString m_sMarkerStreamID; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyLSL diff --git a/applications/platform/acquisition-server/src/OVASDrivers/mcs-nvx/ovasCConfigurationMCSNVXDriver.cpp b/applications/platform/acquisition-server/src/OVASDrivers/mcs-nvx/ovasCConfigurationMCSNVXDriver.cpp new file mode 100755 index 0000000000000000000000000000000000000000..aa8694de254d493c42d2051289d1a43b1cf72232 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/mcs-nvx/ovasCConfigurationMCSNVXDriver.cpp @@ -0,0 +1,70 @@ +#if defined(TARGET_HAS_ThirdPartyMCS) + +#include "ovasCConfigurationMCSNVXDriver.h" + +namespace OpenViBE { +namespace AcquisitionServer { + +/*_________________________________________________ + +Insert callback to specific widget here +Example with a button that launch a calibration of the device: + +//Callback connected to a dedicated gtk button: +static void button_calibrate_pressed_cb(GtkButton* button, void* data) +{ + CConfigurationMKSNVXDriver* config=static_cast<CConfigurationMKSNVXDriver*>(data); + config->buttonCalibratePressedCB(); +} + +//Callback actually called: +void CConfigurationGTecGUSBamp::buttonCalibratePressedCB() +{ + // Connect to the hardware, ask for calibration, verify the return code, etc. +} +_________________________________________________*/ + +// If you added more reference attribute, initialize them here +CConfigurationMKSNVXDriver::CConfigurationMKSNVXDriver(IDriverContext& ctx, const char* gtkBuilderFilename, uint32_t& dataMode, bool& auxChannels) + : CConfigurationBuilder(gtkBuilderFilename), dataMode_(dataMode), showAuxChannels_(auxChannels), m_driverCtx(ctx) {} + +bool CConfigurationMKSNVXDriver::preConfigure() +{ + if (! CConfigurationBuilder::preConfigure()) { return false; } + + // Connect here all callbacks + // Example: + // g_signal_connect(gtk_builder_get_object(m_builder, "button_calibrate"), "pressed", G_CALLBACK(button_calibrate_pressed_cb), this); + + // Insert here the pre-configure code. + // For example, you may want to check if a device is currently connected + // and if more than one are connected. Then you can list in a dedicated combo-box + // the device currently connected so the user can choose which one he wants to acquire from. + GtkComboBox* comboDataMode = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_mode")); + gtk_combo_box_set_active(comboDataMode, dataMode_); + GtkToggleButton* toggleShowAuxChannels = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_show_aux_channels")); + gtk_toggle_button_set_active(toggleShowAuxChannels, showAuxChannels_); + return true; +} + +bool CConfigurationMKSNVXDriver::postConfigure() +{ + if (m_applyConfig) + { + // If the user pressed the "apply" button, you need to save the changes made in the configuration. + // For example, you can save the connection ID of the selected device: + // m_connectionID = <value-from-gtk-widget> + GtkComboBox* comboDataMode = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_mode")); + dataMode_ = uint32_t(gtk_combo_box_get_active(comboDataMode)); + GtkToggleButton* toggleShowAuxChannels = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_show_aux_channels")); + showAuxChannels_ = (gtk_toggle_button_get_active(toggleShowAuxChannels) > 0); + } + + // normal header is filled (Subject ID, Age, Gender, channels, sampling frequency), ressources are realesed + if (! CConfigurationBuilder::postConfigure()) { return false; } + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif diff --git a/applications/platform/acquisition-server/src/OVASDrivers/mcs-nvx/ovasCConfigurationMCSNVXDriver.h b/applications/platform/acquisition-server/src/OVASDrivers/mcs-nvx/ovasCConfigurationMCSNVXDriver.h new file mode 100755 index 0000000000000000000000000000000000000000..a161838d38524dd84174e1b722428164b30caa4d --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/mcs-nvx/ovasCConfigurationMCSNVXDriver.h @@ -0,0 +1,34 @@ +#pragma once + +#include "../../ovasCConfigurationBuilder.h" +#include "ovasIDriver.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CConfigurationMKSNVXDriver + * \author mkochetkov (MKS) + * \date Tue Jan 21 23:21:03 2014 + * \brief The CConfigurationMKSNVXDriver handles the configuration dialog specific to the MKSNVXDriver device. + * + * TODO: details + * + * \sa CDriverMKSNVXDriver + */ +class CConfigurationMKSNVXDriver final : public CConfigurationBuilder +{ + uint32_t& dataMode_; + bool& showAuxChannels_; +protected: + IDriverContext& m_driverCtx; +public: + // you may have to add to your constructor some reference parameters + // for example, a connection ID: + //CConfigurationMKSNVXDriver(IDriverContext& ctx, const char* gtkBuilderFilename, uint32_t& rConnectionId); + CConfigurationMKSNVXDriver(IDriverContext& ctx, const char* gtkBuilderFilename, uint32_t& dataMode, bool& auxChannels); + + bool preConfigure() override; + bool postConfigure() override; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASDrivers/mcs-nvx/ovasCDriverMCSNVXDriver.cpp b/applications/platform/acquisition-server/src/OVASDrivers/mcs-nvx/ovasCDriverMCSNVXDriver.cpp new file mode 100755 index 0000000000000000000000000000000000000000..cf73bd833dc36a24d18016e2a571f9f9f25e8b76 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/mcs-nvx/ovasCDriverMCSNVXDriver.cpp @@ -0,0 +1,482 @@ +#if defined(TARGET_HAS_ThirdPartyMCS) + +#include "ovasCDriverMCSNVXDriver.h" +#include "ovasCConfigurationMCSNVXDriver.h" + +#include <toolkit/ovtk_all.h> + +namespace OpenViBE { +namespace AcquisitionServer { + +void setNVXDataSettinsDefaults(t_NVXDataSettins& ds) +{ + ds.DataRate = 2; + for (size_t i = 0; i < NVX_SELECT_CHANNELS_COUNT; ++i) + { + ds.NVXChannelsSelect.MainChannels[i] = short(i); + ds.NVXChannelsSelect.DiffChannels[i] = 255; + } +} + +CDriverMKSNVXDriver::CDriverMKSNVXDriver(IDriverContext& ctx) + : IDriver(ctx), nvxDataModel_(NVX_DM_NORMAL) + , m_settings("AcquisitionServer_Driver_MKSNVXDriver", m_driverCtx.getConfigurationManager()) +{ + setNVXDataSettinsDefaults(nvxDataSettings_); + m_header.setSamplingFrequency(10000); + m_header.setChannelCount(maxNumberOfChannels); + + // The following class allows saving and loading driver settings from the acquisition server .conf file + m_settings.add("Header", &m_header); + // To save your custom driver settings, register each variable to the SettingsHelper + m_settings.add("dataMode", &dataMode_); + m_settings.add("showAuxChannels", &showAuxChannels_); + + m_settings.load(); +} + +CDriverMKSNVXDriver::~CDriverMKSNVXDriver() {} + +const char* CDriverMKSNVXDriver::getName() { return "MCS NVX amplifier"; } + +//___________________________________________________________________// +// // + +bool CDriverMKSNVXDriver::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + if (m_driverCtx.isConnected()) return false; + if (!m_header.isChannelCountSet() || !m_header.isSamplingFrequencySet()) return false; + + static const char* configuration = "<Configuration version=\"100\"></Configuration>"; + if (NVXAPIInit(configuration) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Cannot load NVX library.\n"; + return false; + } + // ... + // initialize hardware and get + // available header information + // from it + // Using for example the connection ID provided by the configuration (m_connectionID) + // ... + const size_t deviceCount = NVXGetCount(); + if (deviceCount != 1) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << (deviceCount == 0 ? "No MKS device found.\n" : "Only one MKS device is supported.\n"); + return false; + } + nvxDeviceId_ = NVXGetId(0); + if (NVXGetInformation(nvxDeviceId_, &nvxInfo_) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXGetInformation error.\n"; + return false; + } + uint32_t realChannelsCount = 0; + switch (nvxInfo_.Model) + { + case NVX_MODEL_16: realChannelsCount = showAuxChannels_ ? 16 : 10; + break; + case NVX_MODEL_24: realChannelsCount = 24; + break; + case NVX_MODEL_36: realChannelsCount = showAuxChannels_ ? 36 : 32; + break; + case NVX_MODEL_52: realChannelsCount = showAuxChannels_ ? 52 : 48; + break; + default: m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unsupported device model: ." << nvxInfo_.Model << "\n"; + return false; + } + nvxDataModel_ = NVX_DM_NORMAL; + switch (m_header.getSamplingFrequency()) + { + case 50000: nvxDataSettings_.DataRate = 0; // it is not used + realChannelsCount = 4; + nvxDataModel_ = NVX_DM_50_KHZ; + break; + case 10000: nvxDataSettings_.DataRate = 0; + realChannelsCount = 16; + break; + case 5000: nvxDataSettings_.DataRate = 1; + realChannelsCount = 24; + break; + case 2000: nvxDataSettings_.DataRate = 2; + break; + case 1000: nvxDataSettings_.DataRate = 3; + break; + case 500: nvxDataSettings_.DataRate = 4; + break; + case 250: nvxDataSettings_.DataRate = 5; + break; + case 125: nvxDataSettings_.DataRate = 6; + break; + default: m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unsupported sampling frequency.\n"; + return false; + } + m_header.setChannelCount(realChannelsCount); + samplesCounter_ = 0; + triggerStates_ = 0; + // Builds up a buffer to store + // acquired samples. This buffer + // will be sent to the acquisition + // server later... + sampleData_.resize(getDeviceBufferSamplesCapacity()); + + if (NVXSetDataMode(nvxDeviceId_, nvxDataModel_, &nvxDataSettings_) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXSetDataMode error.\n"; + return false; + } + + if (NVXGetProperty(nvxDeviceId_, &nvxProperty_) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXGetProperty error.\n"; + return false; + } + + if (NVXOpen(nvxDeviceId_) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXSetDataMode error.\n"; + return false; + } + // Saves parameters + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + if (m_driverCtx.isImpedanceCheckRequested()) + { + if (NVXStartImpedance(nvxDeviceId_) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXStartImpedance error.\n"; + return false; + } + if (NVXStart(nvxDeviceId_) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXStart error.\n"; + return false; + } + } + return true; +} + +bool CDriverMKSNVXDriver::start() +{ + if (!m_driverCtx.isConnected()) return false; + if (m_driverCtx.isStarted()) return false; + + // ... + // request hardware to start + // sending data + // ... + samplesCounter_ = 0; + if (m_driverCtx.isImpedanceCheckRequested()) + { + if (NVXStop(nvxDeviceId_) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXStop error.\n"; + return false; + } + if (NVXStopImpedance(nvxDeviceId_) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXStopImpedance error.\n"; + return false; + } + } + switch (dataMode_) + { + case 1: // test + if (NVXStartTest(nvxDeviceId_, 0) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXStartTest error.\n"; + return false; + } + // break; no break on purpose + case 0: // normal + if (NVXStart(nvxDeviceId_) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXStart error.\n"; + return false; + } + break; + default: return false; + } + return true; +} + +const float floatNaN = std::numeric_limits<float>::quiet_NaN(); +#define NVXValueToFloat(v, resolution) ((v) == INT_MAX ? floatNaN : ((v)*(resolution))) +// #define NVXValueToFloat(v, resolution) ((v) == INT_MAX ? 0.f : ((v)*(resolution))) + +bool CDriverMKSNVXDriver::loop() +{ + if (!m_driverCtx.isConnected()) return false; + if (m_driverCtx.isStarted()) + { + const size_t bufferSize = sizeof(deviceBuffer_); + int res = NVXGetData(nvxDeviceId_, deviceBuffer_, bufferSize); + size_t sizeOfNVXDataModelStructure = nvxDataModel_ == NVX_DM_NORMAL ? (nvxInfo_.Model == NVX_MODEL_16 ? sizeof(t_NVXDataModel16) + : (nvxInfo_.Model == NVX_MODEL_24 ? sizeof(t_NVXDataModel24) + : (nvxInfo_.Model == NVX_MODEL_36 ? sizeof(t_NVXDataModel36) + : sizeof(t_NVXDataModel52)))) + : sizeof(t_NVXDataMode50kHz); + if (res < 0 || res > bufferSize || res % sizeOfNVXDataModelStructure) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXGetData returned " << res << " This is unexpected.\n"; + return false; + } + if (res) + { + CStimulationSet stimSet; + + // ... + // receive samples from hardware + // put them the correct way in the sample array + // whether the buffer is full, send it to the acquisition server + //... + const size_t channelsAmount = m_header.getChannelCount(); + const size_t sampblesPerChannel = res / sizeOfNVXDataModelStructure; + if (sampblesPerChannel * channelsAmount > getDeviceBufferSamplesCapacity()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << + "Internal error: the amount of data exceeds the size of sampleData storage. This is internal error due to sampleData storage miscalculation.\n"; + return false; + } + float* sampleDataPtr = &sampleData_.at(0); + const float eegResolution = nvxProperty_.ResolutionEeg * 1000000.f, auxResolution = nvxProperty_.ResolutionAux * 1000000.f; + for (size_t j = 0; j < sampblesPerChannel; ++j) + { + for (size_t i = 0; i < channelsAmount; ++i) + { + if (nvxDataModel_ == NVX_DM_NORMAL) + { + switch (nvxInfo_.Model) + { + case NVX_MODEL_16: if (i < NVX_MODEL_16_CHANNELS_MAIN) + { + sampleDataPtr[i * sampblesPerChannel + j] = NVXValueToFloat(reinterpret_cast<t_NVXDataModel16*>(deviceBuffer_)[j].Main[i], eegResolution); + } + else + { + const size_t auxChannelNumber = i - NVX_MODEL_16_CHANNELS_MAIN; + sampleDataPtr[i * sampblesPerChannel + j] = NVXValueToFloat( + reinterpret_cast<t_NVXDataModel16*>(deviceBuffer_)[j].Aux[auxChannelNumber], auxResolution); + } + break; + case NVX_MODEL_24: sampleDataPtr[i * sampblesPerChannel + j] = NVXValueToFloat(reinterpret_cast<t_NVXDataModel24*>(deviceBuffer_)[j].Main[i], eegResolution); + break; + case NVX_MODEL_36: if (i < NVX_MODEL_36_CHANNELS_MAIN) + { + sampleDataPtr[i * sampblesPerChannel + j] = NVXValueToFloat(reinterpret_cast<t_NVXDataModel36*>(deviceBuffer_)[j].Main[i], eegResolution); + } + else + { + const size_t auxChannelNumber = i - NVX_MODEL_36_CHANNELS_MAIN; + sampleDataPtr[i * sampblesPerChannel + j] = NVXValueToFloat(reinterpret_cast<t_NVXDataModel36*>(deviceBuffer_)[j].Aux[auxChannelNumber], auxResolution); + } + break; + case NVX_MODEL_52: if (i < NVX_MODEL_52_CHANNELS_MAIN) + { + sampleDataPtr[i * sampblesPerChannel + j] = NVXValueToFloat(reinterpret_cast<t_NVXDataModel52*>(deviceBuffer_)[j].Main[i], eegResolution); + } + else + { + const size_t auxChannelNumber = i - NVX_MODEL_52_CHANNELS_MAIN; + sampleDataPtr[i * sampblesPerChannel + j] = NVXValueToFloat(reinterpret_cast<t_NVXDataModel52*>(deviceBuffer_)[j].Aux[auxChannelNumber], auxResolution); + } + break; + default: m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unsupported device model: ." << nvxInfo_.Model << "\n"; + return false; + } + } + else + { + sampleDataPtr[i * sampblesPerChannel + j] = NVXValueToFloat(reinterpret_cast<t_NVXDataMode50kHz*>(deviceBuffer_)[j].Main[i], eegResolution); + } + } + // check data integrity + uint32_t correctSamplesCounter = 0; + if (nvxDataModel_ == NVX_DM_NORMAL) + { + switch (nvxInfo_.Model) + { + case NVX_MODEL_16: correctSamplesCounter = reinterpret_cast<t_NVXDataModel16*>(deviceBuffer_)[j].Counter; + break; + case NVX_MODEL_24: correctSamplesCounter = reinterpret_cast<t_NVXDataModel24*>(deviceBuffer_)[j].Counter; + break; + case NVX_MODEL_36: correctSamplesCounter = reinterpret_cast<t_NVXDataModel36*>(deviceBuffer_)[j].Counter; + break; + case NVX_MODEL_52: correctSamplesCounter = reinterpret_cast<t_NVXDataModel52*>(deviceBuffer_)[j].Counter; + break; + default: m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unsupported device model: ." << nvxInfo_.Model << "\n"; + return false; + } + } + else { correctSamplesCounter = reinterpret_cast<t_NVXDataMode50kHz*>(deviceBuffer_)[j].Counter; } + if (samplesCounter_ != correctSamplesCounter) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Data loss: expected sample number is " << samplesCounter_ + << " and the hardware reports " << correctSamplesCounter << "\n"; + samplesCounter_ = correctSamplesCounter; + stimSet.push_back(OVTK_StimulationId_Label_00, CTime(m_header.getSamplingFrequency(), j).time(), 0); + } + ++samplesCounter_; + // set triggers + uint32_t currentTriggersState = 0; + if (nvxDataModel_ == NVX_DM_NORMAL) + { + switch (nvxInfo_.Model) + { + case NVX_MODEL_16: currentTriggersState = ~reinterpret_cast<t_NVXDataModel16*>(deviceBuffer_)[j].Status & 0x1ff; + break; + case NVX_MODEL_24: currentTriggersState = ~reinterpret_cast<t_NVXDataModel24*>(deviceBuffer_)[j].Status & 0x1ff; + break; + case NVX_MODEL_36: currentTriggersState = ~reinterpret_cast<t_NVXDataModel36*>(deviceBuffer_)[j].Status & 0x1ff; + break; + case NVX_MODEL_52: currentTriggersState = ~reinterpret_cast<t_NVXDataModel52*>(deviceBuffer_)[j].Status & 0x1ff; + break; + default: m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unsupported device model: ." << nvxInfo_.Model << "\n"; + return false; + } + } + else { currentTriggersState = ~reinterpret_cast<t_NVXDataMode50kHz*>(deviceBuffer_)[j].Status & 0x1ff; } + for (uint32_t triggerBit = 1, ovtkLabel = OVTK_StimulationId_Label_01; triggerBit <= 256; triggerBit <<= 1, ++ovtkLabel) + { + if (currentTriggersState & triggerBit) + { + if (!(triggerStates_ & triggerBit)) + { + triggerStates_ |= triggerBit; + stimSet.push_back(ovtkLabel, CTime(m_header.getSamplingFrequency(), j).time(), 0); + } + } + else { triggerStates_ &= ~triggerBit; } + } + } + m_callback->setSamples(sampleDataPtr, sampblesPerChannel); + + // When your sample buffer is fully loaded, + // it is advised to ask the acquisition server + // to correct any drift in the acquisition automatically. + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + + // ... + // receive events from hardware + // and put them the correct way in a CStimulationSet object + //... + if (stimSet.size() != 0) { m_callback->setStimulationSet(stimSet); } + } + } + else if (m_driverCtx.isImpedanceCheckRequested()) + { // impedance + const size_t impedanceBubberCapacityAmount = 48; + uint32_t impedanceBuffer[impedanceBubberCapacityAmount]; + size_t impedanceChannelsAmount = m_header.getChannelCount(); + if (impedanceChannelsAmount == 36 || impedanceChannelsAmount == 52) { impedanceChannelsAmount -= 4; } + if (impedanceBubberCapacityAmount < impedanceChannelsAmount) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Incorrect channels amount in impedance mode. This is internal error which shall never happen.\n"; + return false; + } + if (NVXGetImpedance(nvxDeviceId_, impedanceBuffer, impedanceChannelsAmount * sizeof(impedanceBuffer[0])) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXGetImpedance error.\n"; + return false; + } + for (size_t i = 0; i < impedanceChannelsAmount; ++i) { m_driverCtx.updateImpedance(i, impedanceBuffer[i]); } + } + return true; +} + +bool CDriverMKSNVXDriver::stop() +{ + if (!m_driverCtx.isConnected()) return false; + if (!m_driverCtx.isStarted()) return false; + + // ... + // request the hardware to stop + // sending data + // ... + switch (dataMode_) + { + case 0: // normal + if (NVXStop(nvxDeviceId_) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXStop error.\n"; + return false; + } + break; + case 1: // test + if (NVXStop(nvxDeviceId_) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXStop error.\n"; + return false; + } + if (NVXStopTest(nvxDeviceId_) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXStopTest error.\n"; + return false; + } + break; + default: return false; + } + + return true; +} + +bool CDriverMKSNVXDriver::uninitialize() +{ + if (!m_driverCtx.isConnected()) return false; + if (!m_driverCtx.isStarted()) + { + if (m_driverCtx.isImpedanceCheckRequested()) + { + if (NVXStop(nvxDeviceId_) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXStop error.\n"; + return false; + } + if (NVXStopImpedance(nvxDeviceId_) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXStopImpedance error.\n"; + return false; + } + if (NVXClose(nvxDeviceId_) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXClose error.\n"; + return false; + } + return true; + } + return false; + } + + // ... + // uninitialize hardware here + // ... + if (NVXClose(nvxDeviceId_) != NVX_ERR_OK) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "NVXClose error.\n"; + return false; + } + + m_callback = nullptr; + NVXAPIStop(); + + return true; +} + +//___________________________________________________________________// +// // +bool CDriverMKSNVXDriver::isConfigurable() { return true; } // change to false if your device is not configurable + +bool CDriverMKSNVXDriver::configure() +{ + // Change this line if you need to specify some references to your driver attribute that need configuration, e.g. the connection ID. + CConfigurationMKSNVXDriver config(m_driverCtx, Directories::getDataDir() + "/applications/acquisition-server/interface-MCSNVXDriver.ui", dataMode_, showAuxChannels_); + + if (!config.configure(m_header)) { return false; } + m_settings.save(); + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif diff --git a/applications/platform/acquisition-server/src/OVASDrivers/mcs-nvx/ovasCDriverMCSNVXDriver.h b/applications/platform/acquisition-server/src/OVASDrivers/mcs-nvx/ovasCDriverMCSNVXDriver.h new file mode 100755 index 0000000000000000000000000000000000000000..21ae9436260594cdc89cdc0251c6c6c56b6c1fd7 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/mcs-nvx/ovasCDriverMCSNVXDriver.h @@ -0,0 +1,79 @@ +#pragma once + +#if defined(TARGET_HAS_ThirdPartyMCS) + +#include <vector> +#include "ovasIDriver.h" +#include "../../ovasCHeader.h" +#include <openvibe/ov_all.h> + +#include "../../ovasCSettingsHelper.h" +#include "../../ovasCSettingsHelperOperators.h" +#include "NVX.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverMKSNVXDriver + * \author mkochetkov (MKS) + * \date Tue Jan 21 23:21:03 2014 + * \brief The CDriverMKSNVXDriver allows the acquisition server to acquire data from a MKSNVXDriver device. + * + * TODO: details + * + * \sa CConfigurationMKSNVXDriver + */ +const size_t maxNumberOfChannels = 36; + +class CDriverMKSNVXDriver : public IDriver +{ + uint8_t deviceBuffer_[1024 * maxNumberOfChannels]; + int nvxDeviceId_ = -1; + t_NVXDataSettins nvxDataSettings_; + int nvxDataModel_ = 0; + uint32_t dataMode_ = 0; // normal, test, impedance + t_NVXProperty nvxProperty_; + uint32_t samplesCounter_ = 0; // previous t_NVXDataModelXX.Counter + uint32_t triggerStates_ = 0; + bool showAuxChannels_ = false; + t_NVXInformation nvxInfo_; +public: + + CDriverMKSNVXDriver(IDriverContext& ctx); + size_t getDeviceBufferSamplesCapacity() const + { + return sizeof(deviceBuffer_) / sizeof(t_NVXDataModel36) * maxNumberOfChannels; + } // I really do not know if it is accurate for all modes. + ~CDriverMKSNVXDriver() override; + const char* getName() override; + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override; + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + + bool isFlagSet(const EDriverFlag flag) const override { return flag == EDriverFlag::IsUnstable; } + +protected: + + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + + // Replace this generic Header with any specific header you might have written + CHeader m_header; + + uint32_t m_nSamplePerSentBlock = 0; + std::vector<float> sampleData_; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + + +#endif diff --git a/applications/platform/acquisition-server/src/OVASDrivers/mensia-acquisition/ovasCConfigurationDriverMensiaAcquisition.cpp b/applications/platform/acquisition-server/src/OVASDrivers/mensia-acquisition/ovasCConfigurationDriverMensiaAcquisition.cpp new file mode 100644 index 0000000000000000000000000000000000000000..83b64760edcc867aa52b8c1ef967ce1dc081112f --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/mensia-acquisition/ovasCConfigurationDriverMensiaAcquisition.cpp @@ -0,0 +1,27 @@ +#ifdef TARGET_OS_Windows + +#include "ovasCConfigurationDriverMensiaAcquisition.h" + +namespace OpenViBE { +namespace AcquisitionServer { + +//TODO_JL Add the URL as parameter for configuration so it can be saved and loaded + +CConfigurationDriverMensiaAcquisition::CConfigurationDriverMensiaAcquisition(IDriverContext& ctx, const char* gtkBuilderFilename) + : CConfigurationBuilder(gtkBuilderFilename), m_driverCtx(ctx) {} + +bool CConfigurationDriverMensiaAcquisition::preConfigure() +{ + //TODO_JL call preConfigure from DLL + return CConfigurationBuilder::preConfigure(); +} + +bool CConfigurationDriverMensiaAcquisition::postConfigure() +{ + //if (m_applyConfig) { } //TODO_JL call postConfigure from DLL + return CConfigurationBuilder::postConfigure(); +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_OS_Windows diff --git a/applications/platform/acquisition-server/src/OVASDrivers/mensia-acquisition/ovasCConfigurationDriverMensiaAcquisition.h b/applications/platform/acquisition-server/src/OVASDrivers/mensia-acquisition/ovasCConfigurationDriverMensiaAcquisition.h new file mode 100644 index 0000000000000000000000000000000000000000..b63f537888a93f57657792944bfd5e2bae86ce6e --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/mensia-acquisition/ovasCConfigurationDriverMensiaAcquisition.h @@ -0,0 +1,33 @@ +#pragma once + +#ifdef TARGET_OS_Windows + +#include "../ovasCConfigurationBuilder.h" +#include "ovasIDriver.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CConfigurationDriverMensiaAcquisition + * \author Jozef Legeny (Mensia) + * \date 28 jan 2013 + * \brief The CConfigurationDriverMensiaAcquisition loads the configuration using the mensia-acquisition dynamic library + * + * \sa CDriverGenericOscillator + */ + +class CConfigurationDriverMensiaAcquisition final : public CConfigurationBuilder +{ +public: + CConfigurationDriverMensiaAcquisition(IDriverContext& ctx, const char* gtkBuilderFilename); + + bool preConfigure() override; + bool postConfigure() override; + +protected: + IDriverContext& m_driverCtx; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_OS_Windows diff --git a/applications/platform/acquisition-server/src/OVASDrivers/mensia-acquisition/ovasCDriverMensiaAcquisition.cpp b/applications/platform/acquisition-server/src/OVASDrivers/mensia-acquisition/ovasCDriverMensiaAcquisition.cpp new file mode 100644 index 0000000000000000000000000000000000000000..e011ed5a2a83ff755b7d6046f35271036560e85d --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/mensia-acquisition/ovasCDriverMensiaAcquisition.cpp @@ -0,0 +1,360 @@ +#ifdef TARGET_OS_Windows + +#include "ovasCDriverMensiaAcquisition.h" +#include "ovasCConfigurationDriverMensiaAcquisition.h" + +#include <toolkit/ovtk_all.h> + +//#include <Windows.h> +#include <system/WindowsUtilities.h> + +#include <string> + +#include <fstream> + +namespace OpenViBE { +namespace AcquisitionServer { + +namespace { +enum class EAcquisitionModes { Undefined = 0, Data = 1, Impedance = 2 }; + +CString mensiaDll = "openvibe-driver-mensia-acquisition.dll"; +HINSTANCE libMensiaAcquisition; // Library Handle + +typedef int (* initialize_acquisition_driver_t)(const char* sDeviceIdentifier, IDriverContext& ctx); + +typedef const char* (* get_name_t)(size_t); + +typedef const char* (* get_device_url_t)(size_t); + +typedef bool (*preconfigure_t)(size_t, const char*); +typedef bool (*configure_t)(size_t, const char*); +typedef uint32_t (*get_sampling_t)(size_t); +typedef uint32_t (*get_channel_count_t)(size_t); +typedef const char* (*get_channel_name_t)(size_t, size_t); +typedef bool (*is_impedance_check_requested_t)(size_t); +typedef void (*set_impedance_check_requested_t)(size_t, bool); +typedef float (*get_channel_impedance_t)(size_t, size_t); +typedef uint32_t (*get_impedance_limit_t)(size_t); +typedef void (*set_impedance_limit_t)(size_t, uint32_t); +typedef uint32_t (*get_experiment_id_t)(size_t); +typedef uint32_t (*set_experiment_id_t)(size_t, uint32_t); +typedef uint32_t (*get_subject_age_t)(size_t); +typedef uint32_t (*set_subject_age_t)(size_t, uint32_t); +typedef uint32_t (*get_subject_gender_t)(size_t); +typedef uint32_t (*set_subject_gender_t)(size_t, uint32_t); +typedef uint32_t (*set_sample_count_per_buffer_t)(size_t, uint32_t); +typedef bool (*initialize_t)(size_t, IDriverCallback*, uint32_t, const char*, EAcquisitionModes); +typedef bool (*start_t)(size_t); +typedef bool (*stop_t)(size_t); +typedef bool (*uninitialize_t)(size_t); +typedef bool (*loop_t)(size_t); + +initialize_acquisition_driver_t fpInitializeAcquisitionDriver; +get_name_t fpGetName; +get_device_url_t fpGetDeviceURL; + +preconfigure_t fpPreconfigure; +configure_t fpConfigure; +get_sampling_t fpGetSampling; +get_channel_count_t fpGetChannelCount; +get_channel_name_t fpGetChannelName; +is_impedance_check_requested_t fpIsImpedanceCheckRequested; +set_impedance_check_requested_t fpSetImpedanceCheckRequested; +get_channel_impedance_t fpGetChannelImpedance; +get_impedance_limit_t fpGetImpedanceLimit; +set_impedance_limit_t fpSetImpedanceLimit; +get_experiment_id_t fpGetExperimentID; +set_experiment_id_t fpSetExperimentID; +get_subject_age_t fpGetSubjectAge; +set_subject_age_t fpSetSubjectAge; +get_subject_gender_t fpGetSubjectGender; +set_subject_gender_t fpSetSubjectGender; +set_sample_count_per_buffer_t fpSetSampleCountPerBuffer; +initialize_t fpInitialize; +start_t fpStart; +stop_t fpStop; +uninitialize_t fpUninitialize; +loop_t fpLoop; +} // namespace + +template <typename T> +void CDriverMensiaAcquisition::loadDLLfunct(T* pointer, const char* name) +{ + *pointer = T(GetProcAddress(libMensiaAcquisition, name)); + if (!*pointer) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Load method " << name << "\n"; + m_valid = false; + } +} + + +CDriverMensiaAcquisition::CDriverMensiaAcquisition(IDriverContext& ctx, const char* driverID) + : IDriver(ctx) + // This hax only works because m_settings does creates a copy of the string + , m_settings(std::string(std::string("AcquisitionServer_Driver_MensiaAcquisition_") + driverID).c_str(), m_driverCtx.getConfigurationManager()) +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverMensiaAcquisition::CDriverMensiaAcquisition\n"; + m_valid = true; + + // Load the Mensia Acquisition Library + const CString path = m_driverCtx.getConfigurationManager().expand("${Path_Bin}") + "/" + mensiaDll; + if (!std::ifstream(path.toASCIIString()).is_open()) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverMensiaAcquisition::CDriverMensiaAcquisition: " << " dll file [" + << path << "] not openable, perhaps it was not installed.\n"; + m_valid = false; + return; + } + + libMensiaAcquisition = HINSTANCE(System::WindowsUtilities::utf16CompliantLoadLibrary(path.toASCIIString())); + if (!libMensiaAcquisition) { + m_driverCtx.getLogManager() << "CDriverMensiaAcquisition::CDriverMensiaAcquisition: utf16CompliantLoadLibrary failed to load: " + << path << " with error " << size_t(GetLastError()) << "\n"; + } + + loadDLLfunct<initialize_acquisition_driver_t>(&fpInitializeAcquisitionDriver, "initializeAcquisitionDriver"); + loadDLLfunct<get_name_t>(&fpGetName, "getName"); + loadDLLfunct<get_device_url_t>(&fpGetDeviceURL, "getDeviceURL"); + loadDLLfunct<preconfigure_t>(&fpPreconfigure, "preconfigure"); + loadDLLfunct<configure_t>(&fpConfigure, "configure"); + loadDLLfunct<get_sampling_t>(&fpGetSampling, "getSamplingRate"); + loadDLLfunct<get_channel_count_t>(&fpGetChannelCount, "getChannelCount"); + loadDLLfunct<get_channel_name_t>(&fpGetChannelName, "getChannelName"); + loadDLLfunct<is_impedance_check_requested_t>(&fpIsImpedanceCheckRequested, "isImpedanceCheckRequested"); + loadDLLfunct<set_impedance_check_requested_t>(&fpSetImpedanceCheckRequested, "setImpedanceCheckRequested"); + loadDLLfunct<get_channel_impedance_t>(&fpGetChannelImpedance, "getChannelImpedance"); + loadDLLfunct<get_impedance_limit_t>(&fpGetImpedanceLimit, "getImpedanceLimit"); + loadDLLfunct<set_impedance_limit_t>(&fpSetImpedanceLimit, "setImpedanceLimit"); + loadDLLfunct<get_experiment_id_t>(&fpGetExperimentID, "getExperimentID"); + loadDLLfunct<set_experiment_id_t>(&fpSetExperimentID, "setExperimentID"); + loadDLLfunct<get_subject_age_t>(&fpGetSubjectAge, "getSubjectAge"); + loadDLLfunct<set_subject_age_t>(&fpSetSubjectAge, "setSubjectAge"); + loadDLLfunct<get_subject_gender_t>(&fpGetSubjectGender, "getSubjectGender"); + loadDLLfunct<set_subject_gender_t>(&fpSetSubjectGender, "setSubjectGender"); + loadDLLfunct<set_sample_count_per_buffer_t>(&fpSetSampleCountPerBuffer, "setSampleCountPerBuffer"); + loadDLLfunct<initialize_t>(&fpInitialize, "initialize"); + loadDLLfunct<start_t>(&fpStart, "start"); + loadDLLfunct<stop_t>(&fpStop, "stop"); + loadDLLfunct<uninitialize_t>(&fpUninitialize, "uninitialize"); + loadDLLfunct<loop_t>(&fpLoop, "loop"); + + if (!m_valid) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Could not initialize Mensia Acquisition Driver driver\n"; + return; + } + + // prepare the device library + + const int id = fpInitializeAcquisitionDriver(driverID, ctx); + + // Negative value is considered an error + if (id < 0) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Could not initialize Mensia Acquisition Driver driver\n"; + return; + } + m_driverID = uint32_t(id); + + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Initialized Mensia Acquisition Driver on id [" << m_driverID << "]" << "\n"; + + //TODO_JL Set sampling frenquency and channel count in header? + m_header.setSamplingFrequency(128); + m_header.setChannelCount(0); + m_header.setExperimentID(0); + m_header.setSubjectAge(0); + m_header.setSubjectGender(0); + + m_settings.add("Header", &m_header); + m_settings.add("DeviceURL", &m_deviceURL); + //TODO_JL Add the URL to settings so it can be saved (we should be able to expose it) + m_settings.load(); + fpSetExperimentID(m_driverID, m_header.getExperimentID()); + fpSetSubjectAge(m_driverID, m_header.getSubjectAge()); + fpSetSubjectGender(m_driverID, m_header.getSubjectGender()); + + fpSetImpedanceCheckRequested(m_driverID, m_header.isImpedanceCheckRequested()); + fpSetImpedanceLimit(m_driverID, m_header.getImpedanceLimit()); + + fpPreconfigure(m_driverID, m_deviceURL.toASCIIString()); + + m_header.setChannelCount(fpGetChannelCount(m_driverID)); + m_header.setSamplingFrequency(fpGetSampling(m_driverID)); + + for (size_t index = 0; index < m_header.getChannelCount(); ++index) { m_header.setChannelName(index, fpGetChannelName(m_driverID, index)); } +} + +void CDriverMensiaAcquisition::release() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverMensiaAcquisition::release\n"; + delete this; +} + +const char* CDriverMensiaAcquisition::getName() { return fpGetName(m_driverID); } + +//___________________________________________________________________// +// // + +bool CDriverMensiaAcquisition::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverMensiaAcquisition::initialize\n"; + + if (m_driverCtx.isConnected()) { return false; } + + m_nSamplePerSentBlock = nSamplePerSentBlock; + fpSetSampleCountPerBuffer(m_driverID, m_nSamplePerSentBlock); + m_deviceURL = CString(fpGetDeviceURL(m_driverID)); + + m_callback = &callback; + + m_header.setImpedanceCheckRequested(fpIsImpedanceCheckRequested(m_driverID)); + const EAcquisitionModes mode = m_header.isImpedanceCheckRequested() ? EAcquisitionModes::Impedance : EAcquisitionModes::Data; + if (!fpInitialize(m_driverID, m_callback, m_nSamplePerSentBlock, m_deviceURL.toASCIIString(), mode)) { return false; } + + fpSetExperimentID(m_driverID, m_header.getExperimentID()); + fpSetSubjectAge(m_driverID, m_header.getSubjectAge()); + fpSetSubjectGender(m_driverID, m_header.getSubjectGender()); + + m_header.setSamplingFrequency(fpGetSampling(m_driverID)); + m_header.setChannelCount(fpGetChannelCount(m_driverID)); + m_header.setExperimentID(fpGetExperimentID(m_driverID)); + m_header.setSubjectAge(fpGetSubjectAge(m_driverID)); + m_header.setSubjectGender(fpGetSubjectGender(m_driverID)); + m_header.setImpedanceLimit(fpGetImpedanceLimit(m_driverID)); + m_header.setImpedanceCheckRequested(fpIsImpedanceCheckRequested(m_driverID)); + + + for (size_t uiChannelIndex = 0; uiChannelIndex < m_header.getChannelCount(); ++uiChannelIndex) { + m_header.setChannelName(uiChannelIndex, fpGetChannelName(m_driverID, uiChannelIndex)); + m_header.setChannelUnits(uiChannelIndex, OVTK_UNIT_Volts, OVTK_FACTOR_Micro); + } + + return true; +} + +bool CDriverMensiaAcquisition::start() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverMensiaAcquisition::start\n"; + + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + if (!fpStart(m_driverID)) { return false; } + + return true; +} + +bool CDriverMensiaAcquisition::loop() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "CDriverMensiaAcquisition::loop\n"; + + if (!m_driverCtx.isConnected()) { return false; } + + if (m_driverCtx.isStarted()) { if (!fpLoop(m_driverID)) { return false; } } + else { + if (!fpLoop(m_driverID)) { return false; } + // impedance check here + if (m_driverCtx.isImpedanceCheckRequested()) { + for (size_t j = 0; j < m_header.getChannelCount(); ++j) { m_driverCtx.updateImpedance(j, double(fpGetChannelImpedance(m_driverID, j))); } + } + } + + return true; +} + +bool CDriverMensiaAcquisition::stop() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverMensiaAcquisition::stop\n"; + + + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + + return fpStop(m_driverID); +} + +bool CDriverMensiaAcquisition::uninitialize() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverMensiaAcquisition::uninitialize\n"; + + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + fpUninitialize(m_driverID); + + delete [] m_sample; + m_sample = nullptr; + m_callback = nullptr; + + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverMensiaAcquisition::isConfigurable() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverMensiaAcquisition::isConfigurable\n"; + return true; +} + +bool CDriverMensiaAcquisition::configure() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverMensiaAcquisition::configure\n"; + fpSetExperimentID(m_driverID, m_header.getExperimentID()); + fpSetSubjectAge(m_driverID, m_header.getSubjectAge()); + fpSetSubjectGender(m_driverID, m_header.getSubjectGender()); + + /*CConfigurationDriverMensiaAcquisition config(m_driverCtx, Directories::getDataDir() + "/applications/acquisition-server/interface-Generic-Oscillator.ui" ); +*/ + if (fpConfigure(m_driverID, m_deviceURL.toASCIIString())) { + m_deviceURL = CString(fpGetDeviceURL(m_driverID)); + + // We need to escape the URL before we save the setting to the file because + // of the way OpenViBE handles strings + const CString tempURL = m_deviceURL; + std::string escapedURL = m_deviceURL.toASCIIString(); + size_t pos = 0; + while ((pos = escapedURL.find('{', pos)) != std::string::npos) { + escapedURL.replace(pos, 1, "\\{"); + pos += 2; + } + + pos = 0; + while ((pos = escapedURL.find('}', pos)) != std::string::npos) { + escapedURL.replace(pos, 1, "\\}"); + pos += 2; + } + + pos = 0; + while ((pos = escapedURL.find('$', pos)) != std::string::npos) { + escapedURL.replace(pos, 1, "\\$"); + pos += 2; + } + + m_deviceURL = escapedURL.c_str(); + m_header.setSamplingFrequency(fpGetSampling(m_driverID)); + m_header.setChannelCount(fpGetChannelCount(m_driverID)); + m_header.setExperimentID(fpGetExperimentID(m_driverID)); + m_header.setSubjectAge(fpGetSubjectAge(m_driverID)); + m_header.setSubjectGender(fpGetSubjectGender(m_driverID)); + m_header.setImpedanceLimit(fpGetImpedanceLimit(m_driverID)); + m_header.setImpedanceCheckRequested(fpIsImpedanceCheckRequested(m_driverID)); + /* + fpSetExperimentID(m_driverID, m_header.getExperimentID()); + fpSetSubjectAge(m_driverID, m_header.getSubjectAge()); + fpSetSubjectGender(m_driverID, m_header.getSubjectGender()); + */ + + /* + for (size_t index = 0; index < m_header.getChannelCount(); ++index) { m_header.setChannelName(index, ""); } + */ + + m_settings.save(); + m_deviceURL = tempURL; + return true; + } + + + return false; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_OS_Windows diff --git a/applications/platform/acquisition-server/src/OVASDrivers/mensia-acquisition/ovasCDriverMensiaAcquisition.h b/applications/platform/acquisition-server/src/OVASDrivers/mensia-acquisition/ovasCDriverMensiaAcquisition.h new file mode 100644 index 0000000000000000000000000000000000000000..5b08f1b80b39d8500294027640e07b12df83a8fe --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/mensia-acquisition/ovasCDriverMensiaAcquisition.h @@ -0,0 +1,57 @@ +#pragma once + +#ifdef TARGET_OS_Windows + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +namespace OpenViBE { +namespace AcquisitionServer { +class CDriverMensiaAcquisition final : public IDriver +{ +public: + CDriverMensiaAcquisition(IDriverContext& ctx, const char* driverID); + void release(); + const char* getName() override; + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override; + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + +protected: + SettingsHelper m_settings; + bool m_valid = false; + + IDriverCallback* m_callback = nullptr; + CHeader m_header; + + uint32_t m_nSamplePerSentBlock = 0; + float* m_sample = nullptr; + + uint32_t m_nTotalSample = 0; + uint64_t m_startTime = 0; + + uint32_t* m_sampleCountPerBuffer = nullptr; + +private: + // Settings + CString m_deviceURL; + + template <typename T> + void loadDLLfunct(T* pointer, const char* name); + uint32_t m_driverID = 0; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_OS_Windows diff --git a/applications/platform/acquisition-server/src/OVASDrivers/micromed-systemplusevolution/ovasCDriverMicromedSystemPlusEvolution.cpp b/applications/platform/acquisition-server/src/OVASDrivers/micromed-systemplusevolution/ovasCDriverMicromedSystemPlusEvolution.cpp new file mode 100644 index 0000000000000000000000000000000000000000..0ecb7b2e58ebccb03e55cef44c1b3ae0a4a44c27 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/micromed-systemplusevolution/ovasCDriverMicromedSystemPlusEvolution.cpp @@ -0,0 +1,748 @@ +#if defined(TARGET_HAS_ThirdPartyMicromed) + +#include "ovasCDriverMicromedSystemPlusEvolution.h" +#include "../ovasCConfigurationNetworkBuilder.h" + +#if defined TARGET_OS_Windows + +#define MicromedDLL "dllMicromed.dll" + +#include <system/ovCTime.h> + +#include <iostream> +#include <sstream> +#include <cstring> +#include <cstdlib> +#include <windows.h> +#include <cstring> + +#include <algorithm> // std::min, etc on VS2013 + +namespace OpenViBE { +namespace AcquisitionServer { + +typedef char* ( __stdcall * STRUCTHEADER)(); +typedef int ( __stdcall * STRUCTHEADERSIZE)(); +typedef char* ( __stdcall * STRUCTHEADERINFO)(); +typedef int ( __stdcall * STRUCTHEADERINFOSIZE)(); +typedef unsigned short int* ( __stdcall * STRUCTBUFFDATA)(); +typedef int ( __stdcall * STRUCTBUFFDATASIZE)(); +typedef unsigned char* ( __stdcall * STRUCTBUFFNOTE)(); +typedef int ( __stdcall * STRUCTBUFFNOTESIZE)(); +typedef unsigned char* ( __stdcall * STRUCTBUFFTRIGGER)(); +typedef int ( __stdcall * STRUCTBUFFTRIGGERSIZE)(); +typedef bool ( __stdcall * HEADERVALID)(); +typedef bool ( __stdcall * DATAHEADER)(); +typedef bool ( __stdcall * NOTEHEADER)(); +typedef bool ( __stdcall * TRIGGERHEADER)(); +typedef bool ( __stdcall * INITHEADER)(); +typedef uint32_t ( __stdcall * DATALENGTH)(); +//typedef uint32_t ( __stdcall * ADDRESSOFDATA) (); +typedef uint32_t ( __stdcall * NBOFCHANNELS)(); +typedef uint32_t ( __stdcall * MINSAMPLINGRATE)(); +typedef uint32_t ( __stdcall * SIZEOFEACHDATAINBYTE)(); +typedef float ( __stdcall * DATAVALUE)(int numChannel, int numSample); +typedef int ( __stdcall * TRIGGERCOUNT)(); +typedef unsigned long int ( __stdcall * TRIGGERSAMPLE)(int indexTrigger); +typedef unsigned short int ( __stdcall * TRIGGERVALUE)(int indexTrigger); +typedef int ( __stdcall * NOTECOUNT)(); +typedef unsigned long int ( __stdcall * NOTESAMPLE)(int indexNote); +typedef char* ( __stdcall * NOTECOMMENT)(int indexNote); +typedef void ( __stdcall * SHOWELECTRODE)(std::stringstream* info); +typedef void ( __stdcall * SHOWNOTE)(std::stringstream* info); +typedef void ( __stdcall * SHOWTRIGGER)(std::stringstream* trigger); +typedef void ( __stdcall * SHOWSIGNAL)(std::stringstream* signal); + +// Header Structure +//--------------------------- +//pointer on the header structure. the header structure is send before any HeaderInfo or BuffData structure. +STRUCTHEADER fGetStructHeader; + +//give the size of the structHeader +STRUCTHEADERSIZE fGetStructHeaderSize; + +//say if the last structHeader is valid. +//must be call just after structHeader. +HEADERVALID fIsHeaderValid; + +//say if the Header structure is following by a Buffer Data structure +//must be call after structHeader. +DATAHEADER fIsDataHeader; + +//say if the Header structure is following by a Buffer Note structure +//must be call after structHeader. +NOTEHEADER fIsNoteHeader; + +//say if the Header structure is following by a Buffer Trigger structure +//must be call after structHeader. +TRIGGERHEADER fIsTriggerHeader; + +//say if the Header structure is following by a Header Info Structure +//must be call after structHeader. +INITHEADER fIsInitHeader; + +//give the size of the following data receive +//must be call after structHeader. +DATALENGTH fGetDataLength; + +// Header Info Structure +//--------------------------- + +//give many information of the device configuration. +STRUCTHEADERINFO fGetStructHeaderInfo; + +//give the size of the structHeaderInfo +STRUCTHEADERINFOSIZE fGetStructHeaderInfoSize; + +//give address of the first data. the address count start to the beginning of this structure. +//it necessary to receive information between this structure and the first address data before beginning. +//must be call after structHeaderInfo. +//ADDRESSOFDATA fGetAddressOfData; + +//give the number of channels connected to this device. +//must be call after structHeaderInfo. +NBOFCHANNELS fGetNbOfChannels; + +//give the sampling rate of the device +//must be call after structHeaderInfo. +MINSAMPLINGRATE fGetMinimumSamplingRate; + +//give the size in byte for one sample of one channels +//must be call after structHeaderInfo. +SIZEOFEACHDATAINBYTE fGetSizeOfEachDataInByte; + +//Give the value of the samples and channel specify +DATAVALUE fGetDataValue; + +SHOWELECTRODE fShowElectrode; +SHOWNOTE fShowNote; +SHOWTRIGGER fShowTrigger; +SHOWSIGNAL fShowSignal; + +// Buffer Data Structure +//--------------------------- + +//give sample of channels +STRUCTBUFFDATA fGetStructBuffData; +//give the size of the Data buffer +STRUCTBUFFDATASIZE fGetStructBuffDataSize; +// Buffer Note Structure +//--------------------------- + +//give sample of channels +STRUCTBUFFNOTE fGetStructBuffNote; +//give the size of the Data buffer +STRUCTBUFFNOTESIZE fGetStructBuffNoteSize; + +//give the number of Note received in the last data block +NOTECOUNT fGetNoteCount; + +//give the number of the sample whose the time corresponding to the reception of the note specified by the parameter +NOTESAMPLE fGetNoteSample; + +//give the comment corresponding to the note specified by the parameter +NOTECOMMENT fGetNoteComment; + +// Buffer Trigger Structure +//--------------------------- + +//give sample of channels +STRUCTBUFFTRIGGER fGetStructBuffTrigger; +//give the size of the Data buffer +STRUCTBUFFTRIGGERSIZE fGetStructBuffTriggerSize; + +//give the number of Trigger received in the last data block +TRIGGERCOUNT fGetTriggerCount; + +//give the number of the sample whose the time corresponding to the reception of the trigger specified by the parameter +TRIGGERSAMPLE fGetTriggerSample; + +//give the value corresponding to the trigger specified by the parameter +TRIGGERVALUE fGetTriggerValue; + +//lib +HINSTANCE libMicromed; //Library Handle + +//reg key +static char tcpPortNumber[1024]; +static char tcpSendAcq[1024]; +static char tcpServerName[1024]; +static HKEY registryKey = nullptr; +// bool g_bInitializedFromRegistry=false; +static const char* registeryKeyName = "Software\\VB and VBA Program Settings\\Brain Quick - System 98\\EEG_Settings"; + +#define LOAD_DLL_FUNC(var, type, name) \ + var = (type)::GetProcAddress(libMicromed, name); \ + if(!var) \ + { \ + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Load method " << name << "\n"; \ + m_valid=false; \ + return false; \ + } + +CDriverMicromedSystemPlusEvolution::CDriverMicromedSystemPlusEvolution(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_SystemPlusEvolution", m_driverCtx.getConfigurationManager()) +{ + libMicromed = nullptr; + + m_settings.add("Header", &m_header); + m_settings.add("ServerHostPort", &m_ServerHostPort); + m_settings.add("TimeOutMs", &m_timeOutMilliseconds); + m_settings.load(); +} + +CDriverMicromedSystemPlusEvolution::~CDriverMicromedSystemPlusEvolution() +{ + if (m_ConnectionServer) { + m_ConnectionServer->release(); + m_ConnectionServer = nullptr; + } + + /** + * Is it necessary to restore the + * registry keys here ? + */ + +#if 0 + if(ERROR_SUCCESS!=::RegOpenKeyEx(HKEY_CURRENT_USER, registeryKeyName, 0, KEY_WRITE, ®istryKey)) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Registery key " << registeryKeyName << " not restored\n"; + } + + if(tcpPortNumber!=std::string("")) { + if(ERROR_SUCCESS!=::RegSetValueEx(registryKey, "tcpPortNumber", 0, REG_SZ, (LPBYTE)tcpPortNumber, ::strlen(tcpPortNumber))) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Registery key tcpPortNumber not restored\n"; + } + } + else { + if(ERROR_SUCCESS!=::RegDeleteValue(registryKey, "tcpPortNumber")) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Registery key tcpPortNumber not deleted\n"; + } + } + + if(tcpSendAcq!=std::string("")) { + if(ERROR_SUCCESS!=::RegSetValueEx(registryKey, "tcpSendAcq", 0, REG_SZ, (LPBYTE)tcpSendAcq, ::strlen(tcpSendAcq))) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Registery key tcpSendAcq not restored\n"; + } + } + else { + if(ERROR_SUCCESS!=::RegDeleteValue(registryKey, "tcpSendAcq")) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Registery key tcpSendAcq not deleted\n"; + } + } + + if(tcpServerName!=std::string("")) { + if(ERROR_SUCCESS!=::RegSetValueEx(registryKey, "tcpServerName", 0, REG_SZ, (LPBYTE)tcpServerName, ::strlen(tcpServerName))) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Registery key tcpServerName not restored\n"; + } + } + else { + if(ERROR_SUCCESS!=::RegDeleteValue(registryKey, "tcpServerName")) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Registery key tcpServerName not deleted\n"; + } + } + + ::RegCloseKey(registryKey); + registryKey= nullptr; +#endif +} + +// Load the ddl of the driver +bool CDriverMicromedSystemPlusEvolution::loadDLL() +{ + if (libMicromed) { return true; } // already loaded + + //Open library + const CString path = m_driverCtx.getConfigurationManager().expand("${Path_Bin}") + "/" + MicromedDLL; + libMicromed = ::LoadLibrary(path.toASCIIString()); + + //if it can't be open return FALSE; + if (libMicromed == nullptr) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Couldn't load DLL: " << path << "\n"; + return false; + } + + //load the method for initialized the driver + LOAD_DLL_FUNC(fGetStructHeader, STRUCTHEADER, "getStructHeader"); + LOAD_DLL_FUNC(fGetStructHeaderSize, STRUCTHEADERSIZE, "getStructHeaderSize"); + LOAD_DLL_FUNC(fGetStructHeaderInfo, STRUCTHEADERINFO, "getStructHeaderInfo"); + LOAD_DLL_FUNC(fGetStructHeaderInfoSize, STRUCTHEADERINFOSIZE, "getStructHeaderInfoSize"); + LOAD_DLL_FUNC(fGetStructBuffData, STRUCTBUFFDATA, "getStructBuffData"); + LOAD_DLL_FUNC(fGetStructBuffDataSize, STRUCTBUFFDATASIZE, "getStructBuffDataSize"); + LOAD_DLL_FUNC(fGetStructBuffNote, STRUCTBUFFNOTE, "getStructBuffNote"); + LOAD_DLL_FUNC(fGetStructBuffNoteSize, STRUCTBUFFNOTESIZE, "getStructBuffNoteSize"); + LOAD_DLL_FUNC(fGetStructBuffTrigger, STRUCTBUFFTRIGGER, "getStructBuffTrigger"); + LOAD_DLL_FUNC(fGetStructBuffTriggerSize, STRUCTBUFFTRIGGERSIZE, "getStructBuffTriggerSize"); + LOAD_DLL_FUNC(fIsHeaderValid, HEADERVALID, "isHeaderValid"); + LOAD_DLL_FUNC(fIsDataHeader, DATAHEADER, "isDataHeader"); + LOAD_DLL_FUNC(fIsNoteHeader, NOTEHEADER, "isNoteHeader"); + LOAD_DLL_FUNC(fIsTriggerHeader, TRIGGERHEADER, "isTriggerHeader"); + LOAD_DLL_FUNC(fIsInitHeader, INITHEADER, "isInitHeader"); + LOAD_DLL_FUNC(fGetDataLength, DATALENGTH, "getDataLength"); + //LOAD_DLL_FUNC(fGetAddressOfData, ADDRESSOFDATA, "getAddressOfData"); + + LOAD_DLL_FUNC(fGetNbOfChannels, NBOFCHANNELS, "getNbOfChannels"); + LOAD_DLL_FUNC(fGetMinimumSamplingRate, MINSAMPLINGRATE, "getMinimumSamplingRate"); + LOAD_DLL_FUNC(fGetSizeOfEachDataInByte, SIZEOFEACHDATAINBYTE, "getSizeOfEachDataInByte"); + LOAD_DLL_FUNC(fGetDataValue, DATAVALUE, "getDataValue"); + LOAD_DLL_FUNC(fGetTriggerCount, TRIGGERCOUNT, "getTriggerCount"); + LOAD_DLL_FUNC(fGetTriggerSample, TRIGGERSAMPLE, "getTriggerSample"); + LOAD_DLL_FUNC(fGetTriggerValue, TRIGGERVALUE, "getTriggerValue"); + LOAD_DLL_FUNC(fGetNoteCount, NOTECOUNT, "getNoteCount"); + LOAD_DLL_FUNC(fGetNoteSample, NOTESAMPLE, "getNoteSample"); + LOAD_DLL_FUNC(fGetNoteComment, NOTECOMMENT, "getNoteComment"); + LOAD_DLL_FUNC(fShowElectrode, SHOWELECTRODE, "show_Electrode"); + LOAD_DLL_FUNC(fShowNote, SHOWNOTE, "show_Note"); + LOAD_DLL_FUNC(fShowTrigger, SHOWTRIGGER, "show_Trigger"); + LOAD_DLL_FUNC(fShowSignal, SHOWSIGNAL, "showSignal"); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Succeeded in loading DLL: " << path << "\n"; + m_structHeader = fGetStructHeader(); + m_structHeaderInfo = fGetStructHeaderInfo(); + m_structBuffData = fGetStructBuffData(); + m_structBuffNote = fGetStructBuffNote(); + m_structBuffTrigger = fGetStructBuffTrigger(); + +#if 1 + if (ERROR_SUCCESS != ::RegOpenKeyEx(HKEY_CURRENT_USER, registeryKeyName, 0, KEY_QUERY_VALUE, ®istryKey)) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Registery key " << registeryKeyName << " is not initialized\n"; + strcpy(tcpPortNumber, ""); + strcpy(tcpSendAcq, ""); + strcpy(tcpServerName, ""); + return false; + } + + DWORD taille = sizeof(tcpPortNumber); + + if (ERROR_SUCCESS != ::RegQueryValueEx(registryKey, "tcpPortNumber", nullptr, nullptr, reinterpret_cast<LPBYTE>(tcpPortNumber), &taille)) { + strcpy(tcpPortNumber, ""); + } + else { m_ServerHostPort = atoi(tcpPortNumber); } + + if (ERROR_SUCCESS != ::RegQueryValueEx(registryKey, "tcpSendAcq", nullptr, nullptr, reinterpret_cast<LPBYTE>(tcpSendAcq), &taille)) { + strcpy(tcpSendAcq, ""); + } + + if (ERROR_SUCCESS != ::RegQueryValueEx(registryKey, "tcpServerName", nullptr, nullptr, reinterpret_cast<LPBYTE>(tcpServerName), &taille)) { + strcpy(tcpServerName, ""); + } + + RegCloseKey(registryKey); + registryKey = nullptr; + // g_bInitializedFromRegistry=true; +#endif + + return true; +} + +short CDriverMicromedSystemPlusEvolution::myReceive(char* buf, const long dataLen) +{ + long nDati = 0; + //get data contains in the temp buffer + while (!m_tempBuffs.empty() && nDati < dataLen) { + buf[nDati] = m_tempBuffs.front(); + m_tempBuffs.pop_front(); + nDati++; + } + + while (nDati < dataLen) { + const long recByte = m_Connection->receiveBuffer((&buf[nDati]), dataLen - nDati); + if (recByte == 0) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "No data was received, check if the device is still connected\n"; + return -1; + } + + nDati += recByte; + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Received Data: = " << nDati << " /" << dataLen << "\n"; + } + return 0; +} + +bool CDriverMicromedSystemPlusEvolution::receiveAllHeader() +{ + do { + // Receive Header + if (this->myReceive(m_structHeader, fGetStructHeaderSize()) == -1) { return false; } + if (fIsHeaderValid()) { + char* header = new char[fGetStructHeaderSize()]; + memcpy(header, m_structHeader, fGetStructHeaderSize()); + m_headers.push_back(header); + } + else { + //if no header was found, its impossible to find the next data block + if (m_headers.empty()) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Header received not in correct form\n"; + return false; + } + + //save data in the temp buffer + for (int i = fGetStructHeaderSize(); i > 0; i--) { m_tempBuffs.push_front(m_structHeader[i - 1]); } + } + } while (fIsHeaderValid()); + + return true; +} + +bool CDriverMicromedSystemPlusEvolution::loadNextHeader() +{ + //get the next header + memcpy(m_structHeader, m_headers.back(), fGetStructHeaderSize()); + + //load next data + char* temp = new char[fGetStructHeaderSize()]; + if (this->myReceive(temp, fGetStructHeaderSize()) == -1) { return false; } + //check if the next data correspond to the current header + while (m_headers.size() > 1 && ((fIsNoteHeader() && strncmp(&(temp[4]), "Note", 4) != 0) || (!fIsNoteHeader() && strncmp(&(temp[4]), "Note", 4) == 0))) { + m_headers.push_front(m_headers.back()); + m_headers.pop_back(); + //load the last + memcpy(m_structHeader, m_headers.back(), fGetStructHeaderSize()); + } + + //save data in the temp buffer + for (int i = fGetStructHeaderSize(); i > 0; i--) { m_tempBuffs.push_front(temp[i - 1]); } + delete[] temp; + delete[] m_headers.back(); + m_headers.pop_back(); + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverMicromedSystemPlusEvolution::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + if (!m_valid || m_driverCtx.isConnected()) { return false; } + if (!libMicromed && !loadDLL()) { return false; } + + //update register key + if (ERROR_SUCCESS != ::RegOpenKeyEx(HKEY_CURRENT_USER, registeryKeyName, 0, KEY_WRITE, ®istryKey)) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Registery key not initialized\n"; + } + else { + char hostPort[1024]; + sprintf(hostPort, "%i", m_ServerHostPort); + //const std::string port = std::to_string(m_ServerHostPort); + //if (ERROR_SUCCESS != ::RegSetValueEx(registryKey, "tcpPortNumber", 0, REG_SZ, reinterpret_cast<LPBYTE>(const_cast<char*>(port.c_str())), port.size())) + + if (ERROR_SUCCESS != ::RegSetValueEx(registryKey, "tcpPortNumber", 0, REG_SZ, reinterpret_cast<LPBYTE>(hostPort), strlen(hostPort))) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Registery key tcpPortNumber not initialized to '" << m_ServerHostPort << "'\n"; + } + + if (tcpSendAcq == std::string()) { + char* acq = "1"; + if (ERROR_SUCCESS != ::RegSetValueEx(registryKey, "tcpSendAcq", 0, REG_SZ, reinterpret_cast<LPBYTE>(acq), 1)) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Registery key tcpSendAcq not initialized to '1'\n"; + } + } + + if (tcpServerName == std::string()) { + strcpy(tcpServerName, "localhost"); + if (ERROR_SUCCESS != ::RegSetValueEx(registryKey, "tcpServerName", 0, REG_SZ, reinterpret_cast<LPBYTE>(tcpServerName), strlen(tcpServerName))) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Registery key tcpServerName not initialized to '" << tcpServerName << "'\n"; + } + } + + RegCloseKey(registryKey); + registryKey = nullptr; + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Configure Register key\n"; + + // Builds up server connection + m_ConnectionServer = Socket::createConnectionServer(); + + if (!m_ConnectionServer) { + m_driverCtx.getLogManager() << Kernel::LogLevel_ImportantWarning << "> Could not create server socket\n"; + return false; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "> Server is on \n"; + + // Server start listening on defined port + if (!m_ConnectionServer->listen(m_ServerHostPort)) { + m_driverCtx.getLogManager() << Kernel::LogLevel_ImportantWarning << "> Could not listen TCP port " << m_ServerHostPort << "\n"; + + // Cleans up server connection + m_ConnectionServer->close(); + m_ConnectionServer->release(); + m_ConnectionServer = nullptr; + + return false; + } + + m_nSamplePerSentBlock = nSamplePerSentBlock; + m_callback = &callback; + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "> Server is listening on port : " << m_ServerHostPort << "\n"; + + if (m_ConnectionServer->isReadyToReceive(m_timeOutMilliseconds)) { + // Accept new client + m_Connection = m_ConnectionServer->accept(); + } + else { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "> Time out after " << m_timeOutMilliseconds << " milliseconds\n"; + + // Cleans up server connection + m_ConnectionServer->close(); + m_ConnectionServer->release(); + m_ConnectionServer = nullptr; + + return false; + } + + // Receive Header + if (this->myReceive(m_structHeader, fGetStructHeaderSize()) == -1) { return false; } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "> Receiving Header....\n"; + + // Verify header validity + if (!fIsHeaderValid()) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Header received not in correct form : pb with fixCode\n"; + return false; + } + + if (!fIsInitHeader()) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Header received not in correct form : pb not receive Init information\n"; + return false; + } + + if (fGetStructHeaderInfoSize() != fGetDataLength()) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << + "Header received not in correct form : pb the data header Info hasn't the good size\n the structure size:" << fGetStructHeaderInfoSize() << + "the size of data received:" << fGetDataLength() << "\n"; + return false; + } + + // Receive Header + if (this->myReceive(m_structHeaderInfo, fGetStructHeaderInfoSize()) == -1) { return false; } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "> Header received\n"; + + m_header.setChannelCount(fGetNbOfChannels()); + + m_header.setSamplingFrequency(uint32_t(fGetMinimumSamplingRate())); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "size for 1 channel, 1 block: " << m_nSamplePerSentBlock << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "number of channels: " << m_header.getChannelCount() << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Maximum sample rate =" << m_header.getSamplingFrequency() << " Hz" << "\n"; + m_sample = new float[m_header.getChannelCount() * m_nSamplePerSentBlock]; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "size of m_sample=" + << (m_header.getChannelCount() * m_nSamplePerSentBlock * sizeof(float)) << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Maximum Buffer size =" << ( + m_header.getChannelCount() * m_nSamplePerSentBlock * sizeof(signed short int)) << " Samples" << "\n"; + + if (!m_sample) { + m_driverCtx.getLogManager() << Kernel::LogLevel_ImportantWarning << "Could not allocate sample buffer\n"; + uninitialize(); + return false; + } + m_buffDataIdx = 0; + m_posFirstSampleOfCurrentBlock = 0; + if (m_driverCtx.getLogManager().isActive(Kernel::LogLevel_Debug)) { + std::stringstream info; + fShowElectrode(&info); + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << info.str(); + fShowNote(&info); + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << info.str(); + fShowTrigger(&info); + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << info.str(); + } + return true; +} + +bool CDriverMicromedSystemPlusEvolution::start() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "start device\n"; + if (!m_valid || !m_driverCtx.isConnected() || m_driverCtx.isStarted() || !m_Connection) { return false; } + m_nSamplesBlock = m_header.getChannelCount() * m_nSamplePerSentBlock; + m_sizeInByte = fGetSizeOfEachDataInByte(); + //calculate the number max of complete samples can be contains in the buffer. + m_buffSize = fGetStructBuffDataSize() / (m_sizeInByte * m_header.getChannelCount()); + m_buffSize = m_buffSize * (m_sizeInByte * m_header.getChannelCount()); + return true; +} + +bool CDriverMicromedSystemPlusEvolution::dropData() +{ + //drop data + uint32_t totalReceived = 0; + + do { + const uint32_t maxByteRecv = std::min(uint32_t(fGetStructBuffDataSize()), uint32_t(fGetDataLength() - totalReceived)); + if (this->myReceive((char*)m_structBuffData, maxByteRecv) == -1) { return false; } + totalReceived += maxByteRecv; + } while (totalReceived < fGetDataLength()); + return true; +} + +bool CDriverMicromedSystemPlusEvolution::loop() +{ + if (!m_valid || !m_driverCtx.isConnected()) { return false; } + + if (m_Connection) { + // Receive All consecutive Header + //this->myReceive(m_structHeader, fGetStructHeaderSize()); + if (!this->receiveAllHeader()) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "No Header received, an error was occurred during the data acquisition!\n"; + return false; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << ">Number header received: " << m_headers.size() << "\n"; + + while (!m_headers.empty()) { + if (!loadNextHeader()) { return false; } + // Verify header validity + if (!fIsHeaderValid()) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Header received not in correct form\n"; + return false; + } + if (!fIsDataHeader() && !fIsNoteHeader() && !fIsTriggerHeader()) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Header received not in correct form : problem with infoType\n"; + return false; + } + + //if(m_driverCtx.isStarted()) + //{ + if (fIsDataHeader()) { + //if the device is not start or the first block after start haven't been received, data will be dropped + if (!m_driverCtx.isStarted()) { + dropData(); + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Device not started, dropped data: data.len = " << fGetDataLength() << "\n"; + return true; + } + // Receive Data + uint32_t maxByteRecv = 0; + uint32_t totalReceived = 0; + uint32_t receivedSampleCount = 0; + do { + maxByteRecv = std::min(m_buffSize, std::min(fGetDataLength() - totalReceived, + uint32_t(m_nSamplesBlock - m_buffDataIdx * m_header.getChannelCount()) * m_sizeInByte)); + if (this->myReceive((char*)m_structBuffData, maxByteRecv) == -1) { return false; } + receivedSampleCount = maxByteRecv / (m_sizeInByte * m_header.getChannelCount()); + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Number of Samples Received:" << receivedSampleCount << "\n"; + + for (size_t i = 0; i < m_header.getChannelCount(); ++i) { + for (uint32_t j = 0; j < receivedSampleCount; ++j) { + m_sample[m_buffDataIdx + j + i * m_nSamplePerSentBlock] = float(fGetDataValue(i, j)); + } + } + + totalReceived += maxByteRecv; + m_buffDataIdx += receivedSampleCount; + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Convert Data: dataConvert = " << totalReceived << "/" << fGetDataLength() << "\n"; + + if (m_nSamplesBlock < m_buffDataIdx) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Data not received in correct form : problem with lenData\n"; + return false; + } + + if (m_nSamplesBlock == m_buffDataIdx * m_header.getChannelCount()) { + m_callback->setSamples(m_sample); + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Send samples back to CAcquisitionServer: samples.len = " + << m_buffDataIdx << "\n"; + if (m_stimSet.size() > 0) { + m_callback->setStimulationSet(m_stimSet); + m_stimSet.clear(); + } + m_posFirstSampleOfCurrentBlock += m_nSamplesBlock; + m_buffDataIdx = 0; + } + } while (totalReceived < fGetDataLength()); + if (m_driverCtx.getLogManager().isActive(Kernel::LogLevel_Debug)) { + std::stringstream signal; + fShowSignal(&signal); + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << signal.str(); + } + } + else if (fIsNoteHeader()) { + if (this->myReceive((char*)m_structBuffNote, long(fGetDataLength())) == -1) { return false; } + std::stringstream note; + fShowNote(¬e); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << note.str(); + } + else if (fIsTriggerHeader()) { + if (this->myReceive((char*)m_structBuffTrigger, long(fGetDataLength())) == -1) { return false; } + + for (int i = 0; i < fGetTriggerCount(); ++i) { + uint32_t sample = fGetTriggerSample(i); + if (sample < m_posFirstSampleOfCurrentBlock) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning + << " A trigger was received too late! this trigger will not be send to the acquisition server."; + } + else { + uint32_t pos = uint32_t(sample - m_posFirstSampleOfCurrentBlock); + uint64_t time = CTime(m_header.getSamplingFrequency(), uint64_t(pos)).time(); + m_stimSet.push_back(fGetTriggerValue(i), time, 0); + } + } + + if (m_driverCtx.getLogManager().isActive(Kernel::LogLevel_Trace)) { + std::stringstream trigger; + fShowTrigger(&trigger); + //m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "A Trigger was received but this function is not implemented. Please submit a bug report (including the acquisition server log file in debug mode)"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << trigger.str(); + } + } + } + } + return true; +} + +bool CDriverMicromedSystemPlusEvolution::stop() +{ + if (!m_valid) { return false; } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "> Server stopped\n"; + + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + return true; +} + +bool CDriverMicromedSystemPlusEvolution::uninitialize() +{ + if (!m_valid || !m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + if (m_sample) { + delete [] m_sample; + m_sample = nullptr; + m_callback = nullptr; + } + + // Cleans up client connection + if (m_Connection) { + m_Connection->close(); + m_Connection->release(); + m_Connection = nullptr; + } + + // Cleans up server connection + if (m_ConnectionServer) { + m_ConnectionServer->close(); + m_ConnectionServer->release(); + m_ConnectionServer = nullptr; + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "> Server disconnected\n"; + + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverMicromedSystemPlusEvolution::configure() +{ + if (!libMicromed) { loadDLL(); } + + CConfigurationNetworkBuilder config(Directories::getDataDir() + "/applications/acquisition-server/interface-Micromed-SystemPlusEvolution.ui"); + config.setHostPort(m_ServerHostPort); + + if (config.configure(m_header)) { + m_ServerHostPort = config.getHostPort(); + m_settings.save(); + return true; + } + + return false; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // #if defined TARGET_OS_Windows +#endif // #if defined(TARGET_HAS_ThirdPartyMicromed) diff --git a/applications/platform/acquisition-server/src/OVASDrivers/micromed-systemplusevolution/ovasCDriverMicromedSystemPlusEvolution.h b/applications/platform/acquisition-server/src/OVASDrivers/micromed-systemplusevolution/ovasCDriverMicromedSystemPlusEvolution.h new file mode 100644 index 0000000000000000000000000000000000000000..a02d894d3bd05ffdde6369b6ab66d92fe0b8ea8b --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/micromed-systemplusevolution/ovasCDriverMicromedSystemPlusEvolution.h @@ -0,0 +1,90 @@ +#pragma once + +#if defined(TARGET_HAS_ThirdPartyMicromed) + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +#if defined TARGET_OS_Windows +#include <openvibe/ov_all.h> +#include <iostream> +#include <socket/IConnectionServer.h> +#include <list> + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverMicromedSystemPlusEvolution + * \author Yann Renard (INRIA) + */ +class CDriverMicromedSystemPlusEvolution final : public IDriver +{ +public: + explicit CDriverMicromedSystemPlusEvolution(IDriverContext& ctx); + ~CDriverMicromedSystemPlusEvolution() override; + const char* getName() override { return "Micromed SD LTM (through SystemPlus Evolution)"; } + + //virtual bool isFlagSet(const EDriverFlag flag) const { return flag==EDriverFlag::IsUnstable; } + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override { return true; } + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + + bool loadDLL(); + + Socket::IConnectionServer* m_ConnectionServer = nullptr; + uint32_t m_ServerHostPort = 3000; + Socket::IConnection* m_Connection = nullptr; + short myReceive(char* buf, long dataLen); + bool receiveAllHeader(); + bool loadNextHeader(); + +protected: + bool dropData(); + + SettingsHelper m_settings; + + bool m_valid = true; + + IDriverCallback* m_callback = nullptr; + CHeader m_header; + + uint32_t m_nSamplePerSentBlock = 0; + float* m_sample = nullptr; + + uint32_t m_indexIn = 0; + uint32_t m_indexOut = 0; + uint32_t m_buffDataIdx = 0; + + uint32_t m_timeOutMilliseconds = 5000; + + char* m_structHeader = nullptr; + char* m_structHeaderInfo = nullptr; + unsigned short int* m_structBuffData = nullptr; + unsigned char* m_structBuffNote = nullptr; + unsigned char* m_structBuffTrigger = nullptr; + uint64_t m_posFirstSampleOfCurrentBlock = 0; + CStimulationSet m_stimSet; + + uint32_t m_nSamplesBlock = 0; + uint32_t m_sizeInByte = 0; + uint32_t m_buffSize = 0; + + std::list<char*> m_headers; + std::list<char> m_tempBuffs; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif +#endif diff --git a/applications/platform/acquisition-server/src/OVASDrivers/mindmedia-nexus32b/ovasCDriverMindMediaNeXus32B.cpp b/applications/platform/acquisition-server/src/OVASDrivers/mindmedia-nexus32b/ovasCDriverMindMediaNeXus32B.cpp new file mode 100644 index 0000000000000000000000000000000000000000..cbc7f15561f29983dc0c1af14a4b7d00b20a5299 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/mindmedia-nexus32b/ovasCDriverMindMediaNeXus32B.cpp @@ -0,0 +1,236 @@ +#if defined(TARGET_HAS_ThirdPartyNeXus) + +#include "ovasCDriverMindMediaNeXus32B.h" +#include "../ovasCConfigurationBuilder.h" + +#include <toolkit/ovtk_all.h> + +#include <system/ovCTime.h> +#include <system/ovCMemory.h> + +#if defined TARGET_OS_Windows + +#include <cmath> +#include <windows.h> + +namespace OpenViBE { +namespace AcquisitionServer { + +static const uint32_t INTERNALE_BUFFER_COUNT = 32; + +//___________________________________________________________________// +// // + +CDriverMindMediaNeXus32B::CDriverMindMediaNeXus32B(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_MindMediaNexus32B", m_driverCtx.getConfigurationManager()) +{ + m_header.setSamplingFrequency(512); + m_header.setChannelCount(4); + + m_settings.add("Header", &m_header); + m_settings.load(); +} + +void CDriverMindMediaNeXus32B::release() { delete this; } + +const char* CDriverMindMediaNeXus32B::getName() { return "MindMedia NeXus32B"; } + +//___________________________________________________________________// +// // + +#define _MindMedia_NeXus32B_DLLFileName_ "NeXusDLL.dll" + +typedef void (*NeXusDLL_ProcessData)(int sampleCount, int channel, float* sample); +typedef DWORD (*NeXusDLL_Init)(NeXusDLL_ProcessData fpProcessData); +typedef DWORD (*NeXusDLL_Start)(DWORD* sampling); +typedef DWORD (*NeXusDLL_Stop)(); + +static HANDLE mutex = nullptr; +static HINSTANCE neXusDLLInstance = nullptr; +static NeXusDLL_Init fpNeXusDLLInit = nullptr; +static NeXusDLL_Start fpNeXusDLLStart = nullptr; +static NeXusDLL_Stop fpNeXusDLLStop = nullptr; + +static CDriverMindMediaNeXus32B* driver = nullptr; + +//___________________________________________________________________// +// // + +static void processData(const int sampleCount, const int channel, float* sample) +{ + if (driver) { driver->processData(uint32_t(sampleCount), uint32_t(channel), sample); } +} + +//___________________________________________________________________// +// // + +bool CDriverMindMediaNeXus32B::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + if (m_driverCtx.isConnected()) { return false; } + + const CString binPath = m_driverCtx.getConfigurationManager().expand("${Path_Bin}"); + neXusDLLInstance = ::LoadLibrary((binPath + "/" + _MindMedia_NeXus32B_DLLFileName_).toASCIIString()); + if (!neXusDLLInstance) { return false; } + + fpNeXusDLLInit = NeXusDLL_Init(GetProcAddress(neXusDLLInstance, "InitNeXusDevice")); + fpNeXusDLLStart = NeXusDLL_Start(GetProcAddress(neXusDLLInstance, "StartNeXusDevice")); + fpNeXusDLLStop = NeXusDLL_Stop(GetProcAddress(neXusDLLInstance, "StopNeXusDevice")); + m_sample = new float[m_header.getChannelCount() * nSamplePerSentBlock * INTERNALE_BUFFER_COUNT]; + + if (!fpNeXusDLLInit || !fpNeXusDLLStart || !fpNeXusDLLStop || !m_sample) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Error finding NeXus API functions / allocating sample buffer\n"; + + FreeLibrary(neXusDLLInstance); + delete [] m_sample; + neXusDLLInstance = nullptr; + fpNeXusDLLInit = nullptr; + fpNeXusDLLStart = nullptr; + fpNeXusDLLStop = nullptr; + m_sample = nullptr; + mutex = nullptr; + return false; + } + + mutex = CreateMutex(nullptr, FALSE, nullptr); // default security attributes, not initially owned, no name + + if (!mutex) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not create synchronisation mutex\n"; + FreeLibrary(neXusDLLInstance); + delete [] m_sample; + neXusDLLInstance = nullptr; + fpNeXusDLLInit = nullptr; + fpNeXusDLLStart = nullptr; + fpNeXusDLLStop = nullptr; + m_sample = nullptr; + mutex = nullptr; + return false; + } + + DWORD error = fpNeXusDLLInit(OpenViBE::AcquisitionServer::processData); + if (error) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not initialize device with NeXus API\n"; + FreeLibrary(neXusDLLInstance); + delete [] m_sample; + CloseHandle(mutex); + neXusDLLInstance = nullptr; + fpNeXusDLLInit = nullptr; + fpNeXusDLLStart = nullptr; + fpNeXusDLLStop = nullptr; + m_sample = nullptr; + mutex = nullptr; + return false; + } + + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + m_sampleIdx = 0; + driver = this; + + return true; +} + +bool CDriverMindMediaNeXus32B::start() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + DWORD sampling = DWORD(m_header.getSamplingFrequency()); + const DWORD error = fpNeXusDLLStart(&sampling); + if (error) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not start acquisition with NeXus API\n"; + return false; + } + + return true; +} + +bool CDriverMindMediaNeXus32B::loop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return true; } + + WaitForSingleObject(mutex, INFINITE); + if (m_sampleIdx < m_nSamplePerSentBlock) + { + ReleaseMutex(mutex); + return true; + } + + m_callback->setSamples(m_sample); + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + memcpy(m_sample, m_sample + m_header.getChannelCount() * m_nSamplePerSentBlock, m_header.getChannelCount() * m_nSamplePerSentBlock * sizeof(float)); + m_sampleIdx -= m_nSamplePerSentBlock; + ReleaseMutex(mutex); + + return true; +} + +bool CDriverMindMediaNeXus32B::stop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + + const DWORD error = fpNeXusDLLStop(); + if (error) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not stop acquisition with NeXus API\n"; + return false; + } + return true; +} + +bool CDriverMindMediaNeXus32B::uninitialize() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + FreeLibrary(neXusDLLInstance); + delete [] m_sample; + CloseHandle(mutex); + m_sample = nullptr; + m_callback = nullptr; + neXusDLLInstance = nullptr; + fpNeXusDLLInit = nullptr; + fpNeXusDLLStart = nullptr; + fpNeXusDLLStop = nullptr; + driver = nullptr; + mutex = nullptr; + + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverMindMediaNeXus32B::configure() +{ + CConfigurationBuilder config(Directories::getDataDir() + "/applications/acquisition-server/interface-MindMedia-NeXus32B.ui"); + if (!config.configure(m_header)) { return false; } + m_settings.save(); + return true; +} + +void CDriverMindMediaNeXus32B::processData(uint32_t sampleCount, uint32_t channel, float* sample) +{ + WaitForSingleObject(mutex, INFINITE); + + if (m_sampleIdx < m_nSamplePerSentBlock * INTERNALE_BUFFER_COUNT) + { + const uint32_t bufferIdx = m_sampleIdx / m_nSamplePerSentBlock; + const uint32_t sampleIdx = m_sampleIdx % m_nSamplePerSentBlock; + + for (size_t i = 0; i < m_header.getChannelCount(); ++i) + { + m_sample[bufferIdx * m_nSamplePerSentBlock * m_header.getChannelCount() + i * m_nSamplePerSentBlock + sampleIdx] = sample[i]; + } + + m_sampleIdx++; // Please don't overflow :o) + } + + ReleaseMutex(mutex); +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // defined TARGET_OS_Windows +#endif diff --git a/applications/platform/acquisition-server/src/OVASDrivers/mindmedia-nexus32b/ovasCDriverMindMediaNeXus32B.h b/applications/platform/acquisition-server/src/OVASDrivers/mindmedia-nexus32b/ovasCDriverMindMediaNeXus32B.h new file mode 100644 index 0000000000000000000000000000000000000000..e68c181b83b0b54805b00ebf4e3fc7950afc199b --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/mindmedia-nexus32b/ovasCDriverMindMediaNeXus32B.h @@ -0,0 +1,55 @@ +#pragma once + +#if defined(TARGET_HAS_ThirdPartyNeXus) + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +#if defined TARGET_OS_Windows + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverMindMediaNeXus32B + * \author Yann Renard (INRIA) + */ +class CDriverMindMediaNeXus32B : public IDriver +{ +public: + + CDriverMindMediaNeXus32B(IDriverContext& ctx); + virtual void release(); + const char* getName() override; + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override { return true; } + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + + virtual void processData(uint32_t sampleCount, uint32_t channel, float* sample); + +protected: + + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + CHeader m_header; + + uint32_t m_nSamplePerSentBlock = 0; + float* m_sample = nullptr; + uint32_t m_sampleIdx = 0; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // defined TARGET_OS_Windows +#endif diff --git a/applications/platform/acquisition-server/src/OVASDrivers/neuroelectrics-enobio3g/ovasCConfigurationEnobio3G.cpp b/applications/platform/acquisition-server/src/OVASDrivers/neuroelectrics-enobio3g/ovasCConfigurationEnobio3G.cpp new file mode 100755 index 0000000000000000000000000000000000000000..10b24bdfd64727ccab30b1ba2a7ce0d9ed103574 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/neuroelectrics-enobio3g/ovasCConfigurationEnobio3G.cpp @@ -0,0 +1,108 @@ +#if defined(TARGET_HAS_ThirdPartyEnobioAPI) + +#include "ovasCConfigurationEnobio3G.h" +#include <gtk/gtk.h> +#include <stdlib.h> +#include <string> +#include <sstream> +#include <vector> +#include <iterator> +#include <iostream> +#include <algorithm> + +namespace OpenViBE { +namespace AcquisitionServer { + +/*_________________________________________________ + +Insert callback to specific widget here +Example with a button that launch a calibration of the device: + +//Callback connected to a dedicated gtk button: +static void button_calibrate_pressed_cb(GtkButton* button, void* data) +{ + CConfigurationEnobio3G* config=static_cast<CConfigurationEnobio3G*>(data); + config->buttonCalibratePressedCB(); +} + +//Callback actually called: +void CConfigurationGTecGUSBamp::buttonCalibratePressedCB() +{ + // Connect to the hardware, ask for calibration, verify the return code, etc. +} +_________________________________________________*/ + +// If you added more reference attribute, initialize them here +CConfigurationEnobio3G::CConfigurationEnobio3G(IDriverContext& ctx, const char* gtkBuilderFilename) + : CConfigurationBuilder(gtkBuilderFilename), m_driverCtx(ctx) { for (int i = 0; i < 6; ++i) { m_macAddress[i] = 0x00; } } + +bool CConfigurationEnobio3G::preConfigure() +{ + if (! CConfigurationBuilder::preConfigure()) { return false; } + + // Connect here all callbacks + // Example: + // g_signal_connect(gtk_builder_get_object(m_builder, "button_calibrate"), "pressed", G_CALLBACK(button_calibrate_pressed_cb), this); + + // Insert here the pre-configure code. + // For example, you may want to check if a device is currently connected + // and if more than one are connected. Then you can list in a dedicated combo-box + // the device currently connected so the user can choose which one he wants to acquire from. + + return true; +} + +// function to parse from string to HEX, decimal, etc... +template <class T> +bool from_string(T& t, const std::string& s, std::ios_base& (*f)(std::ios_base&)) +{ + std::istringstream iss(s); + return !(iss >> f >> t).fail(); +} + +bool CConfigurationEnobio3G::postConfigure() +{ + if (m_applyConfig) + { + // If the user pressed the "apply" button, you need to save the changes made in the configuration. + // For example, you can save the connection ID of the selected device: + // m_connectionID = <value-from-gtk-widget> + } + + GtkEntry* field = GTK_ENTRY(gtk_builder_get_object(m_builder,"entry_address")); + + std::string str((char*)gtk_entry_get_text(field)); + + if (! CConfigurationBuilder::postConfigure()) { return false; } // normal header is filled (Subject ID, Age, Gender, channels, sampling frequency), ressources are realesed + + // from the string typped in the address text field, parse + // the 6 hex values for the mac address + // first, tokenize the string using ':' as delimeter + std::vector<std::string> v; + std::istringstream buf(str); + for (std::string token; getline(buf, token, ':');) { v.push_back(token); } + + // each token from the string, parse it as HEX values + int a; + from_string<int>(a, v[5], std::hex); + m_macAddress[0] = (unsigned char)a; + from_string<int>(a, v[4], std::hex); + m_macAddress[1] = (unsigned char)a; + from_string<int>(a, v[3], std::hex); + m_macAddress[2] = (unsigned char)a; + from_string<int>(a, v[2], std::hex); + m_macAddress[3] = (unsigned char)a; + from_string<int>(a, v[1], std::hex); + m_macAddress[4] = (unsigned char)a; + from_string<int>(a, v[0], std::hex); + m_macAddress[5] = (unsigned char)a; + + + return true; +} + +unsigned char* CConfigurationEnobio3G::getMacAddress() { return m_macAddress; } + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif diff --git a/applications/platform/acquisition-server/src/OVASDrivers/neuroelectrics-enobio3g/ovasCConfigurationEnobio3G.h b/applications/platform/acquisition-server/src/OVASDrivers/neuroelectrics-enobio3g/ovasCConfigurationEnobio3G.h new file mode 100755 index 0000000000000000000000000000000000000000..e866f7fa49114fd51a433d87c6982a808b1d397e --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/neuroelectrics-enobio3g/ovasCConfigurationEnobio3G.h @@ -0,0 +1,43 @@ +#pragma once + +#include "../ovasCConfigurationBuilder.h" +#include "ovasIDriver.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CConfigurationEnobio3G + * \author Anton Albajes-Eizagirre (NeuroElectrics anton.albajes-eizagirre@neuroelectrics.com) + * \date Tue Apr 15 09:25:20 2014 + * \brief The CConfigurationEnobio3G handles the configuration dialog specific to the Enobio3G device. + * + * TODO: details + * + * \sa CDriverEnobio3G + */ +class CConfigurationEnobio3G final : public CConfigurationBuilder +{ +public: + // you may have to add to your constructor some reference parameters + // for example, a connection ID: + //CConfigurationEnobio3G(IDriverContext& ctx, const char* gtkBuilderFilename, uint32_t& rConnectionId); + CConfigurationEnobio3G(IDriverContext& ctx, const char* gtkBuilderFilename); + + bool preConfigure() override; + bool postConfigure() override; + unsigned char* getMacAddress(); + +protected: + IDriverContext& m_driverCtx; + +private: + /* + * Insert here all specific attributes, such as a connection ID. + * use references to directly modify the corresponding attribute of the driver + * Example: + */ + // uint32_t& m_connectionID; + unsigned char m_macAddress[6]; // mac address of the device +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASDrivers/neuroelectrics-enobio3g/ovasCDriverEnobio3G.cpp b/applications/platform/acquisition-server/src/OVASDrivers/neuroelectrics-enobio3g/ovasCDriverEnobio3G.cpp new file mode 100755 index 0000000000000000000000000000000000000000..0b8dc150d6865bc6a7de6262bede55e24682ec07 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/neuroelectrics-enobio3g/ovasCDriverEnobio3G.cpp @@ -0,0 +1,231 @@ +#if defined(TARGET_HAS_ThirdPartyEnobioAPI) + +#include "ovasCDriverEnobio3G.h" +#include "ovasCConfigurationEnobio3G.h" +#include <string.h> +#include <toolkit/ovtk_all.h> + +namespace OpenViBE { +namespace AcquisitionServer { + +CDriverEnobio3G::CDriverEnobio3G(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_Enobio3G", m_driverCtx.getConfigurationManager()) +{ + m_header.setSamplingFrequency(_ENOBIO_SAMPLE_RATE_); + m_header.setChannelCount(32); + + // The following class allows saving and loading driver settings from the acquisition server .conf file + m_settings.add("Header", &m_header); + // To save your custom driver settings, register each variable to the SettingsHelper + //m_settings.add("SettingName", &variable); + m_settings.load(); + + // register consumers for enobio data and enobio status + // we register for data and status + m_enobioDevice.registerConsumer(Enobio3G::ENOBIO_DATA, *this); + // m_enobioDevice.registerConsumer(Enobio3G::STATUS, this); + // DONT Get the data from the accelerometer HACK: should ask through config dialog + m_enobioDevice.activateAccelerometer(false); + // set sampling rate of enobio device + m_sampleRate = _ENOBIO_SAMPLE_RATE_; + // allocate space for m_macAddres + m_macAddress = new unsigned char[6]; +} + +CDriverEnobio3G::~CDriverEnobio3G() +{ + // Note: Device itself is closed in uninitialize() + + delete m_sample; + delete m_macAddress; +} + +//___________________________________________________________________// +// // + +bool CDriverEnobio3G::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + if (m_driverCtx.isConnected()) return false; + + // open the BT connection to the device + if (m_enobioDevice.openDevice(m_macAddress)) { m_nChannels = m_enobioDevice.numOfChannels(); } + else { return false; } + + m_header.setChannelCount(m_nChannels); + if (!m_header.isChannelCountSet() || !m_header.isSamplingFrequencySet()) return false; + + for (size_t c = 0; c < m_nChannels; ++c) { m_header.setChannelUnits(c, OVTK_UNIT_Volts, OVTK_FACTOR_Micro); } + + // Builds up a buffer to store + // acquired samples. This buffer + // will be sent to the acquisition + // server later... + // number of cycling buffers we will use + m_nBuffers = 32; + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "Need " << m_nBuffers << " buffers of " << m_header.getChannelCount() * nSamplePerSentBlock << " size for " + << m_nChannels << " channels\n"; + m_sample = new float*[m_nBuffers]; + for (uint32_t i = 0; i < m_nBuffers; ++i) + { + // each buffer will be of length samplecountpersentblock, defined by the configuration interface + m_sample[i] = new float[m_header.getChannelCount() * nSamplePerSentBlock]; + } + m_newData = false; + + if (!m_sample) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Memory allocation error\n"; + delete [] m_sample; + m_sample = nullptr; + return false; + } + m_currentBuffer = 0; + m_lastBufferFilled = 0; + m_bufHead = 0; + + // ... + // initialize hardware and get + // available header information + // from it + // Using for example the connection ID provided by the configuration (m_connectionID) + // ... + + // Saves parameters + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + + return true; +} + +bool CDriverEnobio3G::start() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + m_enobioDevice.startStreaming(); + return true; +} + +/** + Running loop used by OV engine to query for new data from device +*/ +bool CDriverEnobio3G::loop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return true; } + + // query new data flag state + bool newData; + { + std::lock_guard<std::mutex> lock(m_mutex); + newData = m_newData; + } + + // if new data flag is raised it means there's a buffer with new data ready to be submitted + if (newData) + { + // submit new data on the buffer pointed by the lastbufferfilled variable + m_callback->setSamples(m_sample[m_lastBufferFilled]); + // lower new data flag + { + std::lock_guard<std::mutex> lock(m_mutex); + m_newData = false; + } + // When your sample buffer is fully loaded, + // it is advised to ask the acquisition server + // to correct any drift in the acquisition automatically. + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + } + return true; +} + +bool CDriverEnobio3G::stop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + + // ... + // request the hardware to stop + // sending data + // Tell Enobio device to stop streaming EEG. + m_enobioDevice.stopStreaming(); + + return true; +} + +bool CDriverEnobio3G::uninitialize() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + if (m_sample) + { + for (uint32_t i = 0; i < m_nBuffers; ++i) { delete m_sample[i]; } + delete [] m_sample; + m_sample = nullptr; + } + + m_callback = nullptr; + // close BT connection with the Enobio device + m_enobioDevice.closeDevice(); + + return true; +} + +//___________________________________________________________________// +// // +bool CDriverEnobio3G::configure() +{ + // Change this line if you need to specify some references to your driver attribute that need configuration, e.g. the connection ID. + CConfigurationEnobio3G config(m_driverCtx, Directories::getDataDir() + "/applications/acquisition-server/interface-Enobio3G.ui"); + + if (!config.configure(m_header)) { return false; } + m_settings.save(); + unsigned char* macAddress = config.getMacAddress(); + for (int i = 0; i < 6; ++i) { m_macAddress[i] = (unsigned char)*(macAddress + i); } + + return true; +} +/** + Callback function that will be called by the Enobio API for each sample received from the device. +*/ +void CDriverEnobio3G::receiveData(const PData& data) +{ + ChannelData* receivedData = (ChannelData*)data.getData(); + // We'll need to iterate through channels instead of memcpy because we need + // to cast from int to float. will also convert to microvolts + + int* samples = receivedData->data(); + for (uint32_t i = 0; i < m_nChannels; ++i) + { + double sample = samples[i] / 1000.0; + m_sample[m_currentBuffer][i * m_nSamplePerSentBlock + m_bufHead] = float(sample); + } + + // mutex for writing header and new data flag + { + std::lock_guard<std::mutex> lock(m_mutex); + + m_bufHead++; + // if we already filled the current buffer we need to raise the new data flag + // and cycle to the next buffer + if (m_bufHead >= m_nSamplePerSentBlock) + { + // update the pointer to the last buffer filled + m_lastBufferFilled = m_currentBuffer; + // reset the buffer writing head to the beginning. + m_bufHead = 0; + // we update pointer to the current buffer + m_currentBuffer++; + // if we are at the end of the buffers set, cycle to the first one + if (m_currentBuffer >= m_nBuffers) { m_currentBuffer = 0; } + // raise the flag to mark existence of new data to be submittted + m_newData = true; + } + } +} + +/** + Callback from EnobioAPI to receive status data. + CURRENTLY NOT USED +*/ +void CDriverEnobio3G::newStatusFromDevice(const PData& data) { } + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif diff --git a/applications/platform/acquisition-server/src/OVASDrivers/neuroelectrics-enobio3g/ovasCDriverEnobio3G.h b/applications/platform/acquisition-server/src/OVASDrivers/neuroelectrics-enobio3g/ovasCDriverEnobio3G.h new file mode 100755 index 0000000000000000000000000000000000000000..01da8331f88dd982e297e4f05a51951be9f54393 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/neuroelectrics-enobio3g/ovasCDriverEnobio3G.h @@ -0,0 +1,96 @@ +#pragma once + +#if defined(TARGET_HAS_ThirdPartyEnobioAPI) + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" +#include <openvibe/ov_all.h> + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +// Including Enobio headers gave 4275 on 11.07.2014 w/ VS2010 +#pragma warning(disable:4275) + +#include "enobio3g.h" +#include "StatusData.h" +#include <mutex> + +#ifndef _ENOBIO_SAMPLE_RATE_ +#ifdef FREQ_SAMP + #define _ENOBIO_SAMPLE_RATE_ FREQSAMP +#else +#define _ENOBIO_SAMPLE_RATE_ 500 +#endif +#endif + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverEnobio3G + * \author Anton Albajes-Eizagirre (NeuroElectrics) anton.albajes-eizagirre@neuroelectrics.com + * \date Tue Apr 15 09:25:20 2014 + * \brief The CDriverEnobio3G allows the acquisition server to acquire data from a Enobio3G device. + * + * TODO: details + * + * \sa CConfigurationEnobio3G + */ +class CDriverEnobio3G final : public IDriver, public IDataConsumer +{ +public: + + CDriverEnobio3G(IDriverContext& ctx); + ~CDriverEnobio3G() override; + const char* getName() override { return "Enobio3G"; } + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override { return true; } + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + + bool isFlagSet(const EDriverFlag flag) const override { return flag == EDriverFlag::IsUnstable; } + + // enobio registered consumers callbacks + void receiveData(const PData& data); + void newStatusFromDevice(const PData& data); + +protected: + SettingsHelper m_settings; + IDriverCallback* m_callback = nullptr; + + // Replace this generic Header with any specific header you might have written + CHeader m_header; + + uint32_t m_nSamplePerSentBlock = 0; + // sample buffers. We will have a set of buffers that will be cycled. + float** m_sample = nullptr; + +private: + + /* + * Insert here all specific attributes, such as USB port number or device ID. + * Example : + */ + uint32_t m_nChannels = 0; // Number of channels on the device reported by the device + unsigned char* m_macAddress = nullptr; // mac address of the device + Enobio3G m_enobioDevice; // Enobio device class instantiation + uint32_t m_sampleRate = 0; // sampling rate of the device + uint32_t m_bufHead = 0; // writing header for the current buffer + uint32_t m_nBuffers = 0; // number of buffers + uint32_t m_currentBuffer = 0; // current buffer in use + uint32_t m_lastBufferFilled = 0; // last buffer filled with data ready to be submitted + bool m_newData = false; // if there is a new buffer with data ready to be submitted + + std::mutex m_mutex; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif diff --git a/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/HidDeviceApi/HidDevice.cpp b/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/HidDeviceApi/HidDevice.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ee7c70317db1f5b465ecf30773b4641af1cee13c --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/HidDeviceApi/HidDevice.cpp @@ -0,0 +1,326 @@ +/* +* HID driver for OpenViBE +* +* \authors (NeuroServo, NeuroTechX) +* \developer (Innocent Aguie) +* \date Wed Nov 23 00:24:00 2016 +* +*/ + +#if defined TARGET_OS_Windows +#if defined TARGET_HAS_ThirdPartyNeuroServo + +#include <iostream> + +#include "HidDevice.h" +#include "SetupApi.h" + +#define READTHREADWAITTIMEOUT 100 + +HidDevice::HidDevice(const unsigned short vendorID, const unsigned short productID, const unsigned short receivdedDataSize) +{ + setHidDeviceInfos(vendorID, productID, receivdedDataSize); +} + +HidDevice::HidDevice() +{ + _hEventObject = CreateEvent(nullptr, TRUE, FALSE, "HIDUSBRcv"); + _hidOverlapped.hEvent = _hEventObject; + _hidOverlapped.Offset = 0; + _hidOverlapped.OffsetHigh = 0; +} + +HidDevice::~HidDevice() +{ + free(_deviceNotifier); + _deviceNotifier = nullptr; +} + +void HidDevice::setHidDeviceInfos(const unsigned short vendorID, const unsigned short productID, const unsigned short receivdedDataSize) +{ + _vendorID = vendorID; + _productID = productID; + _readDataSize = receivdedDataSize; + + // Init the connexion state + _isDeviceAttached = false; + _isDeviceConnected = false; +} + +bool HidDevice::connect() +{ + // Get the HID class identifier + HidD_GetHidGuid(&_hidGui); + + // Get HID information set in the PC + HDEVINFO deviceInfoSet = SetupDiGetClassDevs(&_hidGui, nullptr, nullptr, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE); + + // Ensure that HID information set has been returned + if (!deviceInfoSet) { + std::cout << "HidDevice::connect() -> Error: Problem to load HID information set" << std::endl; + return false; + } + + // Browse through device interfaces + SP_DEVICE_INTERFACE_DATA deviceInterfaceData; + deviceInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); + + BOOL isDeviceFound = 1; + uint32_t memberIndex = 0; + ULONG requiredSize; // Size of device detail data + HIDD_ATTRIBUTES hidAttributes; + while (isDeviceFound) { + // Get the device interface at the index "memberIndex" + isDeviceFound = SetupDiEnumDeviceInterfaces(deviceInfoSet, nullptr, &_hidGui, memberIndex, &deviceInterfaceData); + + // Ensure that a device has been found at the specified index + if (!isDeviceFound) { isDeviceFound = 0; } + else { + // Get the details with null values to get the required size of the buffer + SetupDiGetDeviceInterfaceDetail(deviceInfoSet, &deviceInterfaceData, + nullptr, //interfaceDetail, + 0, //interfaceDetailSize, + &requiredSize, + nullptr); //infoData)) + + // Allocate the buffer + PSP_INTERFACE_DEVICE_DETAIL_DATA deviceInterfaceDetailData = PSP_INTERFACE_DEVICE_DETAIL_DATA(malloc(requiredSize)); + deviceInterfaceDetailData->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA); + + // Fill the buffer with the device details + if (!SetupDiGetDeviceInterfaceDetail(deviceInfoSet, &deviceInterfaceData, deviceInterfaceDetailData, requiredSize, &requiredSize, nullptr)) { + // Ensure to free the dynamic allocated memory + SetupDiDestroyDeviceInfoList(deviceInfoSet); + free(deviceInterfaceDetailData); + std::cout << "HidDevice::connect() -> Error: failed to get device info" << std::endl; + return false; + } + + // Details about the device is available + HANDLE hidDeviceObject = CreateFile(deviceInterfaceDetailData->DevicePath, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, + nullptr, OPEN_EXISTING, 0, nullptr); + + // Ensure that the handle is valid + if (!hidDeviceObject) { + std::cout << "HidDevice::connect() -> Error: failed to get handle of the HID" << std::endl; + return false; + } + + // Get the attribute of the HID + if (!HidD_GetAttributes(hidDeviceObject, &hidAttributes)) { + std::cout << "HidDevice::connect() -> Error: failed to get HID attributes" << std::endl; + return false; + } + + + if (hidAttributes.VendorID == _vendorID && hidAttributes.ProductID == _productID) { + // We found the targeted device ... Save the following: + // - HID device handle + _deviceHandle = hidDeviceObject; + + // - Version number + _versionNumber = hidAttributes.VersionNumber; + + // `- Device Path Name + _devicePathName = deviceInterfaceDetailData->DevicePath; + + // - Configure the device for read and write + if (!configure()) { return false; } + + // At this step it's guaranteed that the device has been detected and connected + deviceIsConnected(); + + // Ensure to free the dynamic memory allocated + free(deviceInterfaceDetailData); + + // The device has been found and is connected + return true; + } + + // Next device + memberIndex++; + } + } + + // No device corresponding to the PID and VID + return false; +} + +bool HidDevice::configure() +{ + // Get the read and write handles + if (!getReadWriteHandle()) { return false; } + + // Get the capabilities of the device + if (!getCapabilities()) { return false; } + + // The device has been correctly configured + return true; +} + +bool HidDevice::getReadWriteHandle() +{ + // Open the readHandle to the device + _readDeviceHandle = CreateFile(_devicePathName, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, + LPSECURITY_ATTRIBUTES(nullptr), OPEN_EXISTING, FILE_FLAG_OVERLAPPED, nullptr); + + // Did we open the readHandle successfully? + if (!_readDeviceHandle) { + std::cout << "HidDevice::configure() -> Error: Fail to get the read handle of the device" << std::endl; + return false; + } + + // Open the readHandle to the device + _writeDeviceHandle = CreateFile(_devicePathName, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, + LPSECURITY_ATTRIBUTES(nullptr), OPEN_EXISTING, 0, nullptr); + + // Did we open the readHandle successfully? + if (!_writeDeviceHandle) { + std::cout << "HidDevice::configure() -> Error: Fail to get the write handle of the device" << std::endl; + return false; + } + + return true; +} + +bool HidDevice::getCapabilities() +{ + // Get the preparsed data in order to request the device capabilities + PHIDP_PREPARSED_DATA preparsedData; + const BOOLEAN result = HidD_GetPreparsedData(_deviceHandle, &preparsedData); + if (result != TRUE) { + std::cout << "HidDevice::configure() -> Error: Fail to get the preparsed data" << std::endl; + return false; + } + + // Get the capabilities + const NTSTATUS status = HidP_GetCaps(preparsedData, &_deviceCaps); + if (status != HIDP_STATUS_SUCCESS) { + std::cout << "HidDevice::configure() -> Error: Fail to get the collection capability information" << std::endl; + return false; + } + + if (preparsedData) { + const BOOLEAN isFreeCompleted = HidD_FreePreparsedData(preparsedData); + + // Ensure memory has been freed correcly + if (!isFreeCompleted) { + std::cout << "HidDevice::configure() -> Error: Fail to free the preparsed data in memory" << std::endl; + return false; + } + } + + + return true; +} + +bool HidDevice::writeToDevice(BYTE data[], const int nbOfBytes) +{ + // Make sure that the device is connected + if (_isDeviceConnected) { + const DWORD dwBytesToWrite = DWORD(nbOfBytes); + DWORD dwBytesWritten = 0; + + const BOOL writeResult = WriteFile(_writeDeviceHandle, data, dwBytesToWrite, &dwBytesWritten, nullptr); + + if (!writeResult) { + std::cout << "HidDevice::writeToDevice() -> Error: Problem sending message to the device" << std::endl; + return false; + } + + //std::cout << "HidDevice::writeToDevice() -> Data sent to the device" << std::endl; + return true; + } + std::cout << "HidDevice::writeToDevice() -> Error: The device is not connected." << std::endl; + return false; +} + +void HidDevice::readThread() +{ + _readData = new BYTE[_readDataSize]; + + DWORD nbByteRead; + DWORD waitReturn; + + while (_isDeviceConnected) { + const BOOL result = ReadFile(_readDeviceHandle, _readData, _readDataSize, nullptr, LPOVERLAPPED(&_hidOverlapped)); + if (result == 1 || (result == 0 && GetLastError() == ERROR_IO_PENDING)) { + do { waitReturn = WaitForSingleObject(_hEventObject, READTHREADWAITTIMEOUT); } while ((waitReturn == WAIT_TIMEOUT) && (_isDeviceConnected == true)); + switch (waitReturn) { + case WAIT_OBJECT_0: // Data returned + { + nbByteRead = 0; + if (GetOverlappedResult(_readDeviceHandle, &_hidOverlapped, &nbByteRead, FALSE) && nbByteRead == _readDataSize) { + // Pass the data read to the client method + if (dataReceived) { dataReceived(_readData); } + } + else { + if (_isDeviceConnected) { std::cout << "HidDevice::readThread():incomplete -> Error: Reading data from device failed." << std::endl; } + } + break; + } + default: + { + if (_isDeviceConnected) { std::cout << "HidDevice::readThread():waitReturn -> Error: Reading data from device failed." << std::endl; } + break; + } + } + } + else { if (_isDeviceConnected) { std::cout << "HidDevice::readThread() -> Error: Reading data from device failed." << std::endl; } } + ResetEvent(_hEventObject); + } + // Free the memory allocated for reading data + delete[] _readData; + _readData = nullptr; +} + +void HidDevice::deviceIsConnected() +{ + // Device is attached + _isDeviceAttached = true; + + // flag the device connexion state + _isDeviceConnected = true; + + // Start a separate thread for reading data from the device + _readTask = std::thread(&HidDevice::readThread, this); + _readTask.detach(); + + // Attach the client callback method + if (deviceConnected) { deviceConnected(); } + + // Start the Register Device Notification just once + if (_deviceNotifier == nullptr) { + _deviceNotifier = new HidDeviceNotifier(_hidGui, _devicePathName); + + // Bind the callback methods + _deviceNotifier->deviceAttached = std::bind(&HidDevice::deviceOnAttached, this); + _deviceNotifier->deviceDetached = std::bind(&HidDevice::deviceOnDetached, this); + + // Register the device for notification + _deviceNotifier->startRegistration(); + } +} + +void HidDevice::deviceOnAttached() +{ + std::cout << "Callback - Device attached" << std::endl; + _isDeviceAttached = true; + + // Execute the callback if defined + if (deviceAttached) { deviceAttached(); } +} + +void HidDevice::deviceOnDetached() +{ + std::cout << "Callback - Device detached" << std::endl; + _isDeviceAttached = false; + _isDeviceConnected = false; + + // Execute the callback if defined + if (deviceDetached) { deviceDetached(); } +} + + +#endif +#endif diff --git a/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/HidDeviceApi/HidDevice.h b/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/HidDeviceApi/HidDevice.h new file mode 100644 index 0000000000000000000000000000000000000000..3de777afd99f47b233c7c258be7e89a8be2b0786 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/HidDeviceApi/HidDevice.h @@ -0,0 +1,89 @@ +/* +* HID driver for OpenViBE +* +* \authors (NeuroServo, NeuroTechX) +* \developer (Innocent Aguie) +* \date Wed Nov 23 00:24:00 2016 +* +*/ + +#pragma once + +#if defined TARGET_OS_Windows +#if defined TARGET_HAS_ThirdPartyNeuroServo + +#include <Windows.h> +#include "Hidsdi.h" +#include <thread> + +#include "HidDeviceNotifier.h" + +class HidDevice +{ +public: + HidDevice(unsigned short vendorID, unsigned short productID, unsigned short receivdedDataSize); + HidDevice(); + ~HidDevice(); + + /* Client available methods */ + bool connect(); + bool writeToDevice(BYTE data[], int nbOfBytes); + bool isDeviceConnected() { return _isDeviceConnected; } + void setHidDeviceInfos(unsigned short vendorID, unsigned short productID, unsigned short receivdedDataSize); + + /* Callbacks methods */ + std::function<void(BYTE [])> dataReceived; + std::function<void()> deviceConnected; + std::function<void()> deviceDetached; + std::function<void()> deviceAttached; + + +private: + /* Methods to perform specific actions */ + bool configure(); + bool getReadWriteHandle(); + bool getCapabilities(); + void deviceIsConnected(); + void readThread(); + + /* Callbacks from Register Device Notification */ + void deviceOnAttached(); + void deviceOnDetached(); + + /* Instances */ + + // Device identification + unsigned short _vendorID = 0; + unsigned short _productID = 0; + unsigned short _versionNumber = 0; + GUID _hidGui; + + // Device connexion state + bool _isDeviceAttached = false; + bool _isDeviceConnected = false; + + // Device communication handle + HANDLE _deviceHandle; + HANDLE _readDeviceHandle; + HANDLE _writeDeviceHandle; + CHAR* _devicePathName = nullptr; + + // Device capabilities + HIDP_CAPS _deviceCaps; + + // Background worker + std::thread _readTask; + + // To be able to read the data + BYTE* _readData = nullptr; + unsigned short _readDataSize; + + // Device notifier + HidDeviceNotifier* _deviceNotifier = nullptr; + + HANDLE _hEventObject; + OVERLAPPED _hidOverlapped; +}; + +#endif +#endif diff --git a/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/HidDeviceApi/HidDeviceNotifier.cpp b/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/HidDeviceApi/HidDeviceNotifier.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b935b815a36c8aac56091c501aafe69a8dd065c3 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/HidDeviceApi/HidDeviceNotifier.cpp @@ -0,0 +1,41 @@ +/* +* HID driver for OpenViBE +* +* \authors (NeuroServo, NeuroTechX) +* \developer (Innocent Agui�) +* \date Wed Nov 23 00:24:00 2016 +* +*/ + +#if defined TARGET_OS_Windows +#if defined TARGET_HAS_ThirdPartyNeuroServo + +#include <windows.h> + +#include "HidDeviceNotifier.h" +#include "HidDeviceNotifierRef.h" +#include <thread> + +#define WND_CLASS_NAME TEXT("SampleAppWindowClass") + + +HidDeviceNotifier::HidDeviceNotifier(const GUID interfaceGuid, CHAR* devicePathName) +{ + _deviceGuid = interfaceGuid; + _devicePathName = devicePathName; + _appName = "Window Notifier"; + _isDeviceRegistered = false; +} + +void HidDeviceNotifier::startRegistration() +{ + _isDeviceRegistered = true; + + // Start a separate thread for reading data from the device + std::thread notifierThread(registerNotification, this); + notifierThread.detach(); +} + +#endif + +#endif // TARGET_OS_Windows diff --git a/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/HidDeviceApi/HidDeviceNotifier.h b/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/HidDeviceApi/HidDeviceNotifier.h new file mode 100644 index 0000000000000000000000000000000000000000..4c6a590526390e54d965bacd8d920f0dee5343cd --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/HidDeviceApi/HidDeviceNotifier.h @@ -0,0 +1,50 @@ +/* +* HID driver for OpenViBE +* +* \authors (NeuroServo, NeuroTechX) +* \developer (Innocent Aguie) +* \date Wed Nov 23 00:24:00 2016 +* +*/ +#pragma once + +#if defined TARGET_OS_Windows +#if defined TARGET_HAS_ThirdPartyNeuroServo + +#include <Windows.h> +#include <functional> + +class HidDeviceNotifier +{ +public: + HidDeviceNotifier(GUID interfaceGuid, CHAR* devicePathName); + HidDeviceNotifier() { } + ~HidDeviceNotifier() { } + + void startRegistration(); + + /* Callbacks methods */ + std::function<void()> deviceDetached; + std::function<void()> deviceAttached; + + /* Member functions */ + GUID getDeviceGuid() const { return _deviceGuid; } + CHAR* getDevicePathName() const { return _devicePathName; } + LPCSTR getAppName() const { return _appName; } + bool isDeviceRegistrationStarted() const { return _isDeviceRegistered; } + + +private: + /* Members */ + // Device related information + GUID _deviceGuid; + CHAR* _devicePathName = nullptr; + + // For informational messages and window titles + LPCSTR _appName; + + bool _isDeviceRegistered = false; +}; + +#endif +#endif diff --git a/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/HidDeviceApi/HidDeviceNotifierRef.cpp b/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/HidDeviceApi/HidDeviceNotifierRef.cpp new file mode 100644 index 0000000000000000000000000000000000000000..85b27913fda44acadcee4feeca61355c214cd5dd --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/HidDeviceApi/HidDeviceNotifierRef.cpp @@ -0,0 +1,426 @@ +/* +* HID driver for OpenViBE +* +* \authors (NeuroServo, NeuroTechX) +* \developer (Innocent Aguie) +* \date Wed Nov 23 00:24:00 2016 +* +*/ + +#if defined TARGET_OS_Windows +#if defined TARGET_HAS_ThirdPartyNeuroServo + +#include <windows.h> +#include <stdio.h> +#include <tchar.h> +#include <strsafe.h> +#include <dbt.h> + +#include "HidDeviceNotifier.h" + +#define WND_CLASS_NAME TEXT("SampleAppWindowClass") + +// Hid notifier object to provide target specific infos +HidDeviceNotifier hidDeviceNotifier; + +/** +The following methods have been copied from Microsoft Dev Center +Date: 2016-11-29 +Address: https://msdn.microsoft.com/en-us/library/windows/desktop/aa363432(v=vs.85).aspx + +*/ + +// Forward declarations +void OutputMessage(HWND hOutWnd, WPARAM wParam, LPARAM lParam); +void ErrorHandler(LPTSTR lpszFunction); + +// +// DoRegisterDeviceInterfaceToHwnd +// +BOOL DoRegisterDeviceInterfaceToHwnd(IN GUID InterfaceClassGuid, IN HWND hWnd, OUT HDEVNOTIFY* hDeviceNotify) +// Routine Description: +// Registers an HWND for notification of changes in the device interfaces +// for the specified interface class GUID. + +// Parameters: +// InterfaceClassGuid - The interface class GUID for the device +// interfaces. + +// hWnd - Window handle to receive notifications. + +// hDeviceNotify - Receives the device notification handle. On failure, +// this value is NULL. + +// Return Value: +// If the function succeeds, the return value is TRUE. +// If the function fails, the return value is FALSE. + +// Note: +// RegisterDeviceNotification also allows a service handle be used, +// so a similar wrapper function to this one supporting that scenario +// could be made from this template. +{ + DEV_BROADCAST_DEVICEINTERFACE NotificationFilter; + + ZeroMemory(&NotificationFilter, sizeof(NotificationFilter)); + NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE); + NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; + NotificationFilter.dbcc_classguid = InterfaceClassGuid; + + *hDeviceNotify = RegisterDeviceNotification(hWnd, // events recipient + &NotificationFilter, // type of device + DEVICE_NOTIFY_WINDOW_HANDLE); // type of recipient handle + + if (nullptr == *hDeviceNotify) { + ErrorHandler(TEXT("RegisterDeviceNotification")); + return FALSE; + } + + return TRUE; +} + +// +// MessagePump +// +void MessagePump(HWND hWnd) +// Routine Description: +// Simple main thread message pump. +// + +// Parameters: +// hWnd - handle to the window whose messages are being dispatched + +// Return Value: +// None. +{ + MSG msg; + int retVal; + + // Get all messages for any window that belongs to this thread, + // without any filtering. Potential optimization could be + // obtained via use of filter values if desired. + + //while ((retVal = GetMessage(&msg, nullptr, 0, 0)) != 0) + while ((retVal = GetMessage(&msg, hWnd, 0, 0)) != 0) { + if (retVal == -1) { + ErrorHandler(TEXT("GetMessage")); + break; + } + TranslateMessage(&msg); + DispatchMessage(&msg); + } +} + +// +// WinProcCallback +// +INT_PTR WINAPI WinProcCallback(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +// Routine Description: +// Simple Windows callback for handling messages. +// This is where all the work is done because the example +// is using a window to process messages. This logic would be handled +// differently if registering a service instead of a window. + +// Parameters: +// hWnd - the window handle being registered for events. + +// message - the message being interpreted. + +// wParam and lParam - extended information provided to this +// callback by the message sender. + +// For more information regarding these parameters and return value, +// see the documentation for WNDCLASSEX and CreateWindowEx. +{ + LRESULT lRet = 1; + static HDEVNOTIFY hDeviceNotify; + static HWND hEditWnd; + + switch (message) { + case WM_CREATE: + // + // This is the actual registration., In this example, registration + // should happen only once, at application startup when the window + // is created. + // + // If you were using a service, you would put this in your main code + // path as part of your service initialization. + // + if (!DoRegisterDeviceInterfaceToHwnd(/*WceusbshGUID*/hidDeviceNotifier.getDeviceGuid(), hWnd, &hDeviceNotify)) { + // Terminate on failure. + ErrorHandler(TEXT("DoRegisterDeviceInterfaceToHwnd")); + ExitProcess(1); + } + + + // + // Make the child window for output. + // + { +#if defined(TARGET_ARCHITECTURE_x64) + HINSTANCE winPtr = HINSTANCE(GetWindowLongPtr(hWnd, GWLP_HINSTANCE)); +#else + HINSTANCE winPtr = HINSTANCE(GetWindowLong(hWnd, GWL_HINSTANCE)); +#endif + + hEditWnd = CreateWindow(TEXT("EDIT"),// predefined class + NULL, // no window title + WS_CHILD | WS_VISIBLE | WS_VSCROLL | + ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL, + 0, 0, 0, 0, // set size in WM_SIZE message + hWnd, // parent window + HMENU(1), // edit control ID + winPtr, + NULL); // pointer not needed + } + + if (hEditWnd == nullptr) { + // Terminate on failure. + ErrorHandler(TEXT("CreateWindow: Edit Control")); + ExitProcess(1); + } + // Add text to the window. + SendMessage(hEditWnd, WM_SETTEXT, 0, LPARAM("Registered for USB device notification...\n")); + + break; + + case WM_SETFOCUS: SetFocus(hEditWnd); + + break; + + case WM_SIZE: + // Make the edit control the size of the window's client area. + MoveWindow(hEditWnd, + 0, 0, // starting x- and y-coordinates + LOWORD(lParam), // width of client area + HIWORD(lParam), // height of client area + TRUE); // repaint window + + break; + + case WM_DEVICECHANGE: + { + // + // This is the actual message from the interface via Windows messaging. + // This code includes some additional decoding for this particular device type + // and some common validation checks. + // + // Note that not all devices utilize these optional parameters in the same + // way. Refer to the extended information for your particular device type + // specified by your GUID. + // + PDEV_BROADCAST_DEVICEINTERFACE b = PDEV_BROADCAST_DEVICEINTERFACE(lParam); + TCHAR strBuff[256]; + + // Output some messages to the window. + switch (wParam) { + case DBT_DEVICEARRIVAL: if (hidDeviceNotifier.deviceAttached) { hidDeviceNotifier.deviceAttached(); } + break; + + case DBT_DEVICEREMOVECOMPLETE: if (hidDeviceNotifier.deviceDetached) { hidDeviceNotifier.deviceDetached(); } + break; + + case DBT_DEVNODES_CHANGED: + // Do nothing + break; + + default: + // Do nothing + break; + } + OutputMessage(hEditWnd, wParam, LPARAM(strBuff)); + } + break; + case WM_CLOSE: if (!UnregisterDeviceNotification(hDeviceNotify)) { ErrorHandler(TEXT("UnregisterDeviceNotification")); } + DestroyWindow(hWnd); + break; + + case WM_DESTROY: PostQuitMessage(0); + break; + + default: + // Send all other messages on to the default windows handler. + lRet = DefWindowProc(hWnd, message, wParam, lParam); + break; + } + + return lRet; +} + +// +// InitWindowClass +// +BOOL InitWindowClass() +// Routine Description: +// Simple wrapper to initialize and register a window class. + +// Parameters: +// None + +// Return Value: +// TRUE on success, FALSE on failure. + +// Note: +// wndClass.lpfnWndProc and wndClass.lpszClassName are the +// important unique values used with CreateWindowEx and the +// Windows message pump. +{ + WNDCLASSEX wndClass; + + wndClass.cbSize = sizeof(WNDCLASSEX); + wndClass.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW; + wndClass.hInstance = reinterpret_cast<HINSTANCE>(GetModuleHandle(nullptr)); + wndClass.lpfnWndProc = reinterpret_cast<WNDPROC>(WinProcCallback); + wndClass.cbClsExtra = 0; + wndClass.cbWndExtra = 0; + wndClass.hIcon = LoadIcon(nullptr, IDI_APPLICATION); + wndClass.hbrBackground = CreateSolidBrush(RGB(192, 192, 192)); + wndClass.hCursor = LoadCursor(nullptr, IDC_ARROW); + wndClass.lpszClassName = WND_CLASS_NAME; + wndClass.lpszMenuName = nullptr; + wndClass.hIconSm = wndClass.hIcon; + + + if (!RegisterClassEx(&wndClass)) { + ErrorHandler(TEXT("RegisterClassEx")); + return FALSE; + } + return TRUE; +} + +// +// main +// +int registerNotification(HidDeviceNotifier* notifier) +{ + hidDeviceNotifier = *notifier; + + if (!InitWindowClass()) { + // InitWindowClass displays any errors + return -1; + } + + /*HidD_GetHidGuid(&WceusbshGUID);*/ + + // Main app window + + HWND hWnd = CreateWindowEx(WS_EX_CLIENTEDGE | WS_EX_APPWINDOW, WND_CLASS_NAME, /*g_pszAppName*/hidDeviceNotifier.getAppName(), + WS_OVERLAPPEDWINDOW, // style + CW_USEDEFAULT, 0, 640, 480, nullptr, nullptr, nullptr, nullptr); + + if (hWnd == nullptr) { + ErrorHandler(TEXT("CreateWindowEx: main appwindow hWnd")); + return -1; + } + + // Actually draw the window. + + /*ShowWindow(hWnd, SW_SHOWNORMAL); + UpdateWindow(hWnd);*/ + + // The message pump loops until the window is destroyed. + + MessagePump(hWnd); + + return 1; +} + +// +// OutputMessage +// +void OutputMessage(const HWND hOutWnd, WPARAM /*wParam*/, const LPARAM lParam) +// Routine Description: +// Support routine. +// Send text to the output window, scrolling if necessary. + +// Parameters: +// hOutWnd - Handle to the output window. +// wParam - Standard windows message code, not used. +// lParam - String message to send to the window. + +// Return Value: +// None + +// Note: +// This routine assumes the output window is an edit control +// with vertical scrolling enabled. + +// This routine has no error checking. +{ + // Make writable and turn off redraw. + SendMessage(hOutWnd, EM_SETREADONLY, FALSE, 0L); + SendMessage(hOutWnd, WM_SETREDRAW, FALSE, 0L); + + // Obtain current text length in the window. + const LONG bufferLen = SendMessage(hOutWnd, WM_GETTEXTLENGTH, 0, 0L); + LONG numLines = SendMessage(hOutWnd, EM_GETLINECOUNT, 0, 0L); + const LONG firstVis = SendMessage(hOutWnd, EM_GETFIRSTVISIBLELINE, 0, 0L); + SendMessage(hOutWnd, EM_SETSEL, bufferLen, bufferLen); + + // Write the new text. + SendMessage(hOutWnd, EM_REPLACESEL, 0, lParam); + + // See whether scrolling is necessary. + if (numLines > (firstVis + 1)) { + int lineLen = 0; + + // Find the last nonblank line. + numLines--; + while (!lineLen) { + const int charPos = SendMessage(hOutWnd, EM_LINEINDEX, WPARAM(numLines), 0L); + lineLen = SendMessage(hOutWnd, EM_LINELENGTH, charPos, 0L); + if (!lineLen) { numLines--; } + } + // Prevent negative value finding min. + int lineCount = numLines - firstVis; + lineCount = (lineCount >= 0) ? lineCount : 0; + + // Scroll the window. + SendMessage(hOutWnd, EM_LINESCROLL, 0, LPARAM(lineCount)); + } + + // Done, make read-only and allow redraw. + SendMessage(hOutWnd, WM_SETREDRAW, TRUE, 0L); + SendMessage(hOutWnd, EM_SETREADONLY, TRUE, 0L); +} + +// +// ErrorHandler +// +void ErrorHandler(LPTSTR lpszFunction) +// Routine Description: +// Support routine. +// Retrieve the system error message for the last-error code +// and pop a modal alert box with usable info. + +// Parameters: +// lpszFunction - String containing the function name where +// the error occurred plus any other relevant data you'd +// like to appear in the output. + +// Return Value: +// None + +// Note: +// This routine is independent of the other windowing routines +// in this application and can be used in a regular console +// application without modification. +{ + LPVOID lpMsgBuf; + const DWORD dw = GetLastError(); + + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, + nullptr, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), LPTSTR(&lpMsgBuf), 0, nullptr); + + // Display the error message and exit the process. + + LPVOID lpDisplayBuf = LPVOID(LocalAlloc(LMEM_ZEROINIT, (lstrlen(LPCTSTR(lpMsgBuf)) + lstrlen(LPCTSTR(lpszFunction)) + 40) * sizeof(TCHAR))); + StringCchPrintf(LPTSTR(lpDisplayBuf), LocalSize(lpDisplayBuf) / sizeof(TCHAR), TEXT("%s failed with error %d: %s"), lpszFunction, dw, lpMsgBuf); + MessageBox(nullptr, LPCTSTR(lpDisplayBuf), hidDeviceNotifier.getAppName(), MB_OK); + + LocalFree(lpMsgBuf); + LocalFree(lpDisplayBuf); +} + +#endif +#endif // TARGET_OS_Windows diff --git a/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/HidDeviceApi/HidDeviceNotifierRef.h b/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/HidDeviceApi/HidDeviceNotifierRef.h new file mode 100644 index 0000000000000000000000000000000000000000..a13c07eef6559977aa3826968066fc38d1ee8504 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/HidDeviceApi/HidDeviceNotifierRef.h @@ -0,0 +1,21 @@ +/* +* HID driver for OpenViBE +* +* \authors (NeuroServo, NeuroTechX) +* \developer (Innocent Agui�) +* \date Wed Nov 23 00:24:00 2016 +* +*/ + +#pragma once + +#if defined TARGET_OS_Windows +#if defined TARGET_HAS_ThirdPartyNeuroServo + +#include "HidDeviceNotifier.h" + +// Register Device Notification method +int registerNotification(HidDeviceNotifier* notifier); + +#endif +#endif // TARGET_OS_Windows diff --git a/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/doc/NeuroServoDriverClass.png b/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/doc/NeuroServoDriverClass.png new file mode 100644 index 0000000000000000000000000000000000000000..c2ca93db4a0093d1b468c507480ba30a05e4a41f Binary files /dev/null and b/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/doc/NeuroServoDriverClass.png differ diff --git a/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/doc/readme.txt b/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/doc/readme.txt new file mode 100644 index 0000000000000000000000000000000000000000..23e670f1fc0dea35995bae1de7cccb6d1c428081 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/doc/readme.txt @@ -0,0 +1,24 @@ +HidDevice class description +*************************** + +The class "HidDevice" is an interface developped in C++ for the interaction with HID devices. + +There is a constructor without argument that allow to create an object and instantiate it later, and also a constructor with instantiation values. + +A function setHidDeviceInfos() is used to update the device information: the vendor ID, the product ID, and the number of bytes that the device should expect to receive. When the object is created and its information is defined, the user can then call the connect() function. This function returns "true" when the connection is successful. Communication with the equipment can then begin. + +The function writeToDevice() allow to send data to the connected device. This function takes two arguments, a byte array which contains the data and a number that correspond to the number of byte within the data array. + +Four "callback" methods are available: + +- dataReceived + +- dataConnected + +- deviceAttached + +- deviceDetached + +Users can assign these function pointers to their own functions to execute the code they want. + +The "HidDeviceNotifier" is another class inside "HidDevice" that lets you know the status of the device at any time. It is this class that gives information about whether the device was plugged-in or unplugged after the first connection. diff --git a/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/ovasCConfigurationNeuroServoHid.cpp b/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/ovasCConfigurationNeuroServoHid.cpp new file mode 100644 index 0000000000000000000000000000000000000000..b18c0ade6fc507c3f9ae02e1a46c57d1eaf4f84e --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/ovasCConfigurationNeuroServoHid.cpp @@ -0,0 +1,93 @@ +/* +* NeuroServo driver for OpenViBE +* +* \author (NeuroServo) +* \date Wed Nov 23 00:24:00 2016 +* +*/ + +#if defined TARGET_OS_Windows +#if defined TARGET_HAS_ThirdPartyNeuroServo + +#include "ovasCConfigurationNeuroServoHid.h" + +namespace OpenViBE { +namespace AcquisitionServer { + +// Automatic Shutdown callback +static void AutomaticShutdownCB(GtkToggleButton* button, CConfigurationNeuroServoHid* data) +{ + data->checkRadioAutomaticShutdown(gtk_toggle_button_get_active(button) == 1); +} + +// Shutdown on driver disconnect callback +static void ShutdownOnDriverDisconnectCB(GtkToggleButton* button, CConfigurationNeuroServoHid* data) +{ + data->checkRadioShutdownOnDriverDisconnect(gtk_toggle_button_get_active(button) == 1); +} + +// Device Light Enable callback +static void DeviceLightEnableCB(GtkToggleButton* button, CConfigurationNeuroServoHid* data) +{ + data->checkRadioDeviceLightEnable(gtk_toggle_button_get_active(button) == 1); +} + +// If you added more reference attribute, initialize them here +CConfigurationNeuroServoHid::CConfigurationNeuroServoHid(IDriverContext& ctx, const char* gtkBuilderFilename) + : CConfigurationBuilder(gtkBuilderFilename), m_driverCtx(ctx) {} + +bool CConfigurationNeuroServoHid::preConfigure() +{ + if (! CConfigurationBuilder::preConfigure()) { return false; } + + // callbacks connection + + // Connection of "Automatic Shutdown" toggle button + GtkToggleButton* buttonAutomaticShutdown = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_automatic_shutdown")); + gtk_toggle_button_set_active(buttonAutomaticShutdown, m_automaticShutdown ? true : false); + + g_signal_connect(gtk_builder_get_object(m_builder, "checkbutton_automatic_shutdown"), "toggled", G_CALLBACK(AutomaticShutdownCB), this); + this->checkRadioAutomaticShutdown(m_automaticShutdown); + + // Connection of "Shutdown on driver disconnect" toggle button + GtkToggleButton* buttonShutdownOnDriverDisconnect = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_shutdown_on_driver_disconnect")); + gtk_toggle_button_set_active(buttonShutdownOnDriverDisconnect, m_shutdownOnDriverDisconnect ? true : false); + + g_signal_connect(gtk_builder_get_object(m_builder, "checkbutton_shutdown_on_driver_disconnect"), "toggled", G_CALLBACK(ShutdownOnDriverDisconnectCB), this); + this->checkRadioShutdownOnDriverDisconnect(m_shutdownOnDriverDisconnect); + + // Connection of "Device Light Enable" toggle button + GtkToggleButton* buttonDeviceLightEnable = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_device_light_enable")); + gtk_toggle_button_set_active(buttonDeviceLightEnable, m_deviceLightEnable ? true : false); + + g_signal_connect(gtk_builder_get_object(m_builder, "checkbutton_device_light_enable"), "toggled", G_CALLBACK(DeviceLightEnableCB), this); + this->checkRadioDeviceLightEnable(m_deviceLightEnable); + + return true; +} + +bool CConfigurationNeuroServoHid::postConfigure() +{ + if (m_applyConfig) { + // Automatic Shutdown + GtkToggleButton* buttonAutomaticShutdown = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_automatic_shutdown")); + m_automaticShutdown = gtk_toggle_button_get_active(buttonAutomaticShutdown) ? true : false; + + // Shutdown on driver disconnect + GtkToggleButton* buttonShutdownOnDriverDisconnect = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_shutdown_on_driver_disconnect")); + m_shutdownOnDriverDisconnect = gtk_toggle_button_get_active(buttonShutdownOnDriverDisconnect) ? true : false; + + // Device Light Enable + GtkToggleButton* buttonDeviceLightEnable = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_device_light_enable")); + m_deviceLightEnable = gtk_toggle_button_get_active(buttonDeviceLightEnable) ? true : false; + } + + if (! CConfigurationBuilder::postConfigure()) { return false; } + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif +#endif // TARGET_OS_Windows diff --git a/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/ovasCConfigurationNeuroServoHid.h b/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/ovasCConfigurationNeuroServoHid.h new file mode 100644 index 0000000000000000000000000000000000000000..2adc258f2d314dd578ae30a7fc2fab9b3c2465f4 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/ovasCConfigurationNeuroServoHid.h @@ -0,0 +1,64 @@ +/* +* NeuroServo driver for OpenViBE +* +* \author (NeuroServo) +* \date Wed Nov 23 00:24:00 2016 +* +*/ + +#pragma once + +#if defined TARGET_OS_Windows +#if defined TARGET_HAS_ThirdPartyNeuroServo + +#include "../ovasCConfigurationBuilder.h" +#include "ovasIDriver.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CConfigurationNeuroServoHid + * \author (NeuroServo) + * \date Wed Nov 23 00:24:00 2016 + * \brief The CConfigurationNeuroServoHid handles the configuration dialog specific to the NeuroServo device. + * + * TODO: details + * + * \sa CDriverNeuroServoHid + */ +class CConfigurationNeuroServoHid final : public CConfigurationBuilder +{ +public: + CConfigurationNeuroServoHid(IDriverContext& ctx, const char* gtkBuilderFilename); + + bool preConfigure() override; + bool postConfigure() override; + + // Automatic Shutdown + void checkRadioAutomaticShutdown(const bool state) { m_automaticShutdown = state; } + bool getAutomaticShutdownStatus() { return m_automaticShutdown; } + void setRadioAutomaticShutdown(const bool state) { m_automaticShutdown = state; } + + // Shutdown on driver disconnect + void checkRadioShutdownOnDriverDisconnect(const bool state) { m_shutdownOnDriverDisconnect = state; } + bool getShutdownOnDriverDisconnectStatus() { return m_shutdownOnDriverDisconnect; } + void setRadioShutdownOnDriverDisconnect(const bool state) { m_shutdownOnDriverDisconnect = state; } + + // Device Light Enable + void checkRadioDeviceLightEnable(const bool state) { m_deviceLightEnable = state; } + bool getDeviceLightEnableStatus() { return m_deviceLightEnable; } + void setRadioDeviceLightEnable(const bool state) { m_deviceLightEnable = state; } + +protected: + IDriverContext& m_driverCtx; + +private: + bool m_automaticShutdown = false; + bool m_shutdownOnDriverDisconnect = false; + bool m_deviceLightEnable = false; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif +#endif // TARGET_OS_Windows diff --git a/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/ovasCDriverNeuroServoHid.cpp b/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/ovasCDriverNeuroServoHid.cpp new file mode 100644 index 0000000000000000000000000000000000000000..9fed5a8534d7df3a3546df76af5d254dd247916e --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/ovasCDriverNeuroServoHid.cpp @@ -0,0 +1,423 @@ +/* +* NeuroServo driver for OpenViBE +* +* \author (NeuroServo) +* \date Wed Nov 23 00:24:00 2016 +* +* \note This driver will not compile with VS2010 due to missing HID library. Use VS2013. +* +*/ + +#if defined TARGET_OS_Windows +#if defined TARGET_HAS_ThirdPartyNeuroServo + +#include "ovasCDriverNeuroServoHid.h" +#include "ovasCConfigurationNeuroServoHid.h" + +#include <toolkit/ovtk_all.h> +#include <system/ovCTime.h> +#include <Windows.h> +#include <functional> + +namespace OpenViBE { +namespace AcquisitionServer { + +/* + NeuroServo general infos +*/ +#define NEUROSERVO_VID uint16_t(0xC1C4) +#define NEUROSERVO_PID uint16_t(0x8B25) +#define NEUROSERVO_DATA_SIZE uint16_t(65) +#define NEUROSERVO_DRIVER_NAME "NeuroServo" +#define NEUROSERVO_SENDDATA_BLOCK uint32_t(1024) +#define ADC_TO_uVOLTS 0.0118 + +/* +General define +*/ +#define DRIFTSTABILISATION_MAXNBSWITCH 10 +#define DRIFTSTABILISATION_MINNBSWITCH 2 +#define DRIFTSTABILISATION_MULTFACTOR 1.2 + +//___________________________________________________________________// +// // + +CDriverNeuroServoHid::CDriverNeuroServoHid(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_NeuroServoHid", m_driverCtx.getConfigurationManager()) +{ + m_header.setSamplingFrequency(2048); + m_header.setChannelCount(1); + m_header.setChannelUnits(0, OVTK_UNIT_Volts, OVTK_FACTOR_Micro); + m_header.setChannelName(0, "FP1-FPz"); + + // Set the Device basic infos + m_vendorId = NEUROSERVO_VID; + m_productId = NEUROSERVO_PID; + m_dataSize = NEUROSERVO_DATA_SIZE; + m_driverName = NEUROSERVO_DRIVER_NAME; + m_isDeviceConnected = false; + + m_settings.add("Header", &m_header); + m_settings.add("Vid", &m_vendorId); + m_settings.add("Pid", &m_productId); + m_settings.add("DataSize", &m_dataSize); + m_settings.add("AutomaticShutdown", &m_automaticShutdown); + m_settings.add("ShutdownOnDrvDisconnect", &m_bShutdownOnDriverDisconnect); + m_settings.add("DeviceLightEnable", &m_bDeviceLightEnable); + + m_settings.load(); +} + +CDriverNeuroServoHid::~CDriverNeuroServoHid() {} + +const char* CDriverNeuroServoHid::getName() { return m_driverName; } + +//___________________________________________________________________// +// // + +bool CDriverNeuroServoHid::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + if (m_driverCtx.isConnected() || !m_header.isChannelCountSet() || !m_header.isSamplingFrequencySet()) { return false; } + + m_nSamplePerSentBlock = nSamplePerSentBlock; + + // Set the specific infos of the device + m_oHidDevice.setHidDeviceInfos(m_vendorId, m_productId, m_dataSize); + + // Connect to the device + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << m_driverName << ": Connecting to the device.\n"; + if (!m_oHidDevice.connect()) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_driverName << ": Connection failed.\n"; + return false; + } + + // Device connection state + m_isDeviceConnected = true; + + // Take into account the configuration of "Automatic Shutdown" and "Device Light Enable" + deviceShutdownAndLightConfiguration(); + + // Bind the callback methods + m_oHidDevice.dataReceived = std::bind(&CDriverNeuroServoHid::processDataReceived, this, std::placeholders::_1); + m_oHidDevice.deviceDetached = std::bind(&CDriverNeuroServoHid::deviceDetached, this); + m_oHidDevice.deviceAttached = std::bind(&CDriverNeuroServoHid::deviceAttached, this); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << m_driverName << ": Connection succeded.\n"; + + m_sendBlockRequiredTime = CTime(m_header.getSamplingFrequency(), (nSamplePerSentBlock)).time(); + m_sendSampleRequiredTime = CTime(m_header.getSamplingFrequency(), 1).time(); + + m_sample = new float[nSamplePerSentBlock]; + if (!m_sample) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Could not allocate memory for sample array\n"; + delete[] m_sample; + m_sample = nullptr; + return false; + } + m_bDeviceEpochDetected = false; + m_isDeviceInitialized = true; + + // Saves parameters + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + + return true; +} + +bool CDriverNeuroServoHid::start() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + // Ensure that the device is connected + if (!m_isDeviceConnected) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_driverName << ": Device is not connected.\n"; + return false; + } + + m_bQueueOverflow = false; + m_bQueueUnderflow = false; + + // Build the data to be sent to the device + BYTE data[65]; + data[0] = 0x00; // HID Report ID + data[1] = 0x09; // Cmd + data[2] = 0x01; // 0x01 (Reserved) + data[3] = 0x01; // Start acquisition + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << m_driverName << ": Request acquisition to be started.\n"; + + if (!m_oHidDevice.writeToDevice(data, m_dataSize)) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_driverName << ": Failed to start acquisittion.\n"; + return false; + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << m_driverName << ": Acquisiton started.\n"; + m_sampleIdxForSentBlock = 0; + m_timeStampLastSentBlock = 0; + m_nDriftSample = 0; + m_bDeviceEpochDetected = false; + m_driftAutoCorrectionDelay = 0; + m_nSwitchDrift = 0; + m_fDriftAutoCorrFactor = 1.0; + m_isDriftWasInEarlyDirection = false; + m_sampleValue = 0; + + // Set approximate lattency in regard to hardware implementation. Queue lattency + // should be adjusted but write_available() member is not accessible in current + // boost version. + m_driverCtx.setInnerLatencySampleCount(-1024); + + return true; +} + +bool CDriverNeuroServoHid::loop() +{ + if (!m_isDeviceInitialized || !m_driverCtx.isConnected()) { return false; } + if (!m_driverCtx.isStarted()) { return true; } + + for (uint32_t i = 0; i < m_nSamplePerSentBlock; ++i) { + if (!m_pBufferQueue.pop(m_sampleValue) && m_bQueueUnderflow == false && m_nSwitchDrift == DRIFTSTABILISATION_MAXNBSWITCH) { + // We wait for stabilisation before warn + m_bQueueUnderflow = true; + } + m_sample[i] = (m_sampleValue * float(ADC_TO_uVOLTS)); // N.B. Last sample value is sent if queue was empty + } + + const int64_t currentDriftSampleCount = m_driverCtx.getDriftSampleCount(); + if (currentDriftSampleCount != 0) { + // Drift in early direction + if (currentDriftSampleCount > m_nDriftSample) { + if (m_isDriftWasInEarlyDirection == false && m_nSwitchDrift < DRIFTSTABILISATION_MAXNBSWITCH) { + m_nSwitchDrift++; + m_isDriftWasInEarlyDirection = true; + if (m_nSwitchDrift > DRIFTSTABILISATION_MINNBSWITCH) { m_fDriftAutoCorrFactor = m_fDriftAutoCorrFactor / float(DRIFTSTABILISATION_MULTFACTOR); } + } + m_driftAutoCorrectionDelay = m_driftAutoCorrectionDelay + int64_t(m_fDriftAutoCorrFactor * m_sendSampleRequiredTime); + } + // Drift in late direction + if (currentDriftSampleCount < m_nDriftSample) { + if (m_isDriftWasInEarlyDirection == true && m_nSwitchDrift < DRIFTSTABILISATION_MAXNBSWITCH) { + m_nSwitchDrift++; + m_isDriftWasInEarlyDirection = false; + if (m_nSwitchDrift > DRIFTSTABILISATION_MINNBSWITCH) { m_fDriftAutoCorrFactor = m_fDriftAutoCorrFactor / float(DRIFTSTABILISATION_MULTFACTOR); } + } + m_driftAutoCorrectionDelay = m_driftAutoCorrectionDelay - int64_t(m_fDriftAutoCorrFactor * m_sendSampleRequiredTime); + } + } + + const uint64_t elapsedTime = System::Time::zgetTime() - m_timeStampLastSentBlock; + if (m_sendBlockRequiredTime > elapsedTime) { + // If we're early, sleep before sending. This code regulate the data drift + // @fixme the code should not rely on zsleep() as its time precision can not be guaranteed; it can oversleep esp. on Windows + boost 1.58 + const uint64_t sleepTime = m_sendBlockRequiredTime - elapsedTime; + System::Time::zsleep(uint64_t(sleepTime + m_driftAutoCorrectionDelay)); + } + + m_timeStampLastSentBlock = System::Time::zgetTime(); + m_callback->setSamples(m_sample); + const int64_t autoCorrection = m_driverCtx.getSuggestedDriftCorrectionSampleCount(); + m_driverCtx.correctDriftSampleCount(autoCorrection); + m_callback->setStimulationSet(m_stimSet); + m_stimSet.clear(); + + // We will apply driver time auto correction on next loop + m_nDriftSample = currentDriftSampleCount; + + if (m_bQueueUnderflow) { + m_bQueueUnderflow = false; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << m_driverName << ": Sample block has been skipped by driver!! Driver queue was empty\n"; + } + return true; +} + +bool CDriverNeuroServoHid::stop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + + // Ensure that the device is connected + if (!m_isDeviceConnected) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_driverName << ": Device is not connected.\n"; + return false; + } + + // Build the data to be sent to the device + BYTE data[65]; + data[0] = 0x00; // HID Report ID + data[1] = 0x09; // Cmd + data[2] = 0x01; // 0x01 (Reserved) + data[3] = 0x00; // Stop acquisition + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << m_driverName << ": Request acquisition to be stopped.\n"; + + if (!m_oHidDevice.writeToDevice(data, m_dataSize)) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << m_driverName << ": Failed to stop acquisittion.\n"; + return false; + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << m_driverName << ": Acquisiton stopped.\n"; + + return true; +} + +bool CDriverNeuroServoHid::uninitialize() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + if (m_isDeviceInitialized && m_isDeviceConnected) { + if (m_bShutdownOnDriverDisconnect) { + BYTE data[65]; + data[0] = 0x00; // HID Report ID + data[1] = 0x16; // Cmd + data[2] = 0x01; // 0x01 (Reserved) + data[3] = 0x01; // Shutdown the device + m_oHidDevice.writeToDevice(data, m_dataSize); + } + else { + // Set device to normal user mode + + BYTE data[65]; + data[0] = 0x00; // HID Report ID + data[1] = 0x17; // Cmd + data[2] = 0x01; // 0x01 (Reserved) + data[3] = 0x01; // ask the device to switch off automatically + m_oHidDevice.writeToDevice(data, m_dataSize); + + data[0] = 0x00; // HID Report ID + data[1] = 0x18; // Cmd + data[2] = 0x01; // 0x01 (Reserved) + data[3] = 0x01; // Enable the device light + m_oHidDevice.writeToDevice(data, m_dataSize); + } + } + m_isDeviceConnected = false; + m_isDeviceInitialized = false; + delete[] m_sample; + m_sample = nullptr; + m_callback = nullptr; + + return true; +} + +//___________________________________________________________________// +// // +bool CDriverNeuroServoHid::configure() +{ + CConfigurationNeuroServoHid config(m_driverCtx, Directories::getDataDir() + "/applications/acquisition-server/interface-NeuroServoHid.ui"); + + // Set the current state of the "Automatic Shutdown" "Shutdown on driver disconnect" and "Device Light Enable" + config.setRadioAutomaticShutdown(m_automaticShutdown); + config.setRadioShutdownOnDriverDisconnect(m_bShutdownOnDriverDisconnect); + config.setRadioDeviceLightEnable(m_bDeviceLightEnable); + + if (!config.configure(m_header)) { return false; } + + // Get the configuration from the ui + m_automaticShutdown = config.getAutomaticShutdownStatus(); + m_bShutdownOnDriverDisconnect = config.getShutdownOnDriverDisconnectStatus(); + m_bDeviceLightEnable = config.getDeviceLightEnableStatus(); + + // Save the settings + m_settings.save(); + + return true; +} + +//___________________________________________________________________// +// // +// NEUROSERVO SPECIFIC METHODS IMPLEMENTATION + +void CDriverNeuroServoHid::processDataReceived(const BYTE data[]) +{ + // Ensure the acquisition has started + if (m_driverCtx.isStarted() && m_isDeviceInitialized) { + if (data[1] == 0x03) { + const uint32_t nElement = (data[3] + (data[4] << 8)); + const uint32_t index = (data[5] + (data[6] << 8)); + + if (index == 0) { + // Queue lattency should be considered but write_available() member + // is not accessible in current boost version. + /* + size_t NbItemInQueue = 1024 - m_pBufferQueue.write_available(); + if (uint32_t(NbItemInQueue) != m_nBufferQueue) + { + m_driverCtx.setInnerLatencySampleCount(int64_t(m_nBufferQueue - uint32_t(NbItemInQueue))); + m_nBufferQueue = uint32_t(NbItemInQueue); + } + */ + m_nSamplesReceived = 0; + m_bDeviceEpochDetected = true; + } + if (m_bDeviceEpochDetected == true) { + // Loop and process the data + for (int i = (7); i < m_dataSize - 1; i = i + 2) { + if (m_nSamplesReceived < nElement) { + float pValue = float(float(data[i]) + float((data[i + 1]) << 8)); + // Remove comp2 + if (pValue > 32767) { pValue = pValue - 65536; } + if (!m_pBufferQueue.push(pValue)) { m_bQueueOverflow = true; } + m_sampleIdxForSentBlock++; + + // If full epoch is received + if (m_sampleIdxForSentBlock == 1024) { + m_bDeviceEpochDetected = false; + m_sampleIdxForSentBlock = 0; + if (m_bQueueOverflow && m_nSwitchDrift == DRIFTSTABILISATION_MAXNBSWITCH) // We wait for stabilisation before warn + { + m_bQueueOverflow = false; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << m_driverName << + ": Sample block has been skipped by driver!! Driver queue was full\n"; + } + } + m_nSamplesReceived++; + } + } + } + } + } +} + +void CDriverNeuroServoHid::deviceDetached() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << m_driverName << ": Device detached.\n"; + m_isDeviceConnected = false; + m_isDeviceInitialized = false; +} + +void CDriverNeuroServoHid::deviceAttached() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << m_driverName << ": Device attached.\n"; + m_isDeviceConnected = true; +} + +void CDriverNeuroServoHid::deviceShutdownAndLightConfiguration() +{ + BYTE data[65]; + data[0] = 0x00; // HID Report ID + data[2] = 0x01; // 0x01 (Reserved) + + data[1] = 0x17; // Cmd + if (m_automaticShutdown) { + data[3] = 0x01; // ask the device to switch off automatically + m_oHidDevice.writeToDevice(data, m_dataSize); + } + else { + data[3] = 0x00; // ask the device not to switch off automatically + m_oHidDevice.writeToDevice(data, m_dataSize); + } + + data[1] = 0x18; // Cmd + if (m_bDeviceLightEnable) { + data[3] = 0x01; // Enable the device light + m_oHidDevice.writeToDevice(data, m_dataSize); + } + else { + data[3] = 0x00; // Disable the device light + m_oHidDevice.writeToDevice(data, m_dataSize); + } +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif +#endif // TARGET_OS_Windows diff --git a/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/ovasCDriverNeuroServoHid.h b/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/ovasCDriverNeuroServoHid.h new file mode 100644 index 0000000000000000000000000000000000000000..114f17fcdf9c0fea449167f723edd5bbb771f68c --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/neuroservo/ovasCDriverNeuroServoHid.h @@ -0,0 +1,120 @@ +/* +* NeuroServo driver for OpenViBE +* +* \author (NeuroServo) +* \date Wed Nov 23 00:24:00 2016 +* +*/ + +#pragma once + +#if defined TARGET_OS_Windows +#if defined TARGET_HAS_ThirdPartyNeuroServo + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" +#include <openvibe/ov_all.h> + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +// Provicde necessary methods to allow connection with HID device +#include "HidDeviceApi/HidDevice.h" + +#include <boost/lockfree/spsc_queue.hpp> + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverNeuroServoHid + * \author (NeuroServo) + * \date Wed Nov 23 00:24:00 2016 + * \brief The CDriverNeuroServoHid allows the acquisition server to acquire data from a NeuroServo device. + * + * \sa CConfigurationNeuroServoHid + */ +class CDriverNeuroServoHid final : public IDriver +{ +public: + explicit CDriverNeuroServoHid(IDriverContext& ctx); + ~CDriverNeuroServoHid() override; + const char* getName() override; + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override { return true; } + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + + bool isFlagSet(const EDriverFlag flag) const override { return flag == EDriverFlag::IsUnstable; } + + /* Methods implemented for the specific needs of NeuroServo. + Execute the callback from the HID device services + */ + void processDataReceived(const BYTE data[]); + void deviceDetached(); + void deviceAttached(); + +private: + // Control "Automatic Shutdown" and "Device Light Enable" based on user configuration + void deviceShutdownAndLightConfiguration(); + + +protected: + SettingsHelper m_settings; + IDriverCallback* m_callback = nullptr; + CHeader m_header; + float* m_sample = nullptr; + CStimulationSet m_stimSet; + +private: + // Create a buffer queue for 1 sec data + boost::lockfree::spsc_queue<float, boost::lockfree::capacity<2048>> m_pBufferQueue; + + // Device related infos + HidDevice m_oHidDevice; + uint16_t m_productId = 0; + uint16_t m_vendorId = 0; + uint16_t m_dataSize = 0; + CString m_driverName; + + // Data processing related infos + uint32_t m_nSamplePerSentBlock = 0; + uint32_t m_sampleIdxForSentBlock = 0; + uint32_t m_nSamplesReceived = 0; + + uint64_t m_timeStampLastSentBlock = 0; + uint64_t m_sendBlockRequiredTime = 0; + uint64_t m_sendSampleRequiredTime = 0; + uint64_t m_nSwitchDrift = 0; + + int64_t m_nDriftSample = 0; + int64_t m_driftAutoCorrectionDelay = 0; + + float m_sampleValue = 0; + float m_fDriftAutoCorrFactor = 0; + + bool m_isDriftWasInEarlyDirection = false; + bool m_bQueueOverflow = false; + bool m_bQueueUnderflow = false; + bool m_bDeviceEpochDetected = false; + + // Configuration + bool m_automaticShutdown = false; + bool m_bShutdownOnDriverDisconnect = true; + bool m_bDeviceLightEnable = false; + bool m_isDeviceInitialized = false; + + // Device connection state + bool m_isDeviceConnected = false; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif +#endif // TARGET_OS_Windows diff --git a/applications/platform/acquisition-server/src/OVASDrivers/neurosky-mindset/ovasCConfigurationNeuroskyMindset.cpp b/applications/platform/acquisition-server/src/OVASDrivers/neurosky-mindset/ovasCConfigurationNeuroskyMindset.cpp new file mode 100644 index 0000000000000000000000000000000000000000..a1b33ff16aeea4cad829241d34a078b5a4778597 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/neurosky-mindset/ovasCConfigurationNeuroskyMindset.cpp @@ -0,0 +1,152 @@ +#if defined TARGET_HAS_ThirdPartyThinkGearAPI + +#include "ovasCConfigurationNeuroskyMindset.h" +#include <system/ovCTime.h> +#include <sstream> + +#include <thinkgear.h> + +namespace OpenViBE { +namespace AcquisitionServer { + +//------------------------------------------------------------------------------------------ +// NOTE : The signal checker is implemented but the device does not seem to handle +// a lot of connection/reconnection and this functionnality may cause +// the bluetooth connection to crash when configuring, checking, +// then reconnecting, and reading data. The signal check button in the +// configuration window is not visible, but the checking is always performed online. +//------------------------------------------------------------------------------------------ +//_________________________________________________ + +CConfigurationNeuroskyMindset::CConfigurationNeuroskyMindset(IDriverContext& ctx, const char* gtkBuilderFilename, uint32_t& comPort, bool& eSenseChannels, + bool& bandPowerChannels, bool& blinkStimulations, bool& blinkStrengthChannel) + : CConfigurationBuilder(gtkBuilderFilename), m_driverCtx(ctx), m_rComPort(comPort), m_eSenseChannels(eSenseChannels), + m_bandPowerChannels(bandPowerChannels), m_blinkStimulations(blinkStimulations), m_blinkStrengthChannel(blinkStrengthChannel) { } + +bool CConfigurationNeuroskyMindset::preConfigure() +{ + if (!CConfigurationBuilder::preConfigure()) { return false; } + //::GtkWidget * windowCheckSignalQuality=GTK_WIDGET(gtk_builder_get_object(m_builder, "dialog_check_signal_quality")); + + /* + g_signal_connect(gtk_builder_get_object(m_builder, "button_check_signal_quality"),"pressed",G_CALLBACK(button_check_signal_quality_cb), this); + g_signal_connect(gtk_builder_get_object(m_builder, "button_refresh"),"pressed",G_CALLBACK(button_refresh_cb), this); + //hide on close + g_signal_connect (G_OBJECT(windowCheckSignalQuality), "delete_event", G_CALLBACK(gtk_widget_hide), nullptr); + */ + + char buffer[1024]; + int count = 0; + bool selected = false; + + GtkComboBox* comboBox = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_com_port")); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "ThinkGear DLL version: " << int(TG_GetVersion()) << "\n"; + + // try the com ports. @NOTE almost duplicate code in CDriverNeuroskyMindset + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Scanning COM ports 1 to 16...\n"; + for (uint32_t i = 1; i < 16; ++i) + { + /* Get a new connection ID handle to ThinkGear API */ + const int connectionId = TG_GetNewConnectionId(); + if (connectionId < 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "The driver was unable to connect to the ThinkGear Communication Driver.\n"; + return false; + } + // m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "ThinkGear Connection ID is: "<< connectionId <<".\n"; + + /* Attempt to connect the connection ID handle to serial port */ + std::stringstream comPortName; + comPortName << "\\\\.\\COM" << i; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Trying port [" << comPortName.str() << "]\n"; + int code = TG_Connect(connectionId, comPortName.str().c_str(), TG_BAUD_9600, TG_STREAM_PACKETS); + if (code >= 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Connection available on port [" << comPortName.str() << "]"; + + const uint32_t startTime = System::Time::getTime(); + const uint32_t timeToTry = 3000; // ms + + // With e.g. MindWave Mobile, errors do not mean that the operation couldn't succeed in the future, so we ask for a packet optimistically for a while. + bool comPortFound = false; + while (!comPortFound && (System::Time::getTime() - startTime) < timeToTry) + { + //we try to read one packet to check the connection. + code = TG_ReadPackets(connectionId, 1); + if (code >= 0) + { + m_driverCtx.getLogManager() << " - Status: OK\n"; + sprintf(buffer, "COM%i", i); + gtk_combo_box_append_text(comboBox, buffer); + if (m_rComPort == i) + { + gtk_combo_box_set_active(comboBox, count); + selected = true; + } + count++; + comPortFound = true; + } + else { System::Time::sleep(1); } + } + if (!comPortFound) + { + m_driverCtx.getLogManager() << " - Tried for " << timeToTry / 1000 << " seconds, gave up.\n"; + if (code == -1) { m_driverCtx.getLogManager() << Kernel::LogLevel_Info << " Last TG_ReadPackets error: -1, Invalid connection ID\n"; } + else if (code == -2) { m_driverCtx.getLogManager() << Kernel::LogLevel_Info << " Last TG_ReadPackets error: -2, 0 bytes on the stream\n"; } + else if (code == -3) { m_driverCtx.getLogManager() << Kernel::LogLevel_Info << " Last TG_ReadPackets error: -3, I/O error occurred\n"; } + else { m_driverCtx.getLogManager() << Kernel::LogLevel_Info << " Last TG_ReadPackets error: " << code << ", Unknown\n"; } + } + } + else { m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "TG_Connect() returned error " << code << "\n"; } + // free the connection to ThinkGear API + // We use FreeConnection() only as doing a TG_Disconnect()+TG_FreeConnection() pair can cause first-chance exceptions on visual studio & MindWave Mobile for some reason. + TG_FreeConnection(connectionId); + } + + if (count == 0) { m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "The driver was unable to find any valid device on serial port COM1 to COM16.\n"; } + + if (!selected) { gtk_combo_box_set_active(comboBox, 0); } + + GtkToggleButton* toggleESense = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "check_esense")); + GtkToggleButton* togglePower = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "check_power")); + GtkToggleButton* toggleBlink = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "check_blink")); + GtkToggleButton* toggleBlinkStrength = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "check_blink_strenght")); + + gtk_toggle_button_set_active(toggleESense, m_eSenseChannels); + gtk_toggle_button_set_active(togglePower, m_bandPowerChannels); + gtk_toggle_button_set_active(toggleBlink, m_blinkStimulations); + gtk_toggle_button_set_active(toggleBlinkStrength, m_blinkStrengthChannel); + + return (count > 0); +} + +bool CConfigurationNeuroskyMindset::postConfigure() +{ + if (m_applyConfig) + { + GtkComboBox* comboBox = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_com_port")); + + int comPort = 0; + const char* usbIdx = gtk_combo_box_get_active_text(comboBox); + if (usbIdx) { if (sscanf(usbIdx, "COM%i", &comPort) == 1) { m_rComPort = uint32_t(comPort); } } + + GtkToggleButton* toggleESense = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "check_esense")); + GtkToggleButton* togglePower = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "check_power")); + GtkToggleButton* toggleBlink = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "check_blink")); + GtkToggleButton* toggleBlinkStrength = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "check_blink_strenght")); + + m_eSenseChannels = (gtk_toggle_button_get_active(toggleESense) != 0); // assign to bool while avoiding C4800 warning on MSVC + m_bandPowerChannels = (gtk_toggle_button_get_active(togglePower) != 0); + m_blinkStimulations = (gtk_toggle_button_get_active(toggleBlink) != 0); + m_blinkStrengthChannel = (gtk_toggle_button_get_active(toggleBlinkStrength) != 0); + } + + if (! CConfigurationBuilder::postConfigure()) { return false; } // normal header is filled, ressources are realesed + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyThinkGearAPI diff --git a/applications/platform/acquisition-server/src/OVASDrivers/neurosky-mindset/ovasCConfigurationNeuroskyMindset.h b/applications/platform/acquisition-server/src/OVASDrivers/neurosky-mindset/ovasCConfigurationNeuroskyMindset.h new file mode 100644 index 0000000000000000000000000000000000000000..27414291cb7c40bdf7ab1b99c9061409a051405a --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/neurosky-mindset/ovasCConfigurationNeuroskyMindset.h @@ -0,0 +1,61 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyThinkGearAPI + +#include "../ovasCConfigurationBuilder.h" +#include "ovasIDriver.h" + +#include <gtk/gtk.h> + +#define OVAS_MINDSET_INVALID_COM_PORT 0xffff + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CConfigurationNeuroskyMindset + * \author Laurent Bonnet (INRIA) + * \date 05 may 2010 + * \erief The CConfigurationNeuroskyMindset handles the configuration dialog specific to the MindSet device. + * + * User can configure ... (TODO). + * + * \sa CDriverNeuroskyMindset + */ +class CConfigurationNeuroskyMindset final : public CConfigurationBuilder +{ +public: + + CConfigurationNeuroskyMindset(IDriverContext& ctx, const char* gtkBuilderFilename, uint32_t& comPort, bool& eSenseChannels, bool& bandPowerChannels, + bool& blinkStimulations, bool& blinkStrengthChannel); + + bool preConfigure() override; + bool postConfigure() override; + + //virtual void buttonCheckSignalQualityCB(); + //virtual void buttonRefreshCB(); + +protected: + + IDriverContext& m_driverCtx; + int m_nDevice = 0; + + // the parameters passed to the driver : + uint32_t& m_rComPort; + bool& m_eSenseChannels; + bool& m_bandPowerChannels; + bool& m_blinkStimulations; + bool& m_blinkStrengthChannel; + + //widgets + GtkWidget* m_comPortSpinButton = nullptr; + + bool m_checkSignalQuality = false; + +private: + + uint32_t m_currentConnectionId = uint32_t(-1); +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyThinkGearAPI diff --git a/applications/platform/acquisition-server/src/OVASDrivers/neurosky-mindset/ovasCDriverNeuroskyMindset.cpp b/applications/platform/acquisition-server/src/OVASDrivers/neurosky-mindset/ovasCDriverNeuroskyMindset.cpp new file mode 100644 index 0000000000000000000000000000000000000000..9eeb5ba0fbf7be5a4ca87cc81f382120f53b3ab9 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/neurosky-mindset/ovasCDriverNeuroskyMindset.cpp @@ -0,0 +1,445 @@ +#if defined TARGET_HAS_ThirdPartyThinkGearAPI + +#include "ovasCDriverNeuroskyMindset.h" +#include "ovasCConfigurationNeuroskyMindset.h" + +#include <sstream> +#include <system/ovCTime.h> + +#include <thinkgear.h> + +namespace OpenViBE { +namespace AcquisitionServer { + +CDriverNeuroskyMindset::CDriverNeuroskyMindset(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_NeuroSkyMindSet", m_driverCtx.getConfigurationManager()) +{ + m_header.setSamplingFrequency(512); // raw signal sampling frequency, from the official documentation. + // CHANNEL COUNT + m_header.setChannelCount(1); // one channel on the forhead + m_header.setChannelName(0, "Electrode"); + + m_connectionID = -1; + + m_comPort = OVAS_MINDSET_INVALID_COM_PORT; + + m_eSenseChannels = false; + m_bandPowerChannels = false; + m_blinkStimulations = false; + m_blinkStrengthChannel = false; + + m_settings.add("Header", &m_header); + m_settings.add("ComPort", &m_comPort); + m_settings.add("ESenseChannels", &m_eSenseChannels); + m_settings.add("BandPowerChannels", &m_bandPowerChannels); + m_settings.add("Stimulations", &m_blinkStimulations); + m_settings.add("StrengthChannel", &m_blinkStrengthChannel); + m_settings.load(); + +#if !defined(TG_DATA_BLINK_STRENGTH) + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Mindset Driver: This version does not have eyeblink detection support\n"; + m_blinkStimulations = false; + m_blinkStrengthChannel = false; +#endif +} + +//___________________________________________________________________// +// // + +bool CDriverNeuroskyMindset::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Mindset Driver: INIT called.\n"; + if (m_driverCtx.isConnected()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] Mindset Driver: Driver already initialized.\n"; + return false; + } + + /* + 11 channels + ----- + eSense values: + TG_DATA_ATTENTION + TG_DATA_MEDITATION + + Raw EEG data: + TG_DATA_RAW (512 Hz sampling frequency) + + Power in defined frequency bands: + TG_DATA_DELTA (0.5 - 2.75 Hz) + TG_DATA_THETA (3.5 - 6.75 Hz) + TG_DATA_ALPHA1 (7.5 - 9.25 Hz) + TG_DATA_ALPHA2 (10 - 11.75 Hz) + TG_DATA_BETA1 (13 - 16.75 Hz) + TG_DATA_BETA2 (18 - 29.75 Hz) + TG_DATA_GAMMA1 (31 - 39.75 Hz) + TG_DATA_GAMMA2 (41 - 49.75 Hz) + + Since MindSet Development Kit 2.1: + TG_DATA_BLINK_STRENGTH (1-255) + */ + + // the tokens allow user to use all data coming from headset. + // Raw EEG is sampled at 512Hz, other data are sampled around 1Hz + // so the driver sends these data at 512 Hz, changing value every seconds (we obtain a square signal) + // The Blink Strength can be viewed as spike signal, sampled at 512 Hz. + // The Blinks can be viewed as an OpenViBE stimulation OVTK_GDF_Eye_Blink + + m_header.setChannelCount(1); // one channel on the forhead + m_header.setChannelName(0, "Electrode"); + + if (m_eSenseChannels) { m_header.setChannelCount(m_header.getChannelCount() + 2); } + if (m_bandPowerChannels) { m_header.setChannelCount(m_header.getChannelCount() + 8); } + if (m_blinkStrengthChannel) { m_header.setChannelCount(m_header.getChannelCount() + 1); } + + // NAMES + uint32_t idx = 1; + + if (m_eSenseChannels) + { + m_header.setChannelName(idx++, "Attention"); + m_header.setChannelName(idx++, "Meditation"); + } + if (m_bandPowerChannels) + { + m_header.setChannelName(idx++, "Delta"); + m_header.setChannelName(idx++, "Theta"); + m_header.setChannelName(idx++, "Low Alpha"); + m_header.setChannelName(idx++, "High Alpha"); + m_header.setChannelName(idx++, "Low Beta"); + m_header.setChannelName(idx++, "High Beta"); + m_header.setChannelName(idx++, "Low Gamma"); + m_header.setChannelName(idx++, "Mid Gamma"); + } + // spikes for blink strength + if (m_blinkStrengthChannel) { m_header.setChannelName(idx++, "Blink Strength"); } + + if (!m_header.isChannelCountSet() + || !m_header.isSamplingFrequencySet()) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] Mindset Driver: Channel count or frequency not set.\n"; + return false; + } + + // Builds up a buffer to store acquired samples. This buffer will be sent to the acquisition server later. + m_sample = new float[m_header.getChannelCount() * nSamplePerSentBlock]; + if (!m_sample) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "[INIT] Mindset Driver: Samples allocation failed.\n"; + return false; + } + + + /* Print driver version number */ + const int dllVersion = TG_GetVersion(); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "ThinkGear DLL version: " << dllVersion << "\n"; + if (dllVersion > 7) { m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Eye blink detection is possible. \n"; } + else { m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Eye blink detection NOT possible. Please use MindSet Dev. Tools v2.1 or sup. \n"; } + + // if no com port was selected with the property dialog window + if (m_comPort == OVAS_MINDSET_INVALID_COM_PORT) + { + // try the com ports. @NOTE almost duplicate code in CConfigurationMindSet + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Scanning COM ports 1 to 16...\n"; + for (uint32_t i = 1; i < 16 && m_comPort == OVAS_MINDSET_INVALID_COM_PORT; ++i) + { + /* Get a new connection ID handle to ThinkGear API */ + int connectionId = TG_GetNewConnectionId(); + if (connectionId < 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "The driver was unable to connect to the ThinkGear Communication Driver.\n"; + return false; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "ThinkGear Connection ID is: " << connectionId << ".\n"; + + /* Attempt to connect the connection ID handle to serial port */ + std::stringstream ss; + ss << "\\\\.\\COM" << i; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Trying port [" << ss.str() << "]\n"; + int errCode = TG_Connect(connectionId, ss.str().c_str(), TG_BAUD_9600, TG_STREAM_PACKETS); + if (errCode >= 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Connection available on port " << ss.str(); + + const uint32_t startTime = System::Time::getTime(); + const uint32_t timeToTry = 3000; // ms + + // With e.g. MindWave Mobile, errors do not mean that the operation couldn't succeed in the future, so we ask for a packet optimistically for a while. + bool comPortFound = false; + while (!comPortFound && (System::Time::getTime() - startTime) < timeToTry) + { + //we try to read one packet to check the connection. + errCode = TG_ReadPackets(connectionId, 1); + if (errCode >= 0) + { + m_driverCtx.getLogManager() << " - Status: OK\n"; + m_comPort = i; + comPortFound = true; + } + else { System::Time::sleep(1); } + } + if (!comPortFound) + { + m_driverCtx.getLogManager() << " - Tried for " << timeToTry / 1000 << " seconds, gave up.\n"; + if (errCode == -1) { m_driverCtx.getLogManager() << Kernel::LogLevel_Info << " Last TG_ReadPackets error: -1, Invalid connection ID\n"; } + else if (errCode == -2) { m_driverCtx.getLogManager() << Kernel::LogLevel_Info << " Last TG_ReadPackets error: -2, 0 bytes on the stream\n"; } + else if (errCode == -3) { m_driverCtx.getLogManager() << Kernel::LogLevel_Info << " Last TG_ReadPackets error: -3, I/O error occurred\n"; } + else { m_driverCtx.getLogManager() << Kernel::LogLevel_Info << " Last TG_ReadPackets error: " << errCode << ", Unknown\n"; } + } + } + else { m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "TG_Connect() returned error " << errCode << "\n"; } + // free the connection to ThinkGear API + // We use FreeConnection() only as doing a TG_Disconnect()+TG_FreeConnection() pair can cause first-chance exceptions on visual studio & MindWave Mobile for some reason. + TG_FreeConnection(connectionId); + } + } + + if (m_comPort == OVAS_MINDSET_INVALID_COM_PORT) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "The driver was unable to find any valid device on serial port COM1 to COM16.\n"; + return false; + } + + //__________________________________ + // Saves parameters + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + + return true; +} + +bool CDriverNeuroskyMindset::start() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Mindset Driver: START called.\n"; + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + if (m_comPort == OVAS_MINDSET_INVALID_COM_PORT) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "No valid Serial COM port detected.\n"; + return false; + } + + /* Get a connection ID handle to ThinkGear */ + m_connectionID = TG_GetNewConnectionId(); + if (m_connectionID < 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Can't connect to ThinkGear Communication Driver (error code " << m_connectionID << ").\n"; + return false; + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "ThinkGear Communication ID is: " << m_connectionID << ".\n"; + + /* Attempt to connect the connection ID handle to serial port */ + const std::string tmp = "\\\\.\\COM" + std::to_string(m_comPort); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Trying to connect ThinkGear driver to Serial Port [" << tmp << "]\n"; + const int errCode = TG_Connect(m_connectionID, tmp.c_str(), TG_BAUD_9600, TG_STREAM_PACKETS); + if (errCode < 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "The ThinkGear driver was unable to connect to serial port [" << tmp << "] (error code " + << errCode << ").\n"; + return false; + } + +#if defined(TG_DATA_BLINK_STRENGTH) + if(m_blinkStimulations || m_blinkStrengthChannel) { TG_EnableBlinkDetection(m_connectionID, 1); } +#endif + + return true; +} + +bool CDriverNeuroskyMindset::loop() +{ + if (!m_driverCtx.isConnected()) { return false; } + + if (m_driverCtx.isStarted()) + { + uint32_t receivedSamples = 0; + uint32_t errorCount = 0; + + CStimulationSet stimSet; + + while (receivedSamples < m_nSamplePerSentBlock) + { + /* Attempt to read 1 Packet of data from the connection (numPackets = -1 means all packets) */ + const int errorCode = TG_ReadPackets(m_connectionID, 1); + + if (errorCode == 1)// we asked for 1 packet and received 1 + { + // Got a packet, reset the error count + errorCount = 0; + + /* If raw value has been updated by TG_ReadPackets()... */ + if (TG_GetValueStatus(m_connectionID, TG_DATA_RAW) != 0) + { + float value = float(TG_GetValue(m_connectionID, TG_DATA_RAW)); + m_sample[receivedSamples] = value; + receivedSamples++; + } + + //checking the signal quality + //if it has been updated... + if (TG_GetValueStatus(m_connectionID, TG_DATA_POOR_SIGNAL) != 0) + { + const float quality = float(TG_GetValue(m_connectionID, TG_DATA_POOR_SIGNAL)); + + // Special warning for value 200 (no contact with electrode) + // Noise warning after 25% contamination. + if (quality == 200) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(" << ++m_nWarning + << ") Poor Signal detected (electrode not in contact with the forehead)\n"; + } + else if (quality > 25) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(" << ++m_nWarning << ") Poor Signal detected (noise at " + << (1 - (quality / 200.0F)) * 100 << "%)\n"; + } + else + { + if (m_nWarning != 0) { m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Signal Quality acceptable - noise < 12.5%\n"; } + m_nWarning = 0; + } + } + + float value; + uint32_t idx = m_nSamplePerSentBlock + receivedSamples - 1; + if (m_eSenseChannels) + { + // we don't check if the value has changed, we construct a square signal (1Hz --> 512Hz) + + value = float(TG_GetValue(m_connectionID, TG_DATA_ATTENTION)); + m_sample[idx] = value; + idx += m_nSamplePerSentBlock; + + value = float(TG_GetValue(m_connectionID, TG_DATA_MEDITATION)); + m_sample[idx] = value; + idx += m_nSamplePerSentBlock; + } + if (m_bandPowerChannels) + { + value = float(TG_GetValue(m_connectionID, TG_DATA_DELTA)); + m_sample[idx] = value; + idx += m_nSamplePerSentBlock; + + value = float(TG_GetValue(m_connectionID, TG_DATA_THETA)); + m_sample[idx] = value; + idx += m_nSamplePerSentBlock; + + value = float(TG_GetValue(m_connectionID, TG_DATA_ALPHA1)); + m_sample[idx] = value; + idx += m_nSamplePerSentBlock; + + value = float(TG_GetValue(m_connectionID, TG_DATA_ALPHA2)); + m_sample[idx] = value; + idx += m_nSamplePerSentBlock; + + value = float(TG_GetValue(m_connectionID, TG_DATA_BETA1)); + m_sample[idx] = value; + idx += m_nSamplePerSentBlock; + + value = float(TG_GetValue(m_connectionID, TG_DATA_BETA2)); + m_sample[idx] = value; + idx += m_nSamplePerSentBlock; + + value = float(TG_GetValue(m_connectionID, TG_DATA_GAMMA1)); + m_sample[idx] = value; + idx += m_nSamplePerSentBlock; + + value = float(TG_GetValue(m_connectionID, TG_DATA_GAMMA2)); + m_sample[idx] = value; + idx += m_nSamplePerSentBlock; // keep this line for the if def next + } + +#if defined(TG_DATA_BLINK_STRENGTH) + bool blinkDetected = false; + // We construct a "blink" spike signal if requested. + if(m_blinkStrengthChannel) + { + if(TG_GetValueStatus(m_connectionID,TG_DATA_BLINK_STRENGTH) != 0) + { + value = float(TG_GetValue(m_connectionID, TG_DATA_BLINK_STRENGTH)); + blinkDetected = true; + } + else { value = 0; } + m_sample[idx] = value; + } + // We send a "blink" stimulation if requested. + if(m_blinkStimulations) + { + if(TG_GetValueStatus(m_connectionID,TG_DATA_BLINK_STRENGTH) != 0 || blinkDetected) + { + uint64_t time = CTime(m_header.getSamplingFrequency(),receivedSamples); + stimSet.push_back(OVTK_GDF_Eye_Blink, time,0); + } + } +#endif + } + else + { + // Received something else than 1 packet. This is not necessarily an unrecoverable error. Try for a while. + // @note this is using counting to avoid polling the clock constantly + errorCount++; + + const uint32_t errorSleep = 2; // In ms + const uint32_t errorTolerance = 1000; // As each error sleeps 2 ms, 1000*2 = 2000ms + if (errorCount > errorTolerance) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "No valid packet from ThinkGear for a while, returning prematurely.\n"; + return true; // Let the acquisition server decide what to do, don't return a failure. It'll timeout after a bit. + } + + System::Time::sleep(errorSleep); + } + } + + m_callback->setSamples(m_sample); + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + m_callback->setStimulationSet(stimSet); + } + + return true; +} + +bool CDriverNeuroskyMindset::stop() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Mindset Driver: STOP called.\n"; + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + + if (m_connectionID >= 0) + { + // We use FreeConnection() only as doing a TG_Disconnect()+TG_FreeConnection() pair can cause first-chance exceptions on visual studio & MindWave Mobile for some reason. + TG_FreeConnection(m_connectionID); + m_connectionID = -1; + } + + return true; +} + +bool CDriverNeuroskyMindset::uninitialize() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + if (m_sample) + { + delete [] m_sample; + m_sample = nullptr; + } + m_callback = nullptr; + + return true; +} + +//___________________________________________________________________// +// // +bool CDriverNeuroskyMindset::configure() +{ + CConfigurationNeuroskyMindset config(m_driverCtx, Directories::getDataDir() + "/applications/acquisition-server/interface-Neurosky-Mindset.ui" + , m_comPort, m_eSenseChannels, m_bandPowerChannels, m_blinkStimulations, m_blinkStrengthChannel); + + if (!config.configure(m_header)) { return false; } // the basic configure will use the basic header + m_settings.save(); + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyThinkGearAPI diff --git a/applications/platform/acquisition-server/src/OVASDrivers/neurosky-mindset/ovasCDriverNeuroskyMindset.h b/applications/platform/acquisition-server/src/OVASDrivers/neurosky-mindset/ovasCDriverNeuroskyMindset.h new file mode 100644 index 0000000000000000000000000000000000000000..432b1898fefd1afd0a12bf73a8572f59360d59c1 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/neurosky-mindset/ovasCDriverNeuroskyMindset.h @@ -0,0 +1,66 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyThinkGearAPI + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" +#include <openvibe/ov_all.h> + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverNeuroskyMindset + * \author Laurent Bonnet (INRIA) + * \date 03 may 2010 + * \erief The CDriverNeuroskyMindset allows the acquisition server to acquire data from a MindSet device (Neurosky)). + * + * The driver opens a connection to the device through a dedicated API called ThinkGear, part of the MindSet Development Tools (MDT). + * The MDT are available for free on the official Neurosky website (http://store.neurosky.com/products/mindset-development-tools). + * + */ +class CDriverNeuroskyMindset final : public IDriver +{ +public: + + explicit CDriverNeuroskyMindset(IDriverContext& ctx); + ~CDriverNeuroskyMindset() override { } + const char* getName() override { return "NeuroSky MindSet (MindSet Dev. Tools 3.2)"; } + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override { return true; } + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + +protected: + SettingsHelper m_settings; + IDriverCallback* m_callback = nullptr; + CHeader m_header; + + uint32_t m_nSamplePerSentBlock = 0; + uint32_t m_nTotalSample = 0; + float* m_sample = nullptr; + +private: + + int m_connectionID = 0; + uint32_t m_comPort = 0; + bool m_eSenseChannels = false; + bool m_bandPowerChannels = false; + bool m_blinkStimulations = false; + bool m_blinkStrengthChannel = false; + + uint32_t m_nWarning = -1; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_HAS_ThirdPartyThinkGearAPI diff --git a/applications/platform/acquisition-server/src/OVASDrivers/shimmer-gsr/ovasCConfigurationShimmerGSR.cpp b/applications/platform/acquisition-server/src/OVASDrivers/shimmer-gsr/ovasCConfigurationShimmerGSR.cpp new file mode 100644 index 0000000000000000000000000000000000000000..7a6bc3dbf7a191738862c8e418052374dcb5de10 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/shimmer-gsr/ovasCConfigurationShimmerGSR.cpp @@ -0,0 +1,110 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file ovasCConfigurationShimmerGSR.cpp +/// \copyright Copyright (C) 2022 Inria +/// +/// This program is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Affero General Public License as published +/// by the Free Software Foundation, either version 3 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Affero General Public License for more details. +/// +/// You should have received a copy of the GNU Affero General Public License +/// along with this program. If not, see <https://www.gnu.org/licenses/>. +/// +///------------------------------------------------------------------------------------------------- + +#if defined TARGET_OS_Windows + +#include "ovasCConfigurationShimmerGSR.hpp" + +#include <iostream> + +namespace OpenViBE { +namespace AcquisitionServer { + +// If you added more reference attribute, initialize them here +CConfigurationShimmerGSR::CConfigurationShimmerGSR(const char* gtkBuilderFilename, std::vector<uint32_t> serialPorts, uint32_t& portIndex, double& samplingFrequency) + : CConfigurationBuilder(gtkBuilderFilename), m_portIndex(portIndex), m_samplingFrequency(samplingFrequency) +{ + m_PortsListStore = gtk_list_store_new(1, G_TYPE_STRING); + m_samplingFrequencyListStore = gtk_list_store_new(1, G_TYPE_STRING); + + m_serialPorts = serialPorts; +} + +bool CConfigurationShimmerGSR::preConfigure() +{ + if (!CConfigurationBuilder::preConfigure()) { return false; } + + GtkComboBox* serialPortBox = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_serialport")); + GtkComboBox* samplingFrequencyBox = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_sampling_frequency")); + + g_object_unref(m_PortsListStore); + g_object_unref(m_samplingFrequencyListStore); + + m_PortsListStore = gtk_list_store_new(1, G_TYPE_STRING); + m_samplingFrequencyListStore = gtk_list_store_new(1, G_TYPE_STRING); + + gtk_combo_box_set_model(serialPortBox, GTK_TREE_MODEL(m_PortsListStore)); + gtk_combo_box_set_model(samplingFrequencyBox, GTK_TREE_MODEL(m_samplingFrequencyListStore)); + + bool selected = false; + + for (uint32_t i = 0; i < m_serialPorts.size(); ++i) { + std::stringstream ss; + + ss << "COM" << m_serialPorts[i]; + + gtk_combo_box_append_text(serialPortBox, ss.str().c_str()); + if (m_portIndex == i) { + gtk_combo_box_set_active(serialPortBox, i); + selected = true; + } + } + if (!selected) { gtk_combo_box_set_active(serialPortBox, 0); } + + selected = false; + for (uint32_t i = 0; i < m_samplingFrequenciesSize; ++i) { + std::stringstream ss; + ss << m_samplingFrequencies[i]; + gtk_combo_box_append_text(samplingFrequencyBox, ss.str().c_str()); + if (m_samplingFrequency == m_samplingFrequencies[i]) { + gtk_combo_box_set_active(samplingFrequencyBox, i); + selected = true; + } + } + if (!selected) { gtk_combo_box_set_active(samplingFrequencyBox, 0); } + + return true; +} + +// Called when clicking on "Apply", in the "Device Configuration" window +bool CConfigurationShimmerGSR::postConfigure() +{ + + GtkComboBox* serialPortBox = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_serialport")); + GtkComboBox* samplingFrequencyBox = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_sampling_frequency")); + + if (m_applyConfig) { + const int portIndex = gtk_combo_box_get_active(serialPortBox); + if (portIndex >= 0) { m_portIndex = uint32_t(portIndex); } + + + const int samplingFrequencyIndex = gtk_combo_box_get_active(samplingFrequencyBox); + if (samplingFrequencyIndex >= 0) { m_samplingFrequency = m_samplingFrequencies[samplingFrequencyIndex]; } + } + + if (!CConfigurationBuilder::postConfigure()) { return false; } // normal header is filled (Subject ID, Age, Gender, channels, sampling frequency), ressources are realesed + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_OS_Windows diff --git a/applications/platform/acquisition-server/src/OVASDrivers/shimmer-gsr/ovasCConfigurationShimmerGSR.hpp b/applications/platform/acquisition-server/src/OVASDrivers/shimmer-gsr/ovasCConfigurationShimmerGSR.hpp new file mode 100644 index 0000000000000000000000000000000000000000..36a91dc9375162bd868e3e28f4ca1ef4b1f91760 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/shimmer-gsr/ovasCConfigurationShimmerGSR.hpp @@ -0,0 +1,57 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file ovasCConfigurationShimmerGSR.hpp +/// \copyright Copyright (C) 2022 Inria +/// +/// This program is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Affero General Public License as published +/// by the Free Software Foundation, either version 3 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Affero General Public License for more details. +/// +/// You should have received a copy of the GNU Affero General Public License +/// along with this program. If not, see <https://www.gnu.org/licenses/>. +/// +///------------------------------------------------------------------------------------------------- + + +#pragma once + +#if defined TARGET_OS_Windows + +#include "../ovasCConfigurationBuilder.h" +#include "ovasIDriver.h" + +#include <gtk/gtk.h> + +namespace OpenViBE { +namespace AcquisitionServer { + +class CConfigurationShimmerGSR : public CConfigurationBuilder +{ +public: + + CConfigurationShimmerGSR(const char* gtkBuilderFilename, std::vector<uint32_t> serialPorts, uint32_t& port, double& samplingFrequency); + + virtual bool preConfigure(); + virtual bool postConfigure(); + +protected: + std::vector<uint32_t> m_serialPorts; + GtkListStore* m_PortsListStore = nullptr; + uint32_t& m_portIndex; + + uint32_t m_samplingFrequenciesSize = 5; + double m_samplingFrequencies[5] = { 32,64,128,256,512 }; + GtkListStore* m_samplingFrequencyListStore = nullptr; + double& m_samplingFrequency; +}; + +} //namespace AcquisitionServer +} //namespace OpenViBE + +#endif // TARGET_OS_Windows diff --git a/applications/platform/acquisition-server/src/OVASDrivers/shimmer-gsr/ovasCDefinesShimmerGSR.hpp b/applications/platform/acquisition-server/src/OVASDrivers/shimmer-gsr/ovasCDefinesShimmerGSR.hpp new file mode 100644 index 0000000000000000000000000000000000000000..bfbde100df06750152d67189c2642fd8cf288d45 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/shimmer-gsr/ovasCDefinesShimmerGSR.hpp @@ -0,0 +1,233 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file ovasCDefinesShimmerGSR.hpp +/// \copyright Copyright (C) 2022 Inria +/// +/// This program is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Affero General Public License as published +/// by the Free Software Foundation, either version 3 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Affero General Public License for more details. +/// +/// You should have received a copy of the GNU Affero General Public License +/// along with this program. If not, see <https://www.gnu.org/licenses/>. +/// +///------------------------------------------------------------------------------------------------- + + +#pragma once + +#if defined TARGET_OS_Windows + +namespace OpenViBE { +namespace AcquisitionServer { + +#define DATA_PACKET 0x00 +#define INQUIRY_COMMAND 0x01 +#define INQUIRY_RESPONSE 0x02 +#define GET_SAMPLING_RATE_COMMAND 0x03 +#define SAMPLING_RATE_RESPONSE 0x04 +#define SET_SAMPLING_RATE_COMMAND 0x05 +#define TOGGLE_LED_COMMAND 0x06 +#define START_STREAMING_COMMAND 0x07 +#define SET_SENSORS_COMMAND 0x08 +#define SET_ACCEL_RANGE_COMMAND 0x09 +#define ACCEL_RANGE_RESPONSE 0x0A +#define GET_ACCEL_RANGE_COMMAND 0x0B +#define SET_5V_REGULATOR_COMMAND 0x0C +#define SET_POWER_MUX_COMMAND 0x0D +#define SET_CONFIG_SETUP_BYTE0_Command 0x0E +#define CONFIG_SETUP_BYTE0_RESPONSE 0x0F + +#define GET_CONFIG_SETUP_BYTE0_COMMAND 0x10 +#define SET_ACCEL_CALIBRATION_COMMAND 0x11 +#define ACCEL_CALIBRATION_RESPONSE 0x12 +#define GET_ACCEL_CALIBRATION_COMMAND 0x13 +#define SET_GYRO_CALIBRATION_COMMAND 0x14 +#define GYRO_CALIBRATION_RESPONSE 0x15 +#define GET_GYRO_CALIBRATION_COMMAND 0x16 +#define SET_MAG_CALIBRATION_COMMAND 0x17 +#define MAG_CALIBRATION_RESPONSE 0x18 +#define GET_MAG_CALIBRATION_COMMAND 0x19 +#define WR_ACCEL_CALIBRATION_RESPONSE 0x1B + +#define STOP_STREAMING_COMMAND 0x20 +#define SET_GSR_RANGE_COMMAND 0x21 +#define GSR_RANGE_RESPONSE 0x22 +#define GET_GSR_RANGE_COMMAND 0x23 + +#define GET_SHIMMER_VERSION_RESPONSE 0x25 +#define SET_EMG_CALIBRATION_COMMAND 0x26 +#define EMG_CALIBRATION_RESPONSE 0x27 +#define GET_EMG_CALIBRATION_COMMAND 0x28 +#define SET_ECG_CALIBRATION_COMMAND 0x29 +#define ECG_CALIBRATION_RESPONSE 0x2A +#define GET_ECG_CALIBRATION_COMMAND 0x2B +#define GET_ALL_CALIBRATION_COMMAND 0x2C +#define ALL_CALIBRATION_RESPONSE 0x2D +#define GET_FW_VERSION_COMMAND 0x2E +#define FW_VERSION_RESPONSE 0x2F + +#define SET_BLINK_LED 0x30 +#define BLINK_LED_RESPONSE 0x31 +#define GET_BLINK_LED 0x32 +#define SET_GYRO_TEMP_VREF_COMMAND 0x33 +#define SET_BUFFER_SIZE_COMMAND 0x34 +#define BUFFER_SIZE_RESPONSE 0x35 +#define GET_BUFFER_SIZE_COMMAND 0x36 +#define SET_MAG_GAIN_COMMAND 0x37 +#define MAG_GAIN_RESPONSE 0x38 +#define GET_MAG_GAIN_COMMAND 0x39 +#define SET_MAG_SAMPLING_RATE_COMMAND 0x3A +#define MAG_SAMPLING_RATE_RESPONSE 0x3B +#define GET_MAG_SAMPLING_RATE_COMMAND 0x3C +#define GET_SHIMMER_VERSION_COMMAND 0x3F + +#define SET_ACCEL_SAMPLING_RATE_COMMAND 0x40 +#define ACCEL_SAMPLING_RATE_RESPONSE 0x41 +#define GET_ACCEL_SAMPLING_RATE_COMMAND 0x42 +#define MPU9150_GYRO_RANGE_RESPONSE 0x4A +#define GET_MPU9150_GYRO_RANGE_COMMAND 0x4B +#define SET_MPU9150_SAMPLING_RATE_COMMAND 0x4C +#define SET_MPU9150_GYRO_RANGE_COMMAND 0x49 + +#define SET_BMP180_PRES_RESOLUTION_COMMAND 0x52 +#define BMP180_PRES_RESOLUTION_RESPONSE 0x53 +#define GET_BMP180_PRES_RESOLUTION_COMMAND 0x54 +#define BMP180_CALIBRATION_COEFFICIENTS_RESPONSE 0x58 +#define GET_BMP180_CALIBRATION_COEFFICIENTS_COMMAND 0x59 +#define SET_INTERNAL_EXP_POWER_ENABLE_COMMAND 0x5E +#define INTERNAL_EXP_POWER_ENABLE_RESPONSE 0x5F + +#define GET_INTERNAL_EXP_POWER_ENABLE_COMMAND 0x60 +#define SET_EXG_REGS_COMMAND 0x61 +#define EXG_REGS_RESPONSE 0x62 +#define GET_EXG_REGS_COMMAND 0x63 +#define SET_BAUD_RATE_COMMAND 0x6A +#define BAUD_RATE_RESPONSE 0X6B +#define GET_BAUD_RATE_COMMAND 0X6C +#define DETECT_EXPANSION_BOARD_RESPONSE 0X65 +#define GET_EXPANSION_BOARD_COMMAND 0x66 + +#define START_SDBT_COMMAND 0x70 +#define STATUS_RESPONSE 0x71 +#define GET_STATUS_COMMAND 0x72 +#define SET_TRIAL_CONFIG_COMMAND 0x73 +#define TRIAL_CONFIG_RESPONSE 0x74 +#define GET_TRIAL_CONFIG_COMMAND 0x75 +#define SET_CENTER_COMMAND 0x76 +#define CENTER_RESPONSE 0x77 +#define GET_CENTER_COMMAND 0x78 +#define SET_SHIMMERNAME_COMMAND 0x79 +#define SHIMMERNAME_RESPONSE 0x7a +#define GET_SHIMMERNAME_COMMAND 0x7b +#define SET_EXPID_COMMAND 0x7c +#define EXPID_RESPONSE 0x7d +#define GET_EXPID_COMMAND 0x7e +#define SET_MYID_COMMAND 0x7F + +#define MYID_RESPONSE 0x80 +#define GET_MYID_COMMAND 0x81 +#define SET_NSHIMMER_COMMAND 0x82 +#define NSHIMMER_RESPONSE 0x83 +#define GET_NSHIMMER_COMMAND 0x84 +#define SET_CONFIGTIME_COMMAND 0x85 +#define CONFIGTIME_RESPONSE 0x86 +#define GET_CONFIGTIME_COMMAND 0x87 +#define DIR_RESPONSE 0x88 +#define GET_DIR_COMMAND 0x89 +#define INSTREAM_CMD_RESPONSE 0x8A +#define SET_RWC_COMMAND 0x8F + +#define RWC_RESPONSE 0x90 +#define GET_RWC_COMMAND 0x91 +#define VBATT_RESPONSE 0x94 +#define GET_VBATT_COMMAND 0x95 +#define SET_VBATT_FREQ_COMMAND 0x98 +#define VBATT_FREQ_RESPONSE 0x99 +#define GET_VBATT_FREQ_COMMAND 0x9A + +#define GetBmp280CalibrationCoefficientsCommand 159 + +#define ACK_PROCESSED 0xFF + +#define MAX_NUMBER_OF_SIGNALS 35 + +#define LOW_NOISE_ACCELEROMETER_X "Low Noise Accelerometer X" +#define LOW_NOISE_ACCELEROMETER_Y "Low Noise Accelerometer Y" +#define LOW_NOISE_ACCELEROMETER_Z "Low Noise Accelerometer Z" +#define V_SENSE_BATT "VSenseBatt" +#define WIDE_RANGE_ACCELEROMETER_X "Wide Range Accelerometer X" +#define WIDE_RANGE_ACCELEROMETER_Y "Wide Range Accelerometer Y" +#define WIDE_RANGE_ACCELEROMETER_Z "Wide Range Accelerometer Z" +#define MAGNETOMETER_X "Magnetometer X" +#define MAGNETOMETER_Y "Magnetometer Y" +#define MAGNETOMETER_Z "Magnetometer Z" +#define GYROSCOPE_X "Gyroscope X" +#define GYROSCOPE_Y "Gyroscope Y" +#define GYROSCOPE_Z "Gyroscope Z" +#define EXTERNAL_ADC_A7 "External ADC A7" +#define EXTERNAL_ADC_A6 "External ADC A6" +#define EXTERNAL_ADC_A15 "External ADC A15" +#define INTERNAL_ADC_A1 "Internal ADC A1" +#define INTERNAL_ADC_A12 "Internal ADC A12" +#define INTERNAL_ADC_A13 "Internal ADC A13" +#define INTERNAL_ADC_A14 "Internal ADC A14" +#define PRESSURE "Pressure" +#define TEMPERATURE "Temperature" +#define GSR "GSR" +#define GSR_CONDUCTANCE "GSR Conductance" +#define EXG1_STATUS "EXG1 Status" +#define EXG2_STATUS "EXG2 Status" +#define ECG_LL_RA "ECG LL-RA" +#define ECG_LA_RA "ECG LA-RA" +#define ECG_VX_RL "ECG Vx-RL" +#define EMG_CH1 "EMG CH1" +#define EMG_CH2 "EMG CH2" +#define EXG1_CH1 "EXG1 CH1" +#define EXG1_CH2 "EXG1 CH2" +#define EXG2_CH1 "EXG2 CH1" +#define EXG2_CH2 "EXG2 CH2" +#define EXG1_CH1_16BIT "EXG1 CH1 16Bit" +#define EXG1_CH2_16BIT "EXG1 CH2 16Bit" +#define EXG2_CH1_16BIT "EXG2 CH1 16Bit" +#define EXG2_CH2_16BIT "EXG2 CH2 16Bit" +#define BRIGE_AMPLIFIER_HIGH "Bridge Amplifier High" +#define BRIGE_AMPLIFIER_LOW "Bridge Amplifier Low" +#define QUATERNION_0 "Quaternion 0" +#define QUATERNION_1 "Quaternion 1" +#define QUATERNION_2 "Quaternion 2" +#define QUATERNION_3 "Quaternion 3" +#define AXIS_ANGLE_A "Axis Angle A" +#define AXIS_ANGLE_X "Axis Angle X" +#define AXIS_ANGLE_Y "Axis Angle Y" +#define AXIS_ANGLE_Z "Axis Angle Z" + +#define SENSOR_A_ACCEL 0x80 +#define SENSOR_MPU9150_GYRO 0x040 +#define SENSOR_LSM303DLHC_MAG 0x20 +#define SENSOR_GSR 0x04 +#define SENSOR_EXT_A7 0x02 +#define SENSOR_EXT_A6 0x01 +#define SENSOR_VBATT 0x2000 +#define SENSOR_D_ACCEL 0x1000 +#define SENSOR_EXT_A15 0x0800 +#define SENSOR_INT_A1 0x0400 +#define SENSOR_INT_A12 0x0200 +#define SENSOR_INT_A13 0x0100 +#define SENSOR_INT_A14 0x800000 +#define SENSOR_BMP180_PRESSURE 0x40000 +#define SENSOR_EXG1_24BIT 0x10 +#define SENSOR_EXG2_24BIT 0x08 +#define SENSOR_EXG1_16BIT 0x100000 +#define SENSOR_EXG2_16BIT 0x080000 +#define SENSOR_BRIDGE_AMP 0x8000 + +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_OS_Windows diff --git a/applications/platform/acquisition-server/src/OVASDrivers/shimmer-gsr/ovasCDriverShimmerGSR.cpp b/applications/platform/acquisition-server/src/OVASDrivers/shimmer-gsr/ovasCDriverShimmerGSR.cpp new file mode 100644 index 0000000000000000000000000000000000000000..7b0e0c4cfdb864c520b1a9eb8f84232268c96876 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/shimmer-gsr/ovasCDriverShimmerGSR.cpp @@ -0,0 +1,1228 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file ovasCDriverShimmerGSR.cpp +/// \copyright Copyright (C) 2022 Inria +/// +/// This program is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Affero General Public License as published +/// by the Free Software Foundation, either version 3 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Affero General Public License for more details. +/// +/// You should have received a copy of the GNU Affero General Public License +/// along with this program. If not, see <https://www.gnu.org/licenses/>. +/// +///------------------------------------------------------------------------------------------------- + +#if defined TARGET_OS_Windows + +#include "ovasCDriverShimmerGSR.hpp" +#include "ovasCConfigurationShimmerGSR.hpp" + +#include <toolkit/ovtk_all.h> +#include <algorithm> + +#include <chrono> +#include <thread> + +#include <Eigen/Eigen> + + +namespace OpenViBE { +namespace AcquisitionServer { + +CDriverShimmerGSR::CDriverShimmerGSR(IDriverContext& ctx) + :IDriver(ctx), m_settings("AcquisitionServer_Driver_ShimmerGSR", m_driverCtx.getConfigurationManager()) +{ + m_settings.add("Header", &m_header); + m_settings.add("SerialPortIndex", &m_portIndex); + m_settings.add("SamplingFrequency", &m_samplingFrequency); + + m_settings.load(); +} + +CDriverShimmerGSR::~CDriverShimmerGSR() {} + +const char* CDriverShimmerGSR::getName() { return "ShimmerGSR"; } + +bool CDriverShimmerGSR::isConfigurable() { return true; } // change to false if your device is not configurable + +// Called when clicking on "Driver Properties" +bool CDriverShimmerGSR::configure() +{ + detectDevices(); + + // Change this line if you need to specify some references to your driver attribute that need configuration, + // e.g. the connection ID. + // This constructors returns after clicking on "Apply", in the "Device Configuration" window + CConfigurationShimmerGSR config( + Directories::getDataDir() + "/applications/acquisition-server/interface-ShimmerGSR.ui", + m_serialPorts, + m_portIndex, + m_samplingFrequency + ); + + if (!config.configure(m_header)) { return false; } + + m_settings.save(); + + m_port = m_serialPorts[m_portIndex]; + m_portSelected = true; + + std::stringstream ss; + ss << "Selected port: COM" << m_port << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << ss.str(); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << + "Before clicking the Connect button, make sure that your Shimmer device is on, " << + "and that it is either in \"Standby\" or \"RTC not set\" mode. (See Shimmer user manual). \n"; + + return true; +} + +// Called when clicking on "Connect" +bool CDriverShimmerGSR::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + if (!m_portSelected) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "No serial port was selected.\n"; + return false; + } + + if (m_driverCtx.isConnected()) { return false; } + if (!m_header.isChannelCountSet() || !m_header.isSamplingFrequencySet()) { return false; } + + // ... + // initialize hardware and get + // available header information + // from it + // Using for example the connection ID provided by the configuration (m_connectionID) + // ... + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Attempting to connect to device on port: " << m_serialPorts[m_portIndex] << "\n"; + + const int serSuccess = initSPP(m_port); + if (serSuccess == -1) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Unable to open port, please check device and settings\n"; + return false; + } + + // Saves parameters + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Successfuly connected to the device.\n"; + + if (initializeDevice() == EXIT_FAILURE) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Device didn't respond to multiple requests. Possible causes are:\n" << + " 1. The selected port doesn't correspond to a Shimmer device\n" << + " 2. The Connect button was clicked before the Shimmer device was in \"Standby\" or \"RTC not set\" mode\n"; + return false; + } + + // Builds up a buffer to store + // acquired samples. This buffer + // will be sent to the acquisition + // server later + + m_sampleSize = m_numberOfChannels * nSamplePerSentBlock; + m_sample.resize(m_sampleSize); + + m_dataArray.resize(m_packetSize); + m_parsedData.resize(m_numberOfChannels+1); // m_numberOfChannels for sensors + 1 channel for timestamp + m_realUnitsData.resize(m_numberOfChannels+1); + + return true; +} + + +// Called when clicking "Disconnect" +bool CDriverShimmerGSR::uninitialize() +{ + if (!m_driverCtx.isConnected()) return false; + if (m_driverCtx.isStarted()) return false; + + closeSPP(); + + m_callback = nullptr; + + return true; +} +// Called when clicking "Play" +bool CDriverShimmerGSR::start() +{ + if (!m_driverCtx.isConnected()) { return false; } + if (m_driverCtx.isStarted()) { return false; } + + sendCommandToDevice(START_STREAMING_COMMAND); + + return true; +} + +// Called when clicking "Stop" +bool CDriverShimmerGSR::stop() +{ + if (!m_driverCtx.isConnected()) return false; + if (!m_driverCtx.isStarted()) return false; + + sendCommandToDevice(STOP_STREAMING_COMMAND); + + return true; +} + +bool CDriverShimmerGSR::loop() +{ + if (!m_driverCtx.isConnected()) { return false; } + if (!m_driverCtx.isStarted()) { return true; } + + std::fill(m_sample.begin(), m_sample.end(), 0); + + unsigned char result[1] = { 0 }; + int bytesread = 0; + + bool sendSample = true; + + for (int sampleIndex = 0; sampleIndex < m_nSamplePerSentBlock; sampleIndex++) { + + do { + bytesread = readSPP(result, 1); + } while (bytesread == 0); // while nothing is read (sometimes, readSPP must be called twice before the device sends data) + + + switch (result[0]) { + case DATA_PACKET: + for (int i = 0; i < m_packetSize; i++) { + do { + bytesread = readSPP(result, 1); + } while (bytesread == 0); + m_dataArray[i] = result[0]; + } + + processDataPacket(); + + for (int i = 1; i < m_numberOfChannels + 1; i++) { // timestamp (i = 0) is not sent + int insert_idx = (i - 1) * m_nSamplePerSentBlock + sampleIndex; + m_sample[insert_idx] = m_realUnitsData[i]; + m_realUnitsData[i] = 0; // reset this value for the next loop() call + } + + break; + case ACK_PROCESSED: + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Ack processed\n"; + break; + default: + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Misaligned ByteStream Detected\n"; + + sendSample = false; + break; + } + result[0] = 0; + } + + if (sendSample) { + // ... + // receive samples from hardware + // put them the correct way in the sample array + // whether the buffer is full, send it to the acquisition server + //... + m_callback->setSamples(m_sample.data()); + + // When your sample buffer is fully loaded, + // it is advised to ask the acquisition server + // to correct any drift in the acquisition automatically. + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + } + + + return true; +} + +// Higher level communication + +int CDriverShimmerGSR::initializeDevice() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Initializing the device...\n"; + + if ( + getFromDevice(GET_ACCEL_RANGE_COMMAND) + + getFromDevice(GET_MAG_GAIN_COMMAND) + + getFromDevice(GET_MPU9150_GYRO_RANGE_COMMAND) + + getFromDevice(GET_ACCEL_SAMPLING_RATE_COMMAND) + + getFromDevice(GET_INTERNAL_EXP_POWER_ENABLE_COMMAND) + + getFromDevice(GET_MYID_COMMAND) + + getFromDevice(GET_NSHIMMER_COMMAND) + + getFromDevice(GET_BAUD_RATE_COMMAND) + + + getFromDeviceStr(GET_CENTER_COMMAND) + // Always returns EXIT_FAILURE, even in the ShimmerCapture software + getFromDeviceStr(GET_SHIMMERNAME_COMMAND) + + getFromDeviceStr(GET_EXPID_COMMAND) + + getFromDeviceStr(GET_CONFIGTIME_COMMAND) + + + setAndGetSamplingRate() + + inquiry() + > 1) { + return EXIT_FAILURE; + } + + initializeShimmerTime(); + + return EXIT_SUCCESS; +} + +void CDriverShimmerGSR::sendCommandToDevice(unsigned char command) +{ + unsigned char instructionBuffer[1] = { command }; + writeSPP(instructionBuffer, 1); +} + +// Serial Port Profile handling +int CDriverShimmerGSR::initSPP(const int port) +{ + // open the chosen serial port + std::string portString = "\\\\.\\COM" + std::to_string(port); + + m_handleSerial = CreateFile(portString.c_str(), GENERIC_READ | GENERIC_WRITE, 0, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr); + + std::stringstream ss; + if (m_handleSerial == INVALID_HANDLE_VALUE) { + + if (GetLastError() == ERROR_FILE_NOT_FOUND) { + ss << "Port COM" << port << " not found.\n"; + } + else { + ss << "Port COM" << port << " found, but corresponding device not found.\n"; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << ss.str(); + return -1; + } + + ss << "Port COM" << port << " and corresponding device found.\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << ss.str(); + + // setup serial port parameters + DCB dcbSerialParams = { 0 }; + + if (!GetCommState(m_handleSerial, &dcbSerialParams)) { + //error getting state + return -1; + } + + dcbSerialParams.BaudRate = 115200; + + if (!SetCommState(m_handleSerial, &dcbSerialParams)) { + //error setting serial port state + return -1; + } + + // setup serial port timeouts + COMMTIMEOUTS timeout = { 0 }; + timeout.ReadIntervalTimeout = 60; + timeout.ReadTotalTimeoutConstant = 60; + timeout.ReadTotalTimeoutMultiplier = 15; + timeout.WriteTotalTimeoutConstant = 60; + timeout.WriteTotalTimeoutMultiplier = 8; + if (!SetCommTimeouts(m_handleSerial, &timeout)) { + //handle error here + return -1; + } + + return 0; +} + +void CDriverShimmerGSR::closeSPP() { CloseHandle(m_handleSerial); } + +unsigned long CDriverShimmerGSR::writeSPP(unsigned char* buffer, const int nbBytes) +{ + DWORD dwBytesWritten = 0; + if (!WriteFile(m_handleSerial, buffer, nbBytes, &dwBytesWritten, NULL)) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Error while writing to port\n"; + } + return dwBytesWritten; +} + +unsigned long CDriverShimmerGSR::readSPP(unsigned char* buffer, const int nbBytes) +{ + DWORD dwBytesRead = 0; + ReadFile(m_handleSerial, buffer, nbBytes, &dwBytesRead, NULL); + + return int(dwBytesRead); +} + + +void CDriverShimmerGSR::detectDevices() +{ + + m_serialPorts.clear(); + + DWORD index = 0; + LSTATUS s; + + do { + s = registryRead("Hardware\\Devicemap\\Serialcomm\\", REG_SZ, index); + index++; + } while (s != ERROR_NO_MORE_ITEMS); + + std::sort(m_serialPorts.begin(), m_serialPorts.end()); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Found " << m_serialPorts.size() << " serial ports.\n"; + + +} + +LSTATUS CDriverShimmerGSR::registryRead(LPCTSTR subkey, DWORD type, DWORD index) +{ + HKEY key; + + TCHAR name[255]; + DWORD name_length = 255; + + TCHAR data[255]; + DWORD lpdata = 255; + + RegOpenKey(HKEY_LOCAL_MACHINE, subkey, &key); + + LSTATUS status = RegEnumValueA(key, index, (LPSTR)&name, &name_length, NULL, &type, (LPBYTE)&data, &lpdata); + + RegCloseKey(key); + + // convert to string and remove the first 3 characters (COM) so that only the port number remains + std::string dataStr = ((std::string)data).erase(0, 3); + + // if there are still ports after this one, add the port to the list + if (status != ERROR_NO_MORE_ITEMS) m_serialPorts.push_back(std::stoul(dataStr)); + + return status; +} + +int CDriverShimmerGSR::getFromDevice(unsigned char command) +{ + unsigned char response; + std::string msg; + int* attribute; + + switch (command) { + case GET_ACCEL_RANGE_COMMAND: + response = ACCEL_RANGE_RESPONSE; + msg = "accelerometer range"; + attribute = &m_accelRange; + break; + + case GET_MAG_GAIN_COMMAND: + response = MAG_GAIN_RESPONSE; + msg = "magnetometer gain"; + attribute = &m_magGain; + break; + + case GET_MPU9150_GYRO_RANGE_COMMAND: + response = MPU9150_GYRO_RANGE_RESPONSE; + msg = "gyroscope range"; + attribute = &m_gyroRange; + break; + + case GET_ACCEL_SAMPLING_RATE_COMMAND: + response = ACCEL_SAMPLING_RATE_RESPONSE; + msg = "accelerometer sampling rate"; + attribute = &m_accelSamplingRate; + break; + + case GET_INTERNAL_EXP_POWER_ENABLE_COMMAND: + response = INTERNAL_EXP_POWER_ENABLE_RESPONSE; + msg = "internal exp power setting"; + attribute = &m_internalExpPower; + break; + + case GET_MYID_COMMAND: + response = MYID_RESPONSE; + msg = "multi shimmer setting"; + attribute = &m_myid; + break; + + case GET_NSHIMMER_COMMAND: + response = NSHIMMER_RESPONSE; + msg = "nshimmer"; + attribute = &m_nshimmer; + break; + + case GET_BAUD_RATE_COMMAND: + response = BAUD_RATE_RESPONSE; + msg = "baud rate"; + attribute = &m_baudRate; + break; + + default: + break; + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Acquiring " << msg << "...\n"; + + unsigned char result[1] = { 0 }; + int bytesread = 0; + + sendCommandToDevice(command); + int timeout = 0; + do { + bytesread = readSPP(result, 1); + timeout++; + } while (result[0] != response && timeout < 5); + + // If the device doesn't respond after 5 attempts, give up (to avoid potential infinite loops) + if (timeout == 5) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Device didn't send any response.\n"; + return EXIT_FAILURE; + } + + bytesread = readSPP(result, 1); + if (bytesread != 0) { + *attribute = result[0]; + } + + return EXIT_SUCCESS; +} + +int CDriverShimmerGSR::getFromDeviceStr(unsigned char command) +{ + + unsigned char response; + std::string msg; + std::string* attribute; + + switch (command) { + case GET_CENTER_COMMAND: + response = CENTER_RESPONSE; + msg = "center name"; + attribute = &m_centerName; + break; + case GET_SHIMMERNAME_COMMAND: + response = SHIMMERNAME_RESPONSE; + msg = "shimmer name"; + attribute = &m_shimmerName; + break; + case GET_EXPID_COMMAND: + response = EXPID_RESPONSE; + msg = "experiment ID"; + attribute = &m_expId; + break; + case GET_CONFIGTIME_COMMAND: + response = CONFIGTIME_RESPONSE; + msg = "configuration time"; + attribute = &m_configTime; + break; + default: + break; + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Acquiring " << msg << "...\n"; + + unsigned char result[1] = { 0 }; + int bytesread = 0; + + sendCommandToDevice(command); + int timeout = 0; + do { + bytesread = readSPP(result, 1); + timeout++; + } while (result[0] != response && timeout < 5); + + // If the device doesn't respond after 5 attempts, give up (to avoid potential infinite loops) + // There seems to be a problem with GET_CENTER_COMMAND (E.G. the shimmer nevers sends it, even in the ShimmerCapture software) + if (timeout == 5) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Device didn't send any response.\n"; + return EXIT_FAILURE; + } + + bytesread = readSPP(result, 1); + if (bytesread != 0) { + const int bufferLength = result[0]; + std::string buffer = ""; + for (int i = 0; i < bufferLength; i++) { + bytesread = readSPP(result, 1); + std::string resultStr(1, result[0]); + buffer = buffer + resultStr; + } + *attribute = buffer; + } + + return EXIT_SUCCESS; +} + +int CDriverShimmerGSR::setAndGetSamplingRate() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Acquiring sampling rate...\n"; + + if (m_samplingFrequency > 0) { // if user chose a frenquency in the driver properties window + int invRate = 32768 / m_samplingFrequency; + unsigned char hexInvRate1 = invRate & 0x00FF; + unsigned char hexInvRate2 = (invRate & 0xFF00) >> 8; + + unsigned char instructionBuffer[3] = { SET_SAMPLING_RATE_COMMAND, hexInvRate1, hexInvRate2 }; + writeSPP(instructionBuffer, 3); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Sampling frequency set to " << m_samplingFrequency << ".\n"; + } + + unsigned char result[1] = { 0 }; + int bytesread = 0; + + sendCommandToDevice(GET_SAMPLING_RATE_COMMAND); + int timeout = 0; + do { + bytesread = readSPP(result, 1); + timeout++; + } while (result[0] != SAMPLING_RATE_RESPONSE && timeout < 5); + + // If the device doesn't respond after 5 attempts, give up (to avoid potential infinite loops) + if (timeout == 5) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Device didn't send any response.\n"; + return EXIT_FAILURE; + } + + bytesread = readSPP(result, 1); + if (bytesread != 0) { + int value = (int)result[0]; + + bytesread = readSPP(result, 1); + + value += (int)(result[0] << 8 & 0xFF00); + this->m_samplingRate = (double)32768 / value; + + } + + m_header.setSamplingFrequency(m_samplingRate); + + return EXIT_SUCCESS; +} + +int CDriverShimmerGSR::inquiry() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "Inquiry...\n"; + + unsigned char result[1] = { 0 }; + int bytesread = 0; + + sendCommandToDevice(INQUIRY_COMMAND); + int timeout = 0; + do { + bytesread = readSPP(result, 1); + timeout++; + } while (result[0] != INQUIRY_RESPONSE && timeout < 5); + + // If the device doesn't respond after 5 attempts, give up (to avoid potential infinite loops) + if (timeout == 5) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "Device didn't send any response.\n"; + return EXIT_FAILURE; + } + + const int bufferFinalSize = 8; + std::vector<unsigned char> buffer; + buffer.reserve(bufferFinalSize); + + for (int i = 0; i < bufferFinalSize; i++) { + bytesread = readSPP(result, 1); + buffer.push_back(result[0]); + } + + m_numberOfChannels = buffer[6]; + m_header.setChannelCount(m_numberOfChannels); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << m_numberOfChannels << " sensors are enabled:" << "\n"; + + std::vector<unsigned char> channelIds; + channelIds.reserve(m_numberOfChannels); + for (int i = 0; i < m_numberOfChannels; i++) { + bytesread = readSPP(result, 1); + channelIds.push_back(result[0]); + } + + interpretInquiryResponse(channelIds); + + return EXIT_SUCCESS; +} + +void CDriverShimmerGSR::interpretInquiryResponse(std::vector<unsigned char> channelIds) +{ + m_signalNameArray.resize(m_numberOfChannels + 1); // +1 for the timestamp + m_signalDataTypeArray.resize(m_numberOfChannels + 1); + + m_signalNameArray[0] = "Timestamp"; + m_signalDataTypeArray[0] = "u24"; + int packetSize = 3; + + int enabledSensors = 0x00; + + int numberOfSensors = 0; + + for (int i = 0; i < m_numberOfChannels; i++) { + if (channelIds[i] == 0x00) { + m_signalNameArray[i + 1] = LOW_NOISE_ACCELEROMETER_X; + m_signalDataTypeArray[i + 1] = "u12"; + packetSize = packetSize + 2; + enabledSensors = (enabledSensors | SENSOR_A_ACCEL); + m_header.setChannelName(numberOfSensors, LOW_NOISE_ACCELEROMETER_X); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << LOW_NOISE_ACCELEROMETER_X << "\n"; + numberOfSensors++; + } + else if (channelIds[i] == 0x01) { + m_signalNameArray[i + 1] = LOW_NOISE_ACCELEROMETER_Y; + m_signalDataTypeArray[i + 1] = "u12"; + packetSize = packetSize + 2; + enabledSensors = (enabledSensors | SENSOR_A_ACCEL); + m_header.setChannelName(numberOfSensors, LOW_NOISE_ACCELEROMETER_Y); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << LOW_NOISE_ACCELEROMETER_Y << "\n"; + numberOfSensors++; + } + else if (channelIds[i] == 0x02) { + m_signalNameArray[i + 1] = LOW_NOISE_ACCELEROMETER_Z; + m_signalDataTypeArray[i + 1] = "u12"; + packetSize = packetSize + 2; + enabledSensors = (enabledSensors | SENSOR_A_ACCEL); + m_header.setChannelName(numberOfSensors, LOW_NOISE_ACCELEROMETER_Z); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << LOW_NOISE_ACCELEROMETER_Z << "\n"; + numberOfSensors++; + } + else if (channelIds[i] == 0x03) { + m_signalNameArray[i + 1] = V_SENSE_BATT; + m_signalDataTypeArray[i + 1] = "i16"; + packetSize = packetSize + 2; + enabledSensors = (enabledSensors | SENSOR_VBATT); + m_header.setChannelName(numberOfSensors, V_SENSE_BATT); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << V_SENSE_BATT << "\n"; + numberOfSensors++; + } + else if (channelIds[i] == 0x04) { + m_signalDataTypeArray[i + 1] = "i16"; + packetSize = packetSize + 2; + m_signalNameArray[i + 1] = WIDE_RANGE_ACCELEROMETER_X; + enabledSensors = (enabledSensors | SENSOR_D_ACCEL); + m_header.setChannelName(numberOfSensors, WIDE_RANGE_ACCELEROMETER_X); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << WIDE_RANGE_ACCELEROMETER_X << "\n"; + numberOfSensors++; + } + else if (channelIds[i] == 0x05) { + m_signalDataTypeArray[i + 1] = "i16"; + packetSize = packetSize + 2; + m_signalNameArray[i + 1] = WIDE_RANGE_ACCELEROMETER_Y; + enabledSensors = (enabledSensors | SENSOR_D_ACCEL); + m_header.setChannelName(numberOfSensors, WIDE_RANGE_ACCELEROMETER_Y); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << WIDE_RANGE_ACCELEROMETER_Y << "\n"; + numberOfSensors++; + } + else if (channelIds[i] == 0x06) { + m_signalDataTypeArray[i + 1] = "i16"; + packetSize = packetSize + 2; + m_signalNameArray[i + 1] = WIDE_RANGE_ACCELEROMETER_Z; + enabledSensors = (enabledSensors | SENSOR_D_ACCEL); + m_header.setChannelName(numberOfSensors, WIDE_RANGE_ACCELEROMETER_Z); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << WIDE_RANGE_ACCELEROMETER_Z << "\n"; + numberOfSensors++; + } + else if (channelIds[i] == 0x07) { + m_signalNameArray[i + 1] = MAGNETOMETER_X; + m_signalDataTypeArray[i + 1] = "i16"; + packetSize = packetSize + 2; + enabledSensors = (enabledSensors | SENSOR_LSM303DLHC_MAG); + m_header.setChannelName(numberOfSensors, MAGNETOMETER_X); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << MAGNETOMETER_X << "\n"; + numberOfSensors++; + } + else if (channelIds[i] == 0x08) { + m_signalNameArray[i + 1] = MAGNETOMETER_Y; + m_signalDataTypeArray[i + 1] = "i16"; + packetSize = packetSize + 2; + enabledSensors = (enabledSensors | SENSOR_LSM303DLHC_MAG); + m_header.setChannelName(numberOfSensors, MAGNETOMETER_Y); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << MAGNETOMETER_Y << "\n"; + numberOfSensors++; + } + else if (channelIds[i] == 0x09) { + m_signalNameArray[i + 1] = MAGNETOMETER_Z; + m_signalDataTypeArray[i + 1] = "i16"; + packetSize = packetSize + 2; + enabledSensors = (enabledSensors | SENSOR_LSM303DLHC_MAG); + m_header.setChannelName(numberOfSensors, MAGNETOMETER_Z); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << MAGNETOMETER_Z << "\n"; + numberOfSensors++; + } + else if (channelIds[i] == 0x0A) { + m_signalNameArray[i + 1] = GYROSCOPE_X; + m_signalDataTypeArray[i + 1] = "i16*"; + packetSize = packetSize + 2; + enabledSensors = (enabledSensors | SENSOR_MPU9150_GYRO); + m_header.setChannelName(numberOfSensors, GYROSCOPE_X); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << GYROSCOPE_X << "\n"; + numberOfSensors++; + } + else if (channelIds[i] == 0x0B) { + m_signalNameArray[i + 1] = GYROSCOPE_Y; + m_signalDataTypeArray[i + 1] = "i16*"; + packetSize = packetSize + 2; + enabledSensors = (enabledSensors | SENSOR_MPU9150_GYRO); + m_header.setChannelName(numberOfSensors, GYROSCOPE_Y); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << GYROSCOPE_Y << "\n"; + numberOfSensors++; + } + else if (channelIds[i] == 0x0C) { + m_signalNameArray[i + 1] = GYROSCOPE_Z; + m_signalDataTypeArray[i + 1] = "i16*"; + packetSize = packetSize + 2; + enabledSensors = (enabledSensors | SENSOR_MPU9150_GYRO); + m_header.setChannelName(numberOfSensors, GYROSCOPE_Z); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << GYROSCOPE_Z << "\n"; + numberOfSensors++; + } + else if (channelIds[i] == 0x0D) { + m_signalNameArray[i + 1] = EXTERNAL_ADC_A7; + m_signalDataTypeArray[i + 1] = "u12"; + packetSize = packetSize + 2; + enabledSensors = (enabledSensors | SENSOR_EXT_A7); + m_header.setChannelName(numberOfSensors, EXTERNAL_ADC_A7); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << EXTERNAL_ADC_A7 << "\n"; + numberOfSensors++; + } + else if (channelIds[i] == 0x0E) { + m_signalNameArray[i + 1] = EXTERNAL_ADC_A6; + m_signalDataTypeArray[i + 1] = "u12"; + packetSize = packetSize + 2; + enabledSensors = (enabledSensors | SENSOR_EXT_A6); + m_header.setChannelName(numberOfSensors, EXTERNAL_ADC_A6); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << EXTERNAL_ADC_A6 << "\n"; + numberOfSensors++; + } + else if (channelIds[i] == 0x0F) { + m_signalNameArray[i + 1] = EXTERNAL_ADC_A15; + m_signalDataTypeArray[i + 1] = "u12"; + packetSize = packetSize + 2; + enabledSensors = (enabledSensors | SENSOR_EXT_A15); + m_header.setChannelName(numberOfSensors, EXTERNAL_ADC_A15); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << EXTERNAL_ADC_A15 << "\n"; + numberOfSensors++; + } + else if (channelIds[i] == 0x10) { + m_signalNameArray[i + 1] = INTERNAL_ADC_A1; + m_signalDataTypeArray[i + 1] = "u12"; + packetSize = packetSize + 2; + enabledSensors = (enabledSensors | SENSOR_INT_A1); + m_header.setChannelName(numberOfSensors, INTERNAL_ADC_A1); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << INTERNAL_ADC_A1 << "\n"; + numberOfSensors++; + } + else if (channelIds[i] == 0x11) { + m_signalNameArray[i + 1] = INTERNAL_ADC_A12; + m_signalDataTypeArray[i + 1] = "u12"; + packetSize = packetSize + 2; + enabledSensors = (enabledSensors | SENSOR_INT_A12); + m_header.setChannelName(numberOfSensors, INTERNAL_ADC_A12); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << INTERNAL_ADC_A12 << "\n"; + numberOfSensors++; + } + else if (channelIds[i] == 0x12) { + m_signalNameArray[i + 1] = INTERNAL_ADC_A13; + m_signalDataTypeArray[i + 1] = "u12"; + packetSize = packetSize + 2; + enabledSensors = (enabledSensors | SENSOR_INT_A13); + m_header.setChannelName(numberOfSensors, INTERNAL_ADC_A13); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << INTERNAL_ADC_A13 << "\n"; + numberOfSensors++; + } + else if (channelIds[i] == 0x13) { + m_signalNameArray[i + 1] = INTERNAL_ADC_A14; + m_signalDataTypeArray[i + 1] = "u12"; + packetSize = packetSize + 2; + enabledSensors = (enabledSensors | SENSOR_INT_A14); + m_header.setChannelName(numberOfSensors, INTERNAL_ADC_A14); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << INTERNAL_ADC_A14 << "\n"; + numberOfSensors++; + } + else if (channelIds[i] == 0x1A) { + m_signalNameArray[i + 1] = TEMPERATURE; + m_signalDataTypeArray[i + 1] = "u16r"; + packetSize = packetSize + 2; + enabledSensors = (enabledSensors | SENSOR_BMP180_PRESSURE); + m_header.setChannelName(numberOfSensors, TEMPERATURE); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << TEMPERATURE << "\n"; + numberOfSensors++; + } + else if (channelIds[i] == 0x1B) { + m_signalNameArray[i + 1] = PRESSURE; + m_signalDataTypeArray[i + 1] = "u24r"; + packetSize = packetSize + 3; + enabledSensors = (enabledSensors | SENSOR_BMP180_PRESSURE); + m_header.setChannelName(numberOfSensors, PRESSURE); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << PRESSURE << "\n"; + numberOfSensors++; + } + else if (channelIds[i] == 0x1C) { + m_signalNameArray[i + 1] = GSR; + m_signalDataTypeArray[i + 1] = "u16"; + packetSize = packetSize + 2; + enabledSensors = (enabledSensors | SENSOR_GSR); + m_header.setChannelName(numberOfSensors, GSR); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << GSR << "\n"; + numberOfSensors++; + } + else if (channelIds[i] == 0x1D) { + m_signalNameArray[i + 1] = EXG1_STATUS; + m_signalDataTypeArray[i + 1] = "u8"; + packetSize = packetSize + 1; + m_header.setChannelName(numberOfSensors, EXG1_STATUS); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << EXG1_STATUS << "\n"; + numberOfSensors++; + } + else if (channelIds[i] == 0x1E) { //EXG + m_signalNameArray[i + 1] = EXG1_CH1; + m_signalDataTypeArray[i + 1] = "i24r"; + packetSize = packetSize + 3; + enabledSensors = (enabledSensors | SENSOR_EXG1_24BIT); + m_header.setChannelName(numberOfSensors, EXG1_CH1); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << EXG1_CH1 << "\n"; + numberOfSensors++; + } + else if (channelIds[i] == 0x1F) { //EXG + m_signalNameArray[i + 1] = EXG1_CH2; + m_signalDataTypeArray[i + 1] = "i24r"; + packetSize = packetSize + 3; + enabledSensors = (enabledSensors | SENSOR_EXG1_24BIT); + m_header.setChannelName(numberOfSensors, EXG1_CH2); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << EXG1_CH2 << "\n"; + numberOfSensors++; + } + else if (channelIds[i] == 0x20) { //EXG + m_signalNameArray[i + 1] = EXG2_STATUS; + m_signalDataTypeArray[i + 1] = "u8"; + packetSize = packetSize + 1; + m_header.setChannelName(numberOfSensors, EXG2_STATUS); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << EXG2_STATUS << "\n"; + numberOfSensors++; + } + else if (channelIds[i] == 0x21) { //EXG + m_signalNameArray[i + 1] = EXG2_CH1; + m_signalDataTypeArray[i + 1] = "i24r"; + packetSize = packetSize + 3; + enabledSensors = (enabledSensors | SENSOR_EXG2_24BIT); + m_header.setChannelName(numberOfSensors, EXG2_CH1); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << EXG2_CH1 << "\n"; + numberOfSensors++; + } + else if (channelIds[i] == 0x22) { //EXG + m_signalNameArray[i + 1] = EXG2_CH2; + m_signalDataTypeArray[i + 1] = "i24r"; + packetSize = packetSize + 3; + enabledSensors = (enabledSensors | SENSOR_EXG2_24BIT); + m_header.setChannelName(numberOfSensors, EXG2_CH2); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << EXG2_CH2 << "\n"; + numberOfSensors++; + } + else if (channelIds[i] == 0x23) { //EXG + m_signalNameArray[i + 1] = EXG1_CH1_16BIT; + m_signalDataTypeArray[i + 1] = "i16r"; + packetSize = packetSize + 2; + enabledSensors = (enabledSensors | SENSOR_EXG1_16BIT); + m_header.setChannelName(numberOfSensors, EXG1_CH1_16BIT); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << EXG1_CH1_16BIT << "\n"; + numberOfSensors++; + } + else if (channelIds[i] == 0x24) { //EXG + m_signalNameArray[i + 1] = EXG1_CH2_16BIT; + m_signalDataTypeArray[i + 1] = "i16r"; + packetSize = packetSize + 2; + enabledSensors = (enabledSensors | SENSOR_EXG1_16BIT); + m_header.setChannelName(numberOfSensors, EXG1_CH2_16BIT); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << EXG1_CH2_16BIT << "\n"; + numberOfSensors++; + } + else if (channelIds[i] == 0x25) { //EXG + m_signalNameArray[i + 1] = EXG2_CH1_16BIT; + m_signalDataTypeArray[i + 1] = "i16r"; + packetSize = packetSize + 2; + enabledSensors = (enabledSensors | SENSOR_EXG2_16BIT); + m_header.setChannelName(numberOfSensors, EXG2_CH1_16BIT); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << EXG2_CH1_16BIT << "\n"; + numberOfSensors++; + } + else if (channelIds[i] == 0x26) { //EXG + m_signalNameArray[i + 1] = EXG2_CH2_16BIT; + m_signalDataTypeArray[i + 1] = "i16r"; + packetSize = packetSize + 2; + enabledSensors = (enabledSensors | SENSOR_EXG2_16BIT); + m_header.setChannelName(numberOfSensors, EXG2_CH2_16BIT); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << EXG2_CH2_16BIT << "\n"; + numberOfSensors++; + } + else if (channelIds[i] == 0x27) { //BRIDGE AMPLIFIER + m_signalNameArray[i + 1] = BRIGE_AMPLIFIER_HIGH; + m_signalDataTypeArray[i + 1] = "u12"; + packetSize = packetSize + 2; + enabledSensors = (enabledSensors | SENSOR_BRIDGE_AMP); + m_header.setChannelName(numberOfSensors, BRIGE_AMPLIFIER_HIGH); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << BRIGE_AMPLIFIER_HIGH << "\n"; + numberOfSensors++; + } + else if (channelIds[i] == 0x28) { //BRIDGE AMPLIFIER + m_signalNameArray[i + 1] = BRIGE_AMPLIFIER_LOW; + m_signalDataTypeArray[i + 1] = "u12"; + packetSize = packetSize + 2; + enabledSensors = (enabledSensors | SENSOR_BRIDGE_AMP); + m_header.setChannelName(numberOfSensors, BRIGE_AMPLIFIER_LOW); + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << BRIGE_AMPLIFIER_LOW << "\n"; + numberOfSensors++; + } + else { + m_signalNameArray[i + 1] = ""; + m_signalDataTypeArray[i + 1] = "u12"; + packetSize = packetSize + 2; + } + } + + m_enabledSensors = enabledSensors; + m_packetSize = packetSize; + +} + +void CDriverShimmerGSR::initializeShimmerTime() //writeRealWorldClock in the original code +{ + auto currentTime = std::chrono::duration_cast<std::chrono::milliseconds>((std::chrono::system_clock::now()).time_since_epoch()).count(); + long long currentTimeTicks = currentTime * 32.768; // Convert miliseconds to clock ticks + + unsigned char timeArray[9] = { 0 }; //magic number ? already there in shimmers code + timeArray[0] = SET_RWC_COMMAND; + + for (int i = 0; i < 8; i++) { + timeArray[i+1] = (currentTimeTicks >> (8 * i)) & 0xFF; + } + + writeSPP(timeArray, 9); +} + + +int CDriverShimmerGSR::calculateTwosComplement(int signedData, int bitLength) +{ + int newData = signedData; + if (signedData >= (1 << (bitLength - 1))) { + newData = -((signedData ^ (int)(pow(2, bitLength) - 1)) + 1); + } + + return newData; +} + +void CDriverShimmerGSR::parseData() +{ + int iData = 0; + + for (int i = 0; i < m_numberOfChannels + 1; i++) { + if (m_signalDataTypeArray[i] == "u8") { + m_parsedData[i] = (int)m_dataArray[iData]; + iData = iData + 1; + } + else if (m_signalDataTypeArray[i] == "i8") { + m_parsedData[i] = calculateTwosComplement((int)((int)0xFF & m_dataArray[iData]), 8); + iData = iData + 1; + } + else if (m_signalDataTypeArray[i] == "u12") { + m_parsedData[i] = (int)((int)(m_dataArray[iData] & 0xFF) + ((int)(m_dataArray[iData + 1] & 0xFF) << 8)); + iData = iData + 2; + } + else if (m_signalDataTypeArray[i] == "i12>") { + m_parsedData[i] = calculateTwosComplement((int)((int)(m_dataArray[iData] & 0xFF) + ((int)(m_dataArray[iData + 1] & 0xFF) << 8)), 16); + m_parsedData[i] = m_parsedData[i] >> 4; + iData = iData + 2; + } + else if (m_signalDataTypeArray[i] == "u16") { + m_parsedData[i] = (int)((int)(m_dataArray[iData] & 0xFF) + ((int)(m_dataArray[iData + 1] & 0xFF) << 8)); + iData = iData + 2; + } + else if (m_signalDataTypeArray[i] == "u16r") { + m_parsedData[i] = (int)((int)(m_dataArray[iData + 1] & 0xFF) + ((int)(m_dataArray[iData + 0] & 0xFF) << 8)); + iData = iData + 2; + } + else if (m_signalDataTypeArray[i] == "i16") { + m_parsedData[i] = calculateTwosComplement((int)((int)(m_dataArray[iData] & 0xFF) + ((int)(m_dataArray[iData + 1] & 0xFF) << 8)), 16); + iData = iData + 2; + } + else if (m_signalDataTypeArray[i] == "i16*") { + m_parsedData[i] = calculateTwosComplement((int)((int)(m_dataArray[iData + 1] & 0xFF) + ((int)(m_dataArray[iData] & 0xFF) << 8)), 16); + iData = iData + 2; + } + else if (m_signalDataTypeArray[i] == "i16r") { + m_parsedData[i] = calculateTwosComplement((int)((int)(m_dataArray[iData + 1] & 0xFF) + ((int)(m_dataArray[iData] & 0xFF) << 8)), 16); + iData = iData + 2; + } + else if (m_signalDataTypeArray[i] == "u24") { + long xmsb = ((long)(m_dataArray[iData + 2] & 0xFF) << 16); + long msb = ((long)(m_dataArray[iData + 1] & 0xFF) << 8); + long lsb = ((long)(m_dataArray[iData + 0] & 0xFF)); + m_parsedData[i] = xmsb + msb + lsb; + iData = iData + 3; + } + else if (m_signalDataTypeArray[i] == "u24r") { + long xmsb = ((long)(m_dataArray[iData + 0] & 0xFF) << 16); + long msb = ((long)(m_dataArray[iData + 1] & 0xFF) << 8); + long lsb = ((long)(m_dataArray[iData + 2] & 0xFF)); + m_parsedData[i] = xmsb + msb + lsb; + iData = iData + 3; + } + else if (m_signalDataTypeArray[i] == "i24r") { + long xmsb = ((long)(m_dataArray[iData + 0] & 0xFF) << 16); + long msb = ((long)(m_dataArray[iData + 1] & 0xFF) << 8); + long lsb = ((long)(m_dataArray[iData + 2] & 0xFF)); + m_parsedData[i] = xmsb + msb + lsb; + m_parsedData[i] = calculateTwosComplement((int)m_parsedData[i], 24); + iData = iData + 3; + } + } + // Once the data is parsed, reset m_dataArray as it won't be used until the next loop() call + for (int i = 0; i < m_packetSize; i++) { + m_dataArray[i] = 0; + } +} + +double calibrateU12AdcValue(double uncalibratedData, double offset, double vRefP, double gain) +{ + double calibratedData = (uncalibratedData - offset) * (((vRefP * 1000.0) / gain) / 4095.0); + return calibratedData; +} + +double calibrateMspAdcChannel(double unCalData) +{ + double offset = 0; double vRefP = 3; double gain = 1; + double calData = calibrateU12AdcValue(unCalData, offset, vRefP, gain); + return calData; +} + +double calibrateGsrDataToResistanceFromAmplifierEq(double gsrUncalibratedData, int range) +{ + double SHIMMER3_GSR_REF_RESISTORS_KOHMS[] = { 40.2, 287.0, 1000.0, 3300.0 }; // magic numbers from shimmer api + double rFeedback = SHIMMER3_GSR_REF_RESISTORS_KOHMS[range]; + double volts = calibrateMspAdcChannel(gsrUncalibratedData) / 1000.0; + double rSource = rFeedback / ((volts / 0.5) - 1.0); + return rSource; +} + +void calibrateInertialSensorData(std::array<long, 3> rawData, Eigen::Matrix3d AM, Eigen::Matrix3d SM, Eigen::Vector3d OV, std::array<double, 3> &result) +{ + Eigen::Vector3d data2d; + data2d << rawData[0], rawData[1], rawData[2]; + + Eigen::Vector3d res = (AM.inverse() * SM.inverse()) * (data2d - OV); + + result[0] = res[0]; + result[1] = res[1]; + result[2] = res[2]; +} + +Eigen::Vector3d calibrateInertialSensorData(Eigen::Vector3d rawData, Eigen::Matrix3d AM, Eigen::Matrix3d SM, Eigen::Vector3d OV) +{ + return (AM.inverse() * SM.inverse()) * (rawData - OV); +} + +Eigen::Vector3d calibrateInertialSensorDataLNAccel(Eigen::Vector3d rawLNAccel) +{ + Eigen::Matrix3d alignmentMatrixAccel; + alignmentMatrixAccel << + 0, -1, 0, + -1, 0, 0, + 0, 0, -1; + + Eigen::Matrix3d sensitivityMatrixAccel; + sensitivityMatrixAccel << + 83, 0, 0, + 0, 83, 0, + 0, 0, 83; + + Eigen::Vector3d offsetVectorAccel(2047, 2047, 2047); + + return calibrateInertialSensorData(rawLNAccel, alignmentMatrixAccel, sensitivityMatrixAccel, offsetVectorAccel); +} + +Eigen::Vector3d calibrateInertialSensorDataGyro(Eigen::Vector3d rawGyro) +{ + Eigen::Matrix3d alignmentMatrixGyro; + alignmentMatrixGyro << + 0, -1, 0, + -1, 0, 0, + 0, 0, -1; + + Eigen::Matrix3d sensitivityMatrixGyro; + sensitivityMatrixGyro << + 65.5, 0, 0, + 0, 65.5, 0, + 0, 0, 65.5; + + Eigen::Vector3d offsetVectorGyro( 0, 0, 0 ); + + return calibrateInertialSensorData(rawGyro, alignmentMatrixGyro, sensitivityMatrixGyro, offsetVectorGyro); +} + +void CDriverShimmerGSR::convertToRealUnits() +{ + for (int i = 0; i < m_numberOfChannels + 1; i++) { + if (m_signalNameArray[i] == INTERNAL_ADC_A13) { + long rawA13 = m_parsedData[i]; + float mVoltA13 = (calibrateU12AdcValue((double)rawA13, 0.0, 3.0, 1.0)); //magic numbers from shimmer api + m_realUnitsData[i] = mVoltA13; + } + else if( m_signalNameArray[i] == GSR) { + long rawGSR = m_parsedData[i]; + int GSRRange = 4; + int newGSRRange = -1; + float kOhmGSR = 0; + + if (GSRRange == 4) { + newGSRRange = (49152 & (int)rawGSR) >> 14; + } + rawGSR = (double)((int)rawGSR & 4095); + if (GSRRange == 0 || newGSRRange == 0) { + kOhmGSR = calibrateGsrDataToResistanceFromAmplifierEq(rawGSR, 0); + } + else if (GSRRange == 1 || newGSRRange == 1) { + + kOhmGSR = calibrateGsrDataToResistanceFromAmplifierEq(rawGSR, 1); + } + else if (GSRRange == 2 || newGSRRange == 2) { + + kOhmGSR = calibrateGsrDataToResistanceFromAmplifierEq(rawGSR, 2); + } + else if (GSRRange == 3 || newGSRRange == 3) { + + if (rawGSR < 683) { + rawGSR = 683; + } + kOhmGSR = calibrateGsrDataToResistanceFromAmplifierEq(rawGSR, 3); + } + m_realUnitsData[i] = kOhmGSR; + } + else if (m_signalNameArray[i] == LOW_NOISE_ACCELEROMETER_X) { + Eigen::Vector3d rawLNAccel(m_parsedData[i], m_parsedData[i + 1], m_parsedData[i + 2]); + + //mps2 = meters per second squared + Eigen::Vector3d mps2LNAccel = calibrateInertialSensorDataLNAccel(rawLNAccel); + + m_realUnitsData[i] = mps2LNAccel[0]; + m_realUnitsData[i+1] = mps2LNAccel[1]; + m_realUnitsData[i+2] = mps2LNAccel[2]; + } + else if (m_signalNameArray[i] == GYROSCOPE_X) { + Eigen::Vector3d rawGyro(m_parsedData[i], m_parsedData[i + 1], m_parsedData[i + 2]); + + //dps = degrees per second + Eigen::Vector3d dpsGyro = calibrateInertialSensorDataGyro(rawGyro); + + m_realUnitsData[i] = dpsGyro[0]; + m_realUnitsData[i + 1] = dpsGyro[1]; + m_realUnitsData[i + 2] = dpsGyro[2]; + } + m_parsedData[i] = 0; // reset this value for the next loop() call + } +} + +void CDriverShimmerGSR::processDataPacket() +{ + parseData(); + convertToRealUnits(); +} + +} //namespace AcquisitionServer +} //namespace OpenViBE + +#endif // TARGET_OS_Windows diff --git a/applications/platform/acquisition-server/src/OVASDrivers/shimmer-gsr/ovasCDriverShimmerGSR.hpp b/applications/platform/acquisition-server/src/OVASDrivers/shimmer-gsr/ovasCDriverShimmerGSR.hpp new file mode 100644 index 0000000000000000000000000000000000000000..96c35f38227d615a2be59a81f5fb7b302923430f --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/shimmer-gsr/ovasCDriverShimmerGSR.hpp @@ -0,0 +1,140 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file ovasCDriverShimmerGSR.hpp +/// \copyright Copyright (C) 2022 Inria +/// +/// This program is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Affero General Public License as published +/// by the Free Software Foundation, either version 3 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Affero General Public License for more details. +/// +/// You should have received a copy of the GNU Affero General Public License +/// along with this program. If not, see <https://www.gnu.org/licenses/>. +/// +///------------------------------------------------------------------------------------------------- + + +#pragma once + +#if defined TARGET_OS_Windows + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" +#include <openvibe/ov_all.h> + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +#include "ovasCDefinesShimmerGSR.hpp" +#include "array" + +namespace OpenViBE { +namespace AcquisitionServer { +class CDriverShimmerGSR : public IDriver +{ +public: + CDriverShimmerGSR(IDriverContext& ctx); + virtual ~CDriverShimmerGSR(); + virtual const char* getName(); + + virtual bool isConfigurable(); + virtual bool configure(); + + virtual bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback); + virtual bool uninitialize(); + + virtual bool start(); + virtual bool stop(); + virtual bool loop(); + + virtual const IHeader* getHeader() { return &m_header; } + +protected: + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + CHeader m_header; + + std::vector<uint32_t> m_serialPorts; + + size_t m_nSamplePerSentBlock = 0; + std::vector<float> m_sample; + size_t m_sampleSize = 0; + +private: + // Detection of the active bluetooth ports + void detectDevices(); + LSTATUS registryRead(LPCTSTR subkey, DWORD type, DWORD index); + + // Port selection and connection to device + HANDLE m_handleSerial; + + uint32_t m_portIndex = 0; + uint32_t m_port = 0; + bool m_portSelected = false; + + int initSPP(const int port); + void closeSPP(); + + // Communication with device + unsigned long writeSPP(unsigned char* buffer, const int nbBytes); + unsigned long readSPP(unsigned char* buffer, const int nbBytes); + + int m_accelRange; + int m_magGain; + int m_gyroRange; + int m_accelSamplingRate; + int m_internalExpPower = -1; + int m_myid; + int m_nshimmer; + int m_baudRate; + + std::string m_centerName; + std::string m_shimmerName; + std::string m_expId; + std::string m_configTime; + + double m_samplingFrequency = 0; + double m_samplingRate; + + long long shimmerRealWorldClock; + + int m_enabledSensors; + std::vector<std::string> m_signalNameArray; + std::vector<std::string> m_signalDataTypeArray; + int m_numberOfChannels; + int m_packetSize; + + std::vector<unsigned char> m_dataArray; + std::vector<long> m_parsedData; + std::vector<float> m_realUnitsData; + + int initializeDevice(); + + void sendCommandToDevice(unsigned char command); + + // get from device, then set the corresponding attribute + int getFromDevice(unsigned char command); + int getFromDeviceStr(unsigned char command); + int setAndGetSamplingRate(); + + int inquiry(); + void interpretInquiryResponse(std::vector<unsigned char> channelIds); + + void initializeShimmerTime(); + + int calculateTwosComplement(int signedDate, int bitLength); + void parseData(); + void convertToRealUnits(); + void processDataPacket(); + +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_OS_Windows diff --git a/applications/platform/acquisition-server/src/OVASDrivers/simulated-deviator/ovasCConfigurationDriverSimulatedDeviator.cpp b/applications/platform/acquisition-server/src/OVASDrivers/simulated-deviator/ovasCConfigurationDriverSimulatedDeviator.cpp new file mode 100644 index 0000000000000000000000000000000000000000..fc16506517c094f2043a2c74f550b09247a9d694 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/simulated-deviator/ovasCConfigurationDriverSimulatedDeviator.cpp @@ -0,0 +1,96 @@ +#include "ovasCConfigurationDriverSimulatedDeviator.h" + +namespace OpenViBE { +namespace AcquisitionServer { + +CConfigurationDriverSimulatedDeviator::CConfigurationDriverSimulatedDeviator(IDriverContext& ctx, const char* gtkBuilderFilename, bool& sendPeriodicStims, + double& offset, double& spread, double& maxDev, double& pullback, double& update, + uint64_t& wavetype, double& freezeFrequency, double& freezeDuration) + : CConfigurationBuilder(gtkBuilderFilename), m_driverCtx(ctx), m_sendPeriodicStimulations(sendPeriodicStims), m_Offset(offset), m_Spread(spread), + m_MaxDev(maxDev), m_Pullback(pullback), m_Update(update), m_Wavetype(wavetype), m_FreezeFrequency(freezeFrequency), m_FreezeDuration(freezeDuration) {} + +bool CConfigurationDriverSimulatedDeviator::preConfigure() +{ + if (!CConfigurationBuilder::preConfigure()) { return false; } + + GtkToggleButton* sendPeriodicStims = GTK_TOGGLE_BUTTON( + gtk_builder_get_object(m_builder, "checkbutton_send_periodic_stimulations")); + + gtk_toggle_button_set_active(sendPeriodicStims, m_sendPeriodicStimulations); + + GtkSpinButton* tmp = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_offset")); + gtk_spin_button_set_digits(tmp, 2); + gtk_spin_button_set_value(tmp, m_Offset); + + tmp = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_spread")); + gtk_spin_button_set_digits(tmp, 3); + gtk_spin_button_set_value(tmp, m_Spread); + + tmp = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_maxdev")); + gtk_spin_button_set_digits(tmp, 3); + gtk_spin_button_set_value(tmp, m_MaxDev); + + tmp = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_pullback")); + gtk_spin_button_set_digits(tmp, 3); + gtk_spin_button_set_value(tmp, m_Pullback); + + tmp = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_update")); + gtk_spin_button_set_digits(tmp, 3); + gtk_spin_button_set_value(tmp, m_Update); + + GtkComboBox* wavetype = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_wavetype")); + gtk_combo_box_set_active(wavetype, gint(m_Wavetype)); + + tmp = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_freeze_frequency")); + gtk_spin_button_set_digits(tmp, 3); + gtk_spin_button_set_value(tmp, m_FreezeFrequency); + + tmp = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_freeze_duration")); + gtk_spin_button_set_digits(tmp, 3); + gtk_spin_button_set_value(tmp, m_FreezeDuration); + + return true; +} + +bool CConfigurationDriverSimulatedDeviator::postConfigure() +{ + if (m_applyConfig) { + GtkToggleButton* sendPeriodicStims = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_send_periodic_stimulations")); + + m_sendPeriodicStimulations = (gtk_toggle_button_get_active(sendPeriodicStims) > 0); + + GtkSpinButton* tmp = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_offset")); + gtk_spin_button_update(tmp); + m_Offset = gtk_spin_button_get_value(tmp); + tmp = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_spread")); + gtk_spin_button_update(tmp); + m_Spread = gtk_spin_button_get_value(tmp); + tmp = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_maxdev")); + gtk_spin_button_update(tmp); + m_MaxDev = gtk_spin_button_get_value(tmp); + tmp = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_pullback")); + gtk_spin_button_update(tmp); + m_Pullback = gtk_spin_button_get_value(tmp); + tmp = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_update")); + gtk_spin_button_update(tmp); + m_Update = gtk_spin_button_get_value(tmp); + + GtkComboBox* wavetype = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_wavetype")); + m_Wavetype = uint64_t(gtk_combo_box_get_active(wavetype)); + + tmp = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_freeze_frequency")); + gtk_spin_button_update(tmp); + m_FreezeFrequency = gtk_spin_button_get_value(tmp); + + tmp = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_freeze_duration")); + gtk_spin_button_update(tmp); + m_FreezeDuration = gtk_spin_button_get_value(tmp); + } + + if (!CConfigurationBuilder::postConfigure()) { return false; } + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASDrivers/simulated-deviator/ovasCConfigurationDriverSimulatedDeviator.h b/applications/platform/acquisition-server/src/OVASDrivers/simulated-deviator/ovasCConfigurationDriverSimulatedDeviator.h new file mode 100644 index 0000000000000000000000000000000000000000..68ded5159fa737ba84aaddb14cadbb7f08b15f82 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/simulated-deviator/ovasCConfigurationDriverSimulatedDeviator.h @@ -0,0 +1,40 @@ +#pragma once + +#include "../ovasCConfigurationBuilder.h" +#include "ovasIDriver.h" + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CConfigurationDriverSimulatedDeviator + * \author Jussi T. Lindgren (Inria) + * \brief The CConfigurationDriverSimulatedDeviator handles the configuration dialog specific to the Simulated Deviator driver + * + * \sa CDriverSimulatedDeviator + */ + +class CConfigurationDriverSimulatedDeviator final : public CConfigurationBuilder +{ +public: + CConfigurationDriverSimulatedDeviator(IDriverContext& ctx, const char* gtkBuilderFilename, bool& sendPeriodicStims, double& offset, + double& spread, double& maxDev, double& pullback, double& update, uint64_t& wavetype, + double& freezeFrequency, double& freezeDuration); + + bool preConfigure() override; + bool postConfigure() override; + +protected: + IDriverContext& m_driverCtx; + + bool& m_sendPeriodicStimulations; + double& m_Offset; + double& m_Spread; + double& m_MaxDev; + double& m_Pullback; + double& m_Update; + uint64_t& m_Wavetype; + double& m_FreezeFrequency; + double& m_FreezeDuration; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASDrivers/simulated-deviator/ovasCDriverSimulatedDeviator.cpp b/applications/platform/acquisition-server/src/OVASDrivers/simulated-deviator/ovasCDriverSimulatedDeviator.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d158870693e4382810657323b918cee842551211 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/simulated-deviator/ovasCDriverSimulatedDeviator.cpp @@ -0,0 +1,240 @@ +#include "ovasCDriverSimulatedDeviator.h" +#include "ovasCConfigurationDriverSimulatedDeviator.h" + +#include <toolkit/ovtk_all.h> + +#include <system/ovCTime.h> +#include <system/ovCMath.h> + +#include <cmath> +#include <algorithm> + +namespace OpenViBE { +namespace AcquisitionServer { + +CDriverSimulatedDeviator::CDriverSimulatedDeviator(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_SimulatedDeviator", m_driverCtx.getConfigurationManager()), m_gen{ m_rd() } +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverSimulatedDeviator::CDriverSimulatedDeviator\n"; + + m_header.setSamplingFrequency(512); + m_header.setChannelCount(3); + + m_settings.add("Header", &m_header); + m_settings.add("SendPeriodicStimulations", &m_sendPeriodicStimulations); + m_settings.add("Offset", &m_Offset); + m_settings.add("Spread", &m_Spread); + m_settings.add("MaxDev", &m_MaxDev); + m_settings.add("Pullback", &m_Pullback); + m_settings.add("Update", &m_Update); + m_settings.add("Wavetype", &m_Wavetype); + m_settings.add("FreezeFrequency", &m_FreezeFrequency); + m_settings.add("FreezeDuration", &m_FreezeDuration); + m_settings.load(); +} + +void CDriverSimulatedDeviator::release() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverSimulatedDeviator::release\n"; + delete this; +} + +const char* CDriverSimulatedDeviator::getName() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverSimulatedDeviator::getName\n"; + return "Simulated Deviator"; +} + +//___________________________________________________________________// +// // + +bool CDriverSimulatedDeviator::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverSimulatedDeviator::initialize\n"; + + if (m_driverCtx.isConnected() || !m_header.isChannelCountSet() || !m_header.isSamplingFrequencySet()) { return false; } + + m_header.setChannelCount(3); + + m_header.setChannelName(0, (m_Wavetype == 0 ? "SquareWave" : "SineWave")); + m_header.setChannelName(1, "SamplingRate"); + m_header.setChannelName(2, "DriftMs"); + + m_header.setChannelUnits(0, OVTK_UNIT_Volts, OVTK_FACTOR_Micro); + m_header.setChannelUnits(1, OVTK_UNIT_Hertz, OVTK_FACTOR_Base); + m_header.setChannelUnits(2, OVTK_UNIT_Second, OVTK_FACTOR_Milli); + + m_samples.resize(m_header.getChannelCount() * nSamplePerSentBlock); + + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + + return true; +} + +bool CDriverSimulatedDeviator::start() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverSimulatedDeviator::start\n"; + + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + m_nTotalSample = 0; + m_totalSampleCountReal = 0; + m_startTime = System::Time::zgetTime(); + m_lastAdjustment = m_startTime; + + m_usedSamplingFrequency = m_header.getSamplingFrequency() + m_Offset; + m_header.setChannelCount(3); + + return true; +} + +bool CDriverSimulatedDeviator::loop() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "CDriverSimulatedDeviator::loop\n"; + + if (!m_driverCtx.isConnected()) { return false; } + + if (m_driverCtx.isStarted()) { + // Generate the contents we want to send next + CStimulationSet stimSet; + if (m_sendPeriodicStimulations) { + stimSet.resize(1); + stimSet.setId(0, 0); + stimSet.setDate(0, 0); + stimSet.setDuration(0, 0); + } + + const uint64_t now = System::Time::zgetTime(); + + // Is it time to freeze? + if (m_FreezeDuration > 0 && m_FreezeFrequency > 0) { + if (m_NextFreezeTime > 0 && now >= m_NextFreezeTime) { + // Simulate a freeze by setting all samples as sent up to the de-freeze point + const uint64_t freezeDurationFixedPoint = CTime(m_FreezeDuration).time(); + const uint64_t samplesToSkip = CTime(freezeDurationFixedPoint).toSampleCount(m_header.getSamplingFrequency()); + m_nTotalSample += samplesToSkip; + m_totalSampleCountReal += samplesToSkip; + } + if (now >= m_NextFreezeTime) { + // Compute the next time to freeze; simulate a Poisson process + const double secondsUntilNext = -std::log(1.0 - System::Math::random0To1()) / m_FreezeFrequency; + const uint64_t secondsUntilNextFixedPoint = CTime(secondsUntilNext).time(); + + m_NextFreezeTime = now + secondsUntilNextFixedPoint; + } + } + + // Drift the sampling frequency? + if (now - m_lastAdjustment > CTime(m_Update).time()) { + // Make the sampling frequency random walk up or down + if (m_Spread > 0) { + std::normal_distribution<> distro{ 0, m_Spread }; + const double jitter = distro(m_gen); + m_usedSamplingFrequency += jitter; + } + + // Use linear interpolation to pull the drifting sample frequency towards the center frequency + m_usedSamplingFrequency = m_Pullback * (m_header.getSamplingFrequency() + m_Offset) + (1 - m_Pullback) * m_usedSamplingFrequency; + + // Make sure the result stays bounded + m_usedSamplingFrequency = std::min(m_usedSamplingFrequency, m_header.getSamplingFrequency() + m_Offset + m_MaxDev); + m_usedSamplingFrequency = std::max(m_usedSamplingFrequency, m_header.getSamplingFrequency() + m_Offset - m_MaxDev); + m_usedSamplingFrequency = std::max(m_usedSamplingFrequency, 0.0); + + m_lastAdjustment = now; + // std::cout << "freq " << m_usedSamplingFrequency << "\n"; + } + + const uint64_t elapsed = now - m_startTime; + const uint64_t samplesNeededSoFar = uint64_t(m_usedSamplingFrequency * CTime(elapsed).toSeconds()); + const uint64_t samplesNeededSoFarReal = uint64_t(m_header.getSamplingFrequency() * CTime(elapsed).toSeconds()); + if (samplesNeededSoFar <= m_nTotalSample) { + if (samplesNeededSoFarReal > m_totalSampleCountReal) { m_totalSampleCountReal = samplesNeededSoFarReal; } + // Too early + return true; + } + const uint32_t remainingSamples = uint32_t(samplesNeededSoFar - m_nTotalSample); + if (remainingSamples * m_header.getChannelCount() > m_samples.size()) { m_samples.resize(remainingSamples * m_header.getChannelCount()); } + + const double driftMeasure = samplesNeededSoFarReal > samplesNeededSoFar + ? - CTime(m_header.getSamplingFrequency(), samplesNeededSoFarReal - samplesNeededSoFar).toSeconds() + : CTime(m_header.getSamplingFrequency(), samplesNeededSoFar - samplesNeededSoFarReal).toSeconds(); + + for (uint32_t i = 0; i < remainingSamples; ++i) { + double value; + if (m_Wavetype == 0) { + const uint64_t sampleTimeInSeconds = ((CTime(m_header.getSamplingFrequency(), m_totalSampleCountReal)).time() >> 32); + value = (sampleTimeInSeconds % 2 == 0 ? -1 : 1); + } + else { + const double pi = 3.14159265358979323846; + value = std::sin(2 * pi * m_totalSampleCountReal / double(m_header.getSamplingFrequency())); + } + + m_samples[0 * remainingSamples + i] = float(value); + m_samples[1 * remainingSamples + i] = float(m_usedSamplingFrequency); + m_samples[2 * remainingSamples + i] = float(driftMeasure * 1000.0); + + if (samplesNeededSoFarReal >= samplesNeededSoFar) { m_totalSampleCountReal++; } + else { + // nop: we don't move the 'real' process forward if the sampler is in advance, it gets a duplicate sample on purpose, + // we assume that the hardware sampling process has not had time to change state. + // @todo this implementation is not quite correct... if we take twice the amount of samples (512hz->1024hz), + // we'd expect each sample to be replicated twice but we observe that only approximately. The sinusoid 1hz stays correct nevertheless. + } + + m_nTotalSample++; + } + + m_callback->setSamples(&m_samples[0], remainingSamples); + m_callback->setStimulationSet(stimSet); + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + } + else { if (m_driverCtx.isImpedanceCheckRequested()) { for (size_t j = 0; j < m_header.getChannelCount(); ++j) { m_driverCtx.updateImpedance(j, 1); } } } + + return true; +} + +bool CDriverSimulatedDeviator::stop() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverSimulatedDeviator::stop\n"; + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + return true; +} + +bool CDriverSimulatedDeviator::uninitialize() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverSimulatedDeviator::uninitialize\n"; + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + m_callback = nullptr; + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverSimulatedDeviator::isConfigurable() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverSimulatedDeviator::isConfigurable\n"; + return true; +} + +bool CDriverSimulatedDeviator::configure() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "CDriverSimulatedDeviator::configure\n"; + + CConfigurationDriverSimulatedDeviator config(m_driverCtx, Directories::getDataDir() + "/applications/acquisition-server/interface-Simulated-Deviator.ui", + m_sendPeriodicStimulations, m_Offset, m_Spread, m_MaxDev, m_Pullback, m_Update, m_Wavetype, m_FreezeFrequency, + m_FreezeDuration); + + if (config.configure(m_header)) { + m_settings.save(); + return true; + } + + return false; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASDrivers/simulated-deviator/ovasCDriverSimulatedDeviator.h b/applications/platform/acquisition-server/src/OVASDrivers/simulated-deviator/ovasCDriverSimulatedDeviator.h new file mode 100644 index 0000000000000000000000000000000000000000..24ac14294a1e1bcada741095e851686c1a7744d5 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/simulated-deviator/ovasCDriverSimulatedDeviator.h @@ -0,0 +1,81 @@ +#pragma once + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" + +#include "../ovasCSettingsHelper.h" + +#include <random> + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverSimulatedDeviator + * \brief Simulates a drifting acquisition device by changing the sample rate by a random process. + * \author Jussi T. Lindgren (Inria) + * + * The driver simulates a square wave attempting to model a steady, analog process. The square wave changes + * sign every 1 sec. This process is then sampled using a sampling rate that is changing during the + * recording according to the parameters given to the driver. These parameters are + * + * Offset - The center sampling frequency deviation from the declared driver sampling rate. Can be negative. + * Spread - How big jumps the random walk takes; related to the sigma of the normal distribution + * MaxDev - The maximum allowed deviation in Hz from the true sampling rate + Offset + * Pullback - How strongly the random walk is pulled towards the true sampling rate + Offset + * Update - How often the sampling rate is changed (in seconds) + * + * The MaxDev and Pullback are used to keep the stochastic process from diverging. + * + */ +class CDriverSimulatedDeviator final : public IDriver +{ +public: + explicit CDriverSimulatedDeviator(IDriverContext& ctx); + void release(); + const char* getName() override; + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override; + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + +protected: + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + CHeader m_header; + + uint32_t m_nSamplePerSentBlock = 0; + std::vector<float> m_samples; + + uint64_t m_nTotalSample = 0; // Number of samples sent by the drifting sampling process + uint64_t m_totalSampleCountReal = 0; // Number of samples of some imaginary, steady 'real' process, here a square wave + + uint64_t m_startTime = 0; + uint64_t m_lastAdjustment = 0; + double m_usedSamplingFrequency = 0; + +private: + bool m_sendPeriodicStimulations = false; + double m_Offset = 0; + double m_Spread = 0.1; + double m_MaxDev = 3; + double m_Pullback = 0.001; + double m_Update = 0.1; + uint64_t m_Wavetype = 0; + + double m_FreezeFrequency = 0; + double m_FreezeDuration = 0; + uint64_t m_NextFreezeTime = 0; + + std::random_device m_rd; + std::mt19937 m_gen; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASDrivers/tmsi-refa32b/ovasCConfigurationTMSIRefa32B.cpp b/applications/platform/acquisition-server/src/OVASDrivers/tmsi-refa32b/ovasCConfigurationTMSIRefa32B.cpp new file mode 100644 index 0000000000000000000000000000000000000000..6b40a002b19553b60567165799f7892abbc11da4 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/tmsi-refa32b/ovasCConfigurationTMSIRefa32B.cpp @@ -0,0 +1,203 @@ +#include "ovasCConfigurationTMSIRefa32B.h" + +#if defined TARGET_HAS_ThirdPartyNeXus + +#include <windows.h> +#include <iostream> + +namespace OpenViBE { +namespace AcquisitionServer { + +GtkListStore* m_listStoreSlaves; +GtkTreeView* m_pViewSlaves; +GtkListStore* m_listStoreList; +GtkTreeView* m_pViewList; + +static void button_remove_slave_device(GtkButton* button, void* data) +{ +#if defined _DEBUG_Callbacks_ + std::cout << "button_remove_slave_device" << std::endl; +#endif + static_cast<CConfigurationTMSIRefa32B*>(data)->buttonRemoveSlaveDevice(); +} + +static void button_add_slave_device(GtkButton* button, void* data) +{ +#if defined _DEBUG_Callbacks_ + std::cout << "button_add_slave_device" << std::endl; +#endif + static_cast<CConfigurationTMSIRefa32B*>(data)->buttonAddSlaveDevice(); +} + +CConfigurationTMSIRefa32B::CConfigurationTMSIRefa32B(const char* gtkBuilderFilename) + : CConfigurationBuilder(gtkBuilderFilename) {} + +bool CConfigurationTMSIRefa32B::setDeviceList(const std::vector<std::string> deviceList, std::string* deviceMaster, std::vector<std::string>* deviceSlaves) +{ + m_devices = deviceList; + m_deviceMaster = deviceMaster; + m_deviceSlaves = deviceSlaves; + m_deviceSlavesTemp.clear(); + for (uint32_t i = 0; i < (*m_deviceSlaves).size(); ++i) { m_deviceSlavesTemp.push_back((*m_deviceSlaves)[i]); } + + return true; +} + +bool CConfigurationTMSIRefa32B::preConfigure() +{ + if (!CConfigurationBuilder::preConfigure()) { return false; } + GtkComboBox* comboBox = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_device")); + + int count = -1; + bool selected = false; + + // autodetection of the connected device + GtkListStore* listStore = GTK_LIST_STORE(gtk_combo_box_get_model(comboBox)); + + for (uint32_t i = 0; i < m_devices.size(); ++i) + { + GtkTreeIter iter; + gtk_list_store_append(listStore, &iter); + gtk_list_store_set(listStore, &iter, 0, m_devices[i].c_str(), -1); + //::gtk_combo_box_append_text(comboBox,m_devices[i].c_str()); + + if (m_deviceMaster != nullptr && m_devices[i].compare(*m_deviceMaster) == 0) + { + count = i; + selected = true; + } + } + gtk_combo_box_set_model(comboBox,GTK_TREE_MODEL(listStore)); + if (selected) { gtk_combo_box_set_active(comboBox, count); } + else if (!selected && m_devices.size() > 0) { gtk_combo_box_set_active(comboBox, 0); } + + m_pViewSlaves = GTK_TREE_VIEW(gtk_builder_get_object(m_builder, "Devices SlavesTree")); + + GtkCellRenderer* rendererSlaves = gtk_cell_renderer_text_new(); + + GtkTreeViewColumn* colSlaves = gtk_tree_view_column_new_with_attributes("Devices Slaves", + rendererSlaves, "text", 0, nullptr); + gtk_tree_view_append_column(m_pViewSlaves, colSlaves); + + m_listStoreSlaves = gtk_list_store_new(1, G_TYPE_STRING); + + gtk_tree_view_set_model(m_pViewSlaves, GTK_TREE_MODEL(m_listStoreSlaves)); + + g_object_unref(m_listStoreSlaves); /* destroy model with view */ + + gtk_tree_selection_set_mode(gtk_tree_view_get_selection(m_pViewSlaves), GTK_SELECTION_SINGLE); + + m_pViewList = GTK_TREE_VIEW(gtk_builder_get_object(m_builder, "Device ListTree")); + + GtkCellRenderer* rendererList = gtk_cell_renderer_text_new(); + + GtkTreeViewColumn* colList = gtk_tree_view_column_new_with_attributes("Devices List", rendererList, "text", 0, nullptr); + gtk_tree_view_append_column(m_pViewList, colList); + + m_listStoreList = gtk_list_store_new(1, G_TYPE_STRING); + + gtk_tree_view_set_model(m_pViewList, GTK_TREE_MODEL(m_listStoreList)); + + g_object_unref(m_listStoreList); /* destroy model with view */ + + gtk_tree_selection_set_mode(gtk_tree_view_get_selection(m_pViewList), GTK_SELECTION_SINGLE); + + //init list + + for (uint32_t i = 0; i < m_devices.size(); ++i) + { + bool find = false; + uint32_t j = 0; + while (!find && j < (*m_deviceSlaves).size()) + { + find = (*m_deviceSlaves)[j].compare(m_devices[i]) == 0; + j++; + } + if (find) + { + GtkTreeIter iter; + gtk_list_store_append(m_listStoreSlaves, &iter); + gtk_list_store_set(m_listStoreSlaves, &iter, 0, m_devices[i].c_str(), -1); + } + else + { + GtkTreeIter iter; + gtk_list_store_append(m_listStoreList, &iter); + gtk_list_store_set(m_listStoreList, &iter, 0, m_devices[i].c_str(), -1); + } + } + + // Connects custom GTK signals + g_signal_connect(gtk_builder_get_object(m_builder, "button_add_slave_device"), "pressed", G_CALLBACK(button_add_slave_device), this); + g_signal_connect(gtk_builder_get_object(m_builder, "button_remove_slave_device"), "pressed", G_CALLBACK(button_remove_slave_device), this); + gtk_builder_connect_signals(m_builder, nullptr); + return true; +} + +bool CConfigurationTMSIRefa32B::postConfigure() +{ + GtkComboBox* comboBox = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_device")); + + if (m_applyConfig) + { + int usbIdx = 0; + char* master = gtk_combo_box_get_active_text(comboBox); + *m_deviceMaster = (master != nullptr) ? master : ""; + (*m_deviceSlaves).clear(); + *m_deviceSlaves = m_deviceSlavesTemp; + } + + if (!CConfigurationBuilder::postConfigure()) { return false; } + return true; +} + +void CConfigurationTMSIRefa32B::buttonAddSlaveDevice() +{ + GtkTreeIter itList; + GtkTreeIter iter; + + GtkTreeSelection* selection = gtk_tree_view_get_selection(m_pViewList); + + if (gtk_tree_selection_get_selected(selection, nullptr, &itList)) + { + char* tmp = nullptr; + gtk_tree_model_get(GTK_TREE_MODEL(m_listStoreList), &itList, 0, &tmp, -1); + + bool find = false; + for (uint32_t i = 0; !find && i < m_devices.size(); ++i) + { + if (m_devices[i].compare(tmp) == 0) + { + m_deviceSlavesTemp.push_back(m_devices[i]); + gtk_list_store_remove(m_listStoreList, &itList); + gtk_list_store_append(m_listStoreSlaves, &iter); + gtk_list_store_set(m_listStoreSlaves, &iter, 0, m_devices[i].c_str(), -1); + find = true; + } + } + } +} + +void CConfigurationTMSIRefa32B::buttonRemoveSlaveDevice() +{ + GtkTreeIter itSlave; + GtkTreeIter iter; + + GtkTreeSelection* selection = gtk_tree_view_get_selection(m_pViewSlaves); + + if (gtk_tree_selection_get_selected(selection, nullptr, &itSlave)) + { + gchar* tmp = nullptr; + gtk_tree_model_get(GTK_TREE_MODEL(m_listStoreSlaves), &itSlave, 0, &tmp, -1); + gtk_list_store_append(m_listStoreList, &iter); + gtk_list_store_set(m_listStoreList, &iter, 0, tmp, -1); + gtk_list_store_remove(m_listStoreSlaves, &itSlave); + int pos = -1; + for (uint32_t i = 0; i < m_deviceSlavesTemp.size() && pos == -1; ++i) { pos = (m_deviceSlavesTemp[i].compare(tmp) == 0) ? i : -1; } + m_deviceSlavesTemp.erase(m_deviceSlavesTemp.begin() + pos); + } +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyNeXus diff --git a/applications/platform/acquisition-server/src/OVASDrivers/tmsi-refa32b/ovasCConfigurationTMSIRefa32B.h b/applications/platform/acquisition-server/src/OVASDrivers/tmsi-refa32b/ovasCConfigurationTMSIRefa32B.h new file mode 100644 index 0000000000000000000000000000000000000000..39a3e21f1e2057c07347e5b6c422968d0231cc54 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/tmsi-refa32b/ovasCConfigurationTMSIRefa32B.h @@ -0,0 +1,41 @@ +#pragma once + +#include "../ovasCConfigurationBuilder.h" +#include <iostream> + +namespace OpenViBE { +namespace AcquisitionServer { +class CConfigurationTMSIRefa32B final : public CConfigurationBuilder +{ +public: + explicit CConfigurationTMSIRefa32B(const char* gtkBuilderFilename); + + bool preConfigure() override; + bool postConfigure() override; + bool setDeviceList(std::vector<std::string> deviceList, std::string* deviceMaster, std::vector<std::string>* deviceSlaves); + void buttonRemoveSlaveDevice(); + void buttonAddSlaveDevice(); + +protected: + std::string* m_deviceMaster = nullptr; + std::vector<std::string> m_devices; + std::vector<std::string>* m_deviceSlaves = nullptr; + std::vector<std::string> m_deviceSlavesTemp; +}; + +// Translates a vector of strings to a stream for storing configuration. Used strings cannot contain ';'. +inline std::ostream& operator<<(std::ostream& out, const std::vector<std::string>& var) +{ + for (auto it = var.begin(); it != var.end(); ++it) { out << (*it) << ";"; } + return out; +} + +inline std::istream& operator>>(std::istream& in, std::vector<std::string>& var) +{ + var.clear(); + std::string token; + while (std::getline(in, token, ';')) { var.push_back(token); } + return in; +} +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASDrivers/tmsi-refa32b/ovasCDriverTMSiRefa32B.cpp b/applications/platform/acquisition-server/src/OVASDrivers/tmsi-refa32b/ovasCDriverTMSiRefa32B.cpp new file mode 100644 index 0000000000000000000000000000000000000000..2264ae165822c308fe8af204637a86ac21420072 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/tmsi-refa32b/ovasCDriverTMSiRefa32B.cpp @@ -0,0 +1,638 @@ +#if defined TARGET_HAS_ThirdPartyNeXus + +#include "ovasCDriverTMSiRefa32B.h" +#include "ovasCConfigurationTMSIRefa32B.h" + +#include <toolkit/ovtk_all.h> + +#include <iostream> +#include <cmath> +#include <cstring> +#include <system/ovCTime.h> +#include "ovasCConfigurationTMSIRefa32B.h" +#include <windows.h> + +namespace OpenViBE { +namespace AcquisitionServer { +//structure define in the DLL + +typedef struct SSpDevicePath +{ + DWORD dwCbSize; + TCHAR devicePath[1]; +} SP_DEVICE_PATH, *PSP_DEVICE_PATH; + +typedef struct SFeatureData +{ + ULONG FeatureId; + ULONG Info; +} FEATURE_DATA, *PFEATURE_DATA; + +typedef struct _SYSTEM_TIME +{ + WORD wYear; + WORD wMonth; + WORD wDayOfWeek; + WORD wDay; + WORD wHour; + WORD wMinute; + WORD wSecond; + WORD wMilliseconds; +} SYSTEM_TIME; + +typedef struct SSignalFormat +{ + ULONG Size; // Size of this structure + ULONG Elements; // Number of elements in list + + ULONG Type; // One of the signal types above + ULONG SubType; // One of the signal sub-types above + ULONG Format; // Float / Integer / Asci / Ect.. + ULONG Bytes; // Number of bytes per sample including subsignals + + FLOAT UnitGain; + FLOAT UnitOffSet; + ULONG UnitId; + LONG UnitExponent; + + WCHAR Name[SIGNAL_NAME]; + + ULONG Port; + WCHAR PortName[SIGNAL_NAME]; + ULONG SerialNumber; +} signal_format_t, *psignal_format_t; + +typedef struct _FeatureMemory +{ + FEATURE_DATA Feature; + ULONG Data[1]; +} FEATURE_MEMORY, *PFEATURE_MEMORY; + +typedef struct _FeatureMode +{ + FEATURE_DATA Feature; + ULONG Mode; +} FEATURE_MODE, *PFEATURE_MODE; + +//___________________________________________________________// +// // + +//methods define in the DLL + +typedef HANDLE ( __stdcall * POPEN)(PSP_DEVICE_PATH devicePath); +typedef BOOL ( __stdcall * PCLOSE)(HANDLE handle); +typedef ULONG ( __stdcall * PGETDEVICESTATE)(IN HANDLE handle); +typedef BOOLEAN ( __stdcall * PSTART)(IN HANDLE handle); +typedef BOOLEAN ( __stdcall * PRESETDEVICE)(IN HANDLE handle); +typedef BOOLEAN ( __stdcall * PSTOP)(IN HANDLE handle); +typedef HANDLE ( __stdcall * PGETSLAVEHANDLE)(IN HANDLE handle); +typedef BOOLEAN ( __stdcall * PADDSLAVE)(IN HANDLE handle, IN HANDLE slavehandle); +typedef psignal_format_t ( __stdcall * PGETSIGNALFORMAT)(IN HANDLE handle, IN OUT psignal_format_t format); +typedef BOOLEAN ( __stdcall * PSETSIGNALBUFFER)(IN HANDLE handle, IN OUT PULONG sampling, IN OUT PULONG size); +typedef ULONG ( __stdcall * PGETSAMPLES)(IN HANDLE handle, OUT PULONG sampleBuffer, IN ULONG size); +typedef BOOLEAN ( __stdcall * PGETBUFFERINFO)(IN HANDLE handle, OUT PULONG overflow, OUT PULONG percentFull); +typedef BOOLEAN ( __stdcall * PDEVICEFEATURE)(IN HANDLE handle, IN LPVOID dataIn, IN DWORD inSize, OUT LPVOID dataOut, IN DWORD outSize); +typedef PSP_DEVICE_PATH ( __stdcall * PGETINSTANCEID)(IN LONG deviceIndex, IN BOOLEAN present, OUT ULONG* maxDevices); +typedef HKEY ( __stdcall * POPENREGKEY)(IN PSP_DEVICE_PATH path); +typedef BOOL ( __stdcall * PFREE)(IN VOID* memory); + +//___________________________________________________________// +// // + +//vars used for load the DLL's methods +POPEN fpOpen; +PCLOSE fpClose; +PGETDEVICESTATE fpGetDeviceState; +PSTART fpStart; +PRESETDEVICE fpReset; +PSTOP fpStop; +PGETSLAVEHANDLE fpGetSlaveHandle; +PADDSLAVE fpAddSlave; +PGETSIGNALFORMAT fpGetSignalFormat; +PSETSIGNALBUFFER fpSetSignalBuffer; +PGETSAMPLES fpGetSamples; +PGETBUFFERINFO fpGetBufferInfo; +PDEVICEFEATURE fpDeviceFeature; +PGETINSTANCEID fpGetInstanceId; +POPENREGKEY fpOpenRegKey; +PFREE fpFree; + +//___________________________________________________________// +// // + +HANDLE handleMaster; //Device Handle Master +std::vector<HANDLE> handleSlaves; //Device Handle Slave +HINSTANCE libHandle; //Library Handle + +// Buffer for storing the samples +//---------------------------------- +ULONG* bufferUnsigned; +LONG* buffer; +bool islBufferUnsigned; +ULONG sampling; +ULONG bufferSize; + +// device +//---------- +std::map<PSP_DEVICE_PATH, CString> devicePaths; // devicePaths contains all connected devicePath and their name +CString devicePathMaster; // the name of the Master devicePath chosen +std::vector<std::string> devicePathSlaves; // a list with the name of the Slave devicePath chosen +ULONG nDevicesConnected; // Number of devices on this PC +ULONG nDevicesOpen; // total of Master/slaves device open + +// store value for calculate the data +//-------------------------------------- +std::vector<LONG> exponentChannels; +std::vector<FLOAT> unitGains; +std::vector<FLOAT> unitOffSets; + +//number of channels +ULONG nTotalChannels; +uint32_t m_bufferSize; + +#define LOAD_DLL_FUNC(var, type, name) \ + var = (type)::GetProcAddress(libHandle, name); \ + if(!var) \ + { \ + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Load method " << name << "\n"; \ + m_valid=false; \ + return; \ + } + +CDriverTMSiRefa32B::CDriverTMSiRefa32B(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_TMSIRefa32B", m_driverCtx.getConfigurationManager()) +{ + m_header.setSamplingFrequency(512); + m_header.setChannelCount(32); + + //load the DLL of the driver + libHandle = nullptr; + handleMaster = nullptr; + + //Open library + const CString path = m_driverCtx.getConfigurationManager().expand("${Path_Bin}") + "/" + RTLOADER; + libHandle = ::LoadLibrary(path.toASCIIString()); + + //if it can't be open return FALSE; + if (libHandle == nullptr) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Couldn't load DLL: " << path << "\n"; + return; + } + + //load DLL methods for initialized the driver + LOAD_DLL_FUNC(fpOpen, POPEN, "Open"); + LOAD_DLL_FUNC(fpClose, PCLOSE, "Close"); + LOAD_DLL_FUNC(fpGetDeviceState, PGETDEVICESTATE, "GetDeviceState"); + LOAD_DLL_FUNC(fpStart, PSTART, "Start"); + LOAD_DLL_FUNC(fpReset, PRESETDEVICE, "ResetDevice"); + LOAD_DLL_FUNC(fpStop, PSTOP, "Stop"); + LOAD_DLL_FUNC(fpGetSlaveHandle, PGETSLAVEHANDLE, "GetSlaveHandle"); + LOAD_DLL_FUNC(fpAddSlave, PADDSLAVE, "AddSlave"); + LOAD_DLL_FUNC(fpGetSignalFormat, PGETSIGNALFORMAT, "GetSignalFormat"); + LOAD_DLL_FUNC(fpSetSignalBuffer, PSETSIGNALBUFFER, "SetSignalBuffer"); + LOAD_DLL_FUNC(fpGetSamples, PGETSAMPLES, "GetSamples"); + LOAD_DLL_FUNC(fpGetBufferInfo, PGETBUFFERINFO, "GetBufferInfo"); + LOAD_DLL_FUNC(fpDeviceFeature, PDEVICEFEATURE, "DeviceFeature"); + + LOAD_DLL_FUNC(fpGetInstanceId, PGETINSTANCEID, "GetInstanceId"); + LOAD_DLL_FUNC(fpOpenRegKey, POPENREGKEY, "OpenRegKey"); + LOAD_DLL_FUNC(fpFree, PFREE, "Free"); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Succeeded in loading DLL: " << CString(path) << "\n"; + devicePathMaster = ""; + nDevicesOpen = 0; + m_checkImpedance = m_driverCtx.getConfigurationManager().expandAsBoolean("${AcquisitionServer_CheckImpedance}", false);//m_checkImpedance=false; + + m_settings.add("Header", &m_header); + m_settings.add("DevicePathMaster", &devicePathMaster); + m_settings.add("DevicePathSlave", &devicePathSlaves); + m_settings.load(); +} + +bool CDriverTMSiRefa32B::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + if (!m_valid || m_driverCtx.isConnected()) { return false; } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << ">Initialized TMSI\n"; + + if (handleMaster != nullptr) + { + fpClose(handleMaster); + handleMaster = nullptr; + } + + //Refresh information about connected device + if (!refreshDevicePath()) { return false; } + + if (nDevicesConnected == 0) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "There is no device connected to the PC\n"; + return false; + } + + //open master + auto iter = devicePaths.begin(); + bool masterFind = false; + while (devicePathMaster != CString("") && !masterFind && iter != devicePaths.end()) + { + if ((*iter).second == devicePathMaster) + { + masterFind = true; + handleMaster = fpOpen((*iter).first); + if (!handleMaster) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "Open Driver\n"; + return false; + } + nDevicesOpen++; + } + ++iter; + } + if (handleMaster == nullptr && nDevicesConnected > 0) + { + handleMaster = fpOpen((*devicePaths.begin()).first); + if (!handleMaster) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Open Driver\n"; + return false; + } + nDevicesOpen++; + } + + //open slave + for (uint32_t i = 0; i < devicePathSlaves.size(); ++i) + { + auto j = devicePaths.begin(); + bool find = false; + while (!find && j != devicePaths.end()) + { + if ((*j).second == devicePathMaster && + (*j).second == CString(devicePathSlaves[i].c_str())) + { + find = true; + + //open slave driver + handleSlaves.push_back(fpOpen((*j).first)); + fpAddSlave(handleMaster, handleSlaves[handleSlaves.size() - 1]); + nDevicesOpen++; + } + ++j; + } + } + + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << ">size for 1 channel, 1 block: " << m_nSamplePerSentBlock << "\n"; + + + //initialized the buffer + sampling = m_header.getSamplingFrequency() * 1000; + bufferSize = MAX_BUFFER_SIZE; + if (!fpSetSignalBuffer(handleMaster, &sampling, &bufferSize)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "For allocate the buffer\n"; + return false; + } + m_header.setSamplingFrequency(sampling / 1000); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << ">Maximum sample rate =" << uint32_t(sampling / 1000) << "Hz\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << ">Maximum Buffer size =" << uint32_t(bufferSize) << "\n"; + + const BOOLEAN start = fpStart(handleMaster); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << ">Start handle state: " << uint32_t(fpGetDeviceState(handleMaster)) << "\n"; + if (!start) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Start handle failed\n"; + this->uninitialize(); + return false; + } + + //get informations of the format signal for all channels of the Master Handle + psignal_format_t format = fpGetSignalFormat(handleMaster, nullptr); + + if (format != nullptr) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << ">Master device name: " << (char*)format[0].PortName << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << ">Nb channels: " << uint32_t(format[0].Elements) << "\n\n"; + nTotalChannels = format[0].Elements; + islBufferUnsigned = format[0].Format == 0; + for (uint32_t i = 0; i < format[0].Elements; ++i) + { + exponentChannels.push_back(format[i].UnitExponent + 6/*changed measure unit in V*/); + unitGains.push_back(format[i].UnitGain); + unitOffSets.push_back(format[i].UnitOffSet); + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "channel[" << i << "]: Exponent=" << exponentChannels[i] << + " unitGain=" << unitGains[i] << + " offSet=" << unitOffSets[i] << + " format data signed=" << uint32_t(format[i].Format) << + " type=" << uint32_t(format[i].Type) << + " sub type=" << uint32_t(format[i].SubType) << + " unit id=" << uint32_t(format[i].UnitId) << "\n"; + //if no trigger channel was found and this channel is a digital input, this channel contains information about Trigger + if (m_nTriggerChannel == -1 && format[i].Type == 4) { m_nTriggerChannel = i; } + } + + for (uint32_t j = 0; j < handleSlaves.size(); ++j) + { + format = fpGetSignalFormat(handleSlaves[j], nullptr); + + if (format != nullptr) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << ">Slave device n" << j << " name: " << (char*)format[0].PortName << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << ">Nb channels: " << uint32_t(format[0].Elements) << "\n\n"; + nTotalChannels += format[0].Elements; + for (uint32_t i = 0; i < format[0].Elements; ++i) + { + exponentChannels.push_back(format[i].UnitExponent); + unitGains.push_back(format[i].UnitGain); + unitOffSets.push_back(format[i].UnitOffSet); + } + } + } + } + //m_header.setChannelCount(nTotalChannels); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << ">Number of Channels: " << size_t(m_header.getChannelCount()) << "\n"; + m_sample = new float[m_header.getChannelCount() * m_nSamplePerSentBlock * 2]; + + m_sampleIdx = 0; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << ">Sample driver size " << uint32_t(nTotalChannels * 4) << "\n"; + m_bufferSize = (bufferSize < (m_nSamplePerSentBlock * nTotalChannels * 4)) ? bufferSize + : (m_nSamplePerSentBlock * nTotalChannels * 32); + bufferUnsigned = new ULONG[m_bufferSize]; + if (!islBufferUnsigned) { buffer = new LONG[m_bufferSize]; } + + //activate the mode Impedance of the device + if (m_checkImpedance) + { + if (!measureMode(MEASURE_MODE_IMPEDANCE, IC_OHM_005)) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Error impedance measure mode ic_ohm_005\n"; + return false; + } + } + return true; +} + +bool CDriverTMSiRefa32B::start() +{ + if (!m_valid || !m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << ">start TMSI\n"; + if (m_checkImpedance) { measureMode(MEASURE_MODE_NORMAL, 0); } + m_sampleIdx = 0; + m_totalSampleReceived = 0; + return true; +} + +bool CDriverTMSiRefa32B::loop() +{ + if (!m_valid || !m_driverCtx.isConnected()) { return false; } + if (m_driverCtx.isStarted()) + { + //get data receive by the driver + if (fpGetSamples == nullptr) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "fpGetSample not load\n"; + return false; + } + //uint32_t nextSampleIdx = 0; + + //uint64_t elapsed = System::Time::zgetTime()-m_startTime; + const ULONG size = fpGetSamples(handleMaster, (islBufferUnsigned) ? PULONG(bufferUnsigned) : PULONG(buffer), m_bufferSize); + + if (size < 1) { return true; } + + //number of samples contains in the data receive + const uint32_t nSample = size / (nTotalChannels * 4); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "size=" << uint32_t(size) << " ;;number of sample received=" << uint32_t(nSample) << + " ;; Samp[" << 0 + << "]=" << uint32_t((islBufferUnsigned) ? bufferUnsigned[0] : buffer[0]) << ";; " + << uint32_t((islBufferUnsigned) ? bufferUnsigned[1] : buffer[1]) << "\n"; + + //index of the data buffer + uint32_t indexBuffer = 0; + + while (indexBuffer < nSample)//-m_autoRemovedSampleCount) + { + //take the minimum value between the size for complete the current block and the size of data received + ULONG min; + if (m_nSamplePerSentBlock - m_sampleIdx < (nSample - indexBuffer)) { min = m_nSamplePerSentBlock - m_sampleIdx; } + else { min = nSample - indexBuffer; } + + //loop on the channel + for (size_t i = 0; i < m_header.getChannelCount(); ++i) + { + //loop on the samples by channel + for (uint32_t j = 0; j < min; ++j) + { + // save the data of one sample for one channel on the table + if (nTotalChannels <= i) { m_sample[m_sampleIdx + j + i * m_nSamplePerSentBlock] = 0; } + else if (islBufferUnsigned) + { + m_sample[m_sampleIdx + j + i * m_nSamplePerSentBlock] = float( + (float(bufferUnsigned[(indexBuffer + j) * nTotalChannels + i]) * unitGains[i] + unitOffSets[i]) * pow( + 10., double(exponentChannels[i]))); + } + else + { + m_sample[m_sampleIdx + j + i * m_nSamplePerSentBlock] = float( + (float(buffer[(indexBuffer + j) * nTotalChannels + i]) * unitGains[i] + unitOffSets[i]) * pow( + 10., double(exponentChannels[i]))); + } + } + } + + for (uint32_t j = 0; j < min; ++j) + { + uint32_t trigger; + if (islBufferUnsigned) { trigger = bufferUnsigned[(indexBuffer + j) * nTotalChannels + m_nTriggerChannel]; } + else { trigger = buffer[(indexBuffer + j) * nTotalChannels + m_nTriggerChannel]; } + //std::cout<<trigger<<" "; + trigger = ~trigger; + trigger &= 255; + + if (m_lastTriggerValue != trigger) + { + //uint32_t indexStimulation = uint32_t(m_stimSet.size()); + const uint64_t stimulationTime = CTime(m_header.getSamplingFrequency(), uint64_t(m_sampleIdx + j)).time(); + m_stimSet.push_back(trigger, stimulationTime, 0); + m_lastTriggerValue = trigger; + } + } + //Calculate the number of index receive on the block + m_sampleIdx += min; + indexBuffer += min; + m_totalSampleReceived += min; + //see if the block is complete + if (m_sampleIdx >= m_nSamplePerSentBlock) + { + //sent the data block + m_callback->setSamples(m_sample); + m_callback->setStimulationSet(m_stimSet); + m_stimSet.clear(); + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + + //calculate the index of the new block + m_sampleIdx -= m_nSamplePerSentBlock; + } + } + } + else if (m_checkImpedance) + { + //get Impedance value + //get size of data receive + const ULONG size = fpGetSamples(handleMaster, PULONG(bufferUnsigned), m_bufferSize); + for (uint32_t i = 0; i < size / sizeof(ULONG) && i < nTotalChannels; ++i) { m_driverCtx.updateImpedance(i, bufferUnsigned[i] * 1000); } + } + else { fpGetSamples(handleMaster, PULONG(bufferUnsigned), m_bufferSize); } + return true; +} + +bool CDriverTMSiRefa32B::stop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << ">Stop TMSI\n"; + + if (m_checkImpedance) { measureMode(MEASURE_MODE_IMPEDANCE, IC_OHM_005); } + m_sampleIdx = 0; + m_totalSampleReceived = 0; + return true; +} + +bool CDriverTMSiRefa32B::uninitialize() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << ">Uninit TMSI\n"; + + //stop the driver + BOOLEAN stop = TRUE; + + for (uint32_t i = 0; i < handleSlaves.size(); ++i) { stop = stop && fpStop(handleSlaves[i]); } + stop = stop && fpStop(handleMaster); + if (!stop) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Stop handler\n"; + this->uninitialize(); + return false; + } + for (uint32_t i = 0; i < handleSlaves.size(); ++i) { fpClose(handleSlaves[i]); } + handleSlaves.clear(); + fpClose(handleMaster); + handleMaster = nullptr; + for (uint32_t i = 0; i < handleSlaves.size(); ++i) { fpClose(handleSlaves[i]); } + devicePathSlaves.clear(); + devicePathMaster = ""; + devicePaths.clear(); + delete[] m_sample; + m_sample = nullptr; + m_callback = nullptr; + return true; +} + +//___________________________________________________________________// +// // + +bool CDriverTMSiRefa32B::configure() +{ + //refresh the information of the device connected + refreshDevicePath(); + + CConfigurationTMSIRefa32B config(Directories::getDataDir() + "/applications/acquisition-server/interface-TMSI-Refa32B.ui"); + //create a vector with all name of device connected + std::vector<std::string> paths; + for (auto i = devicePaths.begin(); i != devicePaths.end(); ++i) { paths.push_back(std::string((*i).second.toASCIIString())); } + + //call configuration frame + config.setDeviceList(paths, &std::string(devicePathMaster.toASCIIString()), &devicePathSlaves); + + if (!config.configure(m_header)) { return false; } + + m_settings.save(); + return true; +} + +bool CDriverTMSiRefa32B::refreshDevicePath() const +{ + devicePaths.clear(); + + //get the number of devices connected + ULONG maxDevices = 0; + if (fpGetInstanceId == nullptr) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "Initialized the device, fpGetNrDevice not load\n"; + return false; + } + fpGetInstanceId(0, TRUE, &maxDevices); + + for (uint32_t i = 0; i < maxDevices; ++i) + { + TCHAR deviceName[40] = "Unknown Device"; + ULONG serialNumber = 0; + + // get the device path connected + PSP_DEVICE_PATH device = fpGetInstanceId(i, TRUE, &maxDevices); + + // get the name corresponding to this device + const HKEY hKey = fpOpenRegKey(device); + if (hKey != INVALID_HANDLE_VALUE) + { + //get the serial number of the device + ULONG sizeSerial = sizeof(serialNumber); + ::RegQueryValueEx(hKey, "DeviceSerialNumber", nullptr, nullptr, PBYTE(&serialNumber), &sizeSerial); + + //get the name of the device + ULONG sizeDesc = sizeof(deviceName); + ::RegQueryValueEx(hKey, "DeviceDescription", nullptr, nullptr, PBYTE(&deviceName[0]), &sizeDesc); + //put the device path and it name in the map devicePaths + devicePaths[device] = (deviceName + std::to_string(serialNumber)).c_str(); + RegCloseKey(hKey); + } + } + + //verify if the device Master is connected + const std::string pathMaster = devicePathMaster.toASCIIString(); + devicePathMaster = CString(""); + if (!pathMaster.empty()) + { + auto index = devicePaths.begin(); + while (devicePathMaster == CString("") && index != devicePaths.end()) + { + std::string deviceName = (*index).second.toASCIIString(); + devicePathMaster = (pathMaster == deviceName) ? pathMaster.c_str() : nullptr; + ++index; + } + } + + //verify if all device slaves are connected + std::vector<std::string> pathSlaves; + for (uint32_t i = 0; i < devicePathSlaves.size(); ++i) + { + for (auto j = devicePaths.begin(); j != devicePaths.end(); ++j) + { + if ((*j).second == CString(devicePathSlaves[i].c_str())) + { + pathSlaves.push_back(devicePathSlaves[i]); + break; + } + } + } + devicePathSlaves.clear(); + devicePathSlaves = pathSlaves; + nDevicesConnected = maxDevices; + return true; +} + +bool CDriverTMSiRefa32B::measureMode(const uint32_t mode, const uint32_t info) +{ + FEATURE_MODE fMode; + fMode.Feature.FeatureId = DEVICE_FEATURE_MODE; + fMode.Feature.Info = info; + fMode.Mode = mode; + if (!fpDeviceFeature(handleMaster, &fMode, sizeof(FEATURE_MODE), nullptr, 0)) { return false; } + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_HAS_ThirdPartyNeXus diff --git a/applications/platform/acquisition-server/src/OVASDrivers/tmsi-refa32b/ovasCDriverTMSiRefa32B.h b/applications/platform/acquisition-server/src/OVASDrivers/tmsi-refa32b/ovasCDriverTMSiRefa32B.h new file mode 100644 index 0000000000000000000000000000000000000000..4d192ed540ef1774c8f5380bf0aa8a3367b1c9f1 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/tmsi-refa32b/ovasCDriverTMSiRefa32B.h @@ -0,0 +1,108 @@ +#pragma once + +#if defined TARGET_HAS_ThirdPartyNeXus + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" +#include "ovas_base.h" + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +#include "ovasCConfigurationTMSIRefa32B.h" + +// This dll comes from the sdk-nexus.zip dependency archive +#define RTLOADER "RTINST.Dll" +#include <gtk/gtk.h> +// Get Signal info + +#define SIGNAL_NAME 40 +#define MAX_BUFFER_SIZE 0xFFFFFFFF + +namespace OpenViBE { +namespace AcquisitionServer { +/** + * \class CDriverTMSiRefa32B + * \author Baptiste Payan (INRIA) + */ +class CDriverTMSiRefa32B final : virtual public IDriver +{ +public: + + explicit CDriverTMSiRefa32B(IDriverContext& ctx); + ~CDriverTMSiRefa32B() override { this->uninitialize(); } + virtual void release() { delete this; } + const char* getName() override { return "TMSi Refa32B Legacy"; } + + bool isFlagSet(const EDriverFlag flag) const override { return (flag == EDriverFlag::IsUnstable) || (flag == EDriverFlag::IsDeprecated); } + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override { return true; } + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + static bool measureMode(uint32_t mode, uint32_t info); + +protected: + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + CHeader m_header; + + uint32_t m_nSamplePerSentBlock = 0; + float* m_sample = nullptr; + bool m_valid = true; + + uint32_t m_sampleIdx = 0; + uint32_t m_totalSampleReceived = 0; + CStimulationSet m_stimSet; + + bool m_checkImpedance = false; + int m_nTriggerChannel = -1; + uint32_t m_lastTriggerValue = 255; + + bool refreshDevicePath() const; + + +#define EXG (ULONG) 0x0001 +#define AUX (ULONG) 0x0002 +#define DEVICE_FEATURE_TYPE 0x0303 +#define DEVICE_FEATURE_MODE 0x0302 +#define DEVICE_FEATURE_RTC 0x0301 +#define DEVICE_FEATURE_HIGHPASS 0x0401 +#define DEVICE_FEATURE_LOWPASS 0x0402 +#define DEVICE_FEATURE_GAIN 0x0403 +#define DEVICE_FEATURE_OFFSET 0x0404 +#define DEVICE_FEATURE_IO 0x0500 +#define DEVICE_FEATURE_MEMORY 0x0501 +#define DEVICE_FEATURE_STORAGE 0x0502 +#define DEVICE_FEATURE_CORRECTION 0x0503 +#define DEVICE_FEATURE_ID 0x0504 + +#define MEASURE_MODE_NORMAL ((ULONG)0x0) +#define MEASURE_MODE_IMPEDANCE ((ULONG)0x1) +#define MEASURE_MODE_CALIBRATION ((ULONG)0x2) +#define MEASURE_MODE_IMPEDANCE_EX ((ULONG)0x3) +#define MEASURE_MODE_CALIBRATION_EX ((ULONG)0x4) + //for MEASURE_MODE_IMPEDANCE +#define IC_OHM_002 0 // 2K Impedance limit +#define IC_OHM_005 1 // 5K Impedance limit +#define IC_OHM_010 2 // 10K Impedance limit +#define IC_OHM_020 3 // 20K Impedance limit +#define IC_OHM_050 4 // 50K Impedance limit +#define IC_OHM_100 5 // 100K Impedance limit + //for MEASURE_MODE_CALIBRATION +#define IC_VOLT_050 0 //50 uV t-t Calibration voltage +#define IC_VOLT_100 1 //100 uV t-t +#define IC_VOLT_200 2 //200 uV t-t +#define IC_VOLT_500 3 //500 uV t-t +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_OS_Windows diff --git a/applications/platform/acquisition-server/src/OVASDrivers/tmsi/ovasCConfigurationTMSi.cpp b/applications/platform/acquisition-server/src/OVASDrivers/tmsi/ovasCConfigurationTMSi.cpp new file mode 100644 index 0000000000000000000000000000000000000000..88b3aa85e2f868636cc7f6d1ff5ccec9adc6fc86 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/tmsi/ovasCConfigurationTMSi.cpp @@ -0,0 +1,322 @@ +///------------------------------------------------------------------------------------------------- +/// \copyright Copyright (C) 2014, Mensia Technologies SA. All rights reserved. +/// Rights transferred to Inria, contract signed 21.11.2014 +///------------------------------------------------------------------------------------------------- + +#include "ovasCConfigurationTMSi.h" +#include "ovasCDriverTMSi.h" +#include "ovasCTMSiAccess.h" + +namespace OpenViBE { +namespace AcquisitionServer { + +#if defined TARGET_HAS_ThirdPartyTMSi + +namespace { +void ComboBoxCommunicationProtocolChangedCB(GtkComboBox* comboBox, CConfigurationTMSi* configuration) +{ + configuration->showWaitWindow(); + configuration->m_Driver->m_pTMSiAccess->initializeTMSiLibrary(gtk_combo_box_get_active_text(comboBox)); + configuration->hideWaitWindow(); + configuration->fillDeviceCombobox(); +} + +void ComboBoxDeviceChangedCB(GtkComboBox* comboBox, CConfigurationTMSi* configuration) +{ + CTMSiAccess* tmsiAccess = configuration->m_Driver->m_pTMSiAccess; + + const CString currentDevice = CString(gtk_combo_box_get_active_text(comboBox)); + + // If the currently chosen device has no name it means the combo box is empty + if (currentDevice == CString("")) { + configuration->clearAdditionalChannelsTable(); + + // clear the list of sampling frequencies + gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(configuration->m_comboBoxSamplingFrequency))); + return; + } + + configuration->showWaitWindow(); + tmsiAccess->openFrontEnd(currentDevice); + + bool deviceHasImpedanceTestingAbility = false; + if (!tmsiAccess->getImpedanceTestingCapability(&deviceHasImpedanceTestingAbility)) { + tmsiAccess->closeFrontEnd(); + configuration->hideWaitWindow(); + return; + } + + + if (!tmsiAccess->calculateSignalFormat(currentDevice)) { + tmsiAccess->closeFrontEnd(); + configuration->hideWaitWindow(); + return; + } + + if (!configuration->fillSamplingFrequencyCombobox()) { + tmsiAccess->freeSignalFormat(); + tmsiAccess->closeFrontEnd(); + configuration->hideWaitWindow(); + return; + } + + configuration->fillAdditionalChannelsTable(); + + tmsiAccess->freeSignalFormat(); + tmsiAccess->closeFrontEnd(); + configuration->hideWaitWindow(); + + // activate/deactivate the impedance checking dropbown box + gtk_widget_set_sensitive(GTK_WIDGET(configuration->m_comboBoxImpedanceLimit), deviceHasImpedanceTestingAbility); + + // modify the EEG channel count spinbox to reflect the detected maximum number of channels + GtkAdjustment* eegChannelCountAdjustment = gtk_spin_button_get_adjustment(configuration->m_buttonChannelCount); + gtk_adjustment_set_upper(eegChannelCountAdjustment, tmsiAccess->getMaximumEEGChannelCount()); + gtk_adjustment_set_value(eegChannelCountAdjustment, tmsiAccess->getMaximumEEGChannelCount()); +} + +void ChannelCountChangedCB(GtkSpinButton* spinButton, CConfigurationTMSi* /*configuration*/) { gtk_spin_button_update(spinButton); } + +void RemoveWidgets(GtkWidget* widget, gpointer /*data*/) { gtk_widget_destroy(widget); } +} // namespace + +/* Fills the combobox containing list of devices with TMSi devices connected via the + * currently selected protocol + */ +void CConfigurationTMSi::fillDeviceCombobox() const +{ + int idx = -1; + GtkListStore* deviceListStore = GTK_LIST_STORE(gtk_combo_box_get_model(m_comboBoxDeviceID)); + gtk_list_store_clear(deviceListStore); + + for (size_t i = 0; i < m_Driver->m_pTMSiAccess->getDeviceList().size(); i++) { + gtk_combo_box_append_text(m_comboBoxDeviceID, m_Driver->m_pTMSiAccess->getDeviceList()[i].toASCIIString()); + if (m_Driver->m_deviceID == m_Driver->m_pTMSiAccess->getDeviceList()[i]) { idx = int(i); } + } + + // set the active combobox field to the currently set device (if it is present) + if (idx != -1) { gtk_combo_box_set_active(m_comboBoxDeviceID, idx); } +} + +// fills the sampling freuqency combobox, as a side-effect, will also correctly set the maximum number of EEG channels inside the TMSiAccess object +bool CConfigurationTMSi::fillSamplingFrequencyCombobox() +{ + CTMSiAccess* tmsiAccess = m_Driver->m_pTMSiAccess; + + // clear the list of sampling frequencies + GtkListStore* frequencyListStore = GTK_LIST_STORE(gtk_combo_box_get_model(m_comboBoxSamplingFrequency)); + gtk_list_store_clear(frequencyListStore); + + showWaitWindow(); + std::vector<unsigned long> samplingFrequencies = tmsiAccess->discoverDeviceSamplingFrequencies(); + // Emtpy the list of acquisition frequencies and fill it with the frequencies supported by the device + hideWaitWindow(); + + if (samplingFrequencies.empty()) { return false; } + + int idx = -1; + for (size_t samplingFrequencyIdx = 0; samplingFrequencyIdx < samplingFrequencies.size(); samplingFrequencyIdx++) { + std::stringstream ss; + + // TMSi uses sampling frequencies in mHz but we want to display them in Hz + ss << samplingFrequencies[samplingFrequencyIdx] / 1000; + gtk_combo_box_append_text(m_comboBoxSamplingFrequency, ss.str().c_str()); + + if (m_Driver->m_header.getSamplingFrequency() == samplingFrequencies[samplingFrequencyIdx] / 1000) { idx = int(samplingFrequencyIdx); } + } + + // set the active combobox field to the currently set sampling frequency (if it is present) + if (idx != -1) { gtk_combo_box_set_active(m_comboBoxSamplingFrequency, idx); } + else { + // set the sampling frequency to the biggest one + gtk_combo_box_set_active(m_comboBoxSamplingFrequency, gint(samplingFrequencies.size() - 1)); + } + + return true; +} + +// clears the table with additional channels +void CConfigurationTMSi::clearAdditionalChannelsTable() +{ + gtk_container_foreach(GTK_CONTAINER(m_TableAdditionalChannels), RemoveWidgets, m_TableAdditionalChannels); + gtk_table_resize(m_TableAdditionalChannels, 1, 2); + m_AdditionalChannelCheckButtons.erase(m_AdditionalChannelCheckButtons.begin(), m_AdditionalChannelCheckButtons.end()); + m_additionalChannelNames.erase(m_additionalChannelNames.begin(), m_additionalChannelNames.end()); + gtk_widget_hide(GTK_WIDGET(m_TableAdditionalChannels)); + gtk_widget_hide(GTK_WIDGET(m_LabelAdditionalChannels)); +} + +// fills the table with additional channels +void CConfigurationTMSi::fillAdditionalChannelsTable() +{ + CTMSiAccess* tmsiAccess = m_Driver->m_pTMSiAccess; + + const uint32_t nAdditionalChannels = tmsiAccess->getActualChannelCount() - tmsiAccess->getMaximumEEGChannelCount(); + const uint32_t firstAdditionalChannelIdx = tmsiAccess->getMaximumEEGChannelCount(); + + clearAdditionalChannelsTable(); + gtk_table_resize(m_TableAdditionalChannels, nAdditionalChannels, 2); + + for (size_t c = 0; c < nAdditionalChannels; ++c) { + const size_t actualIdx = c + firstAdditionalChannelIdx; + + CString label = "Channel <b>" + tmsiAccess->getChannelName(actualIdx) + "</b> of type " + tmsiAccess->getChannelType(actualIdx).toASCIIString(); + + GtkWidget* labelChannelName = gtk_label_new(label.toASCIIString()); + gtk_label_set_use_markup(GTK_LABEL(labelChannelName), TRUE); + + GtkWidget* buttonChannelActive = gtk_check_button_new(); + gtk_table_set_row_spacings(m_TableAdditionalChannels, 5); + m_AdditionalChannelCheckButtons.push_back(GTK_CHECK_BUTTON(buttonChannelActive)); + m_additionalChannelNames.push_back(tmsiAccess->getChannelName(actualIdx)); + + // if the channel was previously selected, check it in the list + // the list of selected channels is in form ;CH1;CH2;CH3, thus we seek for substring of type ;CHX; + if (std::string(m_Driver->m_sActiveAdditionalChannels).find(";" + std::string(tmsiAccess->getChannelName(actualIdx).toASCIIString()) + ";") + != std::string::npos) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(buttonChannelActive), TRUE); } + else { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(buttonChannelActive), FALSE); } + + gtk_table_attach_defaults(m_TableAdditionalChannels, labelChannelName, 0, 1, guint(c), guint(c + 1)); + gtk_table_attach_defaults(m_TableAdditionalChannels, buttonChannelActive, 1, 2, guint(c), guint(c + 1)); + } + + gtk_widget_show(GTK_WIDGET(m_LabelAdditionalChannels)); + gtk_widget_show_all(GTK_WIDGET(m_TableAdditionalChannels)); +} + + +CString CConfigurationTMSi::getActiveAdditionalChannels() +{ + CString additionalChannelsString = ";"; + + CTMSiAccess* tmsiAccess = m_Driver->m_pTMSiAccess; + + const uint32_t nAdditionalChannels = tmsiAccess->getActualChannelCount() - tmsiAccess->getMaximumEEGChannelCount(); + + for (size_t i = 0; i < nAdditionalChannels; i++) { + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_AdditionalChannelCheckButtons[i]))) { + additionalChannelsString = additionalChannelsString + m_additionalChannelNames[i] + ";"; + } + } + + return additionalChannelsString; +} + +CConfigurationTMSi::CConfigurationTMSi(const char* gtkBuilderFilename, CDriverTMSi* driver) + : CConfigurationBuilder(gtkBuilderFilename), m_Driver(driver) { m_waitWindow = nullptr; } + +CConfigurationTMSi::~CConfigurationTMSi() +{ + // Hide the wait window when the object dies + hideWaitWindow(); +} + +bool CConfigurationTMSi::preConfigure() +{ + if (!CConfigurationBuilder::preConfigure()) { return false; } + + m_buttonChannelCount = GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spinbutton_number_of_channels")); + m_comboBoxSamplingFrequency = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_sampling_frequency")); + m_comboBoxConnectionProtocol = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_tmsi_connection_protocol")); + m_comboBoxDeviceID = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_tmsi_device")); + m_comboBoxImpedanceLimit = GTK_COMBO_BOX(gtk_builder_get_object(m_builder, "combobox_tmsi_impedance_limit")); + // m_pToggleButtonCommonAverageReference = GTK_TOGGLE_BUTTON(gtk_builder_get_object(m_builder, "checkbutton_tmsi_average_reference")); + m_LabelAdditionalChannels = GTK_LABEL(gtk_builder_get_object(m_builder, "label_tmsi_additional_channels")); + m_TableAdditionalChannels = GTK_TABLE(gtk_builder_get_object(m_builder, "table_tmsi_additional_channels")); + + g_signal_connect(G_OBJECT(m_comboBoxConnectionProtocol), "changed", G_CALLBACK(ComboBoxCommunicationProtocolChangedCB), this); + g_signal_connect(G_OBJECT(m_comboBoxDeviceID), "changed", G_CALLBACK(ComboBoxDeviceChangedCB), this); + g_signal_connect(G_OBJECT(m_buttonChannelCount), "changed", G_CALLBACK(ChannelCountChangedCB), this); + + // The order of the drivers corresponds to indexes in the ConnectionProtocols map inside the driver + gtk_combo_box_append_text(m_comboBoxConnectionProtocol, "USB"); + gtk_combo_box_append_text(m_comboBoxConnectionProtocol, "WiFi"); + gtk_combo_box_append_text(m_comboBoxConnectionProtocol, "Network"); + gtk_combo_box_append_text(m_comboBoxConnectionProtocol, "Bluetooth"); + + // Get the index of the currently set connection protocol from the map + gtk_combo_box_set_active(m_comboBoxConnectionProtocol, m_Driver->m_pTMSiAccess->getConnectionProtocols()[m_Driver->m_sConnectionProtocol].second); + + gtk_combo_box_set_active(m_comboBoxImpedanceLimit, gint(m_Driver->m_impedanceLimit)); + + // gtk_toggle_button_set_active(m_pToggleButtonCommonAverageReference, m_Driver->m_bCommonAverageReference); + gtk_spin_button_set_value(m_buttonChannelCount, double(m_Driver->m_activeEEGChannels)); + + return true; +} + +bool CConfigurationTMSi::postConfigure() +{ + if (m_applyConfig) { + // set the channel count to the number of EEG channels + number of active additional channels + CTMSiAccess* tmsiAccess = m_Driver->m_pTMSiAccess; + + m_Driver->m_sConnectionProtocol = gtk_combo_box_get_active_text(m_comboBoxConnectionProtocol); + m_Driver->m_deviceID = gtk_combo_box_get_active_text(m_comboBoxDeviceID); + + // If the device was set to an actual existing device + if (m_Driver->m_deviceID != CString("")) { + // m_Driver->m_bCommonAverageReference = gtk_toggle_button_get_active(m_pToggleButtonCommonAverageReference) != 0; + m_Driver->m_sActiveAdditionalChannels = getActiveAdditionalChannels(); + m_Driver->m_activeEEGChannels = gtk_spin_button_get_value_as_int(m_buttonChannelCount); + m_Driver->m_impedanceLimit = gtk_combo_box_get_active(m_comboBoxImpedanceLimit); + } + // If the device is unset then set all driver settings to neutral values + else { + // m_Driver->m_bCommonAverageReference = 0; + m_Driver->m_sActiveAdditionalChannels = CString(";"); + m_Driver->m_activeEEGChannels = 0; + m_Driver->m_impedanceLimit = 1; + } + + // Increase the Channel Count spin button to the value of all active channels (EEG+additional) + uint32_t activeChannels = gtk_spin_button_get_value_as_int(m_buttonChannelCount); + + for (size_t idx = 0; idx < m_AdditionalChannelCheckButtons.size(); idx++) { + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_AdditionalChannelCheckButtons[idx]))) { activeChannels++; } + } + + GtkAdjustment* adjustment = gtk_spin_button_get_adjustment(m_buttonChannelCount); + gtk_adjustment_set_upper(adjustment, tmsiAccess->getActualChannelCount()); + gtk_adjustment_set_value(adjustment, activeChannels); + } + if (!CConfigurationBuilder::postConfigure()) { return false; } + + return true; +} + +void CConfigurationTMSi::showWaitWindow() +{ + if (m_waitWindow != nullptr) { return; } + + m_waitWindow = gtk_window_new(GTK_WINDOW_POPUP); + gtk_window_set_position(GTK_WINDOW(m_waitWindow), GTK_WIN_POS_CENTER); + gtk_window_set_decorated(GTK_WINDOW(m_waitWindow), FALSE); + gtk_window_set_modal(GTK_WINDOW(m_waitWindow), TRUE); + GdkColor bgColor; + bgColor.blue = 0; + bgColor.green = 0xffff; + bgColor.red = 0xffff; + gtk_widget_modify_bg(m_waitWindow, GTK_STATE_NORMAL, &bgColor); + GtkWidget* box = gtk_vbox_new(FALSE, 0); + GtkWidget* label = gtk_label_new(" COMMUNICATING WITH DEVICE... "); + gtk_box_pack_end(GTK_BOX(box), label, TRUE, TRUE, 10); + + gtk_container_add(GTK_CONTAINER(m_waitWindow), box); + + gtk_widget_show_all(m_waitWindow); + while (gtk_events_pending()) { gtk_main_iteration(); } +} + +void CConfigurationTMSi::hideWaitWindow() +{ + if (m_waitWindow != nullptr) { + gtk_widget_destroy(GTK_WIDGET(m_waitWindow)); + m_waitWindow = nullptr; + } +} + +#endif // TARGET_HAS_ThirdPartyTMSi + +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASDrivers/tmsi/ovasCConfigurationTMSi.h b/applications/platform/acquisition-server/src/OVASDrivers/tmsi/ovasCConfigurationTMSi.h new file mode 100644 index 0000000000000000000000000000000000000000..cb0a1548f1fa76f9230c00c578bc821f31046a0d --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/tmsi/ovasCConfigurationTMSi.h @@ -0,0 +1,50 @@ +///------------------------------------------------------------------------------------------------- +/// \copyright Copyright (C) 2014, Mensia Technologies SA. All rights reserved. +/// Rights transferred to Inria, contract signed 21.11.2014 +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "../ovasCConfigurationBuilder.h" +#include <gtk/gtk.h> + +namespace OpenViBE { +namespace AcquisitionServer { +class CDriverTMSi; + +class CConfigurationTMSi final : public CConfigurationBuilder +{ +public: + CConfigurationTMSi(const char* gtkBuilderFilename, CDriverTMSi* driver); + ~CConfigurationTMSi() override; + + bool preConfigure() override; + bool postConfigure() override; + + void fillDeviceCombobox() const; + bool fillSamplingFrequencyCombobox(); + void fillAdditionalChannelsTable(); + void clearAdditionalChannelsTable(); + CString getActiveAdditionalChannels(); + + void showWaitWindow(); + void hideWaitWindow(); + + CDriverTMSi* m_Driver = nullptr; + + GtkSpinButton* m_buttonChannelCount = nullptr; + GtkComboBox* m_comboBoxConnectionProtocol = nullptr; + GtkComboBox* m_comboBoxDeviceID = nullptr; + GtkComboBox* m_comboBoxSamplingFrequency = nullptr; + GtkComboBox* m_comboBoxImpedanceLimit = nullptr; + //GtkToggleButton* m_ButtonCommonAverageReference = nullptr; + GtkLabel* m_LabelAdditionalChannels = nullptr; + GtkTable* m_TableAdditionalChannels = nullptr; + std::vector<GtkCheckButton*> m_AdditionalChannelCheckButtons; +private: + std::vector<CString> m_additionalChannelNames; + + GtkWidget* m_waitWindow = nullptr; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE diff --git a/applications/platform/acquisition-server/src/OVASDrivers/tmsi/ovasCDriverTMSi.cpp b/applications/platform/acquisition-server/src/OVASDrivers/tmsi/ovasCDriverTMSi.cpp new file mode 100644 index 0000000000000000000000000000000000000000..37e2c96ebc28702dd5a0aa85fe0b5bc8f0fb1246 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/tmsi/ovasCDriverTMSi.cpp @@ -0,0 +1,239 @@ +///------------------------------------------------------------------------------------------------- +/// \copyright Copyright (C) 2014, Mensia Technologies SA. All rights reserved. +/// Rights transferred to Inria, contract signed 21.11.2014 +///------------------------------------------------------------------------------------------------- + +#include "ovasCDriverTMSi.h" +#include "ovasCConfigurationTMSi.h" +#include "ovasCTMSiAccess.h" + +#if defined TARGET_HAS_ThirdPartyTMSi + +#include <toolkit/ovtk_all.h> + +#include <iostream> +#include <system/ovCTime.h> + +namespace OpenViBE { +namespace AcquisitionServer { + +// Public driver functions + +CDriverTMSi::CDriverTMSi(IDriverContext& ctx) + : IDriver(ctx), m_settings("AcquisitionServer_Driver_TMSi", m_driverCtx.getConfigurationManager()) +{ + // default parameters, will be overriden by saved settings + m_header.setSamplingFrequency(512); + m_header.setChannelCount(32); + m_sConnectionProtocol = "USB"; + m_deviceID = ""; + m_bCommonAverageReference = true; + m_activeEEGChannels = 0; + m_sActiveAdditionalChannels = ";"; + m_impedanceLimit = 1; + + m_settings.add("Header", &m_header); + m_settings.add("ConnectionProtocol", &m_sConnectionProtocol); + m_settings.add("DeviceIdentifier", &m_deviceID); + // m_settings.add("CommonAverageReference", &m_bCommonAverageReference); + m_settings.add("ActiveEEGChannels", &m_activeEEGChannels); + m_settings.add("ActiveAdditionalChannels", &m_sActiveAdditionalChannels); + m_settings.add("ImpedanceLimit", &m_impedanceLimit); + m_settings.load(); + + m_valid = true; + + if (!m_valid) { return; } + + m_pTMSiAccess = new CTMSiAccess(m_driverCtx); +} + + +bool CDriverTMSi::initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) +{ + if (!m_valid || m_driverCtx.isConnected()) { return false; } + + // Show a window prompting the user to wait, this window is automatically closed when the Configuration object is destroyed + CConfigurationTMSi config(Directories::getDataDir() + "/applications/acquisition-server/interface-TMSi.ui", this); + config.showWaitWindow(); + + + if (m_deviceID == CString("")) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "No TMSi device selected" << "\n"; + return false; + } + if (m_header.getSamplingFrequency() == 0) { m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "No Sampling Frequency selected" << "\n"; } + + m_callback = &callback; + m_nSamplePerSentBlock = nSamplePerSentBlock; + + m_pTMSiAccess->initializeTMSiLibrary(m_sConnectionProtocol.toASCIIString()); + m_pTMSiAccess->openFrontEnd(m_deviceID.toASCIIString()); + + + // by default CAR (called Common Mode Rejection in TMSi documents) is enabled, one can disable it by token + m_bCommonAverageReference = !(m_driverCtx.getConfigurationManager().expandAsBoolean("${AcquisitionServer_TMSI_DisableCommonModeRejection}", false)); + + if (!m_pTMSiAccess->setCommonModeRejection(m_bCommonAverageReference)) { + m_pTMSiAccess->closeFrontEnd(); + return false; + } + + if (!m_pTMSiAccess->runDiagnostics()) { + m_pTMSiAccess->closeFrontEnd(); + return false; + } + /* + // Get Time + SYSTEMTIME time; + if(m_fpGetRtcTime( m_libraryHandle, &time )) + { + char str[255]; + sprintf(str, "Current Device Time Weekday %d on %d-%d-%d Time %d:%d:%d", time.wDayOfWeek, time.wDay, time.wMonth, time.wYear, time.wHour, time.wMinute, time.wSecond ); + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) " << str << "\n"; + } + else + { + int code = m_fpGetErrorCode(m_libraryHandle); + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) " << "Error getting time from device, errorcode = " << code << ", message=\"" << m_fpGetErrorCodeMessage(m_libraryHandle, code) << "\"" << "\n"; + return false; + } + + // Set Time + GetLocalTime(&time); + if(m_fpSetRtcTime(m_libraryHandle, &time )) + { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) " << "Time set" << "\n"; + } + else + { + int code = m_fpGetErrorCode(m_libraryHandle); + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) " << "Error setting time on device, errorcode = " << code << ", message=\"" << m_fpGetErrorCodeMessage(m_libraryHandle, code) << "\"" << "\n"; + return false; + } + */ + + // Get Signal Format + if (m_pTMSiAccess->calculateSignalFormat(m_deviceID)) { m_pTMSiAccess->printSignalFormat(); } + else { + m_pTMSiAccess->closeFrontEnd(); + return false; + } + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) " << "Number of Channels on [" << m_deviceID << "]" << " = " << uint64_t( + m_pTMSiAccess->getActualChannelCount()) << "\n"; + + if (!m_pTMSiAccess->setSignalBuffer(m_header.getSamplingFrequency() * 1000, m_header.getSamplingFrequency() * 10)) { + m_pTMSiAccess->closeFrontEnd(); + return false; + } + + m_pTMSiAccess->setActiveChannels(&m_header, m_sActiveAdditionalChannels); + + m_sample = new float[m_header.getChannelCount() * nSamplePerSentBlock]; + if (!m_sample) { + delete [] m_sample; + m_sample = nullptr; + return false; + } + + if (!m_pTMSiAccess->getConnectionProperties()) { + m_pTMSiAccess->closeFrontEnd(); + return false; + } + + if (m_driverCtx.isImpedanceCheckRequested()) { + // Acquisition on the device must be started in order to set the acquiring mode to impedance + if (!m_pTMSiAccess->startAcquisition()) { return false; } + if (!m_pTMSiAccess->setSignalMeasuringModeToImpedanceCheck(int(m_impedanceLimit))) { + m_pTMSiAccess->stopAcquisition(); + m_bIgnoreImpedanceCheck = true; + } + else { + m_impedances.resize(m_header.getChannelCount()); + m_bIgnoreImpedanceCheck = false; + } + } + + // @todo modify the API to provide this info (depends on the device) + for (size_t i = 0; i < m_header.getChannelCount(); ++i) { m_header.setChannelUnits(i, OVTK_UNIT_Unspecified, OVTK_FACTOR_Base); } + + return true; +} + +bool CDriverTMSi::start() +{ + if (!m_valid || !m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + + if (m_driverCtx.isImpedanceCheckRequested()) { + m_pTMSiAccess->setSignalMeasuringModeToNormal(); + m_pTMSiAccess->stopAcquisition(); + } + // sometimes the driver might refuse to start, some sampling frequencies can be set but not used for example + if (!m_pTMSiAccess->startAcquisition()) { return false; } + + // TODO_JL Do impedance check when applicable + + m_totalSampleReceived = 0; + return true; +} + +bool CDriverTMSi::loop() +{ + if (!m_valid || !m_driverCtx.isConnected()) { return false; } + if (m_driverCtx.isStarted()) { + const int bytesReceived = m_pTMSiAccess->getSamples(m_sample, m_callback, m_nSamplePerSentBlock, m_header.getSamplingFrequency()); + + if (bytesReceived >= 0) { m_totalSampleReceived += bytesReceived; } + else { return false; } + } + else { + if (m_driverCtx.isImpedanceCheckRequested() && !m_bIgnoreImpedanceCheck) { + if (!m_pTMSiAccess->getImpedanceValues(&m_impedances)) { return false; } + + for (size_t i = 0; i < m_header.getChannelCount(); ++i) { m_driverCtx.updateImpedance(i, m_impedances[i]); } + } + } + + return true; +} + +bool CDriverTMSi::stop() +{ + if (!m_driverCtx.isConnected() || !m_driverCtx.isStarted()) { return false; } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) " << ">Stop TMSI\n"; + + m_pTMSiAccess->stopAcquisition(); + + m_totalSampleReceived = 0; + return true; +} + +bool CDriverTMSi::uninitialize() +{ + if (!m_driverCtx.isConnected() || m_driverCtx.isStarted()) { return false; } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) " << ">Uninit TMSI\n"; + + m_pTMSiAccess->stopAcquisition(); + m_pTMSiAccess->freeSignalFormat(); + + if (!m_pTMSiAccess->closeFrontEnd()) { return false; } + + return true; +} + +bool CDriverTMSi::configure() +{ + CConfigurationTMSi config(Directories::getDataDir() + "/applications/acquisition-server/interface-TMSi.ui", this); + + const bool result = config.configure(m_header); + if (!result) { return false; } + + m_settings.save(); + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif // TARGET_OS_Windows diff --git a/applications/platform/acquisition-server/src/OVASDrivers/tmsi/ovasCDriverTMSi.h b/applications/platform/acquisition-server/src/OVASDrivers/tmsi/ovasCDriverTMSi.h new file mode 100644 index 0000000000000000000000000000000000000000..3204026388fc0eafa102881d4c9bc3a82e7f9afb --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/tmsi/ovasCDriverTMSi.h @@ -0,0 +1,78 @@ +///------------------------------------------------------------------------------------------------- +/// \copyright Copyright (C) 2014, Mensia Technologies SA. All rights reserved. +/// Rights transferred to Inria, contract signed 21.11.2014 +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" +#include "ovas_base.h" + +#include "../ovasCSettingsHelper.h" +#include "../ovasCSettingsHelperOperators.h" + +#if defined TARGET_OS_Windows + +// Get Signal info + + +namespace OpenViBE { +namespace AcquisitionServer { +class CTMSiAccess; + +/** + * \class CDriverTMSi + * \author Mensia Technologies + */ +class CDriverTMSi final : public IDriver +{ +public: + explicit CDriverTMSi(IDriverContext& ctx); + ~CDriverTMSi() override { this->uninitialize(); } + void release() { delete this; } + const char* getName() override { return "TMSi amplifiers"; } + + bool initialize(const uint32_t nSamplePerSentBlock, IDriverCallback& callback) override; + bool uninitialize() override; + + bool start() override; + bool stop() override; + bool loop() override; + + bool isConfigurable() override { return true; } + bool configure() override; + const IHeader* getHeader() override { return &m_header; } + + // saved parameters + CString m_sConnectionProtocol; + CString m_deviceID; + bool m_bCommonAverageReference = false; + uint64_t m_activeEEGChannels = 0; + CString m_sActiveAdditionalChannels; + uint64_t m_impedanceLimit = 0; + + CTMSiAccess* m_pTMSiAccess = nullptr; + CHeader m_header; + +protected: + SettingsHelper m_settings; + + IDriverCallback* m_callback = nullptr; + + uint32_t m_nSamplePerSentBlock = 0; + float* m_sample = nullptr; + std::vector<double> m_impedances; + + bool m_valid = false; + + uint32_t m_totalSampleReceived = 0; + CStimulationSet m_stimSet; + +private: + bool m_bIgnoreImpedanceCheck = false; +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif // TARGET_OS_Windows diff --git a/applications/platform/acquisition-server/src/OVASDrivers/tmsi/ovasCTMSiAccess.cpp b/applications/platform/acquisition-server/src/OVASDrivers/tmsi/ovasCTMSiAccess.cpp new file mode 100644 index 0000000000000000000000000000000000000000..311a10495a9cbc7b6e45602c36d347150f3d63f9 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/tmsi/ovasCTMSiAccess.cpp @@ -0,0 +1,845 @@ +///------------------------------------------------------------------------------------------------- +/// \copyright Copyright (C) 2014, Mensia Technologies SA. All rights reserved. +/// Rights transferred to Inria, contract signed 21.11.2014 +///------------------------------------------------------------------------------------------------- + +#if defined TARGET_HAS_ThirdPartyTMSi + +#include "ovasIDriver.h" +#include "../ovasCHeader.h" +#include "ovasCTMSiAccess.h" + +#include <iostream> +#include <string> +#include <gtk/gtk.h> + +namespace OpenViBE { +namespace AcquisitionServer { + +static const std::string TMSI_DLL = "TMSiSDK.dll"; +//static const unsigned long s_ulLengthOfBufferInSeconds = 10; +static const int CALIBRATION_VOLTAGE = IC_VOLT_050; +//static const int s_iImpedanceLimit = IC_OHM_005; + +HINSTANCE libTMSi; // Library Handle + +template <typename T> +void CTMSiAccess::loadDLLFunct(T* functionPointer, const char* functionName) +{ + *functionPointer = T(GetProcAddress(libTMSi, functionName)); + if (!*functionPointer) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "(TMSi) Load method " << functionName << "\n"; + m_valid = false; + } +} + +CTMSiAccess::CTMSiAccess(IDriverContext& ctx) + : m_driverCtx(ctx) +{ + // Create a map of available protocols, each protocol has an Enum value coming from TMSi and an index (used for the dropbown box) + m_connectionProtocols["USB"] = std::make_pair(TMSiConnectionUSB, 0); + m_connectionProtocols["WiFi"] = std::make_pair(TMSiConnectionWifi, 1); + m_connectionProtocols["Network"] = std::make_pair(TMSiConnectionNetwork, 2); + m_connectionProtocols["Bluetooth"] = std::make_pair(TMSiConnectionBluetooth, 3); + + m_libraryHandle = nullptr; + m_sampleBuffer = nullptr; + m_signalFormat = nullptr; + + // Load the Mensia Acquisition Library + const std::string path = std::string(m_driverCtx.getConfigurationManager().expand("${Path_Bin}").toASCIIString()) + "/" + TMSI_DLL; + libTMSi = ::LoadLibrary(path.c_str()); + + if (libTMSi == nullptr) { + const DWORD windowsError = GetLastError(); + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "(TMSi) Can not load library, windows error = " << uint64_t(windowsError) << "\n"; + } + + m_valid = true; + + loadDLLFunct<POPEN>(&m_fpOpen, "Open"); + loadDLLFunct<PCLOSE>(&m_fpClose, "Close"); + loadDLLFunct<PSTART>(&m_fpStart, "Start"); + loadDLLFunct<PSTOP>(&m_fpStop, "Stop"); + loadDLLFunct<PSETSIGNALBUFFER>(&m_fpSetSignalBuffer, "SetSignalBuffer"); + loadDLLFunct<PGETBUFFERINFO>(&m_fpGetBufferInfo, "GetBufferInfo"); + loadDLLFunct<PGETSAMPLES>(&m_fpGetSamples, "GetSamples"); + loadDLLFunct<PGETSIGNALFORMAT>(&m_fpGetSignalFormat, "GetSignalFormat"); + loadDLLFunct<PFREE>(&m_fpFree, "Free"); + loadDLLFunct<PLIBRARYINIT>(&m_fpLibraryInit, "LibraryInit"); + loadDLLFunct<PLIBRARYEXIT>(&m_fpLibraryExit, "LibraryExit"); + loadDLLFunct<PGETFRONTENDINFO>(&m_fpGetFrontEndInfo, "GetFrontEndInfo"); + + loadDLLFunct<PSETRTCTIME>(&m_fpSetRtcTime, "SetRtcTime"); + loadDLLFunct<PGETRTCTIME>(&m_fpGetRtcTime, "GetRtcTime"); + loadDLLFunct<PGETERRORCODE>(&m_fpGetErrorCode, "GetErrorCode"); + loadDLLFunct<PGETERRORCODEMESSAGE>(&m_fpGetErrorCodeMessage, "GetErrorCodeMessage"); + + loadDLLFunct<PGETDEVICELIST>(&m_fpGetDeviceList, "GetDeviceList"); + loadDLLFunct<PFREEDEVICELIST>(&m_fpFreeDeviceList, "FreeDeviceList"); + + loadDLLFunct<PSETREFCALCULATION>(&m_fpSetRefCalculation, "SetRefCalculation"); + loadDLLFunct<PGETCONNECTIONPROPERTIES>(&m_fpGetConnectionProperties, "GetConnectionProperties"); + loadDLLFunct<PSETMEASURINGMODE>(&m_fpSetMeasuringMode, "SetMeasuringMode"); + loadDLLFunct<PGETEXTFRONTENDINFO>(&m_fpGetExtFrontEndInfo, "GetExtFrontEndInfo"); + + /* + // NeXus10MkII functionality + loadDLLFunct<PGETRANDOMKEY>(&m_fpGetRandomKey, "GetRandomKey"); + loadDLLFunct<PUNLOCKFRONTEND>(&m_fpUnlockFrontEnd, "UnlockFrontEnd"); + loadDLLFunct<PGETOEMSIZE>(&m_fpGetOEMSize, "GetOEMSize"); + loadDLLFunct<PSETOEMDATA>(&m_fpSetOEMData, "SetOEMData"); + loadDLLFunct<PGETOEMDATA>(&m_fpGetOEMData, "GetOEMData"); + loadDLLFunct<POPENFIRSTDEVICE>(&m_oFopenFirstDevice, "OpenFirstDevice"); + loadDLLFunct<PSETSTORAGEMODE>(&m_fpSetStorageMode, "SetStorageMode"); + loadDLLFunct<PGETFLASHSTATUS>(&m_fpGetFlashStatus, "GetFlashStatus"); + loadDLLFunct<PSTARTFLASHDATA>(&m_fpStartFlashData, "StartFlashData"); + loadDLLFunct<PGETFLASHSAMPLES>(&m_fpGetFlashSamples, "GetFlashSamples"); + loadDLLFunct<PSTOPFLASHDATA>(&m_fpStopFlashData, "StopFlashData"); + loadDLLFunct<PFLASHERASEMEMORY>(&m_fpFlashEraseMemory, "FlashEraseMemory"); + loadDLLFunct<PSETFLASHDATA>(&m_fpSetFlashData, "SetFlashData"); +*/ +} + +CTMSiAccess::~CTMSiAccess() +{ + // Close the intefrace if it is still open, should prevent device locking in some cases + if (m_opened) { closeFrontEnd(); } + if (m_libraryHandle != nullptr) { m_fpLibraryExit(m_libraryHandle); } + FreeLibrary(libTMSi); +} + +bool CTMSiAccess::initializeTMSiLibrary(const char* connectionProtocol) +{ + if (!m_valid) { return false; } + + // TODO_JL block this function if the driver is in use + + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "(TMSi) Initializing TMSi library on [" << connectionProtocol << "] protocol \n"; + const ETmSiConnection connection = m_connectionProtocols[connectionProtocol].first; + + int error; + + if (m_libraryHandle != nullptr) { + // if the library is already in use then exit it first + m_fpLibraryExit(m_libraryHandle); + m_libraryHandle = nullptr; + } + + m_libraryHandle = m_fpLibraryInit(connection, &error); + + if (error != 0) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "(TMSi) Can not initialize TMSi library, errorcode = " << error << "\n"; + m_libraryHandle = nullptr; + return false; + } + + if (m_libraryHandle == INVALID_HANDLE_VALUE) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "(TMSi) Can not initialize TMSi library, INVALID_ERROR_HANDLE\n"; + m_libraryHandle = nullptr; + return false; + } + + int nDevices; + // Once the library is initialized, get the list of devices on the frontend + char** deviceList = m_fpGetDeviceList(m_libraryHandle, &nDevices); + m_devices.clear(); + + if (nDevices == 0) { + error = m_fpGetErrorCode(m_libraryHandle); + if (error == 0) { m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "(TMSi) No TMSi devices connected\n"; } + else { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) Could not list TMSi devices, errorcode = " << error + << " message : \"" << m_fpGetErrorCodeMessage(m_libraryHandle, error) << "\"\n"; + } + + return false; + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Info << "(TMSi) Found [" << nDevices << "] TMSi devices\n"; + + for (int i = 0; i < nDevices; ++i) { m_devices.push_back(CString(deviceList[i])); } + + // the device list allocated in the library has to be freed + m_fpFreeDeviceList(m_libraryHandle, nDevices, deviceList); + + m_isInitialized = true; + return true; +} + +bool CTMSiAccess::openFrontEnd(const char* deviceID) +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Opening FrontEnd [" << deviceID << "]\n"; + if (m_libraryHandle == nullptr) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) TMSi library not accessible\n"; + return false; + } + + if (m_fpOpen(m_libraryHandle, deviceID)) { m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Frontend opened\n"; } + else { + const int error = m_fpGetErrorCode(m_libraryHandle); + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) Frontend NOT available, errorcode = " << error << ", message=\"" << + m_fpGetErrorCodeMessage(m_libraryHandle, error) << "\"\n"; + + // If we receive "Access Refused (10061)" error we show a dialog prompting the user to restart his device + GtkWidget* gtkMessageDialog = error == 10061 + ? gtk_message_dialog_new_with_markup(nullptr, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, + "The device <b>%s</b> is present but refuses access. It might be connected to another instance of OpenViBE. Restarting the device might help", + deviceID) + : gtk_message_dialog_new_with_markup(nullptr, GTK_DIALOG_MODAL, GTK_MESSAGE_WARNING, GTK_BUTTONS_CLOSE, + "The device <b>%s</b> is present but can not be opened. Restarting the device might help. Error reported by driver : %s", + deviceID, m_fpGetErrorCodeMessage(m_libraryHandle, error)); + + gtk_dialog_run(GTK_DIALOG(gtkMessageDialog)); + gtk_widget_destroy(gtkMessageDialog); + + // if we fail to open the frontend we close the library immediately + //m_fpLibraryExit(m_libraryHandle); + //m_libraryHandle = nullptr; + return false; + } + + m_opened = true; + return true; +} + +bool CTMSiAccess::closeFrontEnd() +{ + if (m_libraryHandle == nullptr) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) TMSi library not accessible\n"; + return false; + } + + if (!m_opened) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) Can not close unopened FrontEnd\n"; + return false; + } + + if (m_fpClose(m_libraryHandle)) { m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Frontend closed\n"; } + else { + const int error = m_fpGetErrorCode(m_libraryHandle); + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) Can not close frontend, errorcode = " << error << ", message=\"" << + m_fpGetErrorCodeMessage(m_libraryHandle, error) << "\"\n"; + return false; + } + + m_opened = false; + m_hasChannelStructure = false; + m_hasBufferSet = false; + return true; +} + +std::vector<unsigned long> CTMSiAccess::discoverDeviceSamplingFrequencies() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Checking for sampling frequencies\n"; + + std::vector<unsigned long> samplings; + + m_maxBufferSize = MAX_BUFFER_SIZE; + samplings.push_back(128 * 1000); + samplings.push_back(256 * 1000); + samplings.push_back(512 * 1000); + samplings.push_back(1024 * 1000); + samplings.push_back(2048 * 1000); + + if (!m_opened) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) No FrontEnd opened\n"; + samplings.clear(); + return samplings; + } + + for (size_t i = 0; i < samplings.size(); ++i) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Trying frequency [" << uint64_t(samplings[i]) << "]\n"; + + unsigned long sampling = samplings[i]; + + // Max bufer size will be set to the right value in this step + if (m_fpSetSignalBuffer(m_libraryHandle, &sampling, &m_maxBufferSize)) { + samplings[i] = sampling; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Sample rate: " << uint64_t(sampling) << ", Buffer Size: " << + uint64_t(m_maxBufferSize) << "\n"; + } + else { + const int error = m_fpGetErrorCode(m_libraryHandle); + m_driverCtx.getLogManager() << Kernel::LogLevel_Error << "(TMSi) Failed to set sampling frequency, errorcode = " << error + << ", message = \"" << m_fpGetErrorCodeMessage(m_libraryHandle, error) << "\"\n"; + samplings.clear(); + return samplings; + } + } + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Sampling frequencies OK\n"; + return samplings; +} + +bool CTMSiAccess::runDiagnostics() +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Running diagnostics\n"; + + if (!m_opened) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) No FrontEnd opened\n"; + return false; + } + + front_end_info_t frontEndInfo; + + if (m_fpGetFrontEndInfo(m_libraryHandle, &frontEndInfo)) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Frontend has Serial " << size_t(frontEndInfo.Serial) << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Frontend has HwVersion " << frontEndInfo.HwVersion << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Frontend has SwVersion " << frontEndInfo.SwVersion << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Frontend has BaseSf " << frontEndInfo.BaseSf << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Frontend has maxRS232 " << frontEndInfo.maxRS232 << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Frontend has " << frontEndInfo.NrOfChannels << " channels\n"; + } + else { + const int error = m_fpGetErrorCode(m_libraryHandle); + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) FrontendInfo NOT available, errorcode = " << error + << ", message=\"" << m_fpGetErrorCodeMessage(m_libraryHandle, error) << "\"\n"; + // return false; + } + + tmsi_bat_report_type_t TMSiBatReport; + tmsi_storage_report_type_t TMSiStorageReport; + tmsi_device_report_type_t TMSiDeviceReport; + tmsi_ext_frontend_info_type_t TMSiExtFrontEndInfo; + + if (m_fpGetExtFrontEndInfo(m_libraryHandle, &TMSiExtFrontEndInfo, &TMSiBatReport, &TMSiStorageReport, &TMSiDeviceReport)) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) CurrentSamplerate " << TMSiExtFrontEndInfo.CurrentSamplerate << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) CurrentBlockType " << TMSiExtFrontEndInfo.CurrentBlockType << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) CurrentInterface " << TMSiExtFrontEndInfo.CurrentInterface << "\n"; + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) MemoryStatus.TotalSize " << TMSiStorageReport.TotalSize << " MByte\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) MemoryStatus.UsedSpace " << TMSiStorageReport.UsedSpace << " MByte\n"; + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) BatteryStatus.AccumCurrent " << TMSiBatReport.AccumCurrent << " mA\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) BatteryStatus.Current " << TMSiBatReport.Current << " mA\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) BatteryStatus.Temp " << TMSiBatReport.Temp << " C\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) BatteryStatus.Voltage " << TMSiBatReport.Voltage << " mV\n"; + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) STmSiDeviceReport.AdapterSerial " << TMSiDeviceReport.AdapterSN << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) STmSiDeviceReport.AdapterCycles " << TMSiDeviceReport.AdapterCycles << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) STmSiDeviceReport.AdapterStatus " << TMSiDeviceReport.AdapterStatus << "\n"; + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) STmSiDeviceReport.MobitaCycles " << TMSiDeviceReport.MobitaCycles << "\n"; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) STmSiDeviceReport.MobitaStatus " << TMSiDeviceReport.MobitaStatus << "\n"; + } + else { + const int error = m_fpGetErrorCode(m_libraryHandle); + // Most of the devices do not have the extended frontend info so this message will popup quite often + m_driverCtx.getLogManager() << Kernel::LogLevel_Debug << "(TMSi) Extended FrontendInfo NOT available, errorcode = " << error + << ", message=\"" << m_fpGetErrorCodeMessage(m_libraryHandle, error) << "\"\n"; + // return false; + } + + // only fails if the device is not opened, as not all devices support the getFrontEndInfo and getExtFrontEndInfo functions + //m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Diagnostics OK\n"; + return true; +} + +bool CTMSiAccess::getImpedanceTestingCapability(bool* hasImpedanceTestingAbility) const +{ + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Getting impedance capability\n"; + + if (!m_opened) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) No FrontEnd opened\n"; + return false; + } + + front_end_info_t frontEndInfo; + + if (m_fpGetFrontEndInfo(m_libraryHandle, &frontEndInfo)) { + // get the first three numbers from the serial number + // TMSi devices that can measure impedance have their serial numbers starting by a number between 107 and 128 + char serialNumber[1024]; + sprintf(serialNumber, "%lu", frontEndInfo.Serial); + + char deviceIdentifier[4]; + strncpy(deviceIdentifier, serialNumber, 3); + deviceIdentifier[3] = 0; + + const int deviceID = atoi(deviceIdentifier); + + *hasImpedanceTestingAbility = (deviceID >= 107 && deviceID <= 128); + } + else { + const int error = m_fpGetErrorCode(m_libraryHandle); + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) FrontendInfo NOT available, errorcode = " << error + << ", message=\"" << m_fpGetErrorCodeMessage(m_libraryHandle, error) << "\"\n"; + // return false; + } + return true; +} + +bool CTMSiAccess::calculateSignalFormat(const char* deviceID) +{ + if (!m_opened) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) No FrontEnd opened\n"; + return false; + } + + m_hasChannelStructure = false; + m_nActualChannel = 0; + m_nMaxEEGChannel = 0; + + char deviceIdentifier[1024]; + strcpy(deviceIdentifier, deviceID); + m_signalFormat = m_fpGetSignalFormat(m_libraryHandle, deviceIdentifier); + + if (m_signalFormat == nullptr) { + const int error = m_fpGetErrorCode(m_libraryHandle); + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi)Error getting channel format, errorcode = " << error + << ", message=\"" << m_fpGetErrorCodeMessage(m_libraryHandle, error) << "\"\n"; + return false; + } + + // Count the EEG channels + m_nMaxEEGChannel = 0; + + m_nActualChannel = m_signalFormat->Elements; + // go through the channels and find the number of EEG channels and additional channels + // NOTE that this ONLY work if all EEG channels are listed first + for (size_t i = 0; i < size_t(m_signalFormat->Elements); ++i) { + if (m_signalFormat[i].Type == CHANNELTYPE_EXG) { m_nMaxEEGChannel++; } + else if (m_signalFormat[i].Type == CHANNELTYPE_BIP) { m_nMaxEEGChannel++; } + else if (m_signalFormat[i].Type == CHANNELTYPE_AUX) { m_nMaxEEGChannel++; } + } + + m_hasChannelStructure = true; + + // the pointer is initialized and held by the library so we can store it + return true; +} + +bool CTMSiAccess::printSignalFormat() +{ + if (m_signalFormat != nullptr) { + for (int i = 0; i < int(m_signalFormat->Elements); ++i) { + char channelInfo[1024]; + CString channelName = getChannelName(i); + + sprintf(channelInfo, "%3d: %s Format %d Type %d Bytes %d Subtype %d UnitId %d UnitExponent %d", i, channelName.toASCIIString(), + int(m_signalFormat[i].Format), int(m_signalFormat[i].Type), int(m_signalFormat[i].Bytes), int(m_signalFormat[i].SubType), + int(m_signalFormat[i].UnitId), int(m_signalFormat[i].UnitExponent)); + + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) " << channelInfo << "\n"; + } + } + else { return false; } + + return true; +} + +CString CTMSiAccess::getChannelName(const size_t index) const +{ + if (m_signalFormat == nullptr || index >= m_signalFormat->Elements) { return ""; } + + char channelName[SIGNAL_NAME + 1]; + for (int i = 0; i < SIGNAL_NAME; ++i) { channelName[i] = char(m_signalFormat[index].Name[i]); } + channelName[SIGNAL_NAME] = '\0'; + + return CString(channelName); +} + +CString CTMSiAccess::getChannelType(const size_t index) const +{ + if (m_signalFormat == nullptr || index >= m_signalFormat->Elements) { return ""; } + + switch (m_signalFormat[index].Type) { + case CHANNELTYPE_UNKNOWN: return "Unknown"; + case CHANNELTYPE_EXG: return "EXG"; + case CHANNELTYPE_BIP: return "BIP"; + case CHANNELTYPE_AUX: return "AUX"; + case CHANNELTYPE_DIG: return "DIG"; + case CHANNELTYPE_TIME: return "TIME"; + case CHANNELTYPE_LEAK: return "LEAK"; + case CHANNELTYPE_PRESSURE: return "PRESSURE"; + case CHANNELTYPE_ENVELOPE: return "ENVELOPE"; + case CHANNELTYPE_MARKER: return "MARKER"; + case CHANNELTYPE_SAW: return "RAMP"; + case CHANNELTYPE_SAO2: return "SAO2"; + default: return "Unknown"; + } +} + +void CTMSiAccess::freeSignalFormat() +{ + if (m_signalFormat != nullptr) { + m_fpFree(m_signalFormat); + m_signalFormat = nullptr; + } +} + +bool CTMSiAccess::setCommonModeRejection(const bool isCommonModeRejectionEnabled) +{ + const int statusCAR = isCommonModeRejectionEnabled ? 1 : 0; + + if (m_fpSetRefCalculation(m_libraryHandle, statusCAR)) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Common mode rejection set to " << statusCAR << "\n"; + } + else { + const int error = m_fpGetErrorCode(m_libraryHandle); + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) Can not set common mode rejection, errorcode = " << error + << ", message=\"" << m_fpGetErrorCodeMessage(m_libraryHandle, error) << "\"\n"; + return false; + } + + return true; +} + +bool CTMSiAccess::setActiveChannels(CHeader* header, const CString& additionalChannels) +{ + const size_t activeChannels = header->getChannelCount(); + bool hasRenamedAChannel = false; + + m_isChannelsActivated.clear(); + m_isChannelsActivated.resize(m_nActualChannel, false); + + size_t nActiveAdditionalChannel = 0; + + for (size_t i = m_nMaxEEGChannel; i < m_nActualChannel; ++i) { + if (std::string(additionalChannels.toASCIIString()).find(std::string(";") + std::string(getChannelName(i).toASCIIString()) + std::string(";")) + != std::string::npos) { + m_isChannelsActivated[i] = true; + nActiveAdditionalChannel++; + } + else { m_isChannelsActivated[i] = false; } + } + + const size_t activeEEGChannelIdx = activeChannels - nActiveAdditionalChannel; + + for (size_t i = 0; i < activeEEGChannelIdx; ++i) { + m_isChannelsActivated[i] = true; + if (strcmp(header->getChannelName(i), "") != 0) { hasRenamedAChannel = true; } + } + for (size_t i = activeEEGChannelIdx; i < m_nMaxEEGChannel; ++i) { m_isChannelsActivated[i] = false; } + + m_nActiveChannel = activeChannels; + + // set names of EEG channels if none were renamed + if (!hasRenamedAChannel) { for (size_t i = 0; i < activeEEGChannelIdx; i++) { header->setChannelName(i, getChannelName(i)); } } + + // set names of additional channels + size_t currentChannel = activeEEGChannelIdx; + for (size_t i = m_nMaxEEGChannel; i < m_nActualChannel; i++) { + if (m_isChannelsActivated[i]) { + header->setChannelName(currentChannel, getChannelName(i)); + currentChannel++; + } + } + + return true; +} + +bool CTMSiAccess::setSignalBuffer(const unsigned long sampling, unsigned long bufferSizeInSamples) +{ + if (!m_opened) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) No FrontEnd opened\n"; + return false; + } + + if (!m_hasChannelStructure) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) The SignalFormat structure was not initialized\n"; + return false; + } + + // if the buffer size in samples is too big, change it automatically to the MAX for the current device + if (bufferSizeInSamples > m_maxBufferSize) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) The desired buffer size is too large, setting to maximum for the device instead" + << "\n"; + bufferSizeInSamples = m_maxBufferSize; + } + + ULONG samplingFrequency = sampling; + ULONG size = bufferSizeInSamples; + + if (m_fpSetSignalBuffer(m_libraryHandle, &samplingFrequency, &size)) { + if (samplingFrequency == sampling && size == bufferSizeInSamples) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) SignalBuffer set to " << size_t(samplingFrequency) << " " << size_t(size) << "\n"; + } + else { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Frontend does not support this Sampling Rate/Buffer Size combination\n"; + return false; + } + } + else { + const int error = m_fpGetErrorCode(m_libraryHandle); + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) Can not setSignalBuffer, errorcode = " << error + << ", message=\"" << m_fpGetErrorCodeMessage(m_libraryHandle, error) << "\"\n"; + return false; + } + + if (m_sampleBuffer != nullptr) { + delete[] m_sampleBuffer; + m_sampleBuffer = nullptr; + } + + + m_signalBufferSizeInBytes = size * m_nActualChannel * sizeof(m_sampleBuffer[0]); + m_sampleBuffer = new unsigned long[m_signalBufferSizeInBytes]; + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Allocating sample buffer with " << size_t(m_signalBufferSizeInBytes) << "\n"; + + m_hasBufferSet = true; + + return true; +} + +bool CTMSiAccess::setSignalMeasuringModeToCalibration() { return setSignalMeasuringMode(MEASURE_MODE_CALIBRATION_EX); } + +bool CTMSiAccess::setSignalMeasuringModeToImpedanceCheck(const int limit) { return setSignalMeasuringMode(MEASURE_MODE_IMPEDANCE_EX, limit); } + +bool CTMSiAccess::setSignalMeasuringModeToNormal() { return setSignalMeasuringMode(MEASURE_MODE_NORMAL); } + +bool CTMSiAccess::startAcquisition() +{ + if (m_isStarted) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Acquisition has already been started\n"; + return true; + } + + if (m_libraryHandle == nullptr) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) TMSi library not accessible\n"; + return false; + } + + if (!m_hasBufferSet) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) Can not start acquisition without setting buffer first\n"; + return false; + } + + if (m_fpStart(m_libraryHandle)) { m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Starting Acquisition\n"; } + else { + const int error = m_fpGetErrorCode(m_libraryHandle); + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) Can not start acqusition, errorcode = " << error << ", message=\"" << + m_fpGetErrorCodeMessage(m_libraryHandle, error) << "\"\n"; + return false; + } + + m_lastSampleIndexInBuffer = 0; + m_isStarted = true; + + return true; +} + +bool CTMSiAccess::stopAcquisition() +{ + if (m_libraryHandle == nullptr) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) TMSi library not accessible\n"; + return false; + } + + if (!m_isStarted) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) Acquisition has not been started yet\n"; + return true; + } + + if (m_fpStop(m_libraryHandle)) { m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Stopping Acquisition\n"; } + else { + const int error = m_fpGetErrorCode(m_libraryHandle); + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) Can not stop acqusition, errorcode = " << error + << ", message=\"" << m_fpGetErrorCodeMessage(m_libraryHandle, error) << "\"\n"; + return false; + } + + getConnectionProperties(); + m_lastSampleIndexInBuffer = 0; + m_isStarted = false; + return true; +} + +int CTMSiAccess::getSamples(float* samples, IDriverCallback* driverCB, const uint64_t nSamplePerSentBlock, const uint32_t sampling) +{ + // since this function is called all the time, we do not do safety checks + const long nBytesReceived = m_fpGetSamples(m_libraryHandle, m_sampleBuffer, m_signalBufferSizeInBytes); + + if (nBytesReceived > 0) { + const uint32_t samplesReceived = nBytesReceived / m_nActualChannel / sizeof(m_sampleBuffer[0]); + + for (uint32_t i = 0; i < samplesReceived; ++i) { + uint32_t virtualChannel = 0; + for (uint32_t c = 0; c < m_nActualChannel; ++c) { + if (m_isChannelsActivated[c]) { + // pointer to the current sample inside the signal sample buffer + float* sampleValueInFloat = &samples[virtualChannel * nSamplePerSentBlock + m_lastSampleIndexInBuffer]; + // std::cout << virtualChannel * m_nActiveChannel + m_sampleIdx << std::endl; + + const psignal_format_t currentSampleSignalFormat = &m_signalFormat[c]; + + // Calculate the floating value from the received integer value + // For overflow of a analog channel, set the value to zero + if (m_sampleBuffer[c + i * m_nActualChannel] == OVERFLOW_32BITS && + (currentSampleSignalFormat->Type == CHANNELTYPE_EXG || + currentSampleSignalFormat->Type == CHANNELTYPE_BIP || + currentSampleSignalFormat->Type == CHANNELTYPE_AUX)) { + *sampleValueInFloat = 0; // Set it to a value you find a good sign of a overflow + } + + else { + switch (currentSampleSignalFormat->Format) { + case SF_UNSIGNED: // unsigned integer + *sampleValueInFloat = float(m_sampleBuffer[c + i * m_nActualChannel] * currentSampleSignalFormat->UnitGain + + currentSampleSignalFormat->UnitOffSet); + break ; + case SF_INTEGER: // signed integer + *sampleValueInFloat = float(int(m_sampleBuffer[c + i * m_nActualChannel]) * currentSampleSignalFormat->UnitGain + + currentSampleSignalFormat->UnitOffSet); + break ; + default: + *sampleValueInFloat = 0; // For unknown types, set the value to zero + break ; + } + } + + virtualChannel++; + } + + // process DIGI channel, to receive hardware stimulations + if (m_signalFormat[c].Type == CHANNELTYPE_DIG) { + uint32_t trigger = m_sampleBuffer[i * m_nActualChannel + c]; + + // invert bits + trigger = ~trigger; + + // mask for bits 0-7 (see Refa manual) + trigger &= 255; + + // add 0x8100 to match OVTK_StimulationId_Label_00 stimulation code + trigger += 0x8100U; + + // add stimulation to SimulationSet + if (m_lastTriggerValue != trigger) { + const uint64_t time = CTime(sampling, uint64_t(m_lastSampleIndexInBuffer)).time(); + m_stimSet.push_back(trigger, time, 0); + m_lastTriggerValue = trigger; + } + } + } + m_lastSampleIndexInBuffer++; + + if (m_lastSampleIndexInBuffer == nSamplePerSentBlock) { + driverCB->setSamples(samples); + driverCB->setStimulationSet(m_stimSet); + m_stimSet.clear(); + m_lastSampleIndexInBuffer = 0; + m_driverCtx.correctDriftSampleCount(m_driverCtx.getSuggestedDriftCorrectionSampleCount()); + } + } + } + else if (nBytesReceived == 0) { + ULONG overflow, percentFull; + const int status = m_fpGetBufferInfo(m_libraryHandle, &overflow, &percentFull); + + if (status != 0 && overflow > 0 && percentFull > 0) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Overflow " << int(overflow) << " PercentFull " << int(percentFull) << "\n"; + } + } + else { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) Can not read data, errorcode = " << nBytesReceived + << ", message=\"" << m_fpGetErrorCodeMessage(m_libraryHandle, nBytesReceived) << "\"\n"; + + const int code = m_fpGetErrorCode(m_libraryHandle); + if (code != 0) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) Additional error, errorcode = " << code + << ", message=\"" << m_fpGetErrorCodeMessage(m_libraryHandle, code) << "\"\n"; + } + return -1; + } + + return nBytesReceived; +} + +bool CTMSiAccess::getImpedanceValues(std::vector<double>* impedanceValues) +{ + impedanceValues->resize(m_nActualChannel); + + // since this function is called all the time, we do not do safety checks + const long nBytesReceived = m_fpGetSamples(m_libraryHandle, m_sampleBuffer, m_signalBufferSizeInBytes); + + if (nBytesReceived > 0) { + // We only look at the first sample in the whole buffer, no need to look at all values + for (uint32_t i = 0; i < 1; ++i) { + uint32_t virtualChannel = 0; + for (uint32_t c = 0; c < m_nActualChannel; ++c) { + if (m_isChannelsActivated[c]) { + // Impedance values are returned in MOhm it seems + (*impedanceValues)[virtualChannel] = m_sampleBuffer[c + i * m_nActualChannel] * 1000.0; + virtualChannel++; + } + } + } + } + else if (nBytesReceived == 0) { } + else { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) Can not read impedance data, errorcode = " << nBytesReceived + << ", message=\"" << m_fpGetErrorCodeMessage(m_libraryHandle, nBytesReceived) << "\"\n"; + + const int error = m_fpGetErrorCode(m_libraryHandle); + if (error != 0) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) Additional error, errorcode = " << error + << ", message=\"" << m_fpGetErrorCodeMessage(m_libraryHandle, error) << "\"\n"; + } + return false; + } + + return true; +} + +bool CTMSiAccess::getConnectionProperties() const +{ + uint32_t signalStrength; + uint32_t nCrcErrors; + uint32_t nSampleBlocks; + + if (m_fpGetConnectionProperties(m_libraryHandle, &signalStrength, &nCrcErrors, &nSampleBlocks)) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) fpGetConnectionProperties SignalStrength " << signalStrength + << " NrOfCRCErrors " << nCrcErrors << " NrOfSampleBlocks " << nSampleBlocks << "\n"; + } + else { + const int error = m_fpGetErrorCode(m_libraryHandle); + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) Error getting channel format, errorcode = " << error + << ", message=\"" << m_fpGetErrorCodeMessage(m_libraryHandle, error) << "\"\n"; + return false; + } + + return true; +} + +// PRIVATE METHODS + +bool CTMSiAccess::setSignalMeasuringMode(const ULONG measuringMode, const int value) +{ + if (!m_opened) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) No FrontEnd opened\n"; + return false; + } + + if (!m_isStarted) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) This method must be called after the frontend is started\n"; + return false; + } + + int modeValue = 0; + CString modeName("Normal"); + + if (measuringMode == MEASURE_MODE_CALIBRATION_EX) { + modeValue = CALIBRATION_VOLTAGE; + modeName = "Calibration"; + } + else if (measuringMode == MEASURE_MODE_IMPEDANCE_EX) { + modeValue = value; + modeName = "Impedance"; + } + + if (m_fpSetMeasuringMode(m_libraryHandle, measuringMode, modeValue)) { + m_driverCtx.getLogManager() << Kernel::LogLevel_Trace << "(TMSi) Device set to " << modeName << " mode [" << modeValue << "]\n"; + } + else { + const int error = m_fpGetErrorCode(m_libraryHandle); + m_driverCtx.getLogManager() << Kernel::LogLevel_Warning << "(TMSi) Failed setting the device to " << modeName << " mode, errorcode = " << error + << ", message=\"" << m_fpGetErrorCodeMessage(m_libraryHandle, error) << "\"\n"; + return false; + } + + return true; +} + +} // namespace AcquisitionServer +} // namespace OpenViBE +#endif diff --git a/applications/platform/acquisition-server/src/OVASDrivers/tmsi/ovasCTMSiAccess.h b/applications/platform/acquisition-server/src/OVASDrivers/tmsi/ovasCTMSiAccess.h new file mode 100644 index 0000000000000000000000000000000000000000..2a14f8ccd615dc85dbbfe75c441816938f09e0b6 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASDrivers/tmsi/ovasCTMSiAccess.h @@ -0,0 +1,384 @@ +///------------------------------------------------------------------------------------------------- +/// \copyright Copyright (C) 2014, Mensia Technologies SA. All rights reserved. +/// Rights transferred to Inria, contract signed 21.11.2014 +///------------------------------------------------------------------------------------------------- + +#pragma once + +#if defined TARGET_OS_Windows + +#include "ovas_base.h" +#include "Windows.h" +//#include "TMSiSDK.h" + +#include <map> +#include <vector> + +// TMSi Declared Defines, Enums and Types + +// Measurement modes: +#define MEASURE_MODE_NORMAL ((ULONG)0x0) +#define MEASURE_MODE_IMPEDANCE ((ULONG)0x1) +#define MEASURE_MODE_CALIBRATION ((ULONG)0x2) + +#define MEASURE_MODE_IMPEDANCE_EX ((ULONG)0x3) +#define MEASURE_MODE_CALIBRATION_EX ((ULONG)0x4) + +// for MEASURE_MODE_IMPEDANCE: +#define IC_OHM_002 0 ///< 2K Impedance limit */ +#define IC_OHM_005 1 ///< 5K Impedance limit */ +#define IC_OHM_010 2 ///< 10K Impedance limit */ +#define IC_OHM_020 3 ///< 20K Impedance limit */ +#define IC_OHM_050 4 ///< 50K Impedance limit */ +#define IC_OHM_100 5 ///< 100K Impedance limit */ +#define IC_OHM_200 6 ///< 200K Impedance limit */ + +// for MEASURE_MODE_CALIBRATION: +#define IC_VOLT_050 0 ///< 50 uV t-t Calibration voltage */ +#define IC_VOLT_100 1 ///< 100 uV t-t Calibration voltage */ +#define IC_VOLT_200 2 ///< 200 uV t-t Calibration voltage */ +#define IC_VOLT_500 3 ///< 500 uV t-t Calibration voltage */ + +// for Signat Format +#define SF_UNSIGNED 0x0 ///< Unsigned integer +#define SF_INTEGER 0x1 ///< signed integer + +// integer overflow value for analog channels +#define OVERFLOW_32BITS ((long) 0x80000000) + +// Get Signal info +#define SIGNAL_NAME 40 + +typedef struct SSignalFormat +{ + ULONG Size; // Size of this structure + ULONG Elements; // Number of elements in list + + ULONG Type; // One of the signal types above + ULONG SubType; // One of the signal sub-types above + ULONG Format; // Float / Integer / Asci / Ect.. + ULONG Bytes; // Number of bytes per sample including subsignals + + FLOAT UnitGain; + FLOAT UnitOffSet; + ULONG UnitId; + LONG UnitExponent; + + WCHAR Name[SIGNAL_NAME]; + + ULONG Port; + WCHAR PortName[SIGNAL_NAME]; + ULONG SerialNumber; +} signal_format_t, *psignal_format_t; + +// This structure contains information about the possible configuration of the frontend +typedef struct SFrontEndInfo +{ + unsigned short NrOfChannels; ///< Current number of channels used */ + unsigned short SampleRateSetting; ///< Current sample rate setting (a.k.a. base sample rate divider ) */ + unsigned short Mode; ///< operating mode */ + unsigned short maxRS232; + unsigned long Serial; ///< Serial number */ + unsigned short NrExg; ///< Number of Exg channels in this device */ + unsigned short NrAux; ///< Number of Aux channels in this device */ + unsigned short HwVersion; ///< Version number for the hardware */ + unsigned short SwVersion; ///< Version number of the embedded software */ + unsigned short RecBufSize; ///< Used for debugging only */ + unsigned short SendBufSize; ///< Used for debugging only */ + unsigned short NrOfSwChannels; ///< Max. number of channels supported by this device */ + unsigned short BaseSf; ///< Max. sample frequency */ + unsigned short Power; + unsigned short Check; +} front_end_info_t, *pfront_end_info_t; + +// Enum defined based on the communication methods from tmsi_ext_frontend_info_type_t +typedef enum ETmSiConnection +{ + TMSiConnectionUndefined = 0, ///< Undefined connection, indicates programming error */ + TMSiConnectionFiber, ///< Obsolete, do not use */ + TMSiConnectionBluetooth, ///< Bluetooth connection with Microsoft driver */ + TMSiConnectionUSB, ///< USB 2.0 connection direct */ + TMSiConnectionWifi, ///< Network connection, Ip-adress and port needed, wireless */ + TMSiConnectionNetwork ///< Network connection, Ip-adress and port needed, wired */ +} tmsi_connection_type_t; + + +// Mobita specific: This structure contains information about the current battery state +typedef struct STmSiBatReport +{ + short Temp; ///< Battery temperatur in degree Celsius (�C) */ + short Voltage; ///< Battery Voltage in milliVolt (mV) */ + short Current; ///< Battery Current in milliAmpere (mA) */ + short AccumCurrent; ///< Battery Accumulated Current in milliAmpere (mA) */ + short AvailableCapacityInPercent; ///< Available battery Capacity In Percent, range 0-100 */ + unsigned short DoNotUse1; ///< Do not use, reserved for future use */ + unsigned short DoNotUse2; ///< Do not use, reserved for future use */ + unsigned short DoNotUse3; ///< Do not use, reserved for future use */ + unsigned short DoNotUse4; ///< Do not use, reserved for future use */ +} tmsi_bat_report_type_t; + +// Mobita specific: This structure contains information about the current state of the internal storage +typedef struct STmSiStorageReport +{ + uint32_t StructSize; ///< Size of struct in words */ + uint32_t TotalSize; ///< Total size of the internal storage in MByte (=1024x1024 bytes) */ + uint32_t UsedSpace; ///< Used space on the internal storage in MByte (=1024x1024 bytes)*/ + uint32_t SDCardCID[4]; ///< The CID register of the current SD-Card. */ + unsigned short DoNotUse1; ///< Do not use, reserved for future use */ + unsigned short DoNotUse2; ///< Do not use, reserved for future use */ + unsigned short DoNotUse3; ///< Do not use, reserved for future use */ + unsigned short DoNotUse4; ///< Do not use, reserved for future use */ +} tmsi_storage_report_type_t; + +// Mobita specific: This structure contains information about the current and past use of the Mobita +typedef struct STmSiDeviceReport +{ + uint32_t AdapterSN; ///< Serial number of the current connected Adapter */ + uint32_t AdapterStatus; ///< 0=Unknown; 1=Ok;2=MemError */ + uint32_t AdapterCycles; ///< Number of connections made by the Adapter. */ + uint32_t MobitaSN; ///< Serial number of the Mobita */ + uint32_t MobitaStatus; ///< Statis of the Mobita : 0=Unknown; 1=Ok;2=MemError;3=BatError; */ + uint32_t MobitaCycles; ///< Number of adapter connections made by the Mobita */ + unsigned short DoNotUse1; ///< Do not use, reserved for future use */ + unsigned short DoNotUse2; ///< Do not use, reserved for future use */ + unsigned short DoNotUse3; ///< Do not use, reserved for future use */ + unsigned short DoNotUse4; ///< Do not use, reserved for future use */ +} tmsi_device_report_type_t; + +// Mobita specific: This structure contains information about the current sampling configuration +typedef struct STmSiExtFrontendInfo +{ + unsigned short CurrentSamplerate; ///< in Hz */ + unsigned short CurrentInterface; ///< 0 = Unknown; 1 = Fiber; 2 = Bluetooth; 3 = USB; 4 = WiFi; 5 = Network*/ + unsigned short CurrentBlockType; ///< The blocktype used to send sample data for the selected CurrentFs and selected CurrentInterface */ + unsigned short DoNotUse1; ///< Do not use, reserved for future use */ + unsigned short DoNotUse2; ///< Do not use, reserved for future use */ + unsigned short DoNotUse3; ///< Do not use, reserved for future use */ + unsigned short DoNotUse4; ///< Do not use, reserved for future use */ +} tmsi_ext_frontend_info_type_t; + +//----------- TYPE --------------------- + +#define CHANNELTYPE_UNKNOWN 0 +#define CHANNELTYPE_EXG 1 +#define CHANNELTYPE_BIP 2 +#define CHANNELTYPE_AUX 3 +#define CHANNELTYPE_DIG 4 +#define CHANNELTYPE_TIME 5 +#define CHANNELTYPE_LEAK 6 +#define CHANNELTYPE_PRESSURE 7 +#define CHANNELTYPE_ENVELOPE 8 +#define CHANNELTYPE_MARKER 9 +#define CHANNELTYPE_SAW 10 +#define CHANNELTYPE_SAO2 11 + +#define MAX_BUFFER_SIZE 0xFFFFFFFF + +typedef BOOLEAN ( __stdcall * POPEN )(void* handle, const char* deviceLocator); +typedef BOOLEAN ( __stdcall * PCLOSE )(HANDLE handle); +typedef BOOLEAN ( __stdcall * PSTART)(IN HANDLE handle); +typedef BOOLEAN ( __stdcall * PSTOP)(IN HANDLE handle); +typedef BOOLEAN ( __stdcall * PSETSIGNALBUFFER)(IN HANDLE handle,IN OUT PULONG sampling,IN OUT PULONG size); +typedef BOOLEAN ( __stdcall * PGETBUFFERINFO)(IN HANDLE handle,OUT PULONG overflow,OUT PULONG percentFull); +typedef LONG ( __stdcall * PGETSAMPLES)(IN HANDLE handle,OUT PULONG sampleBuffer,IN ULONG size); +typedef psignal_format_t ( __stdcall * PGETSIGNALFORMAT)(IN HANDLE handle, IN OUT char* frontEndName); +typedef BOOLEAN ( __stdcall * PFREE)(IN VOID* memory); +typedef HANDLE ( __stdcall * PLIBRARYINIT)(IN tmsi_connection_type_t givenConnectionType, IN OUT int* errorCode); +typedef int ( __stdcall * PLIBRARYEXIT)(IN HANDLE handle); +typedef BOOLEAN ( __stdcall * PGETFRONTENDINFO)(IN HANDLE handle, IN OUT front_end_info_t* frontEndInfo); +typedef BOOLEAN ( __stdcall * PSETRTCTIME)(IN HANDLE handle,IN SYSTEMTIME* inTime); +typedef BOOLEAN ( __stdcall * PGETRTCTIME)(IN HANDLE handle,IN SYSTEMTIME* inTime); +typedef int ( __stdcall * PGETERRORCODE)(IN HANDLE handle); +typedef const char* ( __stdcall * PGETERRORCODEMESSAGE)(IN HANDLE handle, IN int errorCode); +typedef char** ( __stdcall * PGETDEVICELIST)(IN HANDLE handle, IN OUT int* nFrontEnds); +typedef void ( __stdcall * PFREEDEVICELIST)(HANDLE handle, int nFrontEnds, char** deviceList); +typedef BOOLEAN ( __stdcall * PSETREFCALCULATION)(IN HANDLE handle, int onOrOff); +typedef BOOLEAN ( __stdcall * PSETMEASURINGMODE)(IN HANDLE handle,IN ULONG mode, IN int value); +typedef BOOLEAN ( __stdcall * PGETCONNECTIONPROPERTIES)(IN HANDLE handle, IN OUT uint32_t* signalStrength, IN OUT uint32_t* nCrcErrors, + IN OUT uint32_t* nSampleBlocks); +typedef BOOLEAN ( __stdcall * PGETEXTFRONTENDINFO)(IN HANDLE handle, IN OUT tmsi_ext_frontend_info_type_t* extFrontEndInfo, + tmsi_bat_report_type_t* batteryReport, tmsi_storage_report_type_t* storageReport, + tmsi_device_report_type_t* deviceReport); + + +// END TMSi + +namespace OpenViBE { +namespace AcquisitionServer { +class IDriverContext; +class IDriverCallback; +class CHeader; + +class CTMSiAccess +{ +public: + explicit CTMSiAccess(IDriverContext& ctx); + ~CTMSiAccess(); + + std::map<CString, std::pair<ETmSiConnection, int>> getConnectionProtocols() const { return m_connectionProtocols; } + + // Initialize the TMSi library with the currently chosen protocol + bool initializeTMSiLibrary(const char* connectionProtocol); + + // Open a frontend (identified by a string) on the currently set protocol + bool openFrontEnd(const char* deviceID); + + // Close the currently opened frontend + bool closeFrontEnd(); + + // Returns a vector of available sampling frequencies of the device, in case of error returns an empty vector + std::vector<unsigned long> discoverDeviceSamplingFrequencies(); + + // Run diagnostics on the device, ask for FrontEndInfo and extFrontEndInfo + bool runDiagnostics(); + + bool getImpedanceTestingCapability(bool* hasImpedanceTestingAbility) const; + + // Initializes the SignalFormat structure inside the driver + // Calculates number of EEG and additional Channels + bool calculateSignalFormat(const char* deviceID); + + // Print the signal format into Trace Log + bool printSignalFormat(); + + // Return the number of EEG channels on the device (must call calculateSignalFormat first) + uint32_t getMaximumEEGChannelCount() const { return m_nMaxEEGChannel; } + + // Return the number of all channels on the device (must call calculateSignalFormat first) + uint32_t getActualChannelCount() const { return m_nActualChannel; } + + // Return the name of the channel at desired index + CString getChannelName(size_t index) const; + + // Return the type of the channel at desired index + CString getChannelType(size_t index) const; + + // Frees the SignalFormat structure in this object and in the library + void freeSignalFormat(); + + // Returns the list of devices found on the current protocol + std::vector<CString> getDeviceList() const { return m_devices; } + + // ACQUISITION SETTINGS + + // Enable or disable the common average reference calculation + bool setCommonModeRejection(bool isCommonModeRejectionEnabled); + + bool setActiveChannels(CHeader* header, const CString& additionalChannels); + + // sets the signal buffer to values known to be functional, returns false if they are inconsistent + bool setSignalBuffer(unsigned long sampling, unsigned long bufferSizeInSamples); + + bool setSignalMeasuringModeToNormal(); + bool setSignalMeasuringModeToImpedanceCheck(int limit); + bool setSignalMeasuringModeToCalibration(); + + // ACQUISITION HANDLING + + bool startAcquisition(); + int getSamples(float* samples, IDriverCallback* driverCB, uint64_t nSamplePerSentBlock, uint32_t sampling); + bool getImpedanceValues(std::vector<double>* impedanceValues); + bool stopAcquisition(); + + + // Gets connection properties, such as signal strength or errors since last call and prints them to Trace Log + bool getConnectionProperties() const; + +private: // private variables + + // status holders + bool m_isInitialized = false; + bool m_opened = false; + bool m_hasChannelStructure = false; + bool m_hasBufferSet = false; + bool m_isStarted = false; + + // informations about the last scanned protocol + std::vector<CString> m_devices; + + // informations about the last scanned device + psignal_format_t m_signalFormat; + unsigned long m_maxBufferSize; + + unsigned long m_nMaxEEGChannel; + unsigned long m_nActualChannel; + std::vector<bool> m_isChannelsActivated; + uint32_t m_nActiveChannel = 0; + + unsigned long m_signalBufferSizeInBytes; + + // buffer for stored signal + unsigned long* m_sampleBuffer; + // index of the current (last) sample in the buffer + uint32_t m_lastSampleIndexInBuffer = 0; + + // device connection protocols + std::map<CString, std::pair<ETmSiConnection, int>> m_connectionProtocols; + + IDriverContext& m_driverCtx; + bool m_valid = false; + + CStimulationSet m_stimSet; + uint32_t m_lastTriggerValue = 0; + + // private methods + bool setSignalMeasuringMode(ULONG measuringMode, int value = 0); + + // DLL library handling members + // The HANDLE type returned by the library is basically a void* (avoids including windows headers to the .h) + HANDLE m_libraryHandle; + + template <typename T> + void loadDLLFunct(T* functionPointer, const char* functionName); + + // TMSi Library functions + POPEN m_fpOpen; + PCLOSE m_fpClose; + PSTART m_fpStart; + PSTOP m_fpStop; + PSETSIGNALBUFFER m_fpSetSignalBuffer; + PGETBUFFERINFO m_fpGetBufferInfo; + PGETSAMPLES m_fpGetSamples; + PGETSIGNALFORMAT m_fpGetSignalFormat; + PFREE m_fpFree; + PLIBRARYINIT m_fpLibraryInit; + PLIBRARYEXIT m_fpLibraryExit; + PGETFRONTENDINFO m_fpGetFrontEndInfo; + PSETRTCTIME m_fpSetRtcTime; + PGETRTCTIME m_fpGetRtcTime; + + PGETERRORCODE m_fpGetErrorCode; + PGETERRORCODEMESSAGE m_fpGetErrorCodeMessage; + + PGETDEVICELIST m_fpGetDeviceList; + PFREEDEVICELIST m_fpFreeDeviceList; + + PGETCONNECTIONPROPERTIES m_fpGetConnectionProperties; + PSETREFCALCULATION m_fpSetRefCalculation; + PSETMEASURINGMODE m_fpSetMeasuringMode; + PGETEXTFRONTENDINFO m_fpGetExtFrontEndInfo; + + /* + // NeXus10MkII functionality + PGETRANDOMKEY m_fpGetRandomKey; + PUNLOCKFRONTEND m_fpUnlockFrontEnd; + PGETOEMSIZE m_fpGetOEMSize; + PSETOEMDATA m_fpSetOEMData; + PGETOEMDATA m_fpGetOEMData; + POPENFIRSTDEVICE m_oFopenFirstDevice; + PSETSTORAGEMODE m_fpSetStorageMode; + PGETDIGSENSORID m_fpGetDigSensorId; + PGETDIGSENSORCONFIG m_fpGetDigSensorConfig; + PGETDIGSENSORDATA m_fpGetDigSensorData; + PGETFLASHSTATUS m_fpGetFlashStatus; + PSTARTFLASHDATA m_fpStartFlashData; + PGETFLASHSAMPLES m_fpGetFlashSamples; + PSTOPFLASHDATA m_fpStopFlashData; + PFLASHERASEMEMORY m_fpFlashEraseMemory; + PSETFLASHDATA m_fpSetFlashData; + */ +}; +} // namespace AcquisitionServer +} // namespace OpenViBE + +#endif diff --git a/applications/platform/acquisition-server/src/OVASInterface/CMakeLists.txt b/applications/platform/acquisition-server/src/OVASInterface/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..b9cacebfe6b6e3cd20993d8b8483d81ff89ed926 --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASInterface/CMakeLists.txt @@ -0,0 +1,31 @@ +project(OVASInterface VERSION ${OPENVIBE_MAJOR_VERSION}.${OPENVIBE_MINOR_VERSION}.${OPENVIBE_PATCH_VERSION}) + +qt_add_qml_module(${PROJECT_NAME} STATIC +URI + ${PROJECT_NAME} +VERSION + 1.0 +PLUGIN_TARGET + ${PROJECT_NAME} +SOURCES + OVMaster.h + OVMaster.cpp +NO_CACHEGEN) + +target_compile_definitions(${PROJECT_NAME} PRIVATE -DTARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines) + +target_link_libraries(${PROJECT_NAME} + PUBLIC + Qt::Gui + PRIVATE + Qt::Quick + OVASCore + OVASDrivers + openvibe-module-system +) + +# Install files +install(TARGETS ${PROJECT_NAME} + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) diff --git a/applications/platform/acquisition-server/src/OVASInterface/OVMaster.cpp b/applications/platform/acquisition-server/src/OVASInterface/OVMaster.cpp new file mode 100644 index 0000000000000000000000000000000000000000..90fb8ba793ac0fd5de8a4a81e942099ad387024b --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASInterface/OVMaster.cpp @@ -0,0 +1,148 @@ +#include "OVMaster.h" + +#include <system/ovCTime.h> + +#include "ovasIDriver.h" +#include "ovasCAcquisitionServer.h" + +// Simulation drivers +#include "generic-oscillator/ovasCDriverGenericOscillator.h" + +/* +#include "generic-sawtooth/ovasCDriverGenericSawTooth.h" +#include "generic-time-signal/ovasCDriverGenericTimeSignal.h" +#include "simulated-deviator/ovasCDriverSimulatedDeviator.h" + +#include "biosemi-activetwo/ovasCDriverBioSemiActiveTwo.h" +#include "brainproducts-actichamp/ovasCDriverBrainProductsActiCHamp.h" +#include "brainproducts-brainampseries/ovasCDriverBrainProductsBrainampSeries.h" +#include "brainproducts-vamp/ovasCDriverBrainProductsVAmp.h" +#include "brainproducts-liveamp/ovasCDriverBrainProductsLiveAmp.h" +#include "egi-ampserver/ovasCDriverEGIAmpServer.h" +#include "emotiv-epoc/ovasCDriverEmotivEPOC.h" +#include "labstreaminglayer/ovasCDriverLabStreamingLayer.h" +#include "micromed-systemplusevolution/ovasCDriverMicromedSystemPlusEvolution.h" +#include "mindmedia-nexus32b/ovasCDriverMindMediaNeXus32B.h" +#include "mcs-nvx/ovasCDriverMCSNVXDriver.h" +#include "neuroelectrics-enobio3g/ovasCDriverEnobio3G.h" +#include "neuroservo/ovasCDriverNeuroServoHid.h" +#include "neurosky-mindset/ovasCDriverNeuroskyMindset.h" +#include "tmsi/ovasCDriverTMSi.h" +#include "tmsi-refa32b/ovasCDriverTMSiRefa32B.h" + +#include "mensia-acquisition/ovasCDriverMensiaAcquisition.h" + +#include "shimmer-gsr/ovasCDriverShimmerGSR.hpp" +*/ + +#include <vector> + +namespace OpenViBE { +namespace AcquisitionServer { + +struct OVMasterPrivate { + + OVMasterPrivate(const Kernel::IKernelContext& kernelCtx): + m_acquisitionServer(new CAcquisitionServer(kernelCtx)) {} + + void initDrivers(); + void launchThread(); + + std::vector<IDriver*> m_drivers; + CAcquisitionServer* m_acquisitionServer = nullptr; +}; + +void OVMasterPrivate::initDrivers() +{ + + m_drivers.push_back(new CDriverGenericOscillator(m_acquisitionServer->getDriverContext())); + //m_drivers.push_back(new CDriverGenericSawTooth(m_acquisitionServer->getDriverContext())); + //m_drivers.push_back(new CDriverGenericTimeSignal(m_acquisitionServer->getDriverContext())); +} + +void OVMasterPrivate::launchThread() +{ + +} + +OVMaster::OVMaster() { + OpenViBE::CKernelLoader kernelLoader; + + std::cout << "[ INF ] Created kernel loader, trying to load kernel module" << std::endl; + OpenViBE::CString error; + + OpenViBE::CString kernelFile = OpenViBE::Directories::getLib("kernel"); + + if (!kernelLoader.load(kernelFile, &error)) { + std::cout << "[ FAILED ] Error loading kernel from [" << kernelFile << "]: " << error << "\n"; + } + else { + std::cout << "[ INF ] Kernel module loaded, trying to get kernel descriptor" << std::endl; + OpenViBE::Kernel::IKernelDesc* kernelDesc = nullptr; + kernelLoader.initialize(); + kernelLoader.getKernelDesc(kernelDesc); + if (!kernelDesc) { std::cout << "[ FAILED ] No kernel descriptor" << std::endl; } + else { + std::cout << "[ INF ] Got kernel descriptor, trying to create kernel" << std::endl; + + + OpenViBE::CString configFile = OpenViBE::CString(OpenViBE::Directories::getDataDir() + "/kernel/openvibe.conf"); + + OpenViBE::Kernel::IKernelContext* kernelCtx = kernelDesc->createKernel("acquisition-server", configFile); + if (!kernelCtx) { std::cout << "[ FAILED ] No kernel created by kernel descriptor" << std::endl; } + else { + kernelCtx->initialize(); + + OpenViBE::Kernel::IConfigurationManager& configManager = kernelCtx->getConfigurationManager(); + + // @FIXME CERT silent fail if missing file is provided + configManager.addConfigurationFromFile(configManager.expand("${Path_Data}/applications/acquisition-server/acquisition-server-defaults.conf")); + + // User configuration mods + configManager.addConfigurationFromFile(configManager.expand("${Path_UserData}/openvibe-acquisition-server.conf")); + + kernelCtx->getPluginManager().addPluginsFromFiles(configManager.expand("${AcquisitionServer_Plugins}")); + + /* + Commented out cause config is loaded from argc/argv in legacy, which is not in place here + for (auto itr = config.tokens.begin(); itr != config.tokens.end(); ++itr) { + kernelCtx->getLogManager() << OpenViBE::Kernel::LogLevel_Trace << "Adding command line configuration token [" + << (*itr).first.c_str() << " = " << (*itr).second.c_str() << "]\n"; + configManager.addOrReplaceConfigurationToken((*itr).first.c_str(), (*itr).second.c_str()); + } */ + + // Check the clock + if (!System::Time::isClockSteady()) { + kernelCtx->getLogManager() << OpenViBE::Kernel::LogLevel_Warning + << "The system does not seem to have a steady clock. This may affect the acquisition time precision.\n"; + } + + + d = new OVMasterPrivate(*kernelCtx); + d->initDrivers(); + d->launchThread(); + emit driverChanged(); + } + } + } + + +} + +QStringList OVMaster::getDrivers() { + QStringList drivers; + for (const auto driver: d->m_drivers) { + std::cout << Q_FUNC_INFO << " - Adding driver: " << driver->getName() << std::endl; + drivers.append(driver->getName()); + } + return drivers; +} + +OVMaster::~OVMaster() { + delete d; + +} + + +} // namespace AcquisitionServer +} // namespace OpenViBE \ No newline at end of file diff --git a/applications/platform/acquisition-server/src/OVASInterface/OVMaster.h b/applications/platform/acquisition-server/src/OVASInterface/OVMaster.h new file mode 100644 index 0000000000000000000000000000000000000000..7e048831fdf47dca51b93d009ad9c715ed85352d --- /dev/null +++ b/applications/platform/acquisition-server/src/OVASInterface/OVMaster.h @@ -0,0 +1,28 @@ +#include <QtCore> +#include <QtQml/qqmlregistration.h> + + +namespace OpenViBE { +namespace AcquisitionServer { + +class OVMaster : public QObject +{ + Q_OBJECT + QML_ELEMENT + + Q_PROPERTY(QStringList drivers READ getDrivers NOTIFY driverChanged) +public: + OVMaster(); + ~OVMaster(); + + QStringList getDrivers(); + +signals: + void driverChanged(); + +protected: + struct OVMasterPrivate *d = nullptr; +}; + +} // namespace AcquisitionServer +} // namespace OpenViBE \ No newline at end of file diff --git a/applications/platform/py2-check/CMakeLists.txt b/applications/platform/py2-check/CMakeLists.txt index c15b3f4f050feed5b249a551f82cd17281f9d49c..1cf03f0809d6a5fa04d4347a9f598e20c1746e24 100755 --- a/applications/platform/py2-check/CMakeLists.txt +++ b/applications/platform/py2-check/CMakeLists.txt @@ -21,10 +21,6 @@ include("FindThirdPartyPython2") if(WIN32) add_definitions("-DWIN32") endif() -# ---------------------- -# Generate launch script -# ---------------------- -OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "openvibe-py2-check" EXECUTABLE_NAME "${PROJECT_NAME}" PAUSE) # ----------------------------- # Install files diff --git a/applications/platform/py3-check/CMakeLists.txt b/applications/platform/py3-check/CMakeLists.txt index a09d9af90bd738bc0b862fb040c04b2e1bba0ea2..70f50a327cf5a8779ce44800ea46c4b61541c580 100644 --- a/applications/platform/py3-check/CMakeLists.txt +++ b/applications/platform/py3-check/CMakeLists.txt @@ -1,4 +1,3 @@ - # # Disabled until it behaves gracefully on a system without Python dll # @@ -10,7 +9,14 @@ project(openvibe-py3-check VERSION ${OPENVIBE_MAJOR_VERSION}.${OPENVIBE_MINOR_VE file(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.hpp src/*.inl) add_executable(${PROJECT_NAME} ${SRC_FILES}) set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER}) -include("FindThirdPartyPython3") + +target_link_libraries(${PROJECT_NAME} Python3::Python) + +if(win32) + # These are needed not to cause a popup on machines missing the dll + target_link_libraries(${PROJECT_NAME} optimized Delayimp ) + set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS "/DELAYLOAD:python37.dll") +endif() # --------------------------------- @@ -22,10 +28,6 @@ include("FindThirdPartyPython3") if(WIN32) add_definitions("-DWIN32") endif() -# ---------------------- -# Generate launch script -# ---------------------- -OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "openvibe-py3-check" EXECUTABLE_NAME "${PROJECT_NAME}" PAUSE) # ----------------------------- # Install files diff --git a/applications/platform/tracker/CMakeLists.txt b/applications/platform/tracker/CMakeLists.txt index 21c6faaa4a4f262cd261ec4c8dc2e830ec8f1c70..5ece3cf3eaa3e35ffdbe7db5d884459f67bb00ae 100755 --- a/applications/platform/tracker/CMakeLists.txt +++ b/applications/platform/tracker/CMakeLists.txt @@ -1,23 +1,30 @@ if(OV_DISABLE_GTK) - message(STATUS "Skipping Tracker, no GTK") - return() + message(STATUS "Skipping Tracker, no GTK") + return() endif(OV_DISABLE_GTK) project(openvibe-tracker VERSION ${OPENVIBE_MAJOR_VERSION}.${OPENVIBE_MINOR_VERSION}.${OPENVIBE_PATCH_VERSION}) file(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.hpp src/*.inl include/*.h include/*.hpp) +# FIXME Laurent G : 19/09/2023 +# Problems linking with mendia library, have to be created first +If (APPLE) + message(WARNING "Problems linking with mendia library, have to be created first. ${PROJECT_NAME} will not be build on APPLE") + return() +endif() + # @FIXME bad hack, we are cannibalizing a lot of non-exported code from Designer and Kernel -# Its better than copy-paste but it'd be preferable to either export the necessary materials +# Its better than copy-paste but it'd be preferable to either export the necessary materials # or make another solution. set(OV_AVP_PATH "${CMAKE_SOURCE_DIR}/designer/plugins/visualization/ovp-advanced-visualization/src/") LIST(APPEND SRC_FILES ${OV_AVP_PATH}/defines.hpp - ${OV_AVP_PATH}/GtkGL.cpp - ${OV_AVP_PATH}/GtkGL.hpp - ${OV_AVP_PATH}/VisualizationTools.cpp - ${OV_AVP_PATH}/VisualizationTools.hpp - ${OV_AVP_PATH}/TGtkGLWidget.hpp - ${OV_AVP_PATH}/IRuler.hpp + ${OV_AVP_PATH}/GtkGL.cpp + ${OV_AVP_PATH}/GtkGL.hpp + ${OV_AVP_PATH}/VisualizationTools.cpp + ${OV_AVP_PATH}/VisualizationTools.hpp + ${OV_AVP_PATH}/TGtkGLWidget.hpp + ${OV_AVP_PATH}/IRuler.hpp ) file(GLOB RULER_FILES RELATIVE ${OV_AVP_PATH}/ruler/ *.hpp) @@ -29,45 +36,52 @@ LIST(APPEND SRC_FILES ${RULER_FILES}) add_definitions("-DRENDERER_SUPPORTS_OFFSET") set(OV_DESIGNER_PATH "${CMAKE_SOURCE_DIR}/designer/applications/platform/designer/src/") -file(GLOB designer_files - ${OV_DESIGNER_PATH}/dynamic_settings/*.h ${OV_DESIGNER_PATH}/dynamic_settings/*.cpp - ${OV_DESIGNER_PATH}/base.hpp - ${OV_DESIGNER_PATH}/CBoxConfigurationDialog.* - ${OV_DESIGNER_PATH}/CLogListenerDesigner.* - ${OV_DESIGNER_PATH}/CCommentEditorDialog.* - ${OV_DESIGNER_PATH}/CSettingCollectionHelper.* +file(GLOB designer_files + ${OV_DESIGNER_PATH}/dynamic_settings/*.h ${OV_DESIGNER_PATH}/dynamic_settings/*.cpp + ${OV_DESIGNER_PATH}/base.hpp + ${OV_DESIGNER_PATH}/CBoxConfigurationDialog.* + ${OV_DESIGNER_PATH}/CLogListenerDesigner.* + ${OV_DESIGNER_PATH}/CCommentEditorDialog.* + ${OV_DESIGNER_PATH}/CSettingCollectionHelper.* ) LIST(APPEND SRC_FILES ${designer_files}) configure_file(${OV_DESIGNER_PATH}/../share/interface.ui-base "${CMAKE_CURRENT_BINARY_DIR}/designer-interface.ui") configure_file(${OV_DESIGNER_PATH}/../share/interface-settings.ui-base "${CMAKE_CURRENT_BINARY_DIR}/designer-interface-settings.ui") + +file(COPY ${CMAKE_CURRENT_BINARY_DIR}/designer-interface.ui DESTINATION ${BUILD_DATADIR}/applications/tracker) +file(COPY ${CMAKE_CURRENT_BINARY_DIR}/designer-interface-settings.ui DESTINATION ${BUILD_DATADIR}/applications/tracker) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/designer-interface.ui" DESTINATION ${DIST_DATADIR}/openvibe/applications/tracker) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/designer-interface-settings.ui" DESTINATION ${DIST_DATADIR}/openvibe/applications/tracker) - + set(OV_KERNEL_PATH "${CMAKE_SOURCE_DIR}/sdk/kernel/src/kernel/") file(GLOB kernel_files - ${OV_KERNEL_PATH}/scenario/ovkCBoxProto.* - ${OV_KERNEL_PATH}/scenario/ovkTAttributable.h - ${OV_KERNEL_PATH}/ovkTKernelObject.h + ${OV_KERNEL_PATH}/scenario/ovkCBoxProto.* + ${OV_KERNEL_PATH}/scenario/ovkTAttributable.h + ${OV_KERNEL_PATH}/ovkTKernelObject.h ) LIST(APPEND SRC_FILES ${kernel_files}) add_executable(${PROJECT_NAME} ${SRC_FILES}) target_link_libraries(${PROJECT_NAME} - openvibe - openvibe-common - openvibe-toolkit + openvibe + openvibe-common + openvibe-toolkit openvibe-module-ebml - openvibe-module-socket - openvibe-module-system - openvibe-module-fs - openvibe-module-communication - openvibe-visualization-toolkit - mensia-advanced-visualization-static - Boost::boost - Boost::system - tinyxml2) + openvibe-module-socket + openvibe-module-system + openvibe-module-fs + openvibe-module-communication + openvibe-visualization-toolkit + mensia-advanced-visualization-static + gtk2 + Boost::boost + Boost::serialization + Boost::system + tinyxml2::tinyxml2 + OpenGL::GL +) set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${APP_FOLDER}) @@ -80,12 +94,9 @@ include_directories(${OV_DESIGNER_PATH}) include_directories(${OV_KERNEL_PATH}) include_directories(${OV_KERNEL_PATH}/scenario) -include("FindThirdPartyGTK") -include("FindThirdPartyOpenGL") - -if(WIN32) - # @FIXME CERT getting timeBeginPeriod() linker issues without this - target_link_libraries(${PROJECT_NAME} winmm) +if(WIN32) + # @FIXME CERT getting timeBeginPeriod() linker issues without this + target_link_libraries(${PROJECT_NAME} winmm) endif(WIN32) include("FindThirdPartyRT") # external stims shared memory needs this @@ -95,27 +106,34 @@ include("FindThirdPartyRT") # external stims shared memory needs this # Defines target operating system, architecture and compiler # --------------------------------- if(WIN32) - add_definitions(-DWIN32_LEAN_AND_MEAN) + add_definitions(-DWIN32_LEAN_AND_MEAN) endif(WIN32) -# ---------------------- -# Generate launch script -# ---------------------- -OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "${PROJECT_NAME}" EXECUTABLE_NAME "${PROJECT_NAME}") - # ----------------------------- # Install files # ----------------------------- install(TARGETS ${PROJECT_NAME} - RUNTIME DESTINATION ${DIST_BINDIR} - LIBRARY DESTINATION ${DIST_LIBDIR} - ARCHIVE DESTINATION ${DIST_LIBDIR}) + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) + +install(CODE + "execute_process( \ + COMMAND ${CMAKE_COMMAND} -E create_symlink \ + ${DIST_BINDIR}/$<TARGET_FILE_NAME:${PROJECT_NAME}> \ + ${DIST_ROOT}/$<TARGET_FILE_NAME:${PROJECT_NAME}> \ + )" +) configure_file(share/tracker.ui-base "${CMAKE_CURRENT_BINARY_DIR}/tracker.ui" @ONLY) +file(COPY ${CMAKE_CURRENT_BINARY_DIR}/tracker.ui DESTINATION ${BUILD_DATADIR}/applications/tracker) +file(COPY signals DESTINATION ${BUILD_DATADIR}/scenarios/) +file(COPY share/ DESTINATION ${BUILD_DATADIR}/applications/tracker PATTERN "*-base" EXCLUDE) +file(COPY workspaces DESTINATION ${BUILD_DATADIR}/scenarios/) + install(FILES "${CMAKE_CURRENT_BINARY_DIR}/tracker.ui" DESTINATION ${DIST_DATADIR}/openvibe/applications/tracker) install(DIRECTORY signals DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) install(DIRECTORY share/ DESTINATION ${DIST_DATADIR}/openvibe/applications/tracker PATTERN "*-base" EXCLUDE) install(DIRECTORY workspaces DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) - diff --git a/applications/platform/tracker/include/StreamRendererBase.h b/applications/platform/tracker/include/StreamRendererBase.h index 620523f9e795f74859ae7dca71aac0a471141a13..51cee407ebc97b9c499868c1642a1556922168ec 100755 --- a/applications/platform/tracker/include/StreamRendererBase.h +++ b/applications/platform/tracker/include/StreamRendererBase.h @@ -12,7 +12,6 @@ #include <mensia/advanced-visualization.hpp> #include <TGtkGLWidget.hpp> -#include <GtkGL.hpp> #include <IRuler.hpp> diff --git a/applications/platform/tracker/share/tracker.ui-base b/applications/platform/tracker/share/tracker.ui-base index ba86449013905faee219b3d8cb9f6942eb895a19..81059df9337a7009120ae2e456f8bde47f556eec 100755 --- a/applications/platform/tracker/share/tracker.ui-base +++ b/applications/platform/tracker/share/tracker.ui-base @@ -38,7 +38,7 @@ <property name="default_height">900</property> <property name="type_hint">normal</property> <property name="program_name">OpenViBE Tracker</property> - <property name="version">@OV_GLOBAL_VERSION_STRING@ (@PLATFORM_TARGET@)</property> + <property name="version">@PROJECT_VERSION@ (@PLATFORM_TARGET@)</property> <property name="logo">header_logo.png</property> <property name="comments" translatable="yes">Tool for offline exploration and processing of EEG signals and related data @@ -2117,7 +2117,7 @@ u </child> <child> <object class="GtkImageMenuItem" id="tracker-menu_display_changelog"> - <property name="label" translatable="yes">What's new in version @OV_GLOBAL_VERSION_STRING@ of @TRACKER_NAME@</property> + <property name="label" translatable="yes">What's new in version @PROJECT_VERSION@ of @TRACKER_NAME@</property> <property name="visible">True</property> <property name="can_focus">False</property> <property name="use_underline">True</property> diff --git a/applications/platform/tracker/src/StreamRendererBase.cpp b/applications/platform/tracker/src/StreamRendererBase.cpp index acd7861e37da94550129ed5484bbbb2fce44a1a4..b0858beb91f5f7a90b21ea4f03acce21d2ef67ab 100755 --- a/applications/platform/tracker/src/StreamRendererBase.cpp +++ b/applications/platform/tracker/src/StreamRendererBase.cpp @@ -14,7 +14,6 @@ #include <system/ovCTime.h> #include <mensia/advanced-visualization.hpp> -#include <GtkGL.hpp> #include "StreamRendererBase.h" diff --git a/cmake-modules/FindOVDesigner.cmake b/cmake-modules/FindOVDesigner.cmake deleted file mode 100755 index 8c6c70edd99b94cd69841f4ea8e189eb6e939d4f..0000000000000000000000000000000000000000 --- a/cmake-modules/FindOVDesigner.cmake +++ /dev/null @@ -1,125 +0,0 @@ -# --------------------------------- -# Finds OpenViBE Designer binary distribution -# --------------------------------- - - -if(NOT CMAKE_BUILD_TYPE AND CMAKE_GENERATOR MATCHES "Visual Studio*") - set(MULTI_BUILD TRUE) -elseif(CMAKE_BUILD_TYPE AND OV_PACKAGE) - set(SOLO_PACKAGE TRUE) -elseif(CMAKE_BUILD_TYPE) - set(SOLO_BUILD TRUE) -else() - message(FATAL_ERROR "Build should specify a type or use a multi-type generator (like Visual Studio)") -endif() - -if(NOT DEFINED TRIED_FIND_OVDESIGNER) - if(MULTI_BUILD) - set(SEEK_PATHS ${DESIGNER_SDK_PATH};${LIST_DEPENDENCIES_PATH}) - unset(DESIGNER_SDK_PATH CACHE) - foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} ) - # set(OPENVIBE_SDK_PATH ${OPENVIBE_SDK_PATH}/$<UPPER_CASE:$<CONFIG>>) - string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIGU ) - unset(DESIGNER_SDK_PATH_TMP CACHE) - find_path(DESIGNER_SDK_PATH_TMP include/visualization-toolkit/ovviz_all.h PATHS ${SEEK_PATHS} PATH_SUFFIXES openvibe-designer-${OUTPUTCONFIG} ${OUTPUTCONFIG} NO_DEFAULT_PATH) - set(DESIGNER_SDK_PATH_${OUTPUTCONFIGU} ${DESIGNER_SDK_PATH_TMP}) - if(DESIGNER_SDK_PATH_TMP) - message(STATUS "Found ${OUTPUTCONFIG} of designer at ${DESIGNER_SDK_PATH_TMP}") - string(CONCAT DESIGNER_SDK_PATH ${DESIGNER_SDK_PATH} $<$<CONFIG:${OUTPUTCONFIGU}>:${DESIGNER_SDK_PATH_TMP}>) - set(AT_LEAST_ONE_DESIGNER_BUILD TRUE) - endif() - endforeach() - if(NOT DEFINED AT_LEAST_ONE_DESIGNER_BUILD) - message(FATAL_ERROR "Did not find any valid build of OpenViBE Designer") - endif() - else() # Regular build - # find_path(DESIGNER_SDK_PATH bin PATHS ${DESIGNER_SDK_PATH} PATH_SUFFIXES designer NO_DEFAULT_PATH) - find_path(DESIGNER_SDK_PATH include/visualization-toolkit/ovviz_all.h PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES openvibe-designer-${CMAKE_BUILD_TYPE_LOWER} NO_DEFAULT_PATH) - if(NOT DESIGNER_SDK_PATH) - MESSAGE(ERROR "Could not find DESIGNER_SDK_PATH (value : ${OPENVIBE_SDK_PATH}). Please either specify it or put OpenViBE designer binaries into dependencies/openvibe-designer-{debug/release} folder") - endif() - string(REGEX REPLACE "\\\\+" "/" DESIGNER_SDK_PATH ${DESIGNER_SDK_PATH}) - message(" Found Designer... [${DESIGNER_SDK_PATH}]") - endif() - set(TRIED_FIND_OVDESIGNER TRUE) -endif() - -if(INSTALL_DESIGNER) - if(MULTI_BUILD) # Replace with generator expression in CMake 3.5+ - foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES}) - string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIGU) - file(GLOB EXE_SCRIPT_LIST "${DESIGNER_SDK_PATH_${OUTPUTCONFIGU}}/*.cmd" "${DESIGNER_SDK_PATH_${OUTPUTCONFIGU}}/*.sh") - if(EXE_SCRIPT_LIST) - foreach(SCRIPT IN LISTS EXE_SCRIPT_LIST) - get_filename_component(base_name ${SCRIPT} NAME_WE) - if(WIN32) - set(exe_name "${base_name}.exe") - else() - set(exe_name ${base_name}) - endif() - if(WIN32) - SET(SCRIPT_POSTFIX ".cmd") - elseif(APPLE) - set(SCRIPT_POSTFIX "-macos.sh") - elseif(UNIX) - # Debian recommends that extensions such as .sh are not used; On Linux, scripts with such extensions shouldn't be packaged - set(SCRIPT_POSTFIX ".sh") - endif() - set(OV_CMD_EXECUTABLE ${exe_name}) - # IF(WIN32) - # SET(OV_CMD_EXECUTABLE "%OV_PATH_ROOT%/bin/${exe_name}") - # ENDIF() - set(SCRIPT_NAME ${base_name}${SCRIPT_POSTFIX}) - set(OV_CMD_ARGS "") - set(OV_PAUSE "") - - configure_file(${OV_LAUNCHER_SOURCE_PATH}/openvibe-launcher${SCRIPT_POSTFIX}-base ${CMAKE_CURRENT_BINARY_DIR}/${SCRIPT_NAME} @ONLY) - install(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${SCRIPT_NAME} DESTINATION ${DIST_ROOT}) - endforeach() - endif() - install(DIRECTORY ${DESIGNER_SDK_PATH_${OUTPUTCONFIGU}}/include/ DESTINATION ${DIST_INCLUDEDIR} CONFIGURATIONS ${OUTPUTCONFIG}) - install(DIRECTORY ${DESIGNER_SDK_PATH_${OUTPUTCONFIGU}}/bin/ DESTINATION ${DIST_BINDIR} CONFIGURATIONS ${OUTPUTCONFIG} USE_SOURCE_PERMISSIONS) # FILES_MATCHING PATTERN "openvibe-plugins*dll") or *so* - install(DIRECTORY ${DESIGNER_SDK_PATH_${OUTPUTCONFIGU}}/lib/ DESTINATION ${DIST_LIBDIR} CONFIGURATIONS ${OUTPUTCONFIG}) # FILES_MATCHING PATTERN "openvibe-plugins*dll") - install(DIRECTORY ${DESIGNER_SDK_PATH_${OUTPUTCONFIGU}}/etc/ DESTINATION ${DIST_SYSCONFDIR} CONFIGURATIONS ${OUTPUTCONFIG} OPTIONAL) - install(DIRECTORY ${DESIGNER_SDK_PATH_${OUTPUTCONFIGU}}/share/ DESTINATION ${DIST_DATADIR} CONFIGURATIONS ${OUTPUTCONFIG}) - if(DESIGNER_SDK_PATH_${OUTPUTCONFIGU}) - file(COPY "${DESIGNER_SDK_PATH_${OUTPUTCONFIGU}}/share/openvibe/applications/designer/designer.conf" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}") - file(RENAME ${CMAKE_CURRENT_BINARY_DIR}/designer.conf ${CMAKE_CURRENT_BINARY_DIR}/designer.conf_${OUTPUTCONFIG}) - file(READ ${CMAKE_CURRENT_BINARY_DIR}/designer.conf_${OUTPUTCONFIG} FILE_CONTENT) - set(MATCH_EXPR "(ProjectVersion_Components *= *.\{[^\}]+)(.\}\n)") - string(REGEX REPLACE ${MATCH_EXPR} "\\1, \"openvibe-extras\":\"${OV_GLOBAL_VERSION_STRING}\"\\2" FILE_CONTENT ${FILE_CONTENT}) - set(MATCH_EXPR "(Designer_WebBrowserHelpURLBase *= *\\$\{[^\}]+\}/documentation)/[\\.0-9a-zA-Z]+\n") - string(REGEX REPLACE ${MATCH_EXPR} "\\1/${OV_GLOBAL_VERSION_STRING}\n" FILE_CONTENT ${FILE_CONTENT}) - file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/designer.conf_${OUTPUTCONFIG} ${FILE_CONTENT}) - file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/designer.conf_${OUTPUTCONFIG} "Application_Name = OpenViBE Designer\nApplication_Version = ${OV_GLOBAL_VERSION_STRING}\nAcquisitionServer_HostName = localhost\n") - install(FILES "${CMAKE_CURRENT_BINARY_DIR}/designer.conf_${OUTPUTCONFIG}" DESTINATION "${DIST_DATADIR}/openvibe/applications/designer" RENAME designer.conf CONFIGURATIONS ${OUTPUTCONFIG}) - endif() - endforeach() - else() - file(GLOB EXE_SCRIPT_LIST "${DESIGNER_SDK_PATH}/*.cmd" "${DESIGNER_SDK_PATH}/*.sh") - foreach(SCRIPT IN LISTS EXE_SCRIPT_LIST) - get_filename_component(base_name ${SCRIPT} NAME_WE) - if(WIN32) - set(exe_name "${base_name}.exe") - else() - set(exe_name ${base_name}) - endif() - OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX ${base_name} EXECUTABLE_NAME ${exe_name} NOPROJECT) - endforeach() - install(DIRECTORY ${DESIGNER_SDK_PATH}/include/ DESTINATION ${DIST_INCLUDEDIR}) - install(DIRECTORY ${DESIGNER_SDK_PATH}/bin/ DESTINATION ${DIST_BINDIR} USE_SOURCE_PERMISSIONS) # FILES_MATCHING PATTERN "openvibe-plugins*dll") or *so* - install(DIRECTORY ${DESIGNER_SDK_PATH}/lib/ DESTINATION ${DIST_LIBDIR}) # FILES_MATCHING PATTERN "openvibe-plugins*dll") - install(DIRECTORY ${DESIGNER_SDK_PATH}/etc/ DESTINATION ${DIST_SYSCONFDIR} OPTIONAL) - install(DIRECTORY ${DESIGNER_SDK_PATH}/share/ DESTINATION ${DIST_DATADIR}) - file(COPY "${DESIGNER_SDK_PATH}/share/openvibe/applications/designer/designer.conf" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}") - file(READ ${CMAKE_CURRENT_BINARY_DIR}/designer.conf FILE_CONTENT) - set(MATCH_EXPR "(ProjectVersion_Components *= *.\{[^\}]+)(.\}\n)") - string(REGEX REPLACE ${MATCH_EXPR} "\\1, \"openvibe-extras\":\"${OV_GLOBAL_VERSION_STRING}\"\\2" FILE_CONTENT ${FILE_CONTENT}) - set(MATCH_EXPR "(Designer_WebBrowserHelpURLBase *= *\\$\{[^\}]+\}/documentation)/[\\.0-9a-zA-Z]+\n") - string(REGEX REPLACE ${MATCH_EXPR} "\\1/${OV_GLOBAL_VERSION_STRING}\n" FILE_CONTENT ${FILE_CONTENT}) - file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/designer.conf ${FILE_CONTENT}) - file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/designer.conf "Application_Name = OpenViBE Designer\nApplication_Version = ${OV_GLOBAL_VERSION_STRING}\nAcquisitionServer_HostName = localhost\n") - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/designer.conf DESTINATION "${DIST_DATADIR}/openvibe/applications/designer") - endif() -endif() - diff --git a/cmake-modules/FindOVSDK.cmake b/cmake-modules/FindOVSDK.cmake deleted file mode 100755 index 3c3009ffc0e1cff0c8e9c5d4169f9108e51544a8..0000000000000000000000000000000000000000 --- a/cmake-modules/FindOVSDK.cmake +++ /dev/null @@ -1,112 +0,0 @@ -# --------------------------------- -# Finds OpenViBE SDK binary distribution -# --------------------------------- - - -if(NOT CMAKE_BUILD_TYPE AND CMAKE_GENERATOR MATCHES "Visual Studio*") - set(MULTI_BUILD TRUE) -elseif(CMAKE_BUILD_TYPE AND OV_PACKAGE) - set(SOLO_PACKAGE TRUE) -elseif(CMAKE_BUILD_TYPE) - set(SOLO_BUILD TRUE) -else() - message(FATAL_ERROR "Build should specify a type or use a multi-type generator (like Visual Studio)") -endif() - -if(NOT DEFINED TRIED_FIND_OVSDK) - if(MULTI_BUILD) - set(SEEK_PATHS ${OPENVIBE_SDK_PATH};${LIST_DEPENDENCIES_PATH}) - unset(OPENVIBE_SDK_PATH CACHE) - foreach( OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES} ) - # set(OPENVIBE_SDK_PATH ${OPENVIBE_SDK_PATH}/$<UPPER_CASE:$<CONFIG>>) - string( TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIGU ) - unset(OPENVIBE_SDK_PATH_TMP CACHE) - find_path(OPENVIBE_SDK_PATH_TMP include/openvibe/ov_all.h PATHS ${SEEK_PATHS} PATH_SUFFIXES openvibe-sdk-${OUTPUTCONFIG} ${OUTPUTCONFIG} NO_DEFAULT_PATH) - set(OPENVIBE_SDK_PATH_${OUTPUTCONFIGU} ${OPENVIBE_SDK_PATH_TMP}) - if(OPENVIBE_SDK_PATH_TMP) - message(STATUS "Found ${OUTPUTCONFIG} of sdk at ${OPENVIBE_SDK_PATH_TMP}") - string(CONCAT OPENVIBE_SDK_PATH ${OPENVIBE_SDK_PATH} $<$<CONFIG:${OUTPUTCONFIGU}>:${OPENVIBE_SDK_PATH_TMP}>) - set(AT_LEAST_ONE_OV_BUILD TRUE) - endif() - endforeach() - if(NOT DEFINED AT_LEAST_ONE_OV_BUILD) - message(FATAL_ERROR "Did not find any valid build of OpenViBE SDK") - endif() - else() # Regular build - string(TOLOWER CMAKE_BUILD_TYPE OV_SDK_BUILD_TYPE) - find_path(${OPENVIBE_SDK_PATH} include/openvibe/ov_all.h PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES openvibe-sdk-${OV_SDK_BUILD_TYPE} NO_DEFAULT_PATH) - if(${OPENVIBE_SDK_PATH} STREQUAL "OPENVIBE_SDK_PATH-NOTFOUND") - message(FATAL_ERROR " FAILED to find OpenViBE SDK [${OPENVIBE_SDK_PATH}]") - endif() - string(REGEX REPLACE "\\\\+" "/" OPENVIBE_SDK_PATH ${OPENVIBE_SDK_PATH}) - message(STATUS " Found OpenViBE SDK... [${OPENVIBE_SDK_PATH}]") - endif() - set(TRIED_FIND_OVSDK TRUE) -endif() - -if(INSTALL_SDK) - if(MULTI_BUILD) # Replace with generator expression in CMake 3.5+ - foreach(OUTPUTCONFIG ${CMAKE_CONFIGURATION_TYPES}) - string(TOUPPER ${OUTPUTCONFIG} OUTPUTCONFIGU) - file(GLOB EXE_SCRIPT_LIST "${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/*.cmd" "${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/*.sh") - if(EXE_SCRIPT_LIST) - foreach(SCRIPT IN LISTS EXE_SCRIPT_LIST) - get_filename_component(base_name ${SCRIPT} NAME_WE) - if(WIN32) - set(exe_name "${base_name}.exe") - else() - set(exe_name ${base_name}) - endif() - IF(WIN32) - SET(SCRIPT_POSTFIX ".cmd") - ELSEIF(APPLE) - SET(SCRIPT_POSTFIX "-macos.sh") - ELSEIF(UNIX) - # Debian recommends that extensions such as .sh are not used; On Linux, scripts with such extensions shouldn't be packaged - SET(SCRIPT_POSTFIX ".sh") - ENDIF() - SET(OV_CMD_EXECUTABLE ${exe_name}) - # IF(WIN32) - # SET(OV_CMD_EXECUTABLE "%OV_PATH_ROOT%/bin/${exe_name}") - # ENDIF() - SET(SCRIPT_NAME ${base_name}${SCRIPT_POSTFIX}) - SET(OV_CMD_ARGS "") - SET(OV_PAUSE "") - - CONFIGURE_FILE(${OV_LAUNCHER_SOURCE_PATH}/openvibe-launcher${SCRIPT_POSTFIX}-base ${CMAKE_CURRENT_BINARY_DIR}/${SCRIPT_NAME} @ONLY) - INSTALL(PROGRAMS ${CMAKE_CURRENT_BINARY_DIR}/${SCRIPT_NAME} DESTINATION ${DIST_ROOT}) - endforeach() - endif() - install(DIRECTORY ${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/include/ DESTINATION ${DIST_INCLUDEDIR} CONFIGURATIONS ${OUTPUTCONFIG}) - install(DIRECTORY ${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/bin/ DESTINATION ${DIST_BINDIR} CONFIGURATIONS ${OUTPUTCONFIG} USE_SOURCE_PERMISSIONS) # FILES_MATCHING PATTERN "openvibe-plugins*dll") or *so* - install(DIRECTORY ${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/lib/ DESTINATION ${DIST_LIBDIR} CONFIGURATIONS ${OUTPUTCONFIG}) # FILES_MATCHING PATTERN "openvibe-plugins*dll") - install(DIRECTORY ${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/etc/ DESTINATION ${DIST_SYSCONFDIR} CONFIGURATIONS ${OUTPUTCONFIG} OPTIONAL) - install(DIRECTORY ${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/share/ DESTINATION ${DIST_DATADIR} CONFIGURATIONS ${OUTPUTCONFIG}) - if(OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}) - file(COPY "${OPENVIBE_SDK_PATH_${OUTPUTCONFIGU}}/share/openvibe/kernel/openvibe.conf" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}") - file(RENAME ${CMAKE_CURRENT_BINARY_DIR}/openvibe.conf ${CMAKE_CURRENT_BINARY_DIR}/openvibe.conf_${OUTPUTCONFIG}) - file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/openvibe.conf_${OUTPUTCONFIG} "Application_Name = Player\nApplication_Version = ${OV_GLOBAL_VERSION_STRING}\nAcquisitionServer_HostName = localhost\n") - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/openvibe.conf_${OUTPUTCONFIG} DESTINATION "${DIST_DATADIR}/openvibe/kernel" RENAME openvibe.conf CONFIGURATIONS ${OUTPUTCONFIG}) - endif() - endforeach() - else() - file(GLOB EXE_SCRIPT_LIST "${OPENVIBE_SDK_PATH}/*.cmd" "${OPENVIBE_SDK_PATH}/*.sh") - foreach(SCRIPT IN LISTS EXE_SCRIPT_LIST) - get_filename_component(base_name ${SCRIPT} NAME_WE) - if(WIN32) - set(exe_name "${base_name}.exe") - else() - set(exe_name ${base_name}) - endif() - OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX ${base_name} EXECUTABLE_NAME ${exe_name} NOPROJECT) - endforeach() - install(DIRECTORY ${OPENVIBE_SDK_PATH}/include/ DESTINATION ${DIST_INCLUDEDIR}) - install(DIRECTORY ${OPENVIBE_SDK_PATH}/bin/ DESTINATION ${DIST_BINDIR} USE_SOURCE_PERMISSIONS) # FILES_MATCHING PATTERN "openvibe-plugins*dll") or *so* - install(DIRECTORY ${OPENVIBE_SDK_PATH}/lib/ DESTINATION ${DIST_LIBDIR}) # FILES_MATCHING PATTERN "openvibe-plugins*dll") - install(DIRECTORY ${OPENVIBE_SDK_PATH}/etc/ DESTINATION ${DIST_SYSCONFDIR} OPTIONAL) - install(DIRECTORY ${OPENVIBE_SDK_PATH}/share/ DESTINATION ${DIST_DATADIR}) - file(COPY "${OPENVIBE_SDK_PATH}/share/openvibe/kernel/openvibe.conf" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}") - file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/openvibe.conf "Application_Name = Player\nApplication_Version = ${OV_GLOBAL_VERSION_STRING}\nAcquisitionServer_HostName = localhost\n") - install(FILES ${CMAKE_CURRENT_BINARY_DIR}/openvibe.conf DESTINATION "${DIST_DATADIR}/openvibe/kernel") - endif() -endif() diff --git a/cmake-modules/FindThirdPartyBrainmasterCodeMakerAPI.cmake b/cmake-modules/FindThirdPartyBrainmasterCodeMakerAPI.cmake index af92e3304cddefe39c6946af6de642494b411aaa..82c2929417d6fdbb384e41b8ae79854ff9b0c898 100644 --- a/cmake-modules/FindThirdPartyBrainmasterCodeMakerAPI.cmake +++ b/cmake-modules/FindThirdPartyBrainmasterCodeMakerAPI.cmake @@ -18,8 +18,7 @@ IF(WIN32) "C:/Program Files/Atlantis and Discovery SW DLL 1-11-12" "C:/Program Files (x86)/Atlantis and Discovery SW DLL 1-11-12" "C:/Program Files/Atlantis & Discovery SW DLL 1-11-12" - "C:/Program Files (x86)/Atlantis & Discovery SW DLL 1-11-12" - ${LIST_DEPENDENCIES_PATH}) + "C:/Program Files (x86)/Atlantis & Discovery SW DLL 1-11-12" ) IF(PATH_BrainmasterCodeMakerAPI) OV_PRINT(OV_PRINTED " Found Brainmaster Code Maker API...") INCLUDE_DIRECTORIES(${PATH_BrainmasterCodeMakerAPI}) diff --git a/cmake-modules/FindThirdPartyEmotivAPI.cmake b/cmake-modules/FindThirdPartyEmotivAPI.cmake index fddb2e4087ad36c7cdd9f3a38de154f4776eef8d..771751d606e667460646e011543e26c758b3bbb3 100644 --- a/cmake-modules/FindThirdPartyEmotivAPI.cmake +++ b/cmake-modules/FindThirdPartyEmotivAPI.cmake @@ -36,7 +36,7 @@ FOREACH(Candidate_folder ${PATH_Candidates}) ENDFOREACH(Candidate_folder ${PATH_Candidates}) SET(PATH_EmotivAPI "-NOTFOUND") -FIND_PATH(PATH_EmotivAPI1 edk.h PATHS ${PATH_Candidates} ${LIST_DEPENDENCIES_PATH}) +FIND_PATH(PATH_EmotivAPI1 edk.h PATHS ${PATH_Candidates}) IF(PATH_EmotivAPI1) OV_PRINT(OV_PRINTED " Found Emotiv Research API 1.x ...") SET(OV_EMOTIV_VERSION "research-1") @@ -44,7 +44,7 @@ IF(PATH_EmotivAPI1) SET(OV_EMOTIV_PATHS "${PATH_EmotivAPI}/../lib" "${PATH_EmotivAPI}/../../lib" "${PATH_EmotivAPI}/../../../lib") ENDIF(PATH_EmotivAPI1) -FIND_PATH(PATH_EmotivAPI2 IEdk.h PATHS ${PATH_Candidates} ${LIST_DEPENDENCIES_PATH}) +FIND_PATH(PATH_EmotivAPI2 IEdk.h PATHS ${PATH_Candidates}) IF(PATH_EmotivAPI2) OV_PRINT(OV_PRINTED " Found Emotiv API 3.x ...") SET(OV_EMOTIV_VERSION "community") @@ -52,7 +52,7 @@ IF(PATH_EmotivAPI2) SET(OV_EMOTIV_PATHS "${PATH_EmotivAPI}/../x86" "${PATH_EmotivAPI}/../../x86" "${PATH_EmotivAPI}/../../../x86") ENDIF(PATH_EmotivAPI2) -FIND_PATH(PATH_EmotivAPI3 IEegData.h PATHS ${PATH_Candidates} ${LIST_DEPENDENCIES_PATH}) +FIND_PATH(PATH_EmotivAPI3 IEegData.h PATHS ${PATH_Candidates}) IF(PATH_EmotivAPI3) OV_PRINT(OV_PRINTED " Found Emotiv Research API 3.x ...") SET(OV_EMOTIV_VERSION "research-3") diff --git a/cmake-modules/FindThirdPartyFFTW3.cmake b/cmake-modules/FindThirdPartyFFTW3.cmake deleted file mode 100644 index 793864a1327bd046cbc47e71905720d3bac87d04..0000000000000000000000000000000000000000 --- a/cmake-modules/FindThirdPartyFFTW3.cmake +++ /dev/null @@ -1,78 +0,0 @@ -# --------------------------------- -# Finds FFTW3 -# -# Sets define if the lib is found, adds include paths, libs -# -# --------- - -GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyFFTW3) - -# On windows, we take the itpp one. - -IF(WIN32) - FIND_PATH(PATH_FFTW3 include/fftw3.h PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES itpp) - IF(PATH_FFTW3) - SET(FFTW3_FOUND TRUE) - # Of course the name of the library is this or that, depending on the circumstances ... - IF("${PLATFORM_TARGET}" STREQUAL "x64") - FIND_LIBRARY(FFTW3_TMP NAMES libfftw3-3_win64 PATHS ${PATH_FFTW3}/lib NO_DEFAULT_PATH) - IF(FFTW3_TMP) - SET(FFTW3_LIBRARIES libfftw3-3_win64) - ELSE(FFTW3_TMP) - SET(FFTW3_LIBRARIES libfftw3-3) - ENDIF(FFTW3_TMP) - ELSE() - FIND_LIBRARY(FFTW3_TMP NAMES libfftw3-3_win32 PATHS ${PATH_FFTW3}/lib NO_DEFAULT_PATH) - IF(FFTW3_TMP) - SET(FFTW3_LIBRARIES libfftw3-3_win32) - ELSE(FFTW3_TMP) - SET(FFTW3_LIBRARIES libfftw3-3) - ENDIF(FFTW3_TMP) - ENDIF() - - SET(FFTW3_INCLUDE_DIRS ${PATH_FFTW3}/include ) - SET(FFTW3_LIBRARY_DIRS ${PATH_FFTW3}/lib ) - ENDIF(PATH_FFTW3) -ENDIF(WIN32) - -IF(UNIX) - INCLUDE("FindThirdPartyPkgConfig") - pkg_check_modules(FFTW3 fftw3) -ENDIF(UNIX) - -IF(FFTW3_FOUND) - SET(FFTW3_LOCATED_LIBS "") - OV_PRINT(OV_PRINTED " Found fftw3 includes...") - FOREACH(FFTW3_LIB ${FFTW3_LIBRARIES}) - SET(FFTW3_LIB1 "FFTW3_LIB1-NOTFOUND") - # The list is 'fftw3 m' on Fedora 19. CMake gets confused unless the two following lines are used ... - # 1) catch fftw3 if its under dependencies/lib/ (fedora19) - FIND_LIBRARY(FFTW3_LIB1 NAMES ${FFTW3_LIB} PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lib NO_DEFAULT_PATH) - # 2) catch fftw3 from found paths, and libm from usual system paths, i.e. default path is allowed. (covers other systems + libm on fedora). - FIND_LIBRARY(FFTW3_LIB1 NAMES ${FFTW3_LIB} PATHS ${FFTW3_LIBRARY_DIRS}) - IF(FFTW3_LIB1) - OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${FFTW3_LIB1}") - LIST(APPEND FFTW3_LOCATED_LIBS ${FFTW3_LIB1}) - ELSE(FFTW3_LIB1) - OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${FFTW3_LIB}") - SET(FFTW3_FOUND "-NOTFOUND") - BREAK() - ENDIF(FFTW3_LIB1) - ENDFOREACH(FFTW3_LIB) -ENDIF(FFTW3_FOUND) - -IF(FFTW3_FOUND) - INCLUDE_DIRECTORIES(${FFTW3_INCLUDE_DIRS}) - ADD_DEFINITIONS(${FFTW3_CFLAGS}) - - FOREACH(FFTW3_LIB ${FFTW3_LOCATED_LIBS}) - TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${FFTW3_LIB}) - ENDFOREACH(FFTW3_LIB) - - ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyFFTW3) -ELSE(FFTW3_FOUND) - OV_PRINT(OV_PRINTED " FAILED to find fftw3...") -ENDIF(FFTW3_FOUND) - -SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyFFTW3 "Yes") - diff --git a/cmake-modules/FindThirdPartyGMobiLabPlusAPI.cmake b/cmake-modules/FindThirdPartyGMobiLabPlusAPI.cmake index e33e2725e63b2d1201ea73cda59b9cbfb08ad451..61acedca137026914805c9ddaa94a2aaad69f210 100644 --- a/cmake-modules/FindThirdPartyGMobiLabPlusAPI.cmake +++ b/cmake-modules/FindThirdPartyGMobiLabPlusAPI.cmake @@ -16,20 +16,17 @@ IF(WIN32) # note that the API bitness must match the OV build bitness FIND_PATH(PATH_GMobiLabCAPI GMobiLabPlus.h PATHS "C:/Program Files/gtec/GMobiLabCAPI/Lib" - "C:/Program Files (x86)/gtec/GMobiLabCAPI/Lib" - ${LIST_DEPENDENCIES_PATH}) + "C:/Program Files (x86)/gtec/GMobiLabCAPI/Lib") IF("${PLATFORM_TARGET}" STREQUAL "x64") # We need to copy the DLL on install; note that System32 *is* the 64bit folder on 64bit arch FIND_PATH(PATH_GMobiLabDLL gMOBIlabplus.dll PATHS - "C:/Windows/System32" - ${LIST_DEPENDENCIES_PATH}) + "C:/Windows/System32") FIND_LIBRARY(LIB_GMobiLabCAPI GMobiLabplus PATHS ${PATH_GMobiLabCAPI}/x64) ELSE() # We need to copy the DLL on install FIND_PATH(PATH_GMobiLabDLL gMOBIlabplus.dll PATHS "C:/Windows/System32" - "C:/Windows/SysWOW64" - ${LIST_DEPENDENCIES_PATH}) + "C:/Windows/SysWOW64") FIND_LIBRARY(LIB_GMobiLabCAPI GMobiLabplus PATHS ${PATH_GMobiLabCAPI}/x86) ENDIF() diff --git a/cmake-modules/FindThirdPartyGTK.cmake b/cmake-modules/FindThirdPartyGTK.cmake deleted file mode 100644 index 00716c61e0e5b2e0142b3e9563bd9fc294ae43bf..0000000000000000000000000000000000000000 --- a/cmake-modules/FindThirdPartyGTK.cmake +++ /dev/null @@ -1,84 +0,0 @@ -# --------------------------------- -# Finds GTK toolkit -# -# Sets GTK_FOUND -# Sets GTK_LIBRARIES -# Sets GTK_LIBRARY_DIRS -# Sets GTK_LDFLAGS -# Sets GTK_LDFLAGS_OTHERS -# Sets GTK_INCLUDE_DIRS -# Sets GTK_CFLAGS -# Sets GTK_CFLAGS_OTHERS -# --------------------------------- - -get_property(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyGTK) - -if(OV_DISABLE_GTK) - OV_PRINT(OV_PRINTED " GTK disabled") - return() -endif(OV_DISABLE_GTK) - -include("FindThirdPartyPkgConfig") -if(WIN32) - pkg_check_modules(GTK gtk+-win32-2.0 gthread-2.0) -else(WIN32) - pkg_check_modules(GTK "gtk+-2.0" "gthread-2.0") -endif(WIN32) - -if(${BUILD_ARCH} STREQUAL "x64") - set(GTK_LIB_SUBFOLDER "i686-pc-vs10") - set(LIB_Z_NAME "zlib1") -else() - set(GTK_LIB_SUBFOLDER "2.10.0") - set(LIB_Z_NAME "zdll") -endif() -if(GTK_FOUND) - OV_PRINT(OV_PRINTED " Found GTK+...") - - # optimistic... - set(GTK_FOUND_EVERYTHING "True") - - #shouldn't add GTK_CFLAGS, this results in AdditionalIncludeDirectories becoming broken in visual studio - #ADD_DEFINITIONS(${GTK_CFLAGS} ${GTK_CFLAGS_OTHERS} ${GTHREAD_CFLAGS}${GTHREAD_CFLAGS_OTHERS}) - #LINK_DIRECTORIES(${GTK_LIBRARY_DIRS} ${GTHREAD_LIBRARY_DIRS}) - if(WIN32) - set( GTK_LIB_LIST ${GTK_LIBRARIES} ${GTHREAD_LIBRARIES} ${LIB_Z_NAME}) - else(WIN32) - set( GTK_LIB_LIST ${GTK_LIBRARIES} ${GTHREAD_LIBRARIES} z) - endif(WIN32) - - if(WIN32) - # gdi32.lib could be under the MS Windows SDK - include("OvSetWindowsSDKPath") - endif(WIN32) - - foreach(GTK_LIB ${GTK_LIB_LIST}) - set(GTK_LIB1 "GTK_LIB1-NOTFOUND") - find_library(GTK_LIB1 NAMES ${GTK_LIB} PATHS ${GTK_LIBRARY_DIRS} ${GTK_LIBDIR} NO_DEFAULT_PATH) - find_library(GTK_LIB1 NAMES ${GTK_LIB} PATHS ${GTK_LIBRARY_DIRS} ${GTK_LIBDIR}) - if(WIN32) - find_library(GTK_LIB1 NAMES ${GTK_LIB} PATHS ${OV_MS_SDK_PATH}/lib) - endif(WIN32) - if(GTK_LIB1) - OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${GTK_LIB1}") - target_link_libraries(${PROJECT_NAME} ${GTK_LIB1}) - else(GTK_LIB1) - OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${GTK_LIB}") - set(GTK_FOUND_EVERYTHING "-NOTFOUND") - endif(GTK_LIB1) - endforeach(GTK_LIB) -endif(GTK_FOUND) - -if(GTK_FOUND_EVERYTHING) - include_directories(${GTK_INCLUDE_DIRS} ${GTHREAD_INCLUDE_DIRS}) - add_definitions(-DTARGET_HAS_ThirdPartyGTK) -else(GTK_FOUND_EVERYTHING) - OV_PRINT(OV_PRINTED " FAILED to find GTK+ or its components...") - set(OV_DISABLE_GTK TRUE) - if(NOT PKG_CONFIG_FOUND) - OV_PRINT(OV_PRINTED " Did not even find pkg-config exe") - endif(NOT PKG_CONFIG_FOUND) -endif(GTK_FOUND_EVERYTHING) - -set_property(GLOBAL PROPERTY OV_TRIED_ThirdPartyGTK "Yes") - diff --git a/cmake-modules/FindThirdPartyGUSBampCAPI.cmake b/cmake-modules/FindThirdPartyGUSBampCAPI.cmake index c599e22b253eb94f6e8e13dfeb74ee13fe596e55..3141292361c039a1a7dd744211374e85df92b662 100644 --- a/cmake-modules/FindThirdPartyGUSBampCAPI.cmake +++ b/cmake-modules/FindThirdPartyGUSBampCAPI.cmake @@ -17,8 +17,7 @@ IF(WIN32) "C:/Program Files/gtec/gUSBampCAPI/API" "C:/Program Files (x86)/gtec/gUSBampCAPI/API" "C:/Program Files/gtec/gUSBampCAPI/API/${GUSBAMP_ARCH}" - "C:/Program Files (x86)/gtec/gUSBampCAPI/API/${GUSBAMP_ARCH}" - ${LIST_DEPENDENCIES_PATH}) + "C:/Program Files (x86)/gtec/gUSBampCAPI/API/${GUSBAMP_ARCH}") IF(PATH_GUSBampCAPI) OV_PRINT(OV_PRINTED " Found gtec gUSBampCAPI...") INCLUDE_DIRECTORIES(${PATH_GUSBampCAPI}) diff --git a/cmake-modules/FindThirdPartyITPP.cmake b/cmake-modules/FindThirdPartyITPP.cmake deleted file mode 100644 index 98e9a5bdf2ef270fa9fa8427ab9ee85b2251a3c6..0000000000000000000000000000000000000000 --- a/cmake-modules/FindThirdPartyITPP.cmake +++ /dev/null @@ -1,126 +0,0 @@ -# --------------------------------- -# Finds ITPP toolkit -# -# Sets ITPP_FOUND -# Sets ITPP_LIBRARIES -# Sets ITPP_LIBRARY_DIRS -# Sets ITPP_LDFLAGS -# Sets ITPP_LDFLAGS_OTHERS -# Sets ITPP_INCLUDE_DIRS -# Sets ITPP_CFLAGS -# Sets ITPP_CFLAGS_OTHERS -# -# Adds library to target -# Adds include path -# --------------------------------- - -GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyITPP) - -IF(WIN32) - FIND_PATH(PATH_ITPP include/itpp/itbase.h PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES itpp) - IF(PATH_ITPP) - SET(ITPP_FOUND TRUE) - SET(ITPP_INCLUDE_DIRS ${PATH_ITPP}/include) - - # Currently the different versions we package for different VS have a bit different lib names... - STRING(REGEX MATCH "vc100.*" MSVC_VER100 ${MSVC_SERVICE_PACK}) - STRING(REGEX MATCH "vc120.*" MSVC_VER120 ${MSVC_SERVICE_PACK}) - - IF(MSVC_VER100) - SET(ITPP_LIBRARIES libblas.a libfftw3-3 liblapack.a libgcc.a libg2c.a) - SET(ITPP_LIBRARIES_RELEASE itpp) - SET(ITPP_LIBRARIES_DEBUG itppd) - ENDIF(MSVC_VER100) - IF(MSVC_VER120) - IF("${PLATFORM_TARGET}" STREQUAL "x64") - SET(ITPP_LIBRARIES libfftw3-3_win64) - SET(ITPP_LIBRARIES_RELEASE blas_win64_MT lapack_win64_MT itpp) - SET(ITPP_LIBRARIES_DEBUG blas_win64_MT lapack_win64_MT itpp) # we dont have a good 64bit debug build, just use release - ELSE() - SET(ITPP_LIBRARIES libfftw3-3_win32) - SET(ITPP_LIBRARIES_RELEASE blas_win32_MT lapack_win32_MT itpp) - SET(ITPP_LIBRARIES_DEBUG blas_win32_MTd lapack_win32_MTd itppd) - ENDIF() - ENDIF(MSVC_VER120) - - SET(ITPP_LIBRARY_DIRS ${PATH_ITPP}/lib ) - ENDIF(PATH_ITPP) - -ENDIF(WIN32) - -IF(UNIX) - INCLUDE("FindThirdPartyPkgConfig") - FIND_PATH(PATH_ITPP include/itpp PATHS ${LIST_DEPENDENCIES_PATH}) - - IF(PATH_ITPP) - FIND_LIBRARY(ITPP_LIBRARY itpp PATHS ${PATH_ITPP}/lib) - SET(ITPP_FOUND TRUE) - SET(ITPP_INCLUDE_DIRS ${PATH_ITPP}/include/) - GET_FILENAME_COMPONENT(ITPP_LIBRARY_DIRS ${ITPP_LIBRARY} DIRECTORY) - SET(ITPP_LIBRARIES_RELEASE libitpp.so) - ELSE() - pkg_check_modules(ITPP itpp) - ENDIF() -ENDIF(UNIX) - -IF(ITPP_FOUND) - OV_PRINT(OV_PRINTED " Found it++...") - SET(ITPP_LOADING_FAILURE FALSE) - INCLUDE_DIRECTORIES(${ITPP_INCLUDE_DIRS}) - ADD_DEFINITIONS(${ITPP_CFLAGS}) - ADD_DEFINITIONS(${ITPP_CFLAGS_OTHERS}) - # LINK_DIRECTORIES(${ITPP_LIBRARY_DIRS}) - FOREACH(ITPP_LIB ${ITPP_LIBRARIES}) - SET(ITPP_LIB1 "ITPP_LIB1-NOTFOUND") - FIND_LIBRARY(ITPP_LIB1 NAMES ${ITPP_LIB} PATHS ${ITPP_LIBRARY_DIRS} ${ITPP_LIBDIR} NO_DEFAULT_PATH) - IF(ITPP_LIB1) - OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${ITPP_LIB1}") - TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${ITPP_LIB1}) - IF(WIN32) - INSTALL(FILES "${ITPP_LIBRARY_DIRS}/../bin/${ITPP_LIB}.dll" DESTINATION "${DIST_BINDIR}") - ENDIF() - ELSE() - OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${ITPP_LIB}") - SET(ITPP_LOADING_FAILURE TRUE) - ENDIF() - ENDFOREACH() - FOREACH(ITPP_LIB ${ITPP_LIBRARIES_RELEASE}) - SET(ITPP_LIB1 "ITPP_LIB1-RELEASE-NOTFOUND") - FIND_LIBRARY(ITPP_LIB1 NAMES ${ITPP_LIB} PATHS ${ITPP_LIBRARY_DIRS} ${ITPP_LIBDIR} NO_DEFAULT_PATH) - IF(ITPP_LIB1) - OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${ITPP_LIB1}") - TARGET_LINK_LIBRARIES(${PROJECT_NAME} optimized ${ITPP_LIB1}) - IF(WIN32) - INSTALL(FILES "${ITPP_LIBRARY_DIRS}/../bin/${ITPP_LIB}.dll" DESTINATION "${DIST_BINDIR}" CONFIGURATIONS Release) - ENDIF() - ELSE() - OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${ITPP_LIB}") - SET(ITPP_LOADING_FAILURE TRUE) - ENDIF() - ENDFOREACH() - FOREACH(ITPP_LIB ${ITPP_LIBRARIES_DEBUG}) - SET(ITPP_LIB1 "ITPP_LIB1-DEBUG-NOTFOUND") - FIND_LIBRARY(ITPP_LIB1 NAMES ${ITPP_LIB} PATHS ${ITPP_LIBRARY_DIRS} ${ITPP_LIBDIR} NO_DEFAULT_PATH) - IF(ITPP_LIB1) - OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${ITPP_LIB1}") - TARGET_LINK_LIBRARIES(${PROJECT_NAME} debug ${ITPP_LIB1}) - IF(WIN32) - INSTALL(FILES "${ITPP_LIBRARY_DIRS}/../bin/${ITPP_LIB}.dll" DESTINATION "${DIST_BINDIR}" CONFIGURATIONS Debug) - ENDIF() - ELSE() - OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${ITPP_LIB}") - SET(ITPP_LOADING_FAILURE TRUE) - ENDIF() - ENDFOREACH() - - # We only add ITPP if everything was found - IF(NOT ITPP_LOADING_FAILURE) - ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyITPP) - ENDIF() - -ELSE(ITPP_FOUND) - OV_PRINT(OV_PRINTED " FAILED to find it++...") -ENDIF() - -SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyITPP "Yes") - diff --git a/cmake-modules/FindThirdPartyLSL.cmake b/cmake-modules/FindThirdPartyLSL.cmake deleted file mode 100644 index c229f97930a69d71dfbbbc2860a09df05faeff66..0000000000000000000000000000000000000000 --- a/cmake-modules/FindThirdPartyLSL.cmake +++ /dev/null @@ -1,72 +0,0 @@ -# --------------------------------- -# Finds LabStreamingLayer (LSL) library -# -# Sets LSL_FOUND -# Sets LSL_INCLUDE_DIRS -# Sets LSL_LIBRARY_DIRS -# Sets LSL_LIBRARIES_RELEASE -# -# Adds library to target -# Adds include path -# -# Script @author Jussi T. Lindgren / Inria -# -# @note On Windows, trying to use the debug library of LSL 1.12 in the same way we did with LSL 1.04 -# caused an obscure Windows error code when launching the linking app. To sidestep, we use only the -# LSL release build library for now. To enable the debug lib, the following might be needed on Win -# in addition to linking the debug lib (but did not seem to be sufficient to make it work): -# SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -DLSL_DEBUG_BINDINGS") -# -# --------------------------------- - -GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyLSL) - -# The first ${..}/liblsl path is for Windows, the second ${..}/ for Linux -FIND_PATH(PATH_LSL include/lsl_cpp.h PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES . liblsl NO_DEFAULT_PATH) -FIND_PATH(PATH_LSL include/lsl_cpp.h PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES . liblsl) - -IF(PATH_LSL) - SET(LSL_FOUND TRUE) - SET(LSL_INCLUDE_DIRS ${PATH_LSL}/include/) - SET(LSL_LIBRARY_DIRS ${PATH_LSL}/lib/) - IF(WIN32) - IF("${PLATFORM_TARGET}" STREQUAL "x64") - SET(LSL_LIBRARIES_RELEASE liblsl64.lib) - SET(LSL_LIBRARIES_RELEASE_DLL liblsl64.dll) - ELSE() - SET(LSL_LIBRARIES_RELEASE liblsl32.lib) - SET(LSL_LIBRARIES_RELEASE_DLL liblsl32.dll) - ENDIF() - ELSEIF(UNIX) - SET(LSL_LIBRARIES_RELEASE liblsl.so) - ENDIF() -ENDIF() - -IF(LSL_FOUND) - OV_PRINT(OV_PRINTED " Found liblsl...") - INCLUDE_DIRECTORIES(${LSL_INCLUDE_DIRS}) - - SET(LSL_LIB_REL "LSL_LIB_REL-NOTFOUND") - # OV_PRINT(OV_PRINTED "LSL: ${LSL_LIBRARIES_RELEASE} - ${LSL_LIBRARY_DIRS_RELEASE}") - FIND_LIBRARY(LSL_LIB_REL NAMES ${LSL_LIBRARIES_RELEASE} PATHS ${LSL_LIBRARY_DIRS} NO_DEFAULT_PATH) - IF(LSL_LIB_REL) - OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${LSL_LIB_REL}") - - TARGET_LINK_LIBRARIES(${PROJECT_NAME} optimized ${LSL_LIB_REL}) - TARGET_LINK_LIBRARIES(${PROJECT_NAME} debug ${LSL_LIB_REL}) - - ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyLSL) - - IF(WIN32) - INSTALL(FILES "${LSL_LIBRARY_DIRS}/${LSL_LIBRARIES_RELEASE_DLL}" DESTINATION "${DIST_BINDIR}" CONFIGURATIONS Release Debug) - ENDIF() - ELSE() - OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${LSL_LIB_REL}") - ENDIF() - -ELSE() - OV_PRINT(OV_PRINTED " FAILED to find liblsl (optional) ...") -ENDIF() - -SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyLSL "Yes") - diff --git a/cmake-modules/FindThirdPartyLua.cmake b/cmake-modules/FindThirdPartyLua.cmake deleted file mode 100644 index 82eca54bbf05bddf641491dece921b67d7bb04e5..0000000000000000000000000000000000000000 --- a/cmake-modules/FindThirdPartyLua.cmake +++ /dev/null @@ -1,46 +0,0 @@ -# --------------------------------- -# Finds LUA -# Adds library to target -# Adds include path -# --------------------------------- - -GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyLua) - -IF(WIN32) - FIND_PATH(LUA_INCLUDE_DIR lua.h PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES lua/include NO_DEFAULT_PATH) -ELSEIF(UNIX) - if(${CMAKE_SYSTEM} MATCHES fc21) - FIND_PACKAGE(Lua REQUIRED) - else () - FIND_PACKAGE(Lua51 REQUIRED) - endif() -ENDIF() - -IF(LUA_INCLUDE_DIR) - OV_PRINT(OV_PRINTED " Found Lua... in '${LUA_INCLUDE_DIR}'") - - IF(WIN32) - FIND_LIBRARY(LUA_LIBRARIES lua5.1 PATHS ${LUA_INCLUDE_DIR}/../lib NO_DEFAULT_PATH) - FIND_LIBRARY(LUA_LIBRARIES lua5.1 PATHS ${LUA_INCLUDE_DIR}/../lib) - ENDIF() - - IF(LUA_LIBRARIES) - OV_PRINT(OV_PRINTED " [ OK ] lib ${LUA_LIBRARIES}") - - INCLUDE_DIRECTORIES(${LUA_INCLUDE_DIR}) - TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LUA_LIBRARIES}) - ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyLua) - IF(WIN32) - INSTALL(FILES "${LUA_INCLUDE_DIR}/../bin/lua5.1.dll" DESTINATION "${DIST_BINDIR}") - ENDIF() - ELSE() - OV_PRINT(OV_PRINTED " [FAILED] lib lua5.1") - ENDIF() - -ELSE() - OV_PRINT(OV_PRINTED " FAILED to find Lua") -ENDIF() - - -SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyLua "Yes") - diff --git a/cmake-modules/FindThirdPartyMCS.cmake b/cmake-modules/FindThirdPartyMCS.cmake index 6542e89fad9ba78197533bfd3290924ae0b3fa55..b62f85b6b04872cb24a973ecbd709f9fe2527eaa 100644 --- a/cmake-modules/FindThirdPartyMCS.cmake +++ b/cmake-modules/FindThirdPartyMCS.cmake @@ -3,7 +3,7 @@ GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyMCS) IF(WIN32) - FIND_PATH(PATH_MCS nvxmcs.dll PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES sdk_mcs/lib NO_DEFAULT_PATH) + FIND_PATH(PATH_MCS nvxmcs.dll PATHS PATH_SUFFIXES sdk_mcs/lib) ENDIF(WIN32) IF(PATH_MCS) @@ -14,7 +14,7 @@ IF(PATH_MCS) INSTALL(PROGRAMS "${PATH_MCS}/nvxmcs.dll" DESTINATION ${DIST_BINDIR}) ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyMCS) ELSE(PATH_MCS) - OV_PRINT(OV_PRINTED " FAILED to find MCS device SDK (optional driver)") + OV_PRINT(OV_PRINTED " FAILED to find MCS device SDK (optional driver). No 64 bits driver") ENDIF(PATH_MCS) SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyMCS "Yes") diff --git a/cmake-modules/FindThirdPartyMensiaAcquisition.cmake b/cmake-modules/FindThirdPartyMensiaAcquisition.cmake index 925049923e13d4bb6be4a18c3122a8456ccdd8cc..6876bf2ac8173202fdf1b3b1d266271132c751b7 100644 --- a/cmake-modules/FindThirdPartyMensiaAcquisition.cmake +++ b/cmake-modules/FindThirdPartyMensiaAcquisition.cmake @@ -3,7 +3,7 @@ GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyMensiaAcquisition) IF(WIN32) - FIND_PATH(PATH_MENSIA openvibe-driver-mensia-acquisition.dll PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES sdk_mensia_acquisition_driver NO_DEFAULT_PATH) + FIND_PATH(PATH_MENSIA openvibe-driver-mensia-acquisition.dll) ENDIF(WIN32) IF(PATH_MENSIA) diff --git a/cmake-modules/FindThirdPartyMicromed.cmake b/cmake-modules/FindThirdPartyMicromed.cmake deleted file mode 100644 index f29b6b8158b8b29023f1d53d413d2fdf2a2369a1..0000000000000000000000000000000000000000 --- a/cmake-modules/FindThirdPartyMicromed.cmake +++ /dev/null @@ -1,26 +0,0 @@ - -GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyMicromed) - - -IF(WIN32) - FIND_PATH(PATH_MICROMED_RELEASE dllMicromed.dll PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES sdk_micromed/Release NO_DEFAULT_PATH) - FIND_PATH(PATH_MICROMED_DEBUG dllMicromed.dll PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES sdk_micromed/Debug NO_DEFAULT_PATH) -ENDIF(WIN32) - -IF(PATH_MICROMED_RELEASE AND PATH_MICROMED_DEBUG) - OV_PRINT(OV_PRINTED " Found Micromed dll...") - - OV_PRINT(OV_PRINTED " [ OK ] dll ${PATH_MICROMED_RELEASE}/dllMicromed.dll") - OV_PRINT(OV_PRINTED " [ OK ] dll ${PATH_MICROMED_DEBUG}/dllMicromed.dll") - - INSTALL(PROGRAMS "${PATH_MICROMED_RELEASE}/dllMicromed.dll" DESTINATION ${DIST_BINDIR} CONFIGURATIONS Release Optimized) - INSTALL(PROGRAMS "${PATH_MICROMED_DEBUG}/dllMicromed.dll" DESTINATION ${DIST_BINDIR} CONFIGURATIONS Debug) - INSTALL(PROGRAMS "${PATH_MICROMED_DEBUG}/dllMicromed.pdb" DESTINATION ${DIST_BINDIR} CONFIGURATIONS Debug) - - ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyMicromed) -ELSE(PATH_MICROMED_RELEASE AND PATH_MICROMED_DEBUG) - OV_PRINT(OV_PRINTED " FAILED to find Micromed device dlls (optional driver)") -ENDIF(PATH_MICROMED_RELEASE AND PATH_MICROMED_DEBUG) - -SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyMicromed "Yes") - diff --git a/cmake-modules/FindThirdPartyMitsar.cmake b/cmake-modules/FindThirdPartyMitsar.cmake index c6debb4ecc375b487bfb85ff94efd89815c78145..2efb387229038b1c8e87dfba85f6c461f27a8d01 100644 --- a/cmake-modules/FindThirdPartyMitsar.cmake +++ b/cmake-modules/FindThirdPartyMitsar.cmake @@ -3,7 +3,7 @@ GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyMitsar) IF(WIN32) - FIND_PATH(PATH_MITSAR MitsarDll.dll PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES sdk_mitsar NO_DEFAULT_PATH) + FIND_PATH(PATH_MITSAR MitsarDll.dll) ENDIF(WIN32) IF(PATH_MITSAR) @@ -12,7 +12,7 @@ IF(PATH_MITSAR) INSTALL(PROGRAMS "${PATH_MITSAR}/MitsarDll.dll" DESTINATION ${DIST_BINDIR}) ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyMitsar) ELSE(PATH_MITSAR) - OV_PRINT(OV_PRINTED " FAILED to find Mitsar device dll (optional driver)") + OV_PRINT(OV_PRINTED " FAILED to find Mitsar device dll (optional driver). No 64-bits support.") ENDIF(PATH_MITSAR) SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyMitsar "Yes") diff --git a/cmake-modules/FindThirdPartyNeXus.cmake b/cmake-modules/FindThirdPartyNeXus.cmake index 46d66f59ea515ea56fd3599457756d4945a9f3aa..4c9a51e0204e930c3492d4162d098558b0600aba 100644 --- a/cmake-modules/FindThirdPartyNeXus.cmake +++ b/cmake-modules/FindThirdPartyNeXus.cmake @@ -3,7 +3,7 @@ GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyNeXus) IF(WIN32) - FIND_PATH(PATH_NEXUS NeXusDll.dll PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES sdk_nexus NO_DEFAULT_PATH) + FIND_PATH(PATH_NEXUS NeXusDll.dll) ENDIF(WIN32) IF(PATH_NEXUS) @@ -12,7 +12,7 @@ IF(PATH_NEXUS) INSTALL(PROGRAMS "${PATH_NEXUS}/NeXusDll.dll" "${PATH_NEXUS}/RTInst.dll" DESTINATION ${DIST_BINDIR}) ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyNeXus) ELSE(PATH_NEXUS) - OV_PRINT(OV_PRINTED " FAILED to find MindMedia NeXus device dll (optional driver)") + OV_PRINT(OV_PRINTED " FAILED to find MindMedia NeXus device dll (optional driver). No 64-bits support.") ENDIF(PATH_NEXUS) SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyNeXus "Yes") diff --git a/cmake-modules/FindThirdPartyNeuroelectricsEnobio3G.cmake b/cmake-modules/FindThirdPartyNeuroelectricsEnobio3G.cmake index e16dc18795429b939f6e861ca0071b02165176d7..b0e69d24e1030cc8c638a292462319e96f5600b7 100644 --- a/cmake-modules/FindThirdPartyNeuroelectricsEnobio3G.cmake +++ b/cmake-modules/FindThirdPartyNeuroelectricsEnobio3G.cmake @@ -7,15 +7,15 @@ GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyNeuroelectricsEnobio3G) IF(WIN32) - FIND_PATH(PATH_ENOBIOAPI enobio3g.h PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES sdk_enobio3g/enobio3g) + FIND_PATH(PATH_ENOBIOAPI enobio3g.h) IF(NOT PATH_ENOBIOAPI) - OV_PRINT(OV_PRINTED " FAILED to find ENOBIO API (optional driver) - cmake looked in '${LIST_DEPENDENCIES_PATH}', skipping Enobio.") + OV_PRINT(OV_PRINTED " FAILED to find ENOBIO API (optional driver), skipping Enobio.") RETURN() ENDIF(NOT PATH_ENOBIOAPI) OV_PRINT(OV_PRINTED " Found ENOBIO API...") - FIND_LIBRARY(LIB_ENOBIOAPI Enobio3GAPI PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES sdk_enobio3g/MSVC) + FIND_LIBRARY(LIB_ENOBIOAPI Enobio3GAPI) IF(NOT LIB_ENOBIOAPI) OV_PRINT(OV_PRINTED " [FAILED] Enobio libs not found, skipping Enobio.") RETURN() diff --git a/cmake-modules/FindThirdPartyOpenAL.cmake b/cmake-modules/FindThirdPartyOpenAL.cmake deleted file mode 100644 index 1d90f07c21e9ac3ca41912fbba74738327a8194f..0000000000000000000000000000000000000000 --- a/cmake-modules/FindThirdPartyOpenAL.cmake +++ /dev/null @@ -1,188 +0,0 @@ -# --------------------------------- -# Finds OpenAL, ALUT, OGGVORBIS -# Adds library to target -# Adds include path -# --------------------------------- - -GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyOpenAL) - -IF(WIN32) - FIND_PATH(PATH_OPENAL include/al.h PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES openal . NO_DEFAULT_PATH) - FIND_PATH(PATH_ALUT include/AL/alut.h PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES freealut .) - FIND_PATH(PATH_OGG include/ogg/ogg.h PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES libogg .) - FIND_PATH(PATH_VORBIS include/vorbis/vorbisfile.h PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES libvorbis .) - - SET(BUILDTYPE_PATH_DEBUG "debug") - SET(BUILDTYPE_PATH_RELEASE "release") - - IF(PATH_OPENAL) - OV_PRINT(OV_PRINTED " Found OpenAL...") - IF("${PLATFORM_TARGET}" STREQUAL "x64") - SET(OPENAL_SUBDIR "Win64") - ELSE() - SET(OPENAL_SUBDIR "Win32") - ENDIF() - FIND_LIBRARY(LIB_OPENAL OpenAL32 PATHS ${PATH_OPENAL}/libs/${OPENAL_SUBDIR}/ NO_DEFAULT_PATH) - IF(LIB_OPENAL) - OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_OPENAL}") - INSTALL(DIRECTORY "${PATH_OPENAL}/libs/${OPENAL_SUBDIR}/" DESTINATION "${DIST_BINDIR}/" FILES_MATCHING PATTERN "*.dll" PATTERN "EFX*" EXCLUDE) - ELSE(LIB_OPENAL) - OV_PRINT(OV_PRINTED " [FAILED] lib OpenAL32") - SET(OPENAL_MISSED_SOMETHING YES) - ENDIF(LIB_OPENAL) - ELSE(PATH_OPENAL) - OV_PRINT(OV_PRINTED " FAILED to find OpenAL32") - SET(OPENAL_MISSED_SOMETHING YES) - ENDIF(PATH_OPENAL) - - IF(PATH_ALUT) - FIND_LIBRARY(LIB_ALUT alut PATHS ${PATH_ALUT}/lib NO_DEFAULT_PATH) - IF(LIB_ALUT) - OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_ALUT}") - INSTALL(DIRECTORY "${PATH_ALUT}/lib/" DESTINATION "${DIST_BINDIR}/" FILES_MATCHING PATTERN "*.dll") - ELSE(LIB_ALUT) - OV_PRINT(OV_PRINTED " [FAILED] lib alut") - SET(OPENAL_MISSED_SOMETHING YES) - ENDIF(LIB_ALUT) - ELSE(PATH_ALUT) - OV_PRINT(OV_PRINTED " -- FAILED to find ALUT") - SET(OPENAL_MISSED_SOMETHING YES) - ENDIF(PATH_ALUT) - - IF(PATH_OGG) - FIND_LIBRARY(LIB_OGG_RELEASE libogg PATHS ${PATH_OGG}/win32/lib/${BUILDTYPE_PATH_RELEASE} NO_DEFAULT_PATH) - IF(LIB_OGG_RELEASE) - OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_OGG_RELEASE} (release)") - # We only have release OpenAL, so we have to include release version for libogg, and libvorbis - INSTALL(DIRECTORY "${PATH_OGG}/win32/bin/${BUILDTYPE_PATH_RELEASE}/" DESTINATION "${DIST_BINDIR}/") # CONFIGURATIONS Release) - ELSE(LIB_OGG_RELEASE) - OV_PRINT(OV_PRINTED " [FAILED] lib ogg (release)") - SET(OPENAL_MISSED_SOMETHING YES) - ENDIF(LIB_OGG_RELEASE) - - FIND_LIBRARY(LIB_OGG_DEBUG libogg PATHS ${PATH_OGG}/win32/lib/${BUILDTYPE_PATH_DEBUG} NO_DEFAULT_PATH) - IF(LIB_OGG_DEBUG) - OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_OGG_DEBUG} (debug)") - # INSTALL(DIRECTORY "${PATH_OGG}/win32/bin/${BUILDTYPE_PATH_DEBUG}/" DESTINATION "${DIST_BINDIR}/" CONFIGURATIONS Debug) - ELSE(LIB_OGG_DEBUG) - OV_PRINT(OV_PRINTED " [FAILED] lib ogg (debug)") - SET(OPENAL_MISSED_SOMETHING YES) - ENDIF(LIB_OGG_DEBUG) - ELSE(PATH_OGG) - OV_PRINT(OV_PRINTED " -- FAILED to find OGG") - SET(OPENAL_MISSED_SOMETHING YES) - ENDIF(PATH_OGG) - - IF(PATH_VORBIS) - FIND_LIBRARY(LIB_VORBIS_RELEASE libvorbis PATHS ${PATH_VORBIS}/win32/lib/${BUILDTYPE_PATH_RELEASE} NO_DEFAULT_PATH) - IF(LIB_VORBIS_RELEASE) - OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_VORBIS_RELEASE} (release)") - INSTALL(FILES "${PATH_VORBIS}/win32/bin/${BUILDTYPE_PATH_RELEASE}/libvorbis.dll" DESTINATION "${DIST_BINDIR}") # CONFIGURATIONS Release) - ELSE(LIB_VORBIS_RELEASE) - OV_PRINT(OV_PRINTED " [FAILED] lib vorbis (release)") - SET(OPENAL_MISSED_SOMETHING YES) - ENDIF(LIB_VORBIS_RELEASE) - - FIND_LIBRARY(LIB_VORBIS_DEBUG libvorbis PATHS ${PATH_VORBIS}/win32/lib/${BUILDTYPE_PATH_DEBUG} NO_DEFAULT_PATH) - IF(LIB_VORBIS_DEBUG) - OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_VORBIS_DEBUG} (debug)") - # INSTALL(FILES "${PATH_VORBIS}/win32/bin/${BUILDTYPE_PATH_DEBUG}/libvorbis.dll" DESTINATION "${DIST_BINDIR}" CONFIGURATIONS Debug) - ELSE(LIB_VORBIS_DEBUG) - OV_PRINT(OV_PRINTED " [FAILED] lib vorbis (debug)") - SET(OPENAL_MISSED_SOMETHING YES) - ENDIF(LIB_VORBIS_DEBUG) - - FIND_LIBRARY(LIB_VORBISFILE_RELEASE libvorbisfile PATHS ${PATH_VORBIS}/win32/lib/${BUILDTYPE_PATH_RELEASE} NO_DEFAULT_PATH) - IF(LIB_VORBISFILE_RELEASE) - OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_VORBISFILE_RELEASE} (release)") - INSTALL(FILES "${PATH_VORBIS}/win32/bin/${BUILDTYPE_PATH_RELEASE}/libvorbisfile.dll" DESTINATION "${DIST_BINDIR}")# CONFIGURATIONS Release) - ELSE(LIB_VORBISFILE_RELEASE) - OV_PRINT(OV_PRINTED " [FAILED] lib vorbisfile (release)") - SET(OPENAL_MISSED_SOMETHING YES) - ENDIF(LIB_VORBISFILE_RELEASE) - - FIND_LIBRARY(LIB_VORBISFILE_DEBUG libvorbisfile PATHS ${PATH_VORBIS}/win32/lib/${BUILDTYPE_PATH_DEBUG} NO_DEFAULT_PATH) - IF(LIB_VORBISFILE_DEBUG) - OV_PRINT(OV_PRINTED " [ OK ] lib ${LIB_VORBISFILE_DEBUG} (debug)") - # INSTALL(FILES "${PATH_VORBIS}/win32/bin/${BUILDTYPE_PATH_DEBUG}/libvorbisfile.dll" DESTINATION "${DIST_BINDIR}" CONFIGURATIONS Debug) - ELSE(LIB_VORBISFILE_DEBUG) - OV_PRINT(OV_PRINTED " [FAILED] lib vorbisfile (debug)") - SET(OPENAL_MISSED_SOMETHING YES) - ENDIF(LIB_VORBISFILE_DEBUG) - ELSE(PATH_VORBIS) - OV_PRINT(OV_PRINTED " -- FAILED to find VORBIS") - SET(OPENAL_MISSED_SOMETHING YES) - ENDIF(PATH_VORBIS) - - IF(OPENAL_MISSED_SOMETHING) - OV_PRINT(OV_PRINTED " FAILED to find everything required by OpenAL") - ELSE(OPENAL_MISSED_SOMETHING) - OV_PRINT(OV_PRINTED " Found OpenAL and all its library dependencies...") - TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_OPENAL}) - TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_ALUT}) - - TARGET_LINK_LIBRARIES(${PROJECT_NAME} debug ${LIB_OGG_DEBUG} optimized ${LIB_OGG_RELEASE} ) - TARGET_LINK_LIBRARIES(${PROJECT_NAME} debug ${LIB_VORBIS_DEBUG} optimized ${LIB_VORBIS_RELEASE} ) - TARGET_LINK_LIBRARIES(${PROJECT_NAME} debug ${LIB_VORBISFILE_DEBUG} optimized ${LIB_VORBISFILE_RELEASE}) - - INCLUDE_DIRECTORIES(${PATH_OPENAL}/include ${PATH_ALUT}/include ${PATH_OGG}/include ${PATH_VORBIS}/include) - ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyOpenAL) - ENDIF(OPENAL_MISSED_SOMETHING) - -ENDIF(WIN32) - -IF(UNIX) - INCLUDE("FindThirdPartyPkgConfig") - pkg_check_modules(ALUT freealut) - - IF(ALUT_FOUND) - OV_PRINT(OV_PRINTED " Found ALUT...") - INCLUDE_DIRECTORIES(${ALUT_INCLUDE_DIRS}) - ADD_DEFINITIONS(${ALUT_CFLAGS}) - ADD_DEFINITIONS(${ALUT_CFLAGS_OTHERS}) - # LINK_DIRECTORIES(${ALUT_LIBRARY_DIRS}) - FOREACH(ALUT_LIB ${ALUT_LIBRARIES}) - SET(ALUT_LIB1 "ALUT_LIB1-NOTFOUND") - FIND_LIBRARY(ALUT_LIB1 NAMES ${ALUT_LIB} PATHS ${ALUT_LIBRARY_DIRS} ${ALUT_LIBDIR} NO_DEFAULT_PATH) - FIND_LIBRARY(ALUT_LIB1 NAMES ${ALUT_LIB}) - IF(ALUT_LIB1) - OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${ALUT_LIB1}") - TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${ALUT_LIB1}) - ELSE(ALUT_LIB1) - OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${ALUT_LIB}") - ENDIF(ALUT_LIB1) - ENDFOREACH(ALUT_LIB) - ELSE(ALUT_FOUND) - OV_PRINT(OV_PRINTED " FAILED to find ALUT...") - ENDIF(ALUT_FOUND) - - pkg_check_modules(VORBIS vorbisfile) - - IF(VORBIS_FOUND) - OV_PRINT(OV_PRINTED " Found VORBIS...") - INCLUDE_DIRECTORIES(${VORBIS_INCLUDE_DIRS}) - ADD_DEFINITIONS(${VORBIS_CFLAGS}) - ADD_DEFINITIONS(${VORBIS_CFLAGS_OTHERS}) - # LINK_DIRECTORIES(${VORBIS_LIBRARY_DIRS}) - FOREACH(VORBIS_LIB ${VORBIS_LIBRARIES}) - SET(VORBIS_LIB1 "VORBIS_LIB1-NOTFOUND") - FIND_LIBRARY(VORBIS_LIB1 NAMES ${VORBIS_LIB} PATHS ${VORBIS_LIBRARY_DIRS} ${VORBIS_LIBDIR} NO_DEFAULT_PATH) - FIND_LIBRARY(VORBIS_LIB1 NAMES ${VORBIS_LIB}) - IF(VORBIS_LIB1) - OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${VORBIS_LIB1}") - TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${VORBIS_LIB1}) - ELSE(VORBIS_LIB1) - OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${VORBIS_LIB}") - ENDIF(VORBIS_LIB1) - ENDFOREACH(VORBIS_LIB) - ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyOpenAL) - ELSE(VORBIS_FOUND) - OV_PRINT(OV_PRINTED " FAILED to find VORBIS...") - ENDIF(VORBIS_FOUND) - -ENDIF(UNIX) - - - -SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyOpenAL "Yes") - diff --git a/cmake-modules/FindThirdPartyOpenGL.cmake b/cmake-modules/FindThirdPartyOpenGL.cmake deleted file mode 100644 index f23cb43146ed8c579ce939318252de5a89c8b575..0000000000000000000000000000000000000000 --- a/cmake-modules/FindThirdPartyOpenGL.cmake +++ /dev/null @@ -1,56 +0,0 @@ -# --------------------------------- -# Finds OpenGL toolkit -# -# Sets OpenGL_FOUND -# Sets OpenGL_LIBRARIES -# Sets OpenGL_LIBRARY_DIRS -# Sets OpenGL_LDFLAGS -# Sets OpenGL_LDFLAGS_OTHERS -# Sets OpenGL_INCLUDE_DIRS -# Sets OpenGL_CFLAGS -# Sets OpenGL_CFLAGS_OTHERS -# --------------------------------- - -GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyOpenGL) - -IF(WIN32) - FIND_LIBRARY(LIB_STANDARD_MODULE_GL opengl32) - FIND_LIBRARY(LIB_STANDARD_MODULE_GLU glu32) - IF(LIB_STANDARD_MODULE_GL AND LIB_STANDARD_MODULE_GLU) - OV_PRINT(OV_PRINTED " Found gl...") - TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_STANDARD_MODULE_GL}) - TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${LIB_STANDARD_MODULE_GLU}) - ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyOpenGL) - ELSE(LIB_STANDARD_MODULE_GL AND LIB_STANDARD_MODULE_GLU) - MESSAGE(WARNING " FAILED to find gl...") - ENDIF(LIB_STANDARD_MODULE_GL AND LIB_STANDARD_MODULE_GLU) -ELSE(WIN32) - INCLUDE("FindPkgConfig") - pkg_check_modules(OpenGL glu) - - IF(OpenGL_FOUND) - OV_PRINT(OV_PRINTED " Found OpenGL...") - INCLUDE_DIRECTORIES(${OpenGL_INCLUDE_DIRS}) - ADD_DEFINITIONS(${OpenGL_CFLAGS}) - ADD_DEFINITIONS(${OpenGL_CFLAGS_OTHERS}) - LINK_DIRECTORIES(${OpenGL_LIBRARY_DIRS}) - IF(NOT(APPLE)) - LINK_DIRECTORIES(${OpenGL_LIBRARY_DIRS}/mesa) - ENDIF() - FOREACH(OpenGL_LIB ${OpenGL_LIBRARIES} z) - SET(OpenGL_LIB1 "OpenGL_LIB1-NOTFOUND") - FIND_LIBRARY(OpenGL_LIB1 NAMES ${OpenGL_LIB} PATHS ${OpenGL_LIBRARY_DIRS} ${OpenGL_LIBDIR} NO_DEFAULT_PATH) - FIND_LIBRARY(OpenGL_LIB1 NAMES ${OpenGL_LIB} PATHS ${OpenGL_LIBRARY_DIRS}/mesa ${OpenGL_LIBDIR}/mesa NO_DEFAULT_PATH) - FIND_LIBRARY(OpenGL_LIB1 NAMES ${OpenGL_LIB}) - IF(OpenGL_LIB1) - OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${OpenGL_LIB1}") - TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${OpenGL_LIB1}) - ELSE(OpenGL_LIB1) - MESSAGE(WARNING " [FAILED] Third party lib ${OpenGL_LIB}") - ENDIF(OpenGL_LIB1) - ENDFOREACH(OpenGL_LIB) - ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyOpenGL) - ELSE(OpenGL_FOUND) - MESSAGE(WARNING " FAILED to find OpenGL...") - ENDIF(OpenGL_FOUND) -ENDIF(WIN32) diff --git a/cmake-modules/FindThirdPartyPThread.cmake b/cmake-modules/FindThirdPartyPThread.cmake index 4c08af0ce4c710080cf21cf872c783f5aa0c71bf..dc4c765ad43e248ed0e51707f8f2d712cd7353ff 100644 --- a/cmake-modules/FindThirdPartyPThread.cmake +++ b/cmake-modules/FindThirdPartyPThread.cmake @@ -7,20 +7,13 @@ GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyPThread) IF(WIN32) - FIND_PATH(PTHREAD_DIR lib PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES pthread NO_DEFAULT_PATH) - FIND_PATH(PTHREAD_DIR lib PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES pthreads NO_DEFAULT_PATH) - FIND_LIBRARY(PTHREAD_LIB pthreadVC2 PATHS ${PTHREAD_DIR} PATH_SUFFIXES lib NO_DEFAULT_PATH) - FIND_PROGRAM(PTHREAD_DLL pthread.dll PATHS ${PTHREAD_DIR} PATH_SUFFIXES bin NO_DEFAULT_PATH) - - INCLUDE("OvSetWindowsSDKPath") - SET(WS232_LIB "WS232_LIB-NOTFOUND") - FIND_LIBRARY(WS232_LIB ws2_32 ${OV_MS_SDK_PATH}/lib NO_DEFAULT_PATH) - FIND_LIBRARY(WS232_LIB ws2_32 ${OV_MS_SDK_PATH}/lib) - - IF(PTHREAD_LIB AND WS232_LIB AND PTHREAD_DLL) + FIND_PATH(PTHREAD_DIR pthread.h) + FIND_LIBRARY(PTHREAD_LIB pthread.lib) + FIND_PROGRAM(PTHREAD_DLL pthreadVSE2.dll) + + IF(PTHREAD_LIB AND PTHREAD_DLL) OV_PRINT(OV_PRINTED " Found PThreads") INCLUDE_DIRECTORIES(${PTHREAD_DIR}/include) - TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${WS232_LIB}) TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${PTHREAD_LIB}) INSTALL(PROGRAMS "${PTHREAD_DLL}" DESTINATION ${DIST_BINDIR}) ADD_DEFINITIONS(-DTARGET_HAS_PThread) @@ -36,13 +29,7 @@ IF(WIN32) ELSE() OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${PTHREAD_LIB}") ENDIF() - - IF(WS232_LIB) - OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${WS232_LIB}") - ELSE() - OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${WS232_LIB}") - ENDIF() - + ENDIF(WIN32) IF(UNIX) diff --git a/cmake-modules/FindThirdPartyPThreadsVCE2.cmake b/cmake-modules/FindThirdPartyPThreadsVCE2.cmake deleted file mode 100644 index 490ff738edae94a9c87ef016d7e874d5050449c7..0000000000000000000000000000000000000000 --- a/cmake-modules/FindThirdPartyPThreadsVCE2.cmake +++ /dev/null @@ -1,44 +0,0 @@ -# --------------------------------- -# Finds third party pthreads VCE2 (largely for Fieldtrip) -# Adds library to target -# Adds include path -# --------------------------------- - -GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyPThreadsVCE2) - -IF(WIN32) - FIND_PATH(PTHREAD_DIR lib PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES pthread NO_DEFAULT_PATH) - FIND_PATH(PTHREAD_DIR lib PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES pthreads NO_DEFAULT_PATH) - FIND_LIBRARY(PTHREAD_LIB pthreadVCE2 PATHS ${PTHREAD_DIR} PATH_SUFFIXES lib NO_DEFAULT_PATH) - - INCLUDE("OvSetWindowsSDKPath") - SET(WS232_LIB "WS232_LIB-NOTFOUND") - FIND_LIBRARY(WS232_LIB ws2_32 ${OV_MS_SDK_PATH}/lib NO_DEFAULT_PATH) - FIND_LIBRARY(WS232_LIB ws2_32 ${OV_MS_SDK_PATH}/lib) - - IF(PTHREAD_LIB AND WS232_LIB) - OV_PRINT(OV_PRINTED " Found PThreads VCE2") - INCLUDE_DIRECTORIES(${PTHREAD_DIR}/include) - TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${WS232_LIB}) - TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${PTHREAD_LIB}) - ADD_DEFINITIONS(-DTARGET_HAS_PThreadsVCE2) - ELSE() - OV_PRINT(OV_PRINTED " FAILED to find PThreads VCE2") - ENDIF() - - IF(PTHREAD_LIB) - OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${PTHREAD_LIB}") - ELSE() - OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${PTHREAD_LIB}") - ENDIF() - - IF(WS232_LIB) - OV_PRINT(OV_PRINTED " [ OK ] Third party lib ${WS232_LIB}") - ELSE() - OV_PRINT(OV_PRINTED " [FAILED] Third party lib ${WS232_LIB}") - ENDIF() - -ENDIF(WIN32) - -SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyPThreadsVCE2 "Yes") - diff --git a/cmake-modules/FindThirdPartyPython2.cmake b/cmake-modules/FindThirdPartyPython2.cmake deleted file mode 100644 index 939fd3acb19e5ef4be12ecd93146743e2b2997db..0000000000000000000000000000000000000000 --- a/cmake-modules/FindThirdPartyPython2.cmake +++ /dev/null @@ -1,37 +0,0 @@ -# --------------------------------- -# Finds Python -# Adds library to target -# Adds include path -# --------------------------------- - -GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyPython2) - -SET(Python_ADDITIONAL_VERSIONS 2.7) - -# Stops lookup as soon as a version satisfying the version constraints is found. -# Important when building both 32bits andd 64bits versions on the same machine. -# CMake might go for the 64bits version of Python when building 32bits, making the compilation fail. -# To work, you need to ensure that 32bits versions of Python appearing first in the Path. -# This is only needed for windows. -SET(Python2_FIND_STRATEGY LOCATION) - -FIND_PACKAGE(Python2 COMPONENTS Development) - -IF(Python2_FOUND) - OV_PRINT(OV_PRINTED " Found Python 2 at ${Python2_LIBRARIES}") - INCLUDE_DIRECTORIES(${Python2_INCLUDE_DIRS}) - TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${Python2_LIBRARIES}) - - IF(WIN32) - # These are needed not to cause a popup on machines missing the dll - TARGET_LINK_LIBRARIES(${PROJECT_NAME} optimized Delayimp ) - SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES LINK_FLAGS "/DELAYLOAD:python27.dll") - ENDIF() - - ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyPython2) -ELSE() - OV_PRINT(OV_PRINTED " FAILED to find Python 2 (needs v2.7 with bitness matching build target ${PLATFORM_TARGET})") -ENDIF() - -SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyPython2 "Yes") - diff --git a/cmake-modules/FindThirdPartyPython3.cmake b/cmake-modules/FindThirdPartyPython3.cmake deleted file mode 100644 index 1ccbf4855931ee2d91378da7233536383ab117a4..0000000000000000000000000000000000000000 --- a/cmake-modules/FindThirdPartyPython3.cmake +++ /dev/null @@ -1,37 +0,0 @@ -# --------------------------------- -# Finds Python -# Adds library to target -# Adds include path -# --------------------------------- - -GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyPython3) - -SET(Python_ADDITIONAL_VERSIONS 3.7) - -# Stops lookup as soon as a version satisfying the version constraints is found. -# Important when building both 32bits andd 64bits versions on the same machine. -# CMake might go for the 64bits version of Python when building 32bits, making the compilation fail. -# To work, you need to ensure that 32bits versions of Python appearing first in the Path. -# This is only needed for windows. -SET(Python3_FIND_STRATEGY LOCATION) - -FIND_PACKAGE(Python3 COMPONENTS Development) - -IF(Python3_FOUND) - OV_PRINT(OV_PRINTED " Found Python 3 at ${Python3_LIBRARIES}") - INCLUDE_DIRECTORIES(${Python3_INCLUDE_DIRS}) - TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${Python3_LIBRARIES}) - - IF(WIN32) - # These are needed not to cause a popup on machines missing the dll - TARGET_LINK_LIBRARIES(${PROJECT_NAME} optimized Delayimp ) - SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES LINK_FLAGS "/DELAYLOAD:python37.dll") - ENDIF() - - ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyPython3) -ELSE() - OV_PRINT(OV_PRINTED " FAILED to find Python 3 (needs v3.7 with bitness matching build target ${PLATFORM_TARGET})") -ENDIF() - -SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyPython3 "Yes") - diff --git a/cmake-modules/FindThirdPartyTMSi.cmake b/cmake-modules/FindThirdPartyTMSi.cmake deleted file mode 100644 index 12d56fa284540f9a4ec1d5a8a9b3b343ec3c84b0..0000000000000000000000000000000000000000 --- a/cmake-modules/FindThirdPartyTMSi.cmake +++ /dev/null @@ -1,19 +0,0 @@ - -GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyTMSi) - -IF(WIN32) - FIND_PATH(PATH_TMSi TMSiSDK.dll PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES sdk_tmsi NO_DEFAULT_PATH) -ENDIF(WIN32) - -IF(PATH_TMSi) - OV_PRINT(OV_PRINTED " Found TMSi dll...") - OV_PRINT(OV_PRINTED " [ OK ] dll ${PATH_TMSi}/TMSiSDK.dll") - - INSTALL(PROGRAMS "${PATH_TMSi}/TMSiSDK.dll" DESTINATION ${DIST_BINDIR}) - ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyTMSi) -ELSE(PATH_TMSi) - OV_PRINT(OV_PRINTED " FAILED to find TMSi device dll (optional driver)") -ENDIF(PATH_TMSi) - -SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyTMSi "Yes") - diff --git a/cmake-modules/FindThirdPartyThinkGearAPI.cmake b/cmake-modules/FindThirdPartyThinkGearAPI.cmake index 2a6c1c74714a2e92182ec01538274b2b15285b96..293a8f6f223c8127a11500b2e984a537aaf21b28 100644 --- a/cmake-modules/FindThirdPartyThinkGearAPI.cmake +++ b/cmake-modules/FindThirdPartyThinkGearAPI.cmake @@ -18,8 +18,7 @@ IF(WIN32) FIND_PATH(PATH_ThinkGearAPI thinkgear.h PATHS "C:/Program Files/MindSet Windows Developer Tools 3.2/Stream SDK for PC/libs/${THINKGEAR_LIBDIR}/" - "C:/Program Files (x86)/MindSet Windows Developer Tools 3.2/Stream SDK for PC/libs/${THINKGEAR_LIBDIR}/" - ${LIST_DEPENDENCIES_PATH} + "C:/Program Files (x86)/MindSet Windows Developer Tools 3.2/Stream SDK for PC/libs/${THINKGEAR_LIBDIR}/" NO_DEFAULT_PATH) IF(PATH_ThinkGearAPI) diff --git a/cmake-modules/FindThirdPartyUSBFirstAmpAPI.cmake b/cmake-modules/FindThirdPartyUSBFirstAmpAPI.cmake index ec7df9639a382520835f8bc5ac8f441a05660d29..cad21cd368ce8204109d5e8c3de22db2524b1d78 100644 --- a/cmake-modules/FindThirdPartyUSBFirstAmpAPI.cmake +++ b/cmake-modules/FindThirdPartyUSBFirstAmpAPI.cmake @@ -8,9 +8,9 @@ GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyUSBFirstAmpAPI) IF(WIN32) IF("${PLATFORM_TARGET}" STREQUAL "x64") - FIND_PATH(PATH_USBFirstAmpAPI FirstAmp.h PATHS "C:/Program Files/FaSDK-x64" ${LIST_DEPENDENCIES_PATH}) + FIND_PATH(PATH_USBFirstAmpAPI FirstAmp.h PATHS "C:/Program Files/FaSDK-x64") ELSE() - FIND_PATH(PATH_USBFirstAmpAPI FirstAmp.h PATHS "C:/Program Files/FaSDK" "C:/Program Files (x86)/FaSDK" ${LIST_DEPENDENCIES_PATH}) + FIND_PATH(PATH_USBFirstAmpAPI FirstAmp.h PATHS "C:/Program Files/FaSDK" "C:/Program Files (x86)/FaSDK") ENDIF() IF(PATH_USBFirstAmpAPI) diff --git a/cmake-modules/launchers/openvibe-external-application-launcher-base b/cmake-modules/launchers/openvibe-external-application-launcher-base deleted file mode 100644 index 5d95c88f049bd1205fbe6f29a402a2f4054a9885..0000000000000000000000000000000000000000 --- a/cmake-modules/launchers/openvibe-external-application-launcher-base +++ /dev/null @@ -1,30 +0,0 @@ -#!/bin/bash -# -# This script is meant to be launched from inside an OpenViBE application (such as a scenario in Designer) -# - -CALLCMD=$1 -shift - -ov_run_bg=0 -if [ "$1" == "--run-bg" ]; then - ov_run_bg=1 - shift -fi - -# OV_PATH_BIN overrides the CMake specified folder, if given -LOCAL_BIN_PATH="@CMAKE_INSTALL_FULL_BINDIR@" -if [ "$OV_PATH_BIN" != "" ]; then - LOCAL_BIN_PATH="$OV_PATH_BIN" -fi - -ret_code=0 - -if [ $ov_run_bg == 0 ]; then - eval "$LOCAL_BIN_PATH/$CALLCMD" @OV_CMD_ARGS@ $* - ret_code=$? -else - "$LOCAL_BIN_PATH/$CALLCMD" @OV_CMD_ARGS@ $* & -fi - -exit $ret_code diff --git a/cmake-modules/launchers/openvibe-external-application-launcher.cmd-base b/cmake-modules/launchers/openvibe-external-application-launcher.cmd-base deleted file mode 100644 index 4227c89519c1772ea95494ff8ebb2e062dd6ee7c..0000000000000000000000000000000000000000 --- a/cmake-modules/launchers/openvibe-external-application-launcher.cmd-base +++ /dev/null @@ -1,18 +0,0 @@ -@echo off - -REM -REM This script is meant to be launched from an environment with the OV_PATH_BIN env variable set externally -REM - -SET "OV_RUN_APP=%1" -SHIFT - -SET OV_RUN_IN_BG= -IF /i "%1"=="--run-bg" ( - REM Run in background. The first arg to START is the app title. - SET OV_RUN_IN_BG=START "%OV_RUN_APP%" - SHIFT -) - -%OV_RUN_IN_BG% "%OV_PATH_ROOT%\bin\%OV_RUN_APP%" %1 %2 %3 %4 %5 - diff --git a/contrib/applications/developer-tools/pybox-manager/CMakeLists.txt b/contrib/applications/developer-tools/pybox-manager/CMakeLists.txt index 8ec32e8492fb1c53e0bba16a2b7ec2532bbac340..8270d50bec4d4ce8fdab3e7f7295c4221e35d348 100644 --- a/contrib/applications/developer-tools/pybox-manager/CMakeLists.txt +++ b/contrib/applications/developer-tools/pybox-manager/CMakeLists.txt @@ -4,25 +4,29 @@ file(GLOB_RECURSE source_files src/*.cpp src/*.hpp src/*.h src/*.inl) add_library(${PROJECT_NAME} SHARED ${source_files}) target_link_libraries(${PROJECT_NAME} - openvibe - openvibe-common - openvibe-toolkit - openvibe-module-system - Boost::boost) + openvibe + openvibe-common + openvibe-toolkit + openvibe-module-system + Boost::boost + Python3::Python) + +if(win32) + # These are needed not to cause a popup on machines missing the dll + target_link_libraries(${PROJECT_NAME} optimized Delayimp ) + set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS "/DELAYLOAD:python37.dll") +endif() set_target_properties(${PROJECT_NAME} PROPERTIES - VERSION ${PROJECT_VERSION} - SOVERSION ${PROJECT_VERSION_MAJOR} - FOLDER ${PLUGINS_FOLDER} - COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") add_definitions(-DTARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines) include_directories("src") -# OpenViBE Third Party -include("FindThirdPartyPython3") - # --------------------------------- # Target macros # Defines target operating system @@ -31,6 +35,9 @@ include("FindThirdPartyPython3") # --------------------------------- SET_BUILD_PLATFORM() +file(COPY box-tutorials DESTINATION ${BUILD_DATADIR}/scenarios) +file(COPY share/ DESTINATION ${BUILD_DATADIR}/plugins/python3) + # ----------------------------- # Install files # ----------------------------- diff --git a/contrib/applications/developer-tools/pybox-manager/src/box-algorithms/TrainerML.cpp b/contrib/applications/developer-tools/pybox-manager/src/box-algorithms/TrainerML.cpp index 1854e795274c340489455159ae1ac52d9cfca44d..5106eaaee5cc4cfdf74f32d4c55a0d68c5f23dfe 100644 --- a/contrib/applications/developer-tools/pybox-manager/src/box-algorithms/TrainerML.cpp +++ b/contrib/applications/developer-tools/pybox-manager/src/box-algorithms/TrainerML.cpp @@ -248,6 +248,7 @@ bool CBoxAlgorithmTrainerMLListener::onSettingValueChanged(Kernel::IBox& box, co if (std::string(value.toASCIIString()) == toString(EClassifier::TangentSpace)) { return SetSetting(box, RTS_SETTING); } return true; } + return false; } } // namespace PyBox diff --git a/contrib/cmake-modules/FindThirdPartyGtecUnicornCAPI.cmake b/contrib/cmake-modules/FindThirdPartyGtecUnicornCAPI.cmake deleted file mode 100644 index ccc3b7dbb12e201a4c3f9bc458284c2d14453625..0000000000000000000000000000000000000000 --- a/contrib/cmake-modules/FindThirdPartyGtecUnicornCAPI.cmake +++ /dev/null @@ -1,26 +0,0 @@ - -GET_PROPERTY(OV_PRINTED GLOBAL PROPERTY OV_TRIED_ThirdPartyGtecUnicornCAPI) - - -IF(WIN32) - FIND_PATH(PATH_UNICORN Unicorn.dll PATHS ${LIST_DEPENDENCIES_PATH} PATH_SUFFIXES sdk_gtec_unicorn NO_DEFAULT_PATH) - - IF(PATH_UNICORN) - OV_PRINT(OV_PRINTED " Found Gtec Unicorn device API...") - INCLUDE_DIRECTORIES(${PATH_UNICORN}/) - TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${PATH_UNICORN}/unicorn.lib) - - INSTALL(PROGRAMS "${PATH_UNICORN}/Unicorn.dll" DESTINATION ${DIST_BINDIR}) - ADD_DEFINITIONS(-DTARGET_HAS_ThirdPartyGtecUnicron) - ELSE(PATH_UNICORN) - OV_PRINT(OV_PRINTED " FAILED to find Gtec Unicorn device API (optional driver)") - ENDIF(PATH_UNICORN) - -ENDIF(WIN32) - -IF (UNIX) - OV_PRINT(OV_PRINTED " Gtec Unicorn device API (optional driver): No Linux support") -ENDIF(UNIX) - -SET_PROPERTY(GLOBAL PROPERTY OV_TRIED_ThirdPartyGtecUnicornCAPI "Yes") - diff --git a/contrib/common/contribAcquisitionServer.cmake b/contrib/common/contribAcquisitionServer.cmake index f52de9ba342c4e362605e17bba8f276506fdca13..ea3f174c552ab1708785a16033edcadffb57968e 100644 --- a/contrib/common/contribAcquisitionServer.cmake +++ b/contrib/common/contribAcquisitionServer.cmake @@ -1,40 +1,33 @@ -INCLUDE_DIRECTORIES("${CMAKE_SOURCE_DIR}/extras/contrib/common") +include_directories("${CMAKE_SOURCE_DIR}/extras/contrib/common") -SET(ADDITIONAL_PATH "${CMAKE_SOURCE_DIR}/extras/contrib/plugins/server-extensions/external-stimulations/") -INCLUDE_DIRECTORIES(${ADDITIONAL_PATH}) -FILE(GLOB_RECURSE ADDITIONAL_SRC_FILES ${ADDITIONAL_PATH}/*.cpp ${ADDITIONAL_PATH}/*.h) -SET(SRC_FILES "${SRC_FILES};${ADDITIONAL_SRC_FILES}") +set(ADDITIONAL_PATH "${CMAKE_SOURCE_DIR}/extras/contrib/plugins/server-extensions/external-stimulations/") +include_directories(${ADDITIONAL_PATH}) +file(GLOB_RECURSE ADDITIONAL_SRC_FILES ${ADDITIONAL_PATH}/*.cpp ${ADDITIONAL_PATH}/*.h) +set(SRC_FILES "${SRC_FILES};${ADDITIONAL_SRC_FILES}") -SET(ADDITIONAL_PATH "${CMAKE_SOURCE_DIR}/extras/contrib/plugins/server-extensions/tcp-tagging/") -INCLUDE_DIRECTORIES(${ADDITIONAL_PATH}) -FILE(GLOB ADDITIONAL_SRC_FILES ${ADDITIONAL_PATH}/*.cpp ${ADDITIONAL_PATH}/*.h) -SET(SRC_FILES "${SRC_FILES};${ADDITIONAL_SRC_FILES}") +set(ADDITIONAL_PATH "${CMAKE_SOURCE_DIR}/extras/contrib/plugins/server-extensions/tcp-tagging/") +include_directories(${ADDITIONAL_PATH}) +file(GLOB ADDITIONAL_SRC_FILES ${ADDITIONAL_PATH}/*.cpp ${ADDITIONAL_PATH}/*.h) +set(SRC_FILES "${SRC_FILES};${ADDITIONAL_SRC_FILES}") -FUNCTION(OV_ADD_CONTRIB_DRIVER DRIVER_PATH) +function(OV_ADD_CONTRIB_DRIVER DRIVER_PATH) - SET(ADDITIONAL_PATH ${DRIVER_PATH}) - INCLUDE_DIRECTORIES(${ADDITIONAL_PATH}/src) - FILE(GLOB_RECURSE ADDITIONAL_SRC_FILES ${ADDITIONAL_PATH}/src/*.cpp ${ADDITIONAL_PATH}/src/*.h) - SET(SRC_FILES "${SRC_FILES};${ADDITIONAL_SRC_FILES}" PARENT_SCOPE) + set(ADDITIONAL_PATH ${DRIVER_PATH}) + include_directories(${ADDITIONAL_PATH}/src) + file(GLOB_RECURSE ADDITIONAL_SRC_FILES ${ADDITIONAL_PATH}/src/*.cpp ${ADDITIONAL_PATH}/src/*.h) + set(SRC_FILES "${SRC_FILES};${ADDITIONAL_SRC_FILES}" PARENT_SCOPE) - #MESSAGE(STATUS "DO I EXIST: ${ADDITIONAL_PATH}/share/") - IF(EXISTS "${ADDITIONAL_PATH}/share/") - #MESSAGE(STATUS "I EXIST: ${ADDITIONAL_PATH}/share/") - INSTALL(DIRECTORY "${ADDITIONAL_PATH}/share/" DESTINATION "${DIST_DATADIR}/openvibe/applications/acquisition-server/") - ENDIF(EXISTS "${ADDITIONAL_PATH}/share/") - - #MESSAGE(STATUS "DO I EXIST: ${ADDITIONAL_PATH}/bin/") - IF(EXISTS "${ADDITIONAL_PATH}/bin/") - #MESSAGE(STATUS "I EXIST: ${ADDITIONAL_PATH}/bin/") - INSTALL(DIRECTORY "${ADDITIONAL_PATH}/bin/" DESTINATION "${DIST_BINDIR}") - ENDIF(EXISTS "${ADDITIONAL_PATH}/bin/") + if(EXISTS "${ADDITIONAL_PATH}/share/") + file(COPY ${ADDITIONAL_PATH}/share/ DESTINATION ${BUILD_DATADIR}/applications/acquisition-server/) + install(DIRECTORY ${ADDITIONAL_PATH}/share/ DESTINATION "${DIST_DATADIR}/openvibe/applications/acquisition-server/") + endif(EXISTS "${ADDITIONAL_PATH}/share/") # Add the dir to be parsed for documentation later. - GET_PROPERTY(OV_TMP GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS) - SET(OV_TMP "${OV_TMP};${ADDITIONAL_PATH}") - SET_PROPERTY(GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS ${OV_TMP}) + get_property(OV_TMP GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS) + set(OV_TMP "${OV_TMP};${ADDITIONAL_PATH}") + set_property(GLOBAL PROPERTY OV_PROP_CURRENT_PROJECTS ${OV_TMP}) -ENDFUNCTION(OV_ADD_CONTRIB_DRIVER) +endfunction(OV_ADD_CONTRIB_DRIVER) OV_ADD_CONTRIB_DRIVER("${CMAKE_SOURCE_DIR}/extras/contrib/plugins/server-drivers/brainmaster-discovery") OV_ADD_CONTRIB_DRIVER("${CMAKE_SOURCE_DIR}/extras/contrib/plugins/server-drivers/brainproducts-brainvisionrecorder") @@ -54,12 +47,12 @@ OV_ADD_CONTRIB_DRIVER("${CMAKE_SOURCE_DIR}/extras/contrib/plugins/server-drivers OV_ADD_CONTRIB_DRIVER("${CMAKE_SOURCE_DIR}/extras/contrib/plugins/server-drivers/openeeg-modulareeg") OV_ADD_CONTRIB_DRIVER("${CMAKE_SOURCE_DIR}/extras/contrib/plugins/server-drivers/openbci") OV_ADD_CONTRIB_DRIVER("${CMAKE_SOURCE_DIR}/extras/contrib/plugins/server-drivers/eemagine-eego") -IF(WIN32 AND "${PLATFORM_TARGET}" STREQUAL "x64") - MESSAGE(STATUS " SKIPPED fieldtrip on x64") -ELSE() +if(WIN32 AND "${PLATFORM_TARGET}" STREQUAL "x64") + message(STATUS " SKIPPED fieldtrip on x64") +else() OV_ADD_CONTRIB_DRIVER("${CMAKE_SOURCE_DIR}/extras/contrib/plugins/server-drivers/field-trip-protocol") -ENDIF() +endif() -IF(OV_COMPILE_TESTS) -ADD_SUBDIRECTORY("../../../contrib/plugins/server-extensions/tcp-tagging/test" "./test") -ENDIF(OV_COMPILE_TESTS) +if(OV_COMPILE_TESTS) + add_subdirectory("../../../contrib/plugins/server-extensions/tcp-tagging/test" "./test") +endif(OV_COMPILE_TESTS) diff --git a/contrib/common/contribAcquisitionServerLinkLibs.cmake b/contrib/common/contribAcquisitionServerLinkLibs.cmake index 6c363f6a0fe888adc16f64da5e7dce33b5619735..c282d681e6587af26ebaf2dc2a5af34af47488cd 100644 --- a/contrib/common/contribAcquisitionServerLinkLibs.cmake +++ b/contrib/common/contribAcquisitionServerLinkLibs.cmake @@ -5,8 +5,8 @@ INCLUDE("FindThirdPartyGUSBampCAPI") INCLUDE("FindThirdPartyMitsar") INCLUDE("FindThirdPartyGNEEDaccessAPI") -INCLUDE("FindThirdPartyGtecUnicornCAPI") target_link_libraries(${PROJECT_NAME} eemagine-eego-sdk + sdk-gtec-unicorn ) \ No newline at end of file diff --git a/contrib/packages/wavelet2d/wavelet2s.cpp b/contrib/packages/wavelet2d/wavelet2s.cpp index f18c786119b543d822c29b282c01d3e56740ad0a..36e8ab84e614c22cec1f8a369b8957033ea9244a 100755 --- a/contrib/packages/wavelet2d/wavelet2s.cpp +++ b/contrib/packages/wavelet2d/wavelet2s.cpp @@ -858,7 +858,6 @@ void* dwt_2d_sym(std::vector<std::vector<double>>& origsig, const int J, const s flag.push_back(temp2); flag.push_back((double) J); // Number of Iterations */ - std::size_t sumCoef = 0; for (std::size_t iter = 0; iter < std::size_t(J); ++iter) { filtcoef(nm, lp1, hp1, lp2, hp2); @@ -918,7 +917,6 @@ void* dwt_2d_sym(std::vector<std::vector<double>>& origsig, const int J, const s } dwtOutput.insert(dwtOutput.begin(), tempSig2.begin(), tempSig2.end()); - sumCoef += 4 * nRows * nCols; } /* ofstream dwt2out("dwt2out.dat"); @@ -2102,7 +2100,6 @@ void* dwt_2d(std::vector<std::vector<double>>& origsig, const int J, const std:: length.insert(length.begin(), nRows); - std::size_t sumCoef = 0; for (std::size_t iter = 0; iter < std::size_t(J); ++iter) { filtcoef(nm, lp1, hp1, lp2, hp2); @@ -2161,7 +2158,6 @@ void* dwt_2d(std::vector<std::vector<double>>& origsig, const int J, const std:: } dwtOutput.insert(dwtOutput.begin(), tempSig2.begin(), tempSig2.end()); - sumCoef += 4 * nRows * nCols; } /* ofstream dwt2out("dwt2out.dat"); diff --git a/contrib/plugins/processing/file-io/src/box-algorithms/ovpCBoxAlgorithmEDFFileWriter.h b/contrib/plugins/processing/file-io/src/box-algorithms/ovpCBoxAlgorithmEDFFileWriter.h index b6ac4a7e1ac61fde6dde6f86e3a8106a7014d316..57a0000d461053f2721b54c2588ea1258373f2ad 100644 --- a/contrib/plugins/processing/file-io/src/box-algorithms/ovpCBoxAlgorithmEDFFileWriter.h +++ b/contrib/plugins/processing/file-io/src/box-algorithms/ovpCBoxAlgorithmEDFFileWriter.h @@ -12,7 +12,7 @@ namespace OpenViBE { namespace Plugins { namespace FileIO { -typedef struct +typedef struct SChannel { double min; double max; diff --git a/contrib/plugins/processing/misc/CMakeLists.txt b/contrib/plugins/processing/misc/CMakeLists.txt index 9387438fec125be63aac729c98b40ff1e791dce2..afe3e20457d06924dd345d6c30243134e490f595 100644 --- a/contrib/plugins/processing/misc/CMakeLists.txt +++ b/contrib/plugins/processing/misc/CMakeLists.txt @@ -15,8 +15,6 @@ set_target_properties(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") add_definitions(-DTARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines) -# --------------------------------- -include("FindThirdPartyOpenAL") # ----------------------------- # Install files diff --git a/contrib/plugins/processing/network-io/CMakeLists.txt b/contrib/plugins/processing/network-io/CMakeLists.txt index 028e9c38f89b8ff8dbe505eab2169767dd96ad66..ffd7a062634e8ce53207c57eeba9dc2a9d86094d 100755 --- a/contrib/plugins/processing/network-io/CMakeLists.txt +++ b/contrib/plugins/processing/network-io/CMakeLists.txt @@ -6,7 +6,13 @@ add_library(${PROJECT_NAME} SHARED ${SRC_FILES}) target_link_libraries(${PROJECT_NAME} openvibe openvibe-common - openvibe-toolkit) + openvibe-toolkit + LSL::lsl +) + +if (WIN32) + target_link_libraries(${PROJECT_NAME} ws2_32) +endif (WIN32) set_target_properties(${PROJECT_NAME} PROPERTIES VERSION ${PROJECT_VERSION} @@ -16,9 +22,6 @@ set_target_properties(${PROJECT_NAME} PROPERTIES add_definitions(-DTARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines) -# --------------------------------- -include("FindThirdPartyLSL") - # ----------------------------- # Install files # ----------------------------- diff --git a/contrib/plugins/processing/network-io/src/box-algorithms/ovpCBoxLSLExportGipsa.cpp b/contrib/plugins/processing/network-io/src/box-algorithms/ovpCBoxLSLExportGipsa.cpp index 29f077dd6b89812bd16a4d9931095050ddc6198a..ec56af60e0fe2576011e19ae35a4664d5923316e 100755 --- a/contrib/plugins/processing/network-io/src/box-algorithms/ovpCBoxLSLExportGipsa.cpp +++ b/contrib/plugins/processing/network-io/src/box-algorithms/ovpCBoxLSLExportGipsa.cpp @@ -159,7 +159,8 @@ bool CBoxAlgorithmLSLExportGipsa::process() return true; } -#endif } // namespace NetworkIO } // namespace Plugins } // namespace OpenViBE + +#endif diff --git a/contrib/plugins/processing/python3/CMakeLists.txt b/contrib/plugins/processing/python3/CMakeLists.txt index eabedd663d1f110d6ae6dfc01c8cb5ff3d45276e..4fbeffd56f87de1b27822440898726cf39799a4c 100644 --- a/contrib/plugins/processing/python3/CMakeLists.txt +++ b/contrib/plugins/processing/python3/CMakeLists.txt @@ -4,35 +4,36 @@ file(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.hpp src/*.inl) add_library(${PROJECT_NAME} SHARED ${SRC_FILES}) target_link_libraries(${PROJECT_NAME} - openvibe - openvibe-common - openvibe-toolkit - Boost::boost) + openvibe + openvibe-common + openvibe-toolkit + Boost::boost + Python3::Python) + +if(win32) + # These are needed not to cause a popup on machines missing the dll + target_link_libraries(${PROJECT_NAME} optimized Delayimp ) + set_target_properties(${PROJECT_NAME} PROPERTIES LINK_FLAGS "/DELAYLOAD:python37.dll") +endif() set_target_properties(${PROJECT_NAME} PROPERTIES - VERSION ${PROJECT_VERSION} - SOVERSION ${PROJECT_VERSION_MAJOR} - FOLDER ${PLUGINS_FOLDER} - COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") + VERSION ${PROJECT_VERSION} + SOVERSION ${PROJECT_VERSION_MAJOR} + FOLDER ${PLUGINS_FOLDER} + COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") add_definitions(-DTARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines) -# --------------------------------- -include("FindThirdPartyPython3") +file(COPY share/ DESTINATION ${BUILD_DATADIR}/plugins/python3) +file(COPY box-tutorials DESTINATION ${BUILD_DATADIR}/scenarios/) # ----------------------------- # Install files # ----------------------------- install(TARGETS ${PROJECT_NAME} - RUNTIME DESTINATION ${DIST_BINDIR} - LIBRARY DESTINATION ${DIST_LIBDIR} - ARCHIVE DESTINATION ${DIST_LIBDIR}) - -if(WIN32) - # The pygame scenario doesn't work on Windows, so do not install it - install(DIRECTORY box-tutorials DESTINATION ${DIST_DATADIR}/openvibe/scenarios/ PATTERN "*-pygame-*" EXCLUDE) -else() - install(DIRECTORY box-tutorials DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) -endif() + RUNTIME DESTINATION ${DIST_BINDIR} + LIBRARY DESTINATION ${DIST_LIBDIR} + ARCHIVE DESTINATION ${DIST_LIBDIR}) +install(DIRECTORY box-tutorials DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) install(DIRECTORY share/ DESTINATION ${DIST_DATADIR}/openvibe/plugins/python3) diff --git a/contrib/plugins/processing/python3/src/ovp_main.cpp b/contrib/plugins/processing/python3/src/ovp_main.cpp index 84891ec459ab55fea63904daf94f8e805cd37208..869a5674087d9399b95d20681dc98e5f7c8fbe54 100644 --- a/contrib/plugins/processing/python3/src/ovp_main.cpp +++ b/contrib/plugins/processing/python3/src/ovp_main.cpp @@ -59,10 +59,12 @@ CPython3Initializer::CPython3Initializer() : m_pythonAvailable(false) __try { // We do not care about the last file, since it is the OpenViBE runtime path - if (!Py_IsInitialized() && checkPython3Path()) + if (!Py_IsInitialized()) { Py_Initialize(); - m_pythonAvailable = true; + if (checkPython3Path()) { + m_pythonAvailable = true; + } } } __except (EXCEPTION_EXECUTE_HANDLER) { } diff --git a/contrib/plugins/processing/signal-processing/CMakeLists.txt b/contrib/plugins/processing/signal-processing/CMakeLists.txt index 0a437031b448f889588f62d0e5304ef277b71a20..4478e2f48d11f58cd79978d7e6b241fad2e265da 100644 --- a/contrib/plugins/processing/signal-processing/CMakeLists.txt +++ b/contrib/plugins/processing/signal-processing/CMakeLists.txt @@ -6,7 +6,9 @@ add_library(${PROJECT_NAME} SHARED ${SRC_FILES}) target_link_libraries(${PROJECT_NAME} openvibe openvibe-common - openvibe-toolkit) + openvibe-toolkit + itpp +) set_target_properties(${PROJECT_NAME} PROPERTIES VERSION ${PROJECT_VERSION} @@ -16,8 +18,8 @@ set_target_properties(${PROJECT_NAME} PROPERTIES add_definitions(-DTARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines) -# ----------------------------- -include("FindThirdPartyITPP") +file(COPY box-tutorials DESTINATION ${BUILD_DATADIR}/scenarios/) +file(COPY metaboxes DESTINATION ${BUILD_DATADIR}/) # ----------------------------- # Install files diff --git a/contrib/plugins/processing/signal-processing/src/algorithms/ovpCComputeTemporalFilterCoefficients.h b/contrib/plugins/processing/signal-processing/src/algorithms/ovpCComputeTemporalFilterCoefficients.h index 8f3120a22fe01d2e6811922a9557358b45ae383b..f1c051b12cdfbd37be3181333426b09df60eb219 100644 --- a/contrib/plugins/processing/signal-processing/src/algorithms/ovpCComputeTemporalFilterCoefficients.h +++ b/contrib/plugins/processing/signal-processing/src/algorithms/ovpCComputeTemporalFilterCoefficients.h @@ -16,7 +16,7 @@ #define MINEXP -1077 #define MAXNUM 1.79769313486231570815E308 -typedef struct +typedef struct SComplex { double real; double imag; diff --git a/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmCSPSpatialFilterTrainer.cpp b/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmCSPSpatialFilterTrainer.cpp index 25f9e0881e4a5464496acaefe821ef0dd24b449d..3a940bd237cd853378df9de0bbae98c1ca3d1463 100644 --- a/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmCSPSpatialFilterTrainer.cpp +++ b/contrib/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmCSPSpatialFilterTrainer.cpp @@ -268,8 +268,8 @@ bool CBoxAlgorithmCSPSpatialFilterTrainer::process() } fprintf(file, "</SettingValue>\n"); - fprintf(file, "\t<SettingValue>%d</SettingValue>\n", m_filterDimension); - fprintf(file, "\t<SettingValue>%d</SettingValue>\n", nChannel); + fprintf(file, "\t<SettingValue>%zu</SettingValue>\n", m_filterDimension); + fprintf(file, "\t<SettingValue>%zu</SettingValue>\n", nChannel); fprintf(file, "\t<SettingValue></SettingValue>\n"); fprintf(file, "</OpenViBE-SettingsOverride>\n"); fclose(file); diff --git a/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/dmarequest.c b/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/dmarequest.c index 524ec003cdc9d9c1d8e2bec1fc60d681aa4307d0..b39eee3d0be6f1a5f663eb369ce3e69fc7734d80 100644 --- a/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/dmarequest.c +++ b/contrib/plugins/server-drivers/field-trip-protocol/src/fieldtrip/dmarequest.c @@ -11,7 +11,7 @@ #include "buffer.h" #include <pthread.h> -#ifdef TARGET_OS_Linux +#if defined TARGET_OS_Linux || defined TARGET_OS_MacOS #include <sys/time.h> #endif diff --git a/contrib/plugins/server-drivers/openal-mono16bit-audiocapture/src/ovasCDriverOpenALAudioCapture.h b/contrib/plugins/server-drivers/openal-mono16bit-audiocapture/src/ovasCDriverOpenALAudioCapture.h index 55bf3516dff7af50f750680afdb5a74a11e9ec7c..128c578e6953f809cfee3a4cee6b95a3c02e228a 100644 --- a/contrib/plugins/server-drivers/openal-mono16bit-audiocapture/src/ovasCDriverOpenALAudioCapture.h +++ b/contrib/plugins/server-drivers/openal-mono16bit-audiocapture/src/ovasCDriverOpenALAudioCapture.h @@ -15,7 +15,9 @@ #elif defined TARGET_OS_Linux #include <AL/al.h> #include <AL/alc.h> -#else +#elif defined TARGET_OS_MacOS + #include "al.h" + #include "alc.h" #endif namespace OpenViBE { diff --git a/contrib/plugins/server-drivers/openbci/src/ovasCDriverOpenBCI.cpp b/contrib/plugins/server-drivers/openbci/src/ovasCDriverOpenBCI.cpp index c410ffac4ee14a0c4ccb2dd63a8207a80beeb66a..3b00c6cf61fac348ac72ef1ae82978951ba877cf 100644 --- a/contrib/plugins/server-drivers/openbci/src/ovasCDriverOpenBCI.cpp +++ b/contrib/plugins/server-drivers/openbci/src/ovasCDriverOpenBCI.cpp @@ -856,7 +856,9 @@ uint32_t CDriverOpenBCI::writeToDevice(const FD_TYPE fileDesc, const void* buffe const int count = ::write(fileDesc, buffer, size); if(count < 0) { return WRITE_ERROR; } #else - return WRITE_ERROR; + const int count = ::write(fileDesc, buffer, size); + if(count < 0) { return WRITE_ERROR; } +// return WRITE_ERROR; #endif return uint32_t(count); diff --git a/contrib/plugins/server-drivers/openbci/src/ovasCDriverOpenBCI.h b/contrib/plugins/server-drivers/openbci/src/ovasCDriverOpenBCI.h index 902bfc06a596e91637f2bad5f1b89a88f21d5565..e3c09d6770f1323863f0c58f0ebde0e3016bdd4d 100644 --- a/contrib/plugins/server-drivers/openbci/src/ovasCDriverOpenBCI.h +++ b/contrib/plugins/server-drivers/openbci/src/ovasCDriverOpenBCI.h @@ -18,6 +18,7 @@ typedef void* FD_TYPE; #elif defined TARGET_OS_Linux typedef int FD_TYPE; #else + typedef int FD_TYPE; #endif #include <vector> diff --git a/contrib/plugins/server-drivers/openeeg-modulareeg/src/ovasCDriverOpenEEGModularEEG.h b/contrib/plugins/server-drivers/openeeg-modulareeg/src/ovasCDriverOpenEEGModularEEG.h index ad1ff8b0d0aa827c2ee72c363179a3dfac19cefe..c035453d37b71e76497d67a6bdc1d0f9e6aee332 100755 --- a/contrib/plugins/server-drivers/openeeg-modulareeg/src/ovasCDriverOpenEEGModularEEG.h +++ b/contrib/plugins/server-drivers/openeeg-modulareeg/src/ovasCDriverOpenEEGModularEEG.h @@ -16,6 +16,7 @@ typedef void* FD_TYPE; #elif defined TARGET_OS_Linux typedef int FD_TYPE; #else +typedef int FD_TYPE; #endif #include <vector> diff --git a/contrib/plugins/server-extensions/tcp-tagging/test/CMakeLists.txt b/contrib/plugins/server-extensions/tcp-tagging/test/CMakeLists.txt index bbbb1e9595fe498cad4a9005001a57d8c0ca0f14..45eeb637f34e33821e33d6928ee40686dbc320da 100644 --- a/contrib/plugins/server-extensions/tcp-tagging/test/CMakeLists.txt +++ b/contrib/plugins/server-extensions/tcp-tagging/test/CMakeLists.txt @@ -28,12 +28,3 @@ if(UNIX AND NOT APPLE) endif() set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${TESTS_FOLDER}) # Place project in folder unit-test (for some IDE) - -# Unfortunately we need to install the tests as any application to find .dll/.so files -# on both Windows and Linux. -OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "${PROJECT_NAME}" EXECUTABLE_NAME "${PROJECT_NAME}") -install(TARGETS ${PROJECT_NAME} - RUNTIME DESTINATION ${DIST_BINDIR} - LIBRARY DESTINATION ${DIST_LIBDIR} - ARCHIVE DESTINATION ${DIST_LIBDIR}) - diff --git a/contrib/plugins/server-extensions/tcp-tagging/test/DartTestfile.txt b/contrib/plugins/server-extensions/tcp-tagging/test/DartTestfile.txt index 9d9424a6006166d093e94d840fe599f42eba1f43..8b773ae97dc1b07f709e92eec8a8d675e4f1a949 100644 --- a/contrib/plugins/server-extensions/tcp-tagging/test/DartTestfile.txt +++ b/contrib/plugins/server-extensions/tcp-tagging/test/DartTestfile.txt @@ -5,14 +5,6 @@ SET(TEST_NAME "TagStream") -IF(WIN32) - SET(EXT cmd) - SET(OS_FLAGS "--no-pause") -ELSE(WIN32) - SET(EXT sh) - SET(OS_FLAGS "") -ENDIF(WIN32) - -ADD_TEST(run_${TEST_NAME} "$ENV{OV_BINARY_PATH}/test_tagstream.${EXT}" ${OS_FLAGS}) +ADD_TEST(run_${TEST_NAME} "$ENV{OV_BINARY_PATH}/test_tagstream") diff --git a/modules/eigen/test/CMakeLists.txt b/modules/eigen/test/CMakeLists.txt index b753e9d37ef062a89c5231da45d50f6a63f228ae..2db97c7f933bd78b715fddc81259d6e1489bd96d 100644 --- a/modules/eigen/test/CMakeLists.txt +++ b/modules/eigen/test/CMakeLists.txt @@ -18,13 +18,4 @@ target_link_libraries(${PROJECT_NAME} # --------------------------------- SET_BUILD_PLATFORM() -# ----------------------------- -# Install files -# ----------------------------- ADD_TEST(NAME test_Geometry COMMAND ${PROJECT_NAME}) - -OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "${PROJECT_NAME}" EXECUTABLE_NAME "${PROJECT_NAME}") -install(TARGETS ${PROJECT_NAME} - RUNTIME DESTINATION ${DIST_BINDIR} - LIBRARY DESTINATION ${DIST_LIBDIR} - ARCHIVE DESTINATION ${DIST_LIBDIR}) diff --git a/modules/geometry/CMakeLists.txt b/modules/geometry/CMakeLists.txt index beeee8206ce00dbc04538e4991b6b0a0cc66c468..8013b773f9eb9588965ef3f76db4fe579d6053b2 100644 --- a/modules/geometry/CMakeLists.txt +++ b/modules/geometry/CMakeLists.txt @@ -9,7 +9,7 @@ add_library(${PROJECT_NAME} STATIC ${SRC_FILES}) target_link_libraries(${PROJECT_NAME} Boost::boost Eigen3::Eigen - tinyxml2) + tinyxml2::tinyxml2) set_target_properties(${PROJECT_NAME} PROPERTIES VERSION ${PROJECT_VERSION} diff --git a/modules/geometry/include/geometry/Covariance.hpp b/modules/geometry/include/geometry/Covariance.hpp index 5c7af4ccaa42ea181e9b808578f8a16f85c54153..bd74a06a36ca9bbc940792cd72cfcc6866255285 100644 --- a/modules/geometry/include/geometry/Covariance.hpp +++ b/modules/geometry/include/geometry/Covariance.hpp @@ -133,7 +133,7 @@ bool CovarianceMatrix(const Eigen::MatrixXd& in, Eigen::MatrixXd& out, EEstimato /// <summary> Calculation of the covariance matrix.\n /// \f[ M_{\operatorname{Cov}} = /// \begin{pmatrix} -/// V\left(x_1\right) & \operatorname{Cov}\left(x_1,x_2\right) &\cdots & \operatorname{Cov}\left(x_1,x_N\right)\\ +/// V\left(x_1\right) & \operatorname{Cov}\left(x_1,x_2\right) &\cdots & \operatorname{Cov}\left(x_1,x_N\right) \\ /// \operatorname{Cov}\left(x_2,x_1\right) &\ddots & \ddots & \vdots \\ /// \vdots & \ddots & \ddots & \vdots \\ /// \operatorname{Cov}\left(x_N,x_1\right) &\cdots & \cdots & V\left(x_N\right) @@ -164,9 +164,9 @@ bool CovarianceMatrixSCM(const Eigen::MatrixXd& samples, Eigen::MatrixXd& cov); /// described in "A Well-Conditioned Estimator for Large-Dimensional Covariance Matrices", Ledoit and Wolf, Journal of Multivariate Analysis, Volume 88, Issue 2, February 2004, pages 365-411. : \n /// \f[ /// \begin{aligned} -/// \vec{X}^2 &= \begin{pmatrix}x_{0,0}^2 & \cdots & x_{0,S}^2 \\ \vdots & \ddots &\vdots \\ x_{N,0}^2 & \cdots & x_{N,S}^2\end{pmatrix} \quad \text{with } x_{i,j} \in \vec{X}\\ +/// \vec{X}^2 &= \begin{pmatrix}x_{0,0}^2 & \cdots & x_{0,S}^2 \\ \vdots & \ddots &\vdots \\ x_{N,0}^2 & \cdots & x_{N,S}^2\end{pmatrix} \quad \text{with } x_{i,j} \in \vec{X} \\ /// M_{\mu} &= \mu\times I_N = \begin{pmatrix} \mu & 0 & \cdots & 0 \\ 0 & \ddots &\ddots & \vdots \\ \vdots & \ddots &\ddots & 0 \\ 0 & \cdots & 0 & \mu\end{pmatrix} -/// \quad \text{with } \mu = \frac{\operatorname{trace}(M_{\operatorname{Cov}})}{N}\\ +/// \quad \text{with } \mu = \frac{\operatorname{trace}(M_{\operatorname{Cov}})}{N} \\ /// M_{\delta} &= M_{\operatorname{Cov}}-M_{\mu}\\ /// M_{\delta}^2 &= M_{\delta} * M_{\delta}\\ /// M_{\beta} &= \frac{1}{S} \times \left(\vec{X}^2 * \vec{X}^{2\mathsf{T}}\right) - M_{Cov} * M_{Cov}\\ diff --git a/modules/geometry/test/CMakeLists.txt b/modules/geometry/test/CMakeLists.txt index 2fa7195fe46f0bc044e2a55ca47db3d1a11297af..7e4785a5f1cd428927da205503874427afdda1fc 100644 --- a/modules/geometry/test/CMakeLists.txt +++ b/modules/geometry/test/CMakeLists.txt @@ -25,9 +25,3 @@ SET_BUILD_PLATFORM() # Install files # ----------------------------- ADD_TEST(NAME test_Geometry COMMAND ${PROJECT_NAME}) - -OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "${PROJECT_NAME}" EXECUTABLE_NAME "${PROJECT_NAME}") -install(TARGETS ${PROJECT_NAME} - RUNTIME DESTINATION ${DIST_BINDIR} - LIBRARY DESTINATION ${DIST_LIBDIR} - ARCHIVE DESTINATION ${DIST_LIBDIR}) diff --git a/modules/lsl/CMakeLists.txt b/modules/lsl/CMakeLists.txt index 043e2e4084bcb924547f7d6443bc30f8a60a28da..492e19d6d289aa5315373667ec3ef112d6644a49 100644 --- a/modules/lsl/CMakeLists.txt +++ b/modules/lsl/CMakeLists.txt @@ -9,6 +9,7 @@ add_library(${PROJECT_NAME} STATIC ${SRC_FILES}) target_link_libraries(${PROJECT_NAME} openvibe openvibe-module-system + LSL::lsl ) target_include_directories(${PROJECT_NAME} @@ -24,9 +25,6 @@ if(UNIX) SET_TARGET_PROPERTIES(${PROJECT_NAME} PROPERTIES COMPILE_FLAGS "-fPIC") endif(UNIX) -# OpenViBE Third Party -include("FindThirdPartyLSL") - # --------------------------------- # Target macros # Defines target operating system, architecture and compiler diff --git a/plugins/processing/acquisition/CMakeLists.txt b/plugins/processing/acquisition/CMakeLists.txt index 5915c1d9b4b42a8cab5914525c47ee95e3de5452..25b33cc001165870c38d21b79be969b4fcfb7825 100644 --- a/plugins/processing/acquisition/CMakeLists.txt +++ b/plugins/processing/acquisition/CMakeLists.txt @@ -17,6 +17,9 @@ set_target_properties(${PROJECT_NAME} PROPERTIES add_definitions(-DTARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines) + +file(COPY box-tutorials DESTINATION ${BUILD_DATADIR}/scenarios/) + # ----------------------------- # Install files # ----------------------------- diff --git a/plugins/processing/artifact/CMakeLists.txt b/plugins/processing/artifact/CMakeLists.txt index f6e326f74a176816fc14ea70534002dfb7b50bcc..47395d0684b0d2c4b20f46da7f74831be080ed29 100644 --- a/plugins/processing/artifact/CMakeLists.txt +++ b/plugins/processing/artifact/CMakeLists.txt @@ -10,7 +10,8 @@ target_link_libraries(${PROJECT_NAME} openvibe-module-system openvibe-module-geometry openvibe-module-eigen - Eigen3::Eigen) + Eigen3::Eigen +) set_target_properties(${PROJECT_NAME} PROPERTIES VERSION ${PROJECT_VERSION} @@ -31,6 +32,10 @@ include("FindModuleGeometry") # --------------------------------- SET_BUILD_PLATFORM() +set(SUB_DIR_NAME artifact) + +file(COPY box-tutorials/ DESTINATION ${BUILD_DATADIR}/scenarios/box-tutorials/${SUB_DIR_NAME}) + # ----------------------------- # Install files # ----------------------------- @@ -39,6 +44,4 @@ install(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION ${DIST_LIBDIR} ARCHIVE DESTINATION ${DIST_LIBDIR}) -set(SUB_DIR_NAME artifact) - install(DIRECTORY box-tutorials/ DESTINATION ${DIST_DATADIR}/openvibe/scenarios/box-tutorials/${SUB_DIR_NAME}) diff --git a/plugins/processing/classification/CMakeLists.txt b/plugins/processing/classification/CMakeLists.txt index 4e6b663aaa5bedb96ee05328e70c22c19edcb3bb..386c427cc7a92ae5caf86449a861330b2a60d7cd 100755 --- a/plugins/processing/classification/CMakeLists.txt +++ b/plugins/processing/classification/CMakeLists.txt @@ -9,7 +9,9 @@ target_link_libraries(${PROJECT_NAME} openvibe openvibe-common openvibe-toolkit - Eigen3::Eigen) + Eigen3::Eigen +# No OMP inside OpenMP::OpenMP_CXX +) set_target_properties(${PROJECT_NAME} PROPERTIES VERSION ${PROJECT_VERSION} diff --git a/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierMLP.cpp b/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierMLP.cpp index aa3641563676b125cf7108fc4e33c4ba5ed981dc..ba1ff7bc3875b163ae98908ecac9d4be989aa12d 100644 --- a/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierMLP.cpp +++ b/plugins/processing/classification/src/algorithms/ovpCAlgorithmClassifierMLP.cpp @@ -14,9 +14,7 @@ namespace OpenViBE { namespace Plugins { namespace Classification { -//Need to be reachable from outside -const char* const MLP_EVALUATION_FUNCTION_NAME = "Evaluation function"; - +static const char* const MLP_EVALUATION_FUNCTION_NAME = "Evaluation function"; static const char* const MLP_TYPE_NODE_NAME = "MLP"; static const char* const MLP_NEURON_CONFIG_NODE_NAME = "Neuron-configuration"; static const char* const MLP_INPUT_NEURON_COUNT_NODE_NAME = "Input-neuron-count"; @@ -198,7 +196,7 @@ bool CAlgorithmClassifierMLP::train(const Toolkit::IFeatureVectorSet& dataset) oDeltaHiddenBias.setZero(); //The first cast of tanh has to been explicit for windows compilation oY1.noalias() = ((m_inputWeight * oTrainingDataMatrix).colwise() + m_inputBias).unaryExpr( - std::ptr_fun<double, double>(static_cast<double(*)(double)>(tanh))); + [](double ele) { return tanh(ele); }); oA2.noalias() = (m_hiddenWeight * oY1).colwise() + m_hiddenBias; for (Eigen::Index i = 0; i < Eigen::Index(featureCount); ++i) { const Eigen::VectorXd& oTarget = targetList[oTrainingSet[i]]; @@ -237,7 +235,7 @@ bool CAlgorithmClassifierMLP::train(const Toolkit::IFeatureVectorSet& dataset) //Now we compute the cumulative error in the validation set cumulativeError = 0; //We don't compute Y2 because we train on the identity - oA2.noalias() = (m_hiddenWeight * ((m_inputWeight * oValidationDataMatrix).colwise() + m_inputBias).unaryExpr(std::ptr_fun<double, double>(tanh))). + oA2.noalias() = (m_hiddenWeight * ((m_inputWeight * oValidationDataMatrix).colwise() + m_inputBias).unaryExpr( [](double ele) { return tanh(ele); })). colwise() + m_hiddenBias; for (Eigen::Index i = 0; i < Eigen::Index(oValidationSet.size()); ++i) { const Eigen::VectorXd& oTarget = targetList[oValidationSet[i]]; @@ -273,10 +271,10 @@ bool CAlgorithmClassifierMLP::classify(const Toolkit::IFeatureVector& sample, do const size_t classCount = m_labels.size(); - Eigen::VectorXd oA2 = m_hiddenBias + (m_hiddenWeight * (m_inputBias + (m_inputWeight * oData)).unaryExpr(std::ptr_fun<double, double>(tanh))); + Eigen::VectorXd oA2 = m_hiddenBias + (m_hiddenWeight * (m_inputBias + (m_inputWeight * oData)).unaryExpr([](double ele) { return tanh(ele); })); //The final transfer function is the softmax - Eigen::VectorXd oY2 = oA2.unaryExpr(std::ptr_fun<double, double>(exp)); + Eigen::VectorXd oY2 = oA2.unaryExpr([](double ele) { return exp(ele); }); oY2 /= oY2.sum(); distance.setSize(classCount); diff --git a/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmOutlierRemoval.h b/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmOutlierRemoval.h index 44aef15937eb7b9338e0c73025123fa49fc47fb0..95bada2869dd89d868051f30b8b3204ef90b9ed7 100644 --- a/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmOutlierRemoval.h +++ b/plugins/processing/classification/src/box-algorithms/ovpCBoxAlgorithmOutlierRemoval.h @@ -25,7 +25,7 @@ public: _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm<IBoxAlgorithm>, OVP_ClassId_BoxAlgorithm_OutlierRemoval) protected: - typedef struct + typedef struct SFeature { CMatrix* sampleMatrix; uint64_t startTime; diff --git a/plugins/processing/classification/src/ovp_defines.h b/plugins/processing/classification/src/ovp_defines.h index 142d2c173c85fc48b5df8383836fced29eee4fa4..726f033bc8ec051c49b868f16745294b52698f42 100755 --- a/plugins/processing/classification/src/ovp_defines.h +++ b/plugins/processing/classification/src/ovp_defines.h @@ -11,22 +11,4 @@ #define OVP_TypeId_ClassificationPairwiseStrategy OpenViBE::CIdentifier(0x0DD51C74, 0x3C4E74C9) #define OVP_TypeId_OneVsOne_DecisionAlgorithms OpenViBE::CIdentifier(0xDEC1510, 0xDEC1510) - -extern const char* const FORMAT_VERSION_ATTRIBUTE_NAME; -extern const char* const IDENTIFIER_ATTRIBUTE_NAME; - -extern const char* const STRATEGY_NODE_NAME; -extern const char* const ALGORITHM_NODE_NAME; -extern const char* const STIMULATIONS_NODE_NAME; -extern const char* const REJECTED_CLASS_NODE_NAME; -extern const char* const CLASS_STIMULATION_NODE_NAME; - -extern const char* const CLASSIFICATION_BOX_ROOT; -extern const char* const CLASSIFIER_ROOT; - -extern const char* const PAIRWISE_STRATEGY_ENUMERATION_NAME; - -extern const char* const MLP_EVALUATION_FUNCTION_NAME; -extern const char* const MLP_TRANSFERT_FUNCTION_NAME; - bool OVFloatEqual(double first, double second); diff --git a/plugins/processing/classification/src/ovp_main.cpp b/plugins/processing/classification/src/ovp_main.cpp index e3eedac36f59f0b91493b6e937d133ee155e7c10..22dd37db02339f2e99913db5a3cfd8f314d074ee 100755 --- a/plugins/processing/classification/src/ovp_main.cpp +++ b/plugins/processing/classification/src/ovp_main.cpp @@ -11,8 +11,6 @@ #include<cmath> -const char* const PAIRWISE_STRATEGY_ENUMERATION_NAME = "Pairwise Decision Strategy"; - namespace OpenViBE { namespace Plugins { namespace Classification { @@ -35,7 +33,7 @@ OVP_Declare_Begin() context.getTypeManager().registerEnumerationEntry(OVP_TypeId_SVMKernelType, "Sigmoid", SIGMOID); - context.getTypeManager().registerEnumerationType(OVP_TypeId_ClassificationPairwiseStrategy, PAIRWISE_STRATEGY_ENUMERATION_NAME); + context.getTypeManager().registerEnumerationType(OVP_TypeId_ClassificationPairwiseStrategy, "Pairwise Decision Strategy"); context.getTypeManager().registerEnumerationEntry(OVP_TypeId_ClassificationPairwiseStrategy, "Support Vector Machine (SVM)", OVP_ClassId_Algorithm_ClassifierSVM.id()); diff --git a/plugins/processing/classification/test/CMakeLists.txt b/plugins/processing/classification/test/CMakeLists.txt index c7f0519759e68a24879cc59f714f9c399d2ac677..4bc6d194f62c514c49d3e7ec14c2762fbbb0ebd8 100644 --- a/plugins/processing/classification/test/CMakeLists.txt +++ b/plugins/processing/classification/test/CMakeLists.txt @@ -12,11 +12,3 @@ add_definitions(-DTARGET_ARCHITECTURE_i386) include_directories(../src) add_executable(${PROJECT_NAME} test_accuracy.cpp) set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${TESTS_FOLDER}) # Place project in folder unit-test (for some IDE) - -# Unfortunately we need to install the tests as any application to find .dll/.so files -# on both Windows and Linux. -OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "${PROJECT_NAME}" EXECUTABLE_NAME "${PROJECT_NAME}") -install(TARGETS ${PROJECT_NAME} - RUNTIME DESTINATION ${DIST_BINDIR} - LIBRARY DESTINATION ${DIST_LIBDIR} - ARCHIVE DESTINATION ${DIST_LIBDIR}) \ No newline at end of file diff --git a/plugins/processing/classification/test/DartTestfile.txt b/plugins/processing/classification/test/DartTestfile.txt index 8ec5fe64c7db850b84fecfde37cbfc53891ca12c..2ceca5ff23e1a387026e6ec6b98acb3abba38bc0 100644 --- a/plugins/processing/classification/test/DartTestfile.txt +++ b/plugins/processing/classification/test/DartTestfile.txt @@ -29,8 +29,8 @@ foreach(TEST_NAME ${TEST_SCENARIOS}) set(SCENARIO_TO_TEST "shrinkageLDA/${TEST_NAME}.xml") add_test(clean_Classification_${TEST_NAME} "${CMAKE_COMMAND}" "-E" "remove" "-f" ${OV_LOGFILE}) - add_test(run_Classification_${TEST_NAME} "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--invisible" "--no-session-management" --define Plugin_Classification_RandomizeKFoldTestData true "--play-fast" ${SCENARIO_TO_TEST}) - add_test(compare_Classification_${TEST_NAME} "$ENV{OV_BINARY_PATH}/test_accuracy.${EXT}" ${OS_FLAGS} ${OV_LOGFILE} ${TEST_THRESHOLD}) + add_test(run_Classification_${TEST_NAME} "$ENV{OV_BINARY_PATH}/openvibe-designer" ${OS_FLAGS} "--invisible" "--no-session-management" --define Plugin_Classification_RandomizeKFoldTestData true "--play-fast" ${SCENARIO_TO_TEST}) + add_test(compare_Classification_${TEST_NAME} "$ENV{OV_BINARY_PATH}/test_accuracy" ${OS_FLAGS} ${OV_LOGFILE} ${TEST_THRESHOLD}) # It would be better to clean last, but we can't do this as it will delete the # output we wish to include, and we can't prevent clean from running if a prev. test fails diff --git a/plugins/processing/classification/test/scenarios-tests/LDA-Native-test.xml b/plugins/processing/classification/test/scenarios-tests/LDA-Native-test.xml index 8a90f89d02300c249adca676bcff829121a3cfd6..b46df23a1f6d6ff024385fc4be44e0b0f8d7c327 100644 --- a/plugins/processing/classification/test/scenarios-tests/LDA-Native-test.xml +++ b/plugins/processing/classification/test/scenarios-tests/LDA-Native-test.xml @@ -1,7 +1,7 @@ <OpenViBE-Scenario> <FormatVersion>2</FormatVersion> <Creator>OpenViBE Designer</Creator> - <CreatorVersion>3.3.0</CreatorVersion> + <CreatorVersion>3.6.0</CreatorVersion> <Settings> <Setting> <Identifier>(0x00425137, 0xf2a30c29)</Identifier> @@ -367,6 +367,159 @@ </Attribute> </Attributes> </Box> + <Box> + <Identifier>(0x000058ab, 0x000075df)</Identifier> + <Name>Classifier trainer</Name> + <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Stimulations</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 1</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 2</Name> + </Input> + <Input> + <Identifier>(0xba230fd4, 0x094eb666)</Identifier> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 3</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Train-completed Flag</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Train trigger</Name> + <DefaultValue>OVTK_StimulationId_Train</DefaultValue> + <Value>OVTK_StimulationId_ExperimentStop</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> + <Name>Filename to save configuration to</Name> + <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> + <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> + <Name>Multiclass strategy to apply</Name> + <DefaultValue>Native</DefaultValue> + <Value>Native</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 1 label</Name> + <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> + <Value>OVTK_StimulationId_Label_01</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 2 label</Name> + <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> + <Value>OVTK_StimulationId_Label_02</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 3 label</Name> + <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> + <Value>OVTK_StimulationId_Label_03</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> + <Name>Algorithm to use</Name> + <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> + <Value>Linear Discrimimant Analysis (LDA)</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Number of partitions for k-fold cross-validation test</Name> + <DefaultValue>10</DefaultValue> + <Value>5</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Use shrinkage</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Shrinkage coefficient (-1 == auto)</Name> + <DefaultValue>-1.000000</DefaultValue> + <Value>-1.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Shrinkage: Force diagonal cov (DDA)</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Randomize k-fold cross-validation test data</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Balance classes</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>272</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>880</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0xac393893, 0x25854082)</Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>7</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>3</Value> + </Attribute> + <Attribute> + <Identifier>(0xfba64161, 0x65304e21)</Identifier> + <Value></Value> + </Attribute> + </Attributes> + </Box> <Box> <Identifier>(0x0000646c, 0x000059a1)</Identifier> <Name>Signal Power Log</Name> @@ -1083,159 +1236,6 @@ </Attribute> </Attributes> </Box> - <Box> - <Identifier>(0x56fbfd1a, 0x2c474c9e)</Identifier> - <Name>Classifier trainer</Name> - <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> - <Inputs> - <Input> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Stimulations</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 1</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 2</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 3</Name> - </Input> - </Inputs> - <Outputs> - <Output> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Train-completed Flag</Name> - </Output> - </Outputs> - <Settings> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Train trigger</Name> - <DefaultValue>OVTK_StimulationId_Train</DefaultValue> - <Value>OVTK_StimulationId_ExperimentStop</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> - <Name>Filename to save configuration to</Name> - <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> - <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> - <Name>Multiclass strategy to apply</Name> - <DefaultValue>Native</DefaultValue> - <Value>Native</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 1 label</Name> - <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> - <Value>OVTK_StimulationId_Label_01</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 2 label</Name> - <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> - <Value>OVTK_StimulationId_Label_02</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 3 label</Name> - <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> - <Value>OVTK_StimulationId_Label_03</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> - <Name>Algorithm to use</Name> - <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> - <Value>Linear Discrimimant Analysis (LDA)</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Use shrinkage</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Shrinkage coefficient (-1 == auto)</Name> - <DefaultValue>-1.000000</DefaultValue> - <Value>-1</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Shrinkage: Force diagonal cov (DDA)</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of partitions for k-fold cross-validation test</Name> - <DefaultValue>10</DefaultValue> - <Value>5</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Balance classes</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - </Settings> - <Attributes> - <Attribute> - <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>288</Value> - </Attribute> - <Attribute> - <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>880</Value> - </Attribute> - <Attribute> - <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x9de21779, 0x37776c89)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier> - <Value>(0x00000000, 0x082a348e)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier> - <Value>false</Value> - </Attribute> - <Attribute> - <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> - <Value>1</Value> - </Attribute> - <Attribute> - <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>5</Value> - </Attribute> - <Attribute> - <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> - <Value>3</Value> - </Attribute> - <Attribute> - <Identifier>(0xfba64161, 0x65304e21)</Identifier> - <Value></Value> - </Attribute> - </Attributes> - </Box> <Box> <Identifier>(0x6292a294, 0x629905c2)</Identifier> <Name>Target Separator</Name> @@ -1569,14 +1569,14 @@ </Target> </Link> <Link> - <Identifier>(0x00002bf0, 0x0000520c)</Identifier> + <Identifier>(0x00001ef0, 0x0000130e)</Identifier> <Source> - <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> + <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> + <BoxOutputIndex>2</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxInputIndex>2</BoxInputIndex> </Target> </Link> <Link> @@ -1623,6 +1623,17 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x000044fd, 0x000078dc)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> + <BoxOutputIndex>1</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00004dc4, 0x000063ae)</Identifier> <Source> @@ -1634,6 +1645,17 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x000051d5, 0x000062b8)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> + <BoxOutputIndex>3</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxInputIdentifier>(0xba230fd4, 0x094eb666)</BoxInputIdentifier> + </Target> + </Link> <Link> <Identifier>(0x00005232, 0x000054a6)</Identifier> <Source> @@ -1723,14 +1745,25 @@ </Target> </Link> <Link> - <Identifier>(0x04425bf5, 0x3335d8a7)</Identifier> + <Identifier>(0x00006ebc, 0x00000533)</Identifier> <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> - <BoxOutputIndex>3</BoxOutputIndex> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x2a62aa62, 0x22b9aa6a)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> + <Link> + <Identifier>(0x00006fab, 0x00005e07)</Identifier> + <Source> + <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>3</BoxInputIndex> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> </Target> </Link> <Link> @@ -1788,17 +1821,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x55200f87, 0x00b3c658)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> - <BoxOutputIndex>2</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>2</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x584f1915, 0x72e8000a)</Identifier> <Source> @@ -1810,28 +1832,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x72ae14cf, 0x7201ea84)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> - <BoxOutputIndex>1</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> - </Target> - </Link> - <Link> - <Identifier>(0x731aa1b4, 0x14c8e6c0)</Identifier> - <Source> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x2a62aa62, 0x22b9aa6a)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> </Links> <Comments></Comments> <Metadata> diff --git a/plugins/processing/classification/test/scenarios-tests/LDA-OneVsAll-test.xml b/plugins/processing/classification/test/scenarios-tests/LDA-OneVsAll-test.xml index eb82b9f71e92921d3cff872d958eee7ea35167a6..6013c1d9de89acdb8a8106c2fb5c00cf76c4de28 100644 --- a/plugins/processing/classification/test/scenarios-tests/LDA-OneVsAll-test.xml +++ b/plugins/processing/classification/test/scenarios-tests/LDA-OneVsAll-test.xml @@ -1,7 +1,7 @@ <OpenViBE-Scenario> <FormatVersion>2</FormatVersion> <Creator>OpenViBE Designer</Creator> - <CreatorVersion>3.2.0</CreatorVersion> + <CreatorVersion>3.6.0</CreatorVersion> <Settings> <Setting> <Identifier>(0x00425137, 0xf2a30c29)</Identifier> @@ -367,6 +367,159 @@ </Attribute> </Attributes> </Box> + <Box> + <Identifier>(0x000058ab, 0x000075df)</Identifier> + <Name>Classifier trainer</Name> + <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Stimulations</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 1</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 2</Name> + </Input> + <Input> + <Identifier>(0xba230fd4, 0x094eb666)</Identifier> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 3</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Train-completed Flag</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Train trigger</Name> + <DefaultValue>OVTK_StimulationId_Train</DefaultValue> + <Value>OVTK_StimulationId_ExperimentStop</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> + <Name>Filename to save configuration to</Name> + <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> + <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> + <Name>Multiclass strategy to apply</Name> + <DefaultValue>Native</DefaultValue> + <Value>OneVsAll</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 1 label</Name> + <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> + <Value>OVTK_StimulationId_Label_01</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 2 label</Name> + <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> + <Value>OVTK_StimulationId_Label_02</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 3 label</Name> + <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> + <Value>OVTK_StimulationId_Label_03</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> + <Name>Algorithm to use</Name> + <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> + <Value>Linear Discrimimant Analysis (LDA)</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Number of partitions for k-fold cross-validation test</Name> + <DefaultValue>10</DefaultValue> + <Value>10</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Use shrinkage</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Shrinkage coefficient (-1 == auto)</Name> + <DefaultValue>-1.000000</DefaultValue> + <Value>-1.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Shrinkage: Force diagonal cov (DDA)</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Randomize k-fold cross-validation test data</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Balance classes</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>1088</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>1152</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0xac393893, 0x25854082)</Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>7</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>3</Value> + </Attribute> + <Attribute> + <Identifier>(0xfba64161, 0x65304e21)</Identifier> + <Value></Value> + </Attribute> + </Attributes> + </Box> <Box> <Identifier>(0x0000646c, 0x000059a1)</Identifier> <Name>Signal Power Log</Name> @@ -1083,159 +1236,6 @@ </Attribute> </Attributes> </Box> - <Box> - <Identifier>(0x56fbfd1a, 0x2c474c9e)</Identifier> - <Name>Classifier trainer</Name> - <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> - <Inputs> - <Input> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Stimulations</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 1</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 2</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 3</Name> - </Input> - </Inputs> - <Outputs> - <Output> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Train-completed Flag</Name> - </Output> - </Outputs> - <Settings> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Train trigger</Name> - <DefaultValue>OVTK_StimulationId_Train</DefaultValue> - <Value>OVTK_StimulationId_ExperimentStop</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> - <Name>Filename to save configuration to</Name> - <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> - <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> - <Name>Multiclass strategy to apply</Name> - <DefaultValue>Native</DefaultValue> - <Value>OneVsAll</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 1 label</Name> - <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> - <Value>OVTK_StimulationId_Label_01</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 2 label</Name> - <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> - <Value>OVTK_StimulationId_Label_02</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 3 label</Name> - <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> - <Value>OVTK_StimulationId_Label_03</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> - <Name>Algorithm to use</Name> - <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> - <Value>Linear Discrimimant Analysis (LDA)</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Use shrinkage</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Shrinkage coefficient (-1 == auto)</Name> - <DefaultValue>-1.000000</DefaultValue> - <Value>-1</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Shrinkage: Force diagonal cov (DDA)</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of partitions for k-fold cross-validation test</Name> - <DefaultValue>10</DefaultValue> - <Value>10</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Balance classes</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - </Settings> - <Attributes> - <Attribute> - <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>1088</Value> - </Attribute> - <Attribute> - <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>1152</Value> - </Attribute> - <Attribute> - <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x9de21779, 0x37776c89)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier> - <Value>(0x00000000, 0x082a348e)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier> - <Value>false</Value> - </Attribute> - <Attribute> - <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> - <Value>1</Value> - </Attribute> - <Attribute> - <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>5</Value> - </Attribute> - <Attribute> - <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> - <Value>3</Value> - </Attribute> - <Attribute> - <Identifier>(0xfba64161, 0x65304e21)</Identifier> - <Value></Value> - </Attribute> - </Attributes> - </Box> <Box> <Identifier>(0x6292a294, 0x629905c2)</Identifier> <Name>Target Separator</Name> @@ -1535,6 +1535,17 @@ <BoxInputIndex>1</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x000013ba, 0x000046fa)</Identifier> + <Source> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x2a62aa62, 0x22b9aa6a)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x000017f0, 0x00001a31)</Identifier> <Source> @@ -1568,17 +1579,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x00002bf0, 0x0000520c)</Identifier> - <Source> - <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x0000391f, 0x0000535d)</Identifier> <Source> @@ -1634,6 +1634,17 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x00004e2a, 0x00004bca)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> + <BoxOutputIndex>1</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00005232, 0x000054a6)</Identifier> <Source> @@ -1645,6 +1656,17 @@ <BoxInputIdentifier>(0x4a942408, 0x0f60530d)</BoxInputIdentifier> </Target> </Link> + <Link> + <Identifier>(0x00005376, 0x00007ac0)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> + <BoxOutputIndex>3</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxInputIdentifier>(0xba230fd4, 0x094eb666)</BoxInputIdentifier> + </Target> + </Link> <Link> <Identifier>(0x000056a2, 0x00005ae5)</Identifier> <Source> @@ -1700,6 +1722,17 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x0000673e, 0x00007c5b)</Identifier> + <Source> + <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x000068de, 0x00007645)</Identifier> <Source> @@ -1723,14 +1756,14 @@ </Target> </Link> <Link> - <Identifier>(0x04425bf5, 0x3335d8a7)</Identifier> + <Identifier>(0x00007af0, 0x00005676)</Identifier> <Source> <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> - <BoxOutputIndex>3</BoxOutputIndex> + <BoxOutputIndex>2</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>3</BoxInputIndex> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxInputIndex>2</BoxInputIndex> </Target> </Link> <Link> @@ -1788,17 +1821,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x55200f87, 0x00b3c658)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> - <BoxOutputIndex>2</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>2</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x584f1915, 0x72e8000a)</Identifier> <Source> @@ -1810,28 +1832,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x72ae14cf, 0x7201ea84)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> - <BoxOutputIndex>1</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> - </Target> - </Link> - <Link> - <Identifier>(0x731aa1b4, 0x14c8e6c0)</Identifier> - <Source> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x2a62aa62, 0x22b9aa6a)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> </Links> <Comments></Comments> <Metadata> diff --git a/plugins/processing/classification/test/scenarios-tests/LDA-OneVsOne-HT-test.xml b/plugins/processing/classification/test/scenarios-tests/LDA-OneVsOne-HT-test.xml index 6cb96ffb4c04137affc9faf9b784aa357b60660a..ac5b30c39386e16cf008067ebad3e15912b1ea18 100644 --- a/plugins/processing/classification/test/scenarios-tests/LDA-OneVsOne-HT-test.xml +++ b/plugins/processing/classification/test/scenarios-tests/LDA-OneVsOne-HT-test.xml @@ -1,7 +1,7 @@ <OpenViBE-Scenario> <FormatVersion>2</FormatVersion> <Creator>OpenViBE Designer</Creator> - <CreatorVersion>3.2.0</CreatorVersion> + <CreatorVersion>3.6.0</CreatorVersion> <Settings> <Setting> <Identifier>(0x00425137, 0xf2a30c29)</Identifier> @@ -367,6 +367,166 @@ </Attribute> </Attributes> </Box> + <Box> + <Identifier>(0x000058ab, 0x000075df)</Identifier> + <Name>Classifier trainer</Name> + <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Stimulations</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 1</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 2</Name> + </Input> + <Input> + <Identifier>(0xba230fd4, 0x094eb666)</Identifier> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 3</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Train-completed Flag</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Train trigger</Name> + <DefaultValue>OVTK_StimulationId_Train</DefaultValue> + <Value>OVTK_StimulationId_ExperimentStop</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> + <Name>Filename to save configuration to</Name> + <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> + <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> + <Name>Multiclass strategy to apply</Name> + <DefaultValue>Native</DefaultValue> + <Value>OneVsOne</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x79146976, 0xd7f01a25)</TypeIdentifier> + <Name>Pairwise Decision Strategy</Name> + <DefaultValue>PKPD</DefaultValue> + <Value>HT</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 1 label</Name> + <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> + <Value>OVTK_StimulationId_Label_01</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 2 label</Name> + <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> + <Value>OVTK_StimulationId_Label_02</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 3 label</Name> + <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> + <Value>OVTK_StimulationId_Label_03</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> + <Name>Algorithm to use</Name> + <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> + <Value>Linear Discrimimant Analysis (LDA)</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Number of partitions for k-fold cross-validation test</Name> + <DefaultValue>10</DefaultValue> + <Value>10</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Use shrinkage</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Shrinkage coefficient (-1 == auto)</Name> + <DefaultValue>-1.000000</DefaultValue> + <Value>-1.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Shrinkage: Force diagonal cov (DDA)</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Randomize k-fold cross-validation test data</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Balance classes</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>1136</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>1360</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0xac393893, 0x25854082)</Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>7</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>3</Value> + </Attribute> + <Attribute> + <Identifier>(0xfba64161, 0x65304e21)</Identifier> + <Value></Value> + </Attribute> + </Attributes> + </Box> <Box> <Identifier>(0x0000646c, 0x000059a1)</Identifier> <Name>Signal Power Log</Name> @@ -1083,166 +1243,6 @@ </Attribute> </Attributes> </Box> - <Box> - <Identifier>(0x56fbfd1a, 0x2c474c9e)</Identifier> - <Name>Classifier trainer</Name> - <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> - <Inputs> - <Input> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Stimulations</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 1</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 2</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 3</Name> - </Input> - </Inputs> - <Outputs> - <Output> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Train-completed Flag</Name> - </Output> - </Outputs> - <Settings> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Train trigger</Name> - <DefaultValue>OVTK_StimulationId_Train</DefaultValue> - <Value>OVTK_StimulationId_ExperimentStop</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> - <Name>Filename to save configuration to</Name> - <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> - <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> - <Name>Multiclass strategy to apply</Name> - <DefaultValue>Native</DefaultValue> - <Value>OneVsOne</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x79146976, 0xd7f01a25)</TypeIdentifier> - <Name>Pairwise Decision Strategy</Name> - <DefaultValue>PKPD</DefaultValue> - <Value>HT</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 1 label</Name> - <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> - <Value>OVTK_StimulationId_Label_01</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 2 label</Name> - <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> - <Value>OVTK_StimulationId_Label_02</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 3 label</Name> - <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> - <Value>OVTK_StimulationId_Label_03</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> - <Name>Algorithm to use</Name> - <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> - <Value>Linear Discrimimant Analysis (LDA)</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Use shrinkage</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Shrinkage coefficient (-1 == auto)</Name> - <DefaultValue>-1.000000</DefaultValue> - <Value>-1</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Shrinkage: Force diagonal cov (DDA)</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of partitions for k-fold cross-validation test</Name> - <DefaultValue>10</DefaultValue> - <Value>10</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Balance classes</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - </Settings> - <Attributes> - <Attribute> - <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>1152</Value> - </Attribute> - <Attribute> - <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>1360</Value> - </Attribute> - <Attribute> - <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x9de21779, 0x37776c89)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier> - <Value>(0x00000000, 0x082a348e)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier> - <Value>false</Value> - </Attribute> - <Attribute> - <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> - <Value>1</Value> - </Attribute> - <Attribute> - <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>5</Value> - </Attribute> - <Attribute> - <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> - <Value>3</Value> - </Attribute> - <Attribute> - <Identifier>(0xfba64161, 0x65304e21)</Identifier> - <Value></Value> - </Attribute> - </Attributes> - </Box> <Box> <Identifier>(0x6292a294, 0x629905c2)</Identifier> <Name>Target Separator</Name> @@ -1576,16 +1576,27 @@ </Target> </Link> <Link> - <Identifier>(0x00002bf0, 0x0000520c)</Identifier> + <Identifier>(0x00001e41, 0x000071d9)</Identifier> <Source> <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x00002a08, 0x00001877)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> + <BoxOutputIndex>2</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxInputIndex>2</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x0000391f, 0x0000535d)</Identifier> <Source> @@ -1685,6 +1696,17 @@ <BoxInputIdentifier>(0x4a942408, 0x0f60530d)</BoxInputIdentifier> </Target> </Link> + <Link> + <Identifier>(0x00006179, 0x0000590e)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> + <BoxOutputIndex>1</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x0000641e, 0x00005527)</Identifier> <Source> @@ -1730,14 +1752,25 @@ </Target> </Link> <Link> - <Identifier>(0x04425bf5, 0x3335d8a7)</Identifier> + <Identifier>(0x00007aab, 0x00003453)</Identifier> <Source> <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> <BoxOutputIndex>3</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>3</BoxInputIndex> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxInputIdentifier>(0xba230fd4, 0x094eb666)</BoxInputIdentifier> + </Target> + </Link> + <Link> + <Identifier>(0x00007d9c, 0x00003139)</Identifier> + <Source> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x2a62aa62, 0x22b9aa6a)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> </Target> </Link> <Link> @@ -1795,17 +1828,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x55200f87, 0x00b3c658)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> - <BoxOutputIndex>2</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>2</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x584f1915, 0x72e8000a)</Identifier> <Source> @@ -1817,28 +1839,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x72ae14cf, 0x7201ea84)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> - <BoxOutputIndex>1</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> - </Target> - </Link> - <Link> - <Identifier>(0x731aa1b4, 0x14c8e6c0)</Identifier> - <Source> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x2a62aa62, 0x22b9aa6a)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> </Links> <Comments></Comments> <Metadata> diff --git a/plugins/processing/classification/test/scenarios-tests/LDA-OneVsOne-PKPD-test.xml b/plugins/processing/classification/test/scenarios-tests/LDA-OneVsOne-PKPD-test.xml index f359a69e656912f0447127172e779744ad25ae7f..13b0d13293a1f856f1cb167cc91c2eb31274880a 100644 --- a/plugins/processing/classification/test/scenarios-tests/LDA-OneVsOne-PKPD-test.xml +++ b/plugins/processing/classification/test/scenarios-tests/LDA-OneVsOne-PKPD-test.xml @@ -1,7 +1,7 @@ <OpenViBE-Scenario> <FormatVersion>2</FormatVersion> <Creator>OpenViBE Designer</Creator> - <CreatorVersion>3.2.0</CreatorVersion> + <CreatorVersion>3.6.0</CreatorVersion> <Settings> <Setting> <Identifier>(0x00425137, 0xf2a30c29)</Identifier> @@ -367,6 +367,166 @@ </Attribute> </Attributes> </Box> + <Box> + <Identifier>(0x000058ab, 0x000075df)</Identifier> + <Name>Classifier trainer</Name> + <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Stimulations</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 1</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 2</Name> + </Input> + <Input> + <Identifier>(0xba230fd4, 0x094eb666)</Identifier> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 3</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Train-completed Flag</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Train trigger</Name> + <DefaultValue>OVTK_StimulationId_Train</DefaultValue> + <Value>OVTK_StimulationId_ExperimentStop</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> + <Name>Filename to save configuration to</Name> + <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> + <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> + <Name>Multiclass strategy to apply</Name> + <DefaultValue>Native</DefaultValue> + <Value>OneVsOne</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x79146976, 0xd7f01a25)</TypeIdentifier> + <Name>Pairwise Decision Strategy</Name> + <DefaultValue>PKPD</DefaultValue> + <Value>PKPD</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 1 label</Name> + <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> + <Value>OVTK_StimulationId_Label_01</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 2 label</Name> + <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> + <Value>OVTK_StimulationId_Label_02</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 3 label</Name> + <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> + <Value>OVTK_StimulationId_Label_03</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> + <Name>Algorithm to use</Name> + <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> + <Value>Linear Discrimimant Analysis (LDA)</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Number of partitions for k-fold cross-validation test</Name> + <DefaultValue>10</DefaultValue> + <Value>10</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Use shrinkage</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Shrinkage coefficient (-1 == auto)</Name> + <DefaultValue>-1.000000</DefaultValue> + <Value>-1.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Shrinkage: Force diagonal cov (DDA)</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Randomize k-fold cross-validation test data</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Balance classes</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>992</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>1312</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0xac393893, 0x25854082)</Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>7</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>3</Value> + </Attribute> + <Attribute> + <Identifier>(0xfba64161, 0x65304e21)</Identifier> + <Value></Value> + </Attribute> + </Attributes> + </Box> <Box> <Identifier>(0x0000646c, 0x000059a1)</Identifier> <Name>Signal Power Log</Name> @@ -1083,166 +1243,6 @@ </Attribute> </Attributes> </Box> - <Box> - <Identifier>(0x56fbfd1a, 0x2c474c9e)</Identifier> - <Name>Classifier trainer</Name> - <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> - <Inputs> - <Input> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Stimulations</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 1</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 2</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 3</Name> - </Input> - </Inputs> - <Outputs> - <Output> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Train-completed Flag</Name> - </Output> - </Outputs> - <Settings> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Train trigger</Name> - <DefaultValue>OVTK_StimulationId_Train</DefaultValue> - <Value>OVTK_StimulationId_ExperimentStop</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> - <Name>Filename to save configuration to</Name> - <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> - <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> - <Name>Multiclass strategy to apply</Name> - <DefaultValue>Native</DefaultValue> - <Value>OneVsOne</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x79146976, 0xd7f01a25)</TypeIdentifier> - <Name>Pairwise Decision Strategy</Name> - <DefaultValue>PKPD</DefaultValue> - <Value>PKPD</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 1 label</Name> - <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> - <Value>OVTK_StimulationId_Label_01</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 2 label</Name> - <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> - <Value>OVTK_StimulationId_Label_02</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 3 label</Name> - <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> - <Value>OVTK_StimulationId_Label_03</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> - <Name>Algorithm to use</Name> - <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> - <Value>Linear Discrimimant Analysis (LDA)</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Use shrinkage</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Shrinkage coefficient (-1 == auto)</Name> - <DefaultValue>-1.000000</DefaultValue> - <Value>-1</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Shrinkage: Force diagonal cov (DDA)</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of partitions for k-fold cross-validation test</Name> - <DefaultValue>10</DefaultValue> - <Value>10</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Balance classes</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - </Settings> - <Attributes> - <Attribute> - <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>1008</Value> - </Attribute> - <Attribute> - <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>1312</Value> - </Attribute> - <Attribute> - <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x9de21779, 0x37776c89)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier> - <Value>(0x00000000, 0x082a348e)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier> - <Value>false</Value> - </Attribute> - <Attribute> - <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> - <Value>1</Value> - </Attribute> - <Attribute> - <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>5</Value> - </Attribute> - <Attribute> - <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> - <Value>3</Value> - </Attribute> - <Attribute> - <Identifier>(0xfba64161, 0x65304e21)</Identifier> - <Value></Value> - </Attribute> - </Attributes> - </Box> <Box> <Identifier>(0x6292a294, 0x629905c2)</Identifier> <Name>Target Separator</Name> @@ -1576,13 +1576,13 @@ </Target> </Link> <Link> - <Identifier>(0x00002bf0, 0x0000520c)</Identifier> + <Identifier>(0x0000339f, 0x000017a7)</Identifier> <Source> - <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> + <BoxIdentifier>(0x2a62aa62, 0x22b9aa6a)</BoxIdentifier> <BoxInputIndex>0</BoxInputIndex> </Target> </Link> @@ -1597,6 +1597,17 @@ <BoxInputIdentifier>(0x4a942408, 0x0f60530d)</BoxInputIdentifier> </Target> </Link> + <Link> + <Identifier>(0x00003941, 0x00004ee4)</Identifier> + <Source> + <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00003b0c, 0x00004fa5)</Identifier> <Source> @@ -1630,6 +1641,17 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x00004c09, 0x000076cf)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> + <BoxOutputIndex>1</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00004dc4, 0x000063ae)</Identifier> <Source> @@ -1652,6 +1674,17 @@ <BoxInputIdentifier>(0x4a942408, 0x0f60530d)</BoxInputIdentifier> </Target> </Link> + <Link> + <Identifier>(0x00005369, 0x0000721d)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> + <BoxOutputIndex>2</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxInputIndex>2</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x000056a2, 0x00005ae5)</Identifier> <Source> @@ -1730,14 +1763,14 @@ </Target> </Link> <Link> - <Identifier>(0x04425bf5, 0x3335d8a7)</Identifier> + <Identifier>(0x00007805, 0x000034f2)</Identifier> <Source> <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> <BoxOutputIndex>3</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>3</BoxInputIndex> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxInputIdentifier>(0xba230fd4, 0x094eb666)</BoxInputIdentifier> </Target> </Link> <Link> @@ -1795,17 +1828,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x55200f87, 0x00b3c658)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> - <BoxOutputIndex>2</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>2</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x584f1915, 0x72e8000a)</Identifier> <Source> @@ -1817,28 +1839,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x72ae14cf, 0x7201ea84)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> - <BoxOutputIndex>1</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> - </Target> - </Link> - <Link> - <Identifier>(0x731aa1b4, 0x14c8e6c0)</Identifier> - <Source> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x2a62aa62, 0x22b9aa6a)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> </Links> <Comments></Comments> <Metadata> diff --git a/plugins/processing/classification/test/scenarios-tests/LDA-OneVsOne-Voting-test.xml b/plugins/processing/classification/test/scenarios-tests/LDA-OneVsOne-Voting-test.xml index 82961ce193a41e66cdc9dab7d8f7c1ad58765bcc..2387f59ad3c28e118db1f9210dcd77c26eb6eec0 100644 --- a/plugins/processing/classification/test/scenarios-tests/LDA-OneVsOne-Voting-test.xml +++ b/plugins/processing/classification/test/scenarios-tests/LDA-OneVsOne-Voting-test.xml @@ -1,7 +1,7 @@ <OpenViBE-Scenario> <FormatVersion>2</FormatVersion> <Creator>OpenViBE Designer</Creator> - <CreatorVersion>3.2.0</CreatorVersion> + <CreatorVersion>3.6.0</CreatorVersion> <Settings> <Setting> <Identifier>(0x00425137, 0xf2a30c29)</Identifier> @@ -367,6 +367,166 @@ </Attribute> </Attributes> </Box> + <Box> + <Identifier>(0x000058ab, 0x000075df)</Identifier> + <Name>Classifier trainer</Name> + <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Stimulations</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 1</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 2</Name> + </Input> + <Input> + <Identifier>(0xba230fd4, 0x094eb666)</Identifier> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 3</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Train-completed Flag</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Train trigger</Name> + <DefaultValue>OVTK_StimulationId_Train</DefaultValue> + <Value>OVTK_StimulationId_ExperimentStop</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> + <Name>Filename to save configuration to</Name> + <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> + <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> + <Name>Multiclass strategy to apply</Name> + <DefaultValue>Native</DefaultValue> + <Value>OneVsOne</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x79146976, 0xd7f01a25)</TypeIdentifier> + <Name>Pairwise Decision Strategy</Name> + <DefaultValue>PKPD</DefaultValue> + <Value>Voting</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 1 label</Name> + <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> + <Value>OVTK_StimulationId_Label_01</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 2 label</Name> + <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> + <Value>OVTK_StimulationId_Label_02</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 3 label</Name> + <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> + <Value>OVTK_StimulationId_Label_03</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> + <Name>Algorithm to use</Name> + <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> + <Value>Linear Discrimimant Analysis (LDA)</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Number of partitions for k-fold cross-validation test</Name> + <DefaultValue>10</DefaultValue> + <Value>10</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Use shrinkage</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Shrinkage coefficient (-1 == auto)</Name> + <DefaultValue>-1.000000</DefaultValue> + <Value>-1.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Shrinkage: Force diagonal cov (DDA)</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Randomize k-fold cross-validation test data</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Balance classes</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>1008</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>1088</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0xac393893, 0x25854082)</Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>7</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>3</Value> + </Attribute> + <Attribute> + <Identifier>(0xfba64161, 0x65304e21)</Identifier> + <Value></Value> + </Attribute> + </Attributes> + </Box> <Box> <Identifier>(0x0000646c, 0x000059a1)</Identifier> <Name>Signal Power Log</Name> @@ -1083,166 +1243,6 @@ </Attribute> </Attributes> </Box> - <Box> - <Identifier>(0x56fbfd1a, 0x2c474c9e)</Identifier> - <Name>Classifier trainer</Name> - <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> - <Inputs> - <Input> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Stimulations</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 1</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 2</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 3</Name> - </Input> - </Inputs> - <Outputs> - <Output> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Train-completed Flag</Name> - </Output> - </Outputs> - <Settings> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Train trigger</Name> - <DefaultValue>OVTK_StimulationId_Train</DefaultValue> - <Value>OVTK_StimulationId_ExperimentStop</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> - <Name>Filename to save configuration to</Name> - <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> - <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> - <Name>Multiclass strategy to apply</Name> - <DefaultValue>Native</DefaultValue> - <Value>OneVsOne</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x79146976, 0xd7f01a25)</TypeIdentifier> - <Name>Pairwise Decision Strategy</Name> - <DefaultValue>PKPD</DefaultValue> - <Value>Voting</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 1 label</Name> - <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> - <Value>OVTK_StimulationId_Label_01</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 2 label</Name> - <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> - <Value>OVTK_StimulationId_Label_02</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 3 label</Name> - <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> - <Value>OVTK_StimulationId_Label_03</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> - <Name>Algorithm to use</Name> - <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> - <Value>Linear Discrimimant Analysis (LDA)</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Use shrinkage</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Shrinkage coefficient (-1 == auto)</Name> - <DefaultValue>-1.000000</DefaultValue> - <Value>-1</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Shrinkage: Force diagonal cov (DDA)</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of partitions for k-fold cross-validation test</Name> - <DefaultValue>10</DefaultValue> - <Value>10</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Balance classes</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - </Settings> - <Attributes> - <Attribute> - <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>1008</Value> - </Attribute> - <Attribute> - <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>1088</Value> - </Attribute> - <Attribute> - <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x9de21779, 0x37776c89)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier> - <Value>(0x00000000, 0x082a348e)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier> - <Value>false</Value> - </Attribute> - <Attribute> - <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> - <Value>1</Value> - </Attribute> - <Attribute> - <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>5</Value> - </Attribute> - <Attribute> - <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> - <Value>3</Value> - </Attribute> - <Attribute> - <Identifier>(0xfba64161, 0x65304e21)</Identifier> - <Value></Value> - </Attribute> - </Attributes> - </Box> <Box> <Identifier>(0x6292a294, 0x629905c2)</Identifier> <Name>Target Separator</Name> @@ -1509,6 +1509,17 @@ </Box> </Boxes> <Links> + <Link> + <Identifier>(0x00000734, 0x00007dfa)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> + <BoxOutputIndex>1</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00000750, 0x00007192)</Identifier> <Source> @@ -1531,6 +1542,17 @@ <BoxInputIndex>1</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x00000fa0, 0x000000fc)</Identifier> + <Source> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x2a62aa62, 0x22b9aa6a)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x000011f0, 0x00001ba1)</Identifier> <Source> @@ -1576,13 +1598,13 @@ </Target> </Link> <Link> - <Identifier>(0x00002bf0, 0x0000520c)</Identifier> + <Identifier>(0x0000391e, 0x00006f34)</Identifier> <Source> <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> <BoxInputIndex>0</BoxInputIndex> </Target> </Link> @@ -1730,14 +1752,25 @@ </Target> </Link> <Link> - <Identifier>(0x04425bf5, 0x3335d8a7)</Identifier> + <Identifier>(0x0000784e, 0x00004780)</Identifier> <Source> <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> <BoxOutputIndex>3</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>3</BoxInputIndex> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxInputIdentifier>(0xba230fd4, 0x094eb666)</BoxInputIdentifier> + </Target> + </Link> + <Link> + <Identifier>(0x00007a07, 0x00001df5)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> + <BoxOutputIndex>2</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxInputIndex>2</BoxInputIndex> </Target> </Link> <Link> @@ -1795,17 +1828,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x55200f87, 0x00b3c658)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> - <BoxOutputIndex>2</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>2</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x584f1915, 0x72e8000a)</Identifier> <Source> @@ -1817,28 +1839,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x72ae14cf, 0x7201ea84)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> - <BoxOutputIndex>1</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> - </Target> - </Link> - <Link> - <Identifier>(0x731aa1b4, 0x14c8e6c0)</Identifier> - <Source> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x2a62aa62, 0x22b9aa6a)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> </Links> <Comments></Comments> <Metadata> diff --git a/plugins/processing/classification/test/scenarios-tests/MLP-Native-test.xml b/plugins/processing/classification/test/scenarios-tests/MLP-Native-test.xml index 50c4f52ec09ee6ce5e08e963d634d53adedb7505..b4595a5c97ef8dca548e3301fb90725e3edfbd90 100644 --- a/plugins/processing/classification/test/scenarios-tests/MLP-Native-test.xml +++ b/plugins/processing/classification/test/scenarios-tests/MLP-Native-test.xml @@ -1,7 +1,7 @@ <OpenViBE-Scenario> <FormatVersion>2</FormatVersion> <Creator>OpenViBE Designer</Creator> - <CreatorVersion>3.2.0</CreatorVersion> + <CreatorVersion>3.6.0</CreatorVersion> <Settings> <Setting> <Identifier>(0x00425137, 0xf2a30c29)</Identifier> @@ -257,6 +257,159 @@ </Attribute> </Attributes> </Box> + <Box> + <Identifier>(0x00001dc6, 0x00006b9c)</Identifier> + <Name>Classifier trainer</Name> + <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Stimulations</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 1</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 2</Name> + </Input> + <Input> + <Identifier>(0x9b25397c, 0x36309ca4)</Identifier> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 3</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Train-completed Flag</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Train trigger</Name> + <DefaultValue>OVTK_StimulationId_Train</DefaultValue> + <Value>OVTK_StimulationId_ExperimentStop</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> + <Name>Filename to save configuration to</Name> + <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> + <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> + <Name>Multiclass strategy to apply</Name> + <DefaultValue>Native</DefaultValue> + <Value>Native</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 1 label</Name> + <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> + <Value>OVTK_StimulationId_Label_01</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 2 label</Name> + <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> + <Value>OVTK_StimulationId_Label_02</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 3 label</Name> + <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> + <Value>OVTK_StimulationId_Label_03</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> + <Name>Algorithm to use</Name> + <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> + <Value>Multi-layer Perceptron</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Shrinkage: Force diagonal cov (DDA)</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Number of neurons in hidden layer</Name> + <DefaultValue>3</DefaultValue> + <Value>3</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Learning stop condition</Name> + <DefaultValue>0.000001</DefaultValue> + <Value>0.000001</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Learning coefficient</Name> + <DefaultValue>0.010000</DefaultValue> + <Value>0.010000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Randomize k-fold cross-validation test data</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Balance classes</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>1008</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>1456</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0xac393893, 0x25854082)</Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>7</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>3</Value> + </Attribute> + <Attribute> + <Identifier>(0xfba64161, 0x65304e21)</Identifier> + <Value></Value> + </Attribute> + </Attributes> + </Box> <Box> <Identifier>(0x000041d8, 0x000004c6)</Identifier> <Name>Identity</Name> @@ -1083,159 +1236,6 @@ </Attribute> </Attributes> </Box> - <Box> - <Identifier>(0x56fbfd1a, 0x2c474c9e)</Identifier> - <Name>Classifier trainer</Name> - <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> - <Inputs> - <Input> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Stimulations</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 1</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 2</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 3</Name> - </Input> - </Inputs> - <Outputs> - <Output> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Train-completed Flag</Name> - </Output> - </Outputs> - <Settings> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Train trigger</Name> - <DefaultValue>OVTK_StimulationId_Train</DefaultValue> - <Value>OVTK_StimulationId_ExperimentStop</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> - <Name>Filename to save configuration to</Name> - <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> - <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> - <Name>Multiclass strategy to apply</Name> - <DefaultValue>Native</DefaultValue> - <Value>Native</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 1 label</Name> - <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> - <Value>OVTK_StimulationId_Label_01</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 2 label</Name> - <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> - <Value>OVTK_StimulationId_Label_02</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 3 label</Name> - <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> - <Value>OVTK_StimulationId_Label_03</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> - <Name>Algorithm to use</Name> - <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> - <Value>Multi-layer Perceptron</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of neurons in hidden layer</Name> - <DefaultValue>3</DefaultValue> - <Value>3</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Learning stop condition</Name> - <DefaultValue>0.000001</DefaultValue> - <Value>0.000001</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Learning coefficient</Name> - <DefaultValue>0.010000</DefaultValue> - <Value>0.0100</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of partitions for k-fold cross-validation test</Name> - <DefaultValue>10</DefaultValue> - <Value>3</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Balance classes</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - </Settings> - <Attributes> - <Attribute> - <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>992</Value> - </Attribute> - <Attribute> - <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>1456</Value> - </Attribute> - <Attribute> - <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x9de21779, 0x37776c89)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier> - <Value>(0x00000000, 0x082a348e)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier> - <Value>false</Value> - </Attribute> - <Attribute> - <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> - <Value>1</Value> - </Attribute> - <Attribute> - <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>5</Value> - </Attribute> - <Attribute> - <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> - <Value>3</Value> - </Attribute> - <Attribute> - <Identifier>(0xfba64161, 0x65304e21)</Identifier> - <Value></Value> - </Attribute> - </Attributes> - </Box> <Box> <Identifier>(0x6292a294, 0x629905c2)</Identifier> <Name>Target Separator</Name> @@ -1513,6 +1513,17 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x00000b3f, 0x00007551)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> + <BoxOutputIndex>3</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x00001dc6, 0x00006b9c)</BoxIdentifier> + <BoxInputIdentifier>(0x9b25397c, 0x36309ca4)</BoxInputIdentifier> + </Target> + </Link> <Link> <Identifier>(0x00000dbf, 0x00000a19)</Identifier> <Source> @@ -1569,14 +1580,25 @@ </Target> </Link> <Link> - <Identifier>(0x0000292d, 0x00005c56)</Identifier> + <Identifier>(0x00001bd7, 0x00006692)</Identifier> + <Source> + <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x00001dc6, 0x00006b9c)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> + <Link> + <Identifier>(0x00002f6d, 0x00000cb6)</Identifier> <Source> <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> - <BoxOutputIndex>1</BoxOutputIndex> + <BoxOutputIndex>2</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> + <BoxIdentifier>(0x00001dc6, 0x00006b9c)</BoxIdentifier> + <BoxInputIndex>2</BoxInputIndex> </Target> </Link> <Link> @@ -1601,17 +1623,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x00003c35, 0x0000722e)</Identifier> - <Source> - <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x00003e54, 0x000015ec)</Identifier> <Source> @@ -1689,17 +1700,6 @@ <BoxInputIdentifier>(0x4a942408, 0x0f60530d)</BoxInputIdentifier> </Target> </Link> - <Link> - <Identifier>(0x00006406, 0x00004d5a)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> - <BoxOutputIndex>2</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>2</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x0000641e, 0x00005527)</Identifier> <Source> @@ -1745,25 +1745,25 @@ </Target> </Link> <Link> - <Identifier>(0x00006bbe, 0x00007e3b)</Identifier> + <Identifier>(0x00006d8e, 0x00003e67)</Identifier> <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> - <BoxOutputIndex>3</BoxOutputIndex> + <BoxIdentifier>(0x00001dc6, 0x00006b9c)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>3</BoxInputIndex> + <BoxIdentifier>(0x2a62aa62, 0x22b9aa6b)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> </Target> </Link> <Link> - <Identifier>(0x0000765e, 0x00003a2d)</Identifier> + <Identifier>(0x0000705e, 0x00004e3f)</Identifier> <Source> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> + <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> + <BoxOutputIndex>1</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x2a62aa62, 0x22b9aa6b)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> + <BoxIdentifier>(0x00001dc6, 0x00006b9c)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> </Target> </Link> <Link> diff --git a/plugins/processing/classification/test/scenarios-tests/MLP-OneVsAll-test.xml b/plugins/processing/classification/test/scenarios-tests/MLP-OneVsAll-test.xml index 8ae2fc3a1ac1dfd10e1fe1c1560f1b657ed13212..bc894bad60095361f1316d0481f3e50d000c9f04 100644 --- a/plugins/processing/classification/test/scenarios-tests/MLP-OneVsAll-test.xml +++ b/plugins/processing/classification/test/scenarios-tests/MLP-OneVsAll-test.xml @@ -1,7 +1,7 @@ <OpenViBE-Scenario> <FormatVersion>2</FormatVersion> <Creator>OpenViBE Designer</Creator> - <CreatorVersion>3.2.0</CreatorVersion> + <CreatorVersion>3.6.0</CreatorVersion> <Settings> <Setting> <Identifier>(0x00425137, 0xf2a30c29)</Identifier> @@ -257,6 +257,159 @@ </Attribute> </Attributes> </Box> + <Box> + <Identifier>(0x00001dc6, 0x00006b9c)</Identifier> + <Name>Classifier trainer</Name> + <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Stimulations</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 1</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 2</Name> + </Input> + <Input> + <Identifier>(0x9b25397c, 0x36309ca4)</Identifier> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 3</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Train-completed Flag</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Train trigger</Name> + <DefaultValue>OVTK_StimulationId_Train</DefaultValue> + <Value>OVTK_StimulationId_ExperimentStop</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> + <Name>Filename to save configuration to</Name> + <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> + <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> + <Name>Multiclass strategy to apply</Name> + <DefaultValue>Native</DefaultValue> + <Value>OneVsAll</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 1 label</Name> + <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> + <Value>OVTK_StimulationId_Label_01</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 2 label</Name> + <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> + <Value>OVTK_StimulationId_Label_02</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 3 label</Name> + <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> + <Value>OVTK_StimulationId_Label_03</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> + <Name>Algorithm to use</Name> + <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> + <Value>Multi-layer Perceptron</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Shrinkage: Force diagonal cov (DDA)</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Number of neurons in hidden layer</Name> + <DefaultValue>3</DefaultValue> + <Value>3</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Learning stop condition</Name> + <DefaultValue>0.000001</DefaultValue> + <Value>0.000001</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Learning coefficient</Name> + <DefaultValue>0.010000</DefaultValue> + <Value>0.010000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Randomize k-fold cross-validation test data</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Balance classes</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>432</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>1568</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0xac393893, 0x25854082)</Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>7</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>3</Value> + </Attribute> + <Attribute> + <Identifier>(0xfba64161, 0x65304e21)</Identifier> + <Value></Value> + </Attribute> + </Attributes> + </Box> <Box> <Identifier>(0x000041d8, 0x000004c6)</Identifier> <Name>Identity</Name> @@ -1083,159 +1236,6 @@ </Attribute> </Attributes> </Box> - <Box> - <Identifier>(0x56fbfd1a, 0x2c474c9f)</Identifier> - <Name>Classifier trainer</Name> - <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> - <Inputs> - <Input> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Stimulations</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 1</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 2</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 3</Name> - </Input> - </Inputs> - <Outputs> - <Output> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Train-completed Flag</Name> - </Output> - </Outputs> - <Settings> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Train trigger</Name> - <DefaultValue>OVTK_StimulationId_Train</DefaultValue> - <Value>OVTK_StimulationId_ExperimentStop</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> - <Name>Filename to save configuration to</Name> - <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> - <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> - <Name>Multiclass strategy to apply</Name> - <DefaultValue>Native</DefaultValue> - <Value>OneVsAll</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 1 label</Name> - <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> - <Value>OVTK_StimulationId_Label_01</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 2 label</Name> - <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> - <Value>OVTK_StimulationId_Label_02</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 3 label</Name> - <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> - <Value>OVTK_StimulationId_Label_03</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> - <Name>Algorithm to use</Name> - <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> - <Value>Multi-layer Perceptron</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of neurons in hidden layer</Name> - <DefaultValue>3</DefaultValue> - <Value>3</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Learning stop condition</Name> - <DefaultValue>0.000001</DefaultValue> - <Value>0.000001</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Learning coefficient</Name> - <DefaultValue>0.010000</DefaultValue> - <Value>0.0100</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of partitions for k-fold cross-validation test</Name> - <DefaultValue>10</DefaultValue> - <Value>3</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Balance classes</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - </Settings> - <Attributes> - <Attribute> - <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>432</Value> - </Attribute> - <Attribute> - <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>1568</Value> - </Attribute> - <Attribute> - <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x9de21779, 0x37776c89)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier> - <Value>(0x00000000, 0x082a348e)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier> - <Value>false</Value> - </Attribute> - <Attribute> - <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> - <Value>1</Value> - </Attribute> - <Attribute> - <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>5</Value> - </Attribute> - <Attribute> - <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> - <Value>3</Value> - </Attribute> - <Attribute> - <Identifier>(0xfba64161, 0x65304e21)</Identifier> - <Value></Value> - </Attribute> - </Attributes> - </Box> <Box> <Identifier>(0x6292a294, 0x629905c3)</Identifier> <Name>Target Separator</Name> @@ -1569,14 +1569,36 @@ </Target> </Link> <Link> - <Identifier>(0x0000292d, 0x00005c56)</Identifier> + <Identifier>(0x00001987, 0x00001da0)</Identifier> + <Source> + <BoxIdentifier>(0x00001dc6, 0x00006b9c)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x2a62aa62, 0x22b9aa6b)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> + <Link> + <Identifier>(0x00001a15, 0x00002468)</Identifier> <Source> <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> - <BoxOutputIndex>1</BoxOutputIndex> + <BoxOutputIndex>2</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9f)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> + <BoxIdentifier>(0x00001dc6, 0x00006b9c)</BoxIdentifier> + <BoxInputIndex>2</BoxInputIndex> + </Target> + </Link> + <Link> + <Identifier>(0x00002e4e, 0x00006c59)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> + <BoxOutputIndex>3</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x00001dc6, 0x00006b9c)</BoxIdentifier> + <BoxInputIdentifier>(0x9b25397c, 0x36309ca4)</BoxInputIdentifier> </Target> </Link> <Link> @@ -1601,17 +1623,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x00003c35, 0x0000722e)</Identifier> - <Source> - <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9f)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x00003e54, 0x000015ec)</Identifier> <Source> @@ -1690,14 +1701,14 @@ </Target> </Link> <Link> - <Identifier>(0x00006406, 0x00004d5a)</Identifier> + <Identifier>(0x00005d23, 0x00007ddf)</Identifier> <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> - <BoxOutputIndex>2</BoxOutputIndex> + <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9f)</BoxIdentifier> - <BoxInputIndex>2</BoxInputIndex> + <BoxIdentifier>(0x00001dc6, 0x00006b9c)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> </Target> </Link> <Link> @@ -1722,6 +1733,17 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x0000664e, 0x000072a8)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> + <BoxOutputIndex>1</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x00001dc6, 0x00006b9c)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x000068de, 0x00007645)</Identifier> <Source> @@ -1744,28 +1766,6 @@ <BoxInputIndex>1</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x00006bbe, 0x00007e3b)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> - <BoxOutputIndex>3</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9f)</BoxIdentifier> - <BoxInputIndex>3</BoxInputIndex> - </Target> - </Link> - <Link> - <Identifier>(0x0000765e, 0x00003a2d)</Identifier> - <Source> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9f)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x2a62aa62, 0x22b9aa6b)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x0be130d9, 0x31dafc5c)</Identifier> <Source> diff --git a/plugins/processing/classification/test/scenarios-tests/MLP-OneVsOne-HT-test.xml b/plugins/processing/classification/test/scenarios-tests/MLP-OneVsOne-HT-test.xml index a1d2ef19bf2c15cd2f00e0f1ad4bc0c497ab3dd7..99c655e250e68e409a6b844c2798bc8a468440b6 100644 --- a/plugins/processing/classification/test/scenarios-tests/MLP-OneVsOne-HT-test.xml +++ b/plugins/processing/classification/test/scenarios-tests/MLP-OneVsOne-HT-test.xml @@ -1,7 +1,7 @@ <OpenViBE-Scenario> <FormatVersion>2</FormatVersion> <Creator>OpenViBE Designer</Creator> - <CreatorVersion>3.2.0</CreatorVersion> + <CreatorVersion>3.6.0</CreatorVersion> <Settings> <Setting> <Identifier>(0x00425137, 0xf2a30c29)</Identifier> @@ -502,6 +502,166 @@ </Attribute> </Attributes> </Box> + <Box> + <Identifier>(0x00006579, 0x00003e0c)</Identifier> + <Name>Classifier trainer</Name> + <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Stimulations</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 1</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 2</Name> + </Input> + <Input> + <Identifier>(0xbb05002f, 0x47dc7294)</Identifier> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 3</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Train-completed Flag</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Train trigger</Name> + <DefaultValue>OVTK_StimulationId_Train</DefaultValue> + <Value>OVTK_StimulationId_ExperimentStop</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> + <Name>Filename to save configuration to</Name> + <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> + <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> + <Name>Multiclass strategy to apply</Name> + <DefaultValue>Native</DefaultValue> + <Value>OneVsOne</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x79146976, 0xd7f01a25)</TypeIdentifier> + <Name>Pairwise Decision Strategy</Name> + <DefaultValue>PKPD</DefaultValue> + <Value>HT</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 1 label</Name> + <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> + <Value>OVTK_StimulationId_Label_01</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 2 label</Name> + <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> + <Value>OVTK_StimulationId_Label_02</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 3 label</Name> + <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> + <Value>OVTK_StimulationId_Label_03</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> + <Name>Algorithm to use</Name> + <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> + <Value>Multi-layer Perceptron</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Shrinkage: Force diagonal cov (DDA)</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Number of neurons in hidden layer</Name> + <DefaultValue>3</DefaultValue> + <Value>3</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Learning stop condition</Name> + <DefaultValue>0.000001</DefaultValue> + <Value>0.000001</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Learning coefficient</Name> + <DefaultValue>0.010000</DefaultValue> + <Value>0.010000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Randomize k-fold cross-validation test data</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Balance classes</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>576</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>1600</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0xac393893, 0x25854082)</Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>7</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>3</Value> + </Attribute> + <Attribute> + <Identifier>(0xfba64161, 0x65304e21)</Identifier> + <Value></Value> + </Attribute> + </Attributes> + </Box> <Box> <Identifier>(0x03dba115, 0x4c1f8a3b)</Identifier> <Name>Generic stream reader</Name> @@ -1288,158 +1448,6 @@ </Attribute> </Attributes> </Box> - <Box> - <Identifier>(0x6cc6b8a7, 0x009107fc)</Identifier> - <Name>Classifier trainer</Name> - <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> - <Inputs> - <Input> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Stimulations</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 1</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 2</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 3</Name> - </Input> - </Inputs> - <Outputs> - <Output> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Train-completed Flag</Name> - </Output> - </Outputs> - <Settings> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Train trigger</Name> - <DefaultValue>OVTK_StimulationId_Train</DefaultValue> - <Value>OVTK_StimulationId_ExperimentStop</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> - <Name>Filename to save configuration to</Name> - <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> - <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> - <Name>Multiclass strategy to apply</Name> - <DefaultValue>Native</DefaultValue> - <Value>OneVsOne</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x79146976, 0xd7f01a25)</TypeIdentifier> - <Name>Pairwise Decision Strategy</Name> - <DefaultValue>PKPD</DefaultValue> - <Value>HT</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 1 label</Name> - <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> - <Value>OVTK_StimulationId_Label_01</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 2 label</Name> - <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> - <Value>OVTK_StimulationId_Label_02</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 3 label</Name> - <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> - <Value>OVTK_StimulationId_Label_03</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> - <Name>Algorithm to use</Name> - <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> - <Value>Multi-layer Perceptron</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of neurons in hidden layer</Name> - <DefaultValue>3</DefaultValue> - <Value>3</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Learning stop condition</Name> - <DefaultValue>0.000001</DefaultValue> - <Value>0.000001</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Learning coefficient</Name> - <DefaultValue>0.010000</DefaultValue> - <Value>0.0100</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of partitions for k-fold cross-validation test</Name> - <DefaultValue>10</DefaultValue> - <Value>3</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Balance classes</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - </Settings> - <Attributes> - <Attribute> - <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>576</Value> - </Attribute> - <Attribute> - <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>1600</Value> - </Attribute> - <Attribute> - <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x9de21779, 0x37776c89)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> - <Value>1</Value> - </Attribute> - <Attribute> - <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>6</Value> - </Attribute> - <Attribute> - <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> - <Value>3</Value> - </Attribute> - <Attribute> - <Identifier>(0xfba64161, 0x65304e21)</Identifier> - <Value></Value> - </Attribute> - </Attributes> - </Box> <Box> <Identifier>(0x72a5f195, 0x5ef1cbbc)</Identifier> <Name>Feature aggregator</Name> @@ -1568,25 +1576,25 @@ </Target> </Link> <Link> - <Identifier>(0x00003512, 0x00002372)</Identifier> + <Identifier>(0x00001e8e, 0x000022fa)</Identifier> <Source> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fc)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> + <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> + <BoxOutputIndex>1</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x2a62aa62, 0x22b9aa6b)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> + <BoxIdentifier>(0x00006579, 0x00003e0c)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> </Target> </Link> <Link> - <Identifier>(0x000036ae, 0x00003297)</Identifier> + <Identifier>(0x00003495, 0x00000dec)</Identifier> <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> - <BoxOutputIndex>2</BoxOutputIndex> + <BoxIdentifier>(0x00006579, 0x00003e0c)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fc)</BoxIdentifier> - <BoxInputIndex>2</BoxInputIndex> + <BoxIdentifier>(0x2a62aa62, 0x22b9aa6b)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> </Target> </Link> <Link> @@ -1600,6 +1608,17 @@ <BoxInputIdentifier>(0x4a942408, 0x0f60530d)</BoxInputIdentifier> </Target> </Link> + <Link> + <Identifier>(0x00003af0, 0x00004cc2)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> + <BoxOutputIndex>2</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x00006579, 0x00003e0c)</BoxIdentifier> + <BoxInputIndex>2</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00003b0c, 0x00004fa5)</Identifier> <Source> @@ -1611,6 +1630,17 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x00003dac, 0x00000ebf)</Identifier> + <Source> + <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x00006579, 0x00003e0c)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00003e54, 0x000015ec)</Identifier> <Source> @@ -1688,17 +1718,6 @@ <BoxInputIdentifier>(0x4a942408, 0x0f60530d)</BoxInputIdentifier> </Target> </Link> - <Link> - <Identifier>(0x00005f77, 0x00006b2c)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> - <BoxOutputIndex>3</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fc)</BoxIdentifier> - <BoxInputIndex>3</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x0000641e, 0x00005527)</Identifier> <Source> @@ -1722,25 +1741,14 @@ </Target> </Link> <Link> - <Identifier>(0x000065fc, 0x000010ea)</Identifier> - <Source> - <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fc)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> - <Link> - <Identifier>(0x000067ac, 0x00004ac8)</Identifier> + <Identifier>(0x000065a6, 0x00007e63)</Identifier> <Source> <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> - <BoxOutputIndex>1</BoxOutputIndex> + <BoxOutputIndex>3</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fc)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> + <BoxIdentifier>(0x00006579, 0x00003e0c)</BoxIdentifier> + <BoxInputIdentifier>(0xbb05002f, 0x47dc7294)</BoxInputIdentifier> </Target> </Link> <Link> diff --git a/plugins/processing/classification/test/scenarios-tests/MLP-OneVsOne-PKPD-test.xml b/plugins/processing/classification/test/scenarios-tests/MLP-OneVsOne-PKPD-test.xml index fd32da9def2d16751df2cc36717e6032ff794b37..6afbde2daf54622f897efd94f4f72180df96a81a 100644 --- a/plugins/processing/classification/test/scenarios-tests/MLP-OneVsOne-PKPD-test.xml +++ b/plugins/processing/classification/test/scenarios-tests/MLP-OneVsOne-PKPD-test.xml @@ -1,7 +1,7 @@ <OpenViBE-Scenario> <FormatVersion>2</FormatVersion> <Creator>OpenViBE Designer</Creator> - <CreatorVersion>3.2.0</CreatorVersion> + <CreatorVersion>3.6.0</CreatorVersion> <Settings> <Setting> <Identifier>(0x00425137, 0xf2a30c29)</Identifier> @@ -14,6 +14,166 @@ <Inputs></Inputs> <Outputs></Outputs> <Boxes> + <Box> + <Identifier>(0x00000402, 0x000025aa)</Identifier> + <Name>Classifier trainer</Name> + <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Stimulations</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 1</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 2</Name> + </Input> + <Input> + <Identifier>(0xe7fb7568, 0xe0a60474)</Identifier> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 3</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Train-completed Flag</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Train trigger</Name> + <DefaultValue>OVTK_StimulationId_Train</DefaultValue> + <Value>OVTK_StimulationId_ExperimentStop</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> + <Name>Filename to save configuration to</Name> + <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> + <Value>${Path_UserData}/my-classifier.xml</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> + <Name>Multiclass strategy to apply</Name> + <DefaultValue>Native</DefaultValue> + <Value>OneVsOne</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x79146976, 0xd7f01a25)</TypeIdentifier> + <Name>Pairwise Decision Strategy</Name> + <DefaultValue>PKPD</DefaultValue> + <Value>PKPD</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 1 label</Name> + <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> + <Value>OVTK_StimulationId_Label_01</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 2 label</Name> + <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> + <Value>OVTK_StimulationId_Label_02</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 3 label</Name> + <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> + <Value>OVTK_StimulationId_Label_03</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> + <Name>Algorithm to use</Name> + <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> + <Value>Multi-layer Perceptron</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Shrinkage: Force diagonal cov (DDA)</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Number of neurons in hidden layer</Name> + <DefaultValue>3</DefaultValue> + <Value>3</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Learning stop condition</Name> + <DefaultValue>0.000001</DefaultValue> + <Value>0.000001</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Learning coefficient</Name> + <DefaultValue>0.010000</DefaultValue> + <Value>0.010000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Randomize k-fold cross-validation test data</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Balance classes</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>496</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>1840</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0xac393893, 0x25854082)</Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>7</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>3</Value> + </Attribute> + <Attribute> + <Identifier>(0xfba64161, 0x65304e21)</Identifier> + <Value></Value> + </Attribute> + </Attributes> + </Box> <Box> <Identifier>(0x00000bcc, 0x00007a84)</Identifier> <Name>Temporal Filter</Name> @@ -1288,158 +1448,6 @@ </Attribute> </Attributes> </Box> - <Box> - <Identifier>(0x6cc6b8a7, 0x009107fc)</Identifier> - <Name>Classifier trainer</Name> - <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> - <Inputs> - <Input> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Stimulations</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 1</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 2</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 3</Name> - </Input> - </Inputs> - <Outputs> - <Output> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Train-completed Flag</Name> - </Output> - </Outputs> - <Settings> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Train trigger</Name> - <DefaultValue>OVTK_StimulationId_Train</DefaultValue> - <Value>OVTK_StimulationId_ExperimentStop</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> - <Name>Filename to save configuration to</Name> - <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> - <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> - <Name>Multiclass strategy to apply</Name> - <DefaultValue>Native</DefaultValue> - <Value>OneVsOne</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x79146976, 0xd7f01a25)</TypeIdentifier> - <Name>Pairwise Decision Strategy</Name> - <DefaultValue>PKPD</DefaultValue> - <Value>PKPD</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 1 label</Name> - <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> - <Value>OVTK_StimulationId_Label_01</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 2 label</Name> - <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> - <Value>OVTK_StimulationId_Label_02</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 3 label</Name> - <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> - <Value>OVTK_StimulationId_Label_03</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> - <Name>Algorithm to use</Name> - <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> - <Value>Multi-layer Perceptron</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of neurons in hidden layer</Name> - <DefaultValue>3</DefaultValue> - <Value>3</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Learning stop condition</Name> - <DefaultValue>0.000001</DefaultValue> - <Value>0.000001</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Learning coefficient</Name> - <DefaultValue>0.010000</DefaultValue> - <Value>0.0100</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of partitions for k-fold cross-validation test</Name> - <DefaultValue>10</DefaultValue> - <Value>3</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Balance classes</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - </Settings> - <Attributes> - <Attribute> - <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>496</Value> - </Attribute> - <Attribute> - <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>1840</Value> - </Attribute> - <Attribute> - <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x9de21779, 0x37776c89)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> - <Value>1</Value> - </Attribute> - <Attribute> - <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>6</Value> - </Attribute> - <Attribute> - <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> - <Value>3</Value> - </Attribute> - <Attribute> - <Identifier>(0xfba64161, 0x65304e21)</Identifier> - <Value></Value> - </Attribute> - </Attributes> - </Box> <Box> <Identifier>(0x72a5f195, 0x5ef1cbbc)</Identifier> <Name>Feature aggregator</Name> @@ -1534,6 +1542,17 @@ <BoxInputIndex>1</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x00001664, 0x00005fbf)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> + <BoxOutputIndex>3</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x00000402, 0x000025aa)</BoxIdentifier> + <BoxInputIdentifier>(0xe7fb7568, 0xe0a60474)</BoxInputIdentifier> + </Target> + </Link> <Link> <Identifier>(0x000017f0, 0x00001a31)</Identifier> <Source> @@ -1568,25 +1587,25 @@ </Target> </Link> <Link> - <Identifier>(0x00003512, 0x00002372)</Identifier> + <Identifier>(0x00002940, 0x00005bd9)</Identifier> <Source> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fc)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> + <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> + <BoxOutputIndex>2</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x2a62aa62, 0x22b9aa6b)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> + <BoxIdentifier>(0x00000402, 0x000025aa)</BoxIdentifier> + <BoxInputIndex>2</BoxInputIndex> </Target> </Link> <Link> - <Identifier>(0x000036ae, 0x00003297)</Identifier> + <Identifier>(0x0000354f, 0x00000e93)</Identifier> <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> - <BoxOutputIndex>2</BoxOutputIndex> + <BoxIdentifier>(0x00000402, 0x000025aa)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fc)</BoxIdentifier> - <BoxInputIndex>2</BoxInputIndex> + <BoxIdentifier>(0x2a62aa62, 0x22b9aa6b)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> </Target> </Link> <Link> @@ -1644,6 +1663,17 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x00004f2a, 0x00003af5)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> + <BoxOutputIndex>1</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x00000402, 0x000025aa)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00005232, 0x000054a6)</Identifier> <Source> @@ -1666,6 +1696,17 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x000056ef, 0x00006a64)</Identifier> + <Source> + <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x00000402, 0x000025aa)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00005a71, 0x000019e0)</Identifier> <Source> @@ -1688,17 +1729,6 @@ <BoxInputIdentifier>(0x4a942408, 0x0f60530d)</BoxInputIdentifier> </Target> </Link> - <Link> - <Identifier>(0x00005f77, 0x00006b2c)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> - <BoxOutputIndex>3</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fc)</BoxIdentifier> - <BoxInputIndex>3</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x0000641e, 0x00005527)</Identifier> <Source> @@ -1721,28 +1751,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x000065fc, 0x000010ea)</Identifier> - <Source> - <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fc)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> - <Link> - <Identifier>(0x000067ac, 0x00004ac8)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> - <BoxOutputIndex>1</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fc)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x000068de, 0x00007645)</Identifier> <Source> diff --git a/plugins/processing/classification/test/scenarios-tests/MLP-OneVsOne-Voting-test.xml b/plugins/processing/classification/test/scenarios-tests/MLP-OneVsOne-Voting-test.xml index 0c8313b8d98c0489c07021609fd068bc62f06d33..35ab2978aceba91f1455c1ed00678217fae587ba 100644 --- a/plugins/processing/classification/test/scenarios-tests/MLP-OneVsOne-Voting-test.xml +++ b/plugins/processing/classification/test/scenarios-tests/MLP-OneVsOne-Voting-test.xml @@ -1,7 +1,7 @@ <OpenViBE-Scenario> <FormatVersion>2</FormatVersion> <Creator>OpenViBE Designer</Creator> - <CreatorVersion>3.2.0</CreatorVersion> + <CreatorVersion>3.6.0</CreatorVersion> <Settings> <Setting> <Identifier>(0x00425137, 0xf2a30c29)</Identifier> @@ -367,6 +367,166 @@ </Attribute> </Attributes> </Box> + <Box> + <Identifier>(0x00004526, 0x000035ff)</Identifier> + <Name>Classifier trainer</Name> + <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Stimulations</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 1</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 2</Name> + </Input> + <Input> + <Identifier>(0x9b9ee683, 0xddf822f8)</Identifier> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 3</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Train-completed Flag</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Train trigger</Name> + <DefaultValue>OVTK_StimulationId_Train</DefaultValue> + <Value>OVTK_StimulationId_ExperimentStop</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> + <Name>Filename to save configuration to</Name> + <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> + <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> + <Name>Multiclass strategy to apply</Name> + <DefaultValue>Native</DefaultValue> + <Value>OneVsOne</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x79146976, 0xd7f01a25)</TypeIdentifier> + <Name>Pairwise Decision Strategy</Name> + <DefaultValue>PKPD</DefaultValue> + <Value>Voting</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 1 label</Name> + <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> + <Value>OVTK_StimulationId_Label_01</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 2 label</Name> + <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> + <Value>OVTK_StimulationId_Label_02</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 3 label</Name> + <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> + <Value>OVTK_StimulationId_Label_03</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> + <Name>Algorithm to use</Name> + <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> + <Value>Multi-layer Perceptron</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Shrinkage: Force diagonal cov (DDA)</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Number of neurons in hidden layer</Name> + <DefaultValue>3</DefaultValue> + <Value>3</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Learning stop condition</Name> + <DefaultValue>0.000001</DefaultValue> + <Value>0.000001</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Learning coefficient</Name> + <DefaultValue>0.010000</DefaultValue> + <Value>0.010000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Randomize k-fold cross-validation test data</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Balance classes</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>304</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>528</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0xac393893, 0x25854082)</Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>7</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>3</Value> + </Attribute> + <Attribute> + <Identifier>(0xfba64161, 0x65304e21)</Identifier> + <Value></Value> + </Attribute> + </Attributes> + </Box> <Box> <Identifier>(0x0000646c, 0x000059a1)</Identifier> <Name>Signal Power Log</Name> @@ -1288,158 +1448,6 @@ </Attribute> </Attributes> </Box> - <Box> - <Identifier>(0x6cc6b8a7, 0x009107fc)</Identifier> - <Name>Classifier trainer</Name> - <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> - <Inputs> - <Input> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Stimulations</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 1</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 2</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 3</Name> - </Input> - </Inputs> - <Outputs> - <Output> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Train-completed Flag</Name> - </Output> - </Outputs> - <Settings> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Train trigger</Name> - <DefaultValue>OVTK_StimulationId_Train</DefaultValue> - <Value>OVTK_StimulationId_ExperimentStop</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> - <Name>Filename to save configuration to</Name> - <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> - <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> - <Name>Multiclass strategy to apply</Name> - <DefaultValue>Native</DefaultValue> - <Value>OneVsOne</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x79146976, 0xd7f01a25)</TypeIdentifier> - <Name>Pairwise Decision Strategy</Name> - <DefaultValue>PKPD</DefaultValue> - <Value>Voting</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 1 label</Name> - <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> - <Value>OVTK_StimulationId_Label_01</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 2 label</Name> - <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> - <Value>OVTK_StimulationId_Label_02</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 3 label</Name> - <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> - <Value>OVTK_StimulationId_Label_03</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> - <Name>Algorithm to use</Name> - <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> - <Value>Multi-layer Perceptron</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of neurons in hidden layer</Name> - <DefaultValue>3</DefaultValue> - <Value>3</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Learning stop condition</Name> - <DefaultValue>0.000001</DefaultValue> - <Value>0.000001</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Learning coefficient</Name> - <DefaultValue>0.010000</DefaultValue> - <Value>0.0100</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of partitions for k-fold cross-validation test</Name> - <DefaultValue>10</DefaultValue> - <Value>3</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Balance classes</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - </Settings> - <Attributes> - <Attribute> - <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>304</Value> - </Attribute> - <Attribute> - <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>528</Value> - </Attribute> - <Attribute> - <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x9de21779, 0x37776c89)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> - <Value>1</Value> - </Attribute> - <Attribute> - <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>6</Value> - </Attribute> - <Attribute> - <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> - <Value>3</Value> - </Attribute> - <Attribute> - <Identifier>(0xfba64161, 0x65304e21)</Identifier> - <Value></Value> - </Attribute> - </Attributes> - </Box> <Box> <Identifier>(0x72a5f195, 0x5ef1cbbc)</Identifier> <Name>Feature aggregator</Name> @@ -1512,6 +1520,17 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x00000c28, 0x00007d4d)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> + <BoxOutputIndex>3</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x00004526, 0x000035ff)</BoxIdentifier> + <BoxInputIdentifier>(0x9b9ee683, 0xddf822f8)</BoxInputIdentifier> + </Target> + </Link> <Link> <Identifier>(0x00000dbf, 0x00000a19)</Identifier> <Source> @@ -1568,24 +1587,13 @@ </Target> </Link> <Link> - <Identifier>(0x00003512, 0x00002372)</Identifier> - <Source> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fc)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x2a62aa62, 0x22b9aa6b)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> - <Link> - <Identifier>(0x000036ae, 0x00003297)</Identifier> + <Identifier>(0x00001c0c, 0x00001b98)</Identifier> <Source> <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> <BoxOutputIndex>2</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fc)</BoxIdentifier> + <BoxIdentifier>(0x00004526, 0x000035ff)</BoxIdentifier> <BoxInputIndex>2</BoxInputIndex> </Target> </Link> @@ -1633,6 +1641,28 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x000044a3, 0x0000164d)</Identifier> + <Source> + <BoxIdentifier>(0x00004526, 0x000035ff)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x2a62aa62, 0x22b9aa6b)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> + <Link> + <Identifier>(0x000044ef, 0x00007096)</Identifier> + <Source> + <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x00004526, 0x000035ff)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00004dc4, 0x000063ae)</Identifier> <Source> @@ -1644,6 +1674,17 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x00005157, 0x00006678)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> + <BoxOutputIndex>1</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x00004526, 0x000035ff)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00005232, 0x000054a6)</Identifier> <Source> @@ -1688,17 +1729,6 @@ <BoxInputIdentifier>(0x4a942408, 0x0f60530d)</BoxInputIdentifier> </Target> </Link> - <Link> - <Identifier>(0x00005f77, 0x00006b2c)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> - <BoxOutputIndex>3</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fc)</BoxIdentifier> - <BoxInputIndex>3</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x0000641e, 0x00005527)</Identifier> <Source> @@ -1721,28 +1751,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x000065fc, 0x000010ea)</Identifier> - <Source> - <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fc)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> - <Link> - <Identifier>(0x000067ac, 0x00004ac8)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> - <BoxOutputIndex>1</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fc)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x000068de, 0x00007645)</Identifier> <Source> diff --git a/plugins/processing/classification/test/scenarios-tests/SVM-Native-test.xml b/plugins/processing/classification/test/scenarios-tests/SVM-Native-test.xml index f95e8ee8f2f11a85808a525e1419eda488e29be2..fbda8c38849e2433c6f6695d8d315ece2376ce71 100644 --- a/plugins/processing/classification/test/scenarios-tests/SVM-Native-test.xml +++ b/plugins/processing/classification/test/scenarios-tests/SVM-Native-test.xml @@ -1,7 +1,7 @@ <OpenViBE-Scenario> <FormatVersion>2</FormatVersion> <Creator>OpenViBE Designer</Creator> - <CreatorVersion>3.2.0</CreatorVersion> + <CreatorVersion>3.6.0</CreatorVersion> <Settings> <Setting> <Identifier>(0x00425137, 0xf2a30c29)</Identifier> @@ -14,6 +14,229 @@ <Inputs></Inputs> <Outputs></Outputs> <Boxes> + <Box> + <Identifier>(0x0000095b, 0x00006f0c)</Identifier> + <Name>Classifier trainer</Name> + <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Stimulations</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 1</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 2</Name> + </Input> + <Input> + <Identifier>(0x3a81c00c, 0xe359f17e)</Identifier> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 3</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Train-completed Flag</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Train trigger</Name> + <DefaultValue>OVTK_StimulationId_Train</DefaultValue> + <Value>OVTK_StimulationId_ExperimentStop</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> + <Name>Filename to save configuration to</Name> + <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> + <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> + <Name>Multiclass strategy to apply</Name> + <DefaultValue>Native</DefaultValue> + <Value>Native</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 1 label</Name> + <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> + <Value>OVTK_StimulationId_Label_01</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 2 label</Name> + <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> + <Value>OVTK_StimulationId_Label_02</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 3 label</Name> + <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> + <Value>OVTK_StimulationId_Label_03</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> + <Name>Algorithm to use</Name> + <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> + <Value>Support Vector Machine (SVM)</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Shrinkage: Force diagonal cov (DDA)</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Epsilon</Name> + <DefaultValue>0.100000</DefaultValue> + <Value>0.100000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier> + <Name>Weight</Name> + <DefaultValue></DefaultValue> + <Value></Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2af426d1, 0x72fb7bac)</TypeIdentifier> + <Name>SVM type</Name> + <DefaultValue>C-SVC</DefaultValue> + <Value>C-SVC</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Degree</Name> + <DefaultValue>3</DefaultValue> + <Value>3</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x54bb0016, 0x6aa27496)</TypeIdentifier> + <Name>Kernel type</Name> + <DefaultValue>Linear</DefaultValue> + <Value>Linear</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier> + <Name>Weight Label</Name> + <DefaultValue></DefaultValue> + <Value></Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Epsilon tolerance</Name> + <DefaultValue>0.001000</DefaultValue> + <Value>0.001000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Cost</Name> + <DefaultValue>1.000000</DefaultValue> + <Value>1.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Cache size</Name> + <DefaultValue>100.000000</DefaultValue> + <Value>100.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Gamma</Name> + <DefaultValue>0.000000</DefaultValue> + <Value>0.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Nu</Name> + <DefaultValue>0.500000</DefaultValue> + <Value>0.500000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Shrinking</Name> + <DefaultValue>true</DefaultValue> + <Value>true</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Coef 0</Name> + <DefaultValue>0.000000</DefaultValue> + <Value>0.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Randomize k-fold cross-validation test data</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Balance classes</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>544</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>1648</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0xac393893, 0x25854082)</Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>7</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>3</Value> + </Attribute> + <Attribute> + <Identifier>(0xfba64161, 0x65304e21)</Identifier> + <Value></Value> + </Attribute> + </Attributes> + </Box> <Box> <Identifier>(0x00000bcc, 0x00007a84)</Identifier> <Name>Temporal Filter</Name> @@ -1288,221 +1511,6 @@ </Attribute> </Attributes> </Box> - <Box> - <Identifier>(0x6cc6b8a7, 0x009107fb)</Identifier> - <Name>Classifier trainer</Name> - <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> - <Inputs> - <Input> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Stimulations</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 1</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 2</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 3</Name> - </Input> - </Inputs> - <Outputs> - <Output> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Train-completed Flag</Name> - </Output> - </Outputs> - <Settings> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Train trigger</Name> - <DefaultValue>OVTK_StimulationId_Train</DefaultValue> - <Value>OVTK_StimulationId_ExperimentStop</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> - <Name>Filename to save configuration to</Name> - <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> - <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> - <Name>Multiclass strategy to apply</Name> - <DefaultValue>Native</DefaultValue> - <Value>Native</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 1 label</Name> - <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> - <Value>OVTK_StimulationId_Label_01</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 2 label</Name> - <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> - <Value>OVTK_StimulationId_Label_02</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 3 label</Name> - <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> - <Value>OVTK_StimulationId_Label_03</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> - <Name>Algorithm to use</Name> - <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> - <Value>Support Vector Machine (SVM)</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Epsilon</Name> - <DefaultValue>0.100000</DefaultValue> - <Value>0.1</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier> - <Name>Weight</Name> - <DefaultValue></DefaultValue> - <Value></Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2af426d1, 0x72fb7bac)</TypeIdentifier> - <Name>SVM type</Name> - <DefaultValue>C-SVC</DefaultValue> - <Value>C-SVC</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Degree</Name> - <DefaultValue>3</DefaultValue> - <Value>1</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x54bb0016, 0x6aa27496)</TypeIdentifier> - <Name>Kernel type</Name> - <DefaultValue>Linear</DefaultValue> - <Value>Linear</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier> - <Name>Weight Label</Name> - <DefaultValue></DefaultValue> - <Value></Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Epsilon tolerance</Name> - <DefaultValue>0.001000</DefaultValue> - <Value>0.0010</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Cost</Name> - <DefaultValue>1.000000</DefaultValue> - <Value>1</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Cache size</Name> - <DefaultValue>100.000000</DefaultValue> - <Value>100</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Gamma</Name> - <DefaultValue>0.000000</DefaultValue> - <Value>0</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Nu</Name> - <DefaultValue>0.500000</DefaultValue> - <Value>0.5</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Shrinking</Name> - <DefaultValue>true</DefaultValue> - <Value>true</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Coef 0</Name> - <DefaultValue>0.000000</DefaultValue> - <Value>0</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of partitions for k-fold cross-validation test</Name> - <DefaultValue>10</DefaultValue> - <Value>3</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Balance classes</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - </Settings> - <Attributes> - <Attribute> - <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>544</Value> - </Attribute> - <Attribute> - <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>1648</Value> - </Attribute> - <Attribute> - <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x9de21779, 0x37776c89)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> - <Value>1</Value> - </Attribute> - <Attribute> - <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>6</Value> - </Attribute> - <Attribute> - <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> - <Value>3</Value> - </Attribute> - <Attribute> - <Identifier>(0xfba64161, 0x65304e21)</Identifier> - <Value></Value> - </Attribute> - </Attributes> - </Box> <Box> <Identifier>(0x72a5f195, 0x5ef1cbbc)</Identifier> <Name>Feature aggregator</Name> @@ -1565,36 +1573,36 @@ </Boxes> <Links> <Link> - <Identifier>(0x0000041c, 0x0000785c)</Identifier> + <Identifier>(0x00000750, 0x00007192)</Identifier> <Source> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fb)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> + <BoxIdentifier>(0x50eef0f8, 0x07c4a999)</BoxIdentifier> + <BoxOutputIndex>1</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x2a62aa62, 0x22b9aa6b)</BoxIdentifier> + <BoxIdentifier>(0x00000bcc, 0x00007a86)</BoxIdentifier> <BoxInputIndex>0</BoxInputIndex> </Target> </Link> <Link> - <Identifier>(0x00000499, 0x000061a2)</Identifier> + <Identifier>(0x000007f8, 0x00006f6d)</Identifier> <Source> <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> - <BoxOutputIndex>3</BoxOutputIndex> + <BoxOutputIndex>1</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fb)</BoxIdentifier> - <BoxInputIndex>3</BoxInputIndex> + <BoxIdentifier>(0x0000095b, 0x00006f0c)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> </Target> </Link> <Link> - <Identifier>(0x00000750, 0x00007192)</Identifier> + <Identifier>(0x000008f4, 0x00006704)</Identifier> <Source> - <BoxIdentifier>(0x50eef0f8, 0x07c4a999)</BoxIdentifier> - <BoxOutputIndex>1</BoxOutputIndex> + <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> + <BoxOutputIndex>2</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x00000bcc, 0x00007a86)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> + <BoxIdentifier>(0x0000095b, 0x00006f0c)</BoxIdentifier> + <BoxInputIndex>2</BoxInputIndex> </Target> </Link> <Link> @@ -1619,6 +1627,17 @@ <BoxInputIndex>1</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x0000155d, 0x00003434)</Identifier> + <Source> + <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x0000095b, 0x00006f0c)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x000017f0, 0x00001a31)</Identifier> <Source> @@ -1652,6 +1671,28 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x000022e0, 0x000064e2)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> + <BoxOutputIndex>3</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x0000095b, 0x00006f0c)</BoxIdentifier> + <BoxInputIdentifier>(0x3a81c00c, 0xe359f17e)</BoxInputIdentifier> + </Target> + </Link> + <Link> + <Identifier>(0x000023a4, 0x000065df)</Identifier> + <Source> + <BoxIdentifier>(0x0000095b, 0x00006f0c)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x2a62aa62, 0x22b9aa6b)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x0000391f, 0x0000535d)</Identifier> <Source> @@ -1696,17 +1737,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x00004c1d, 0x000021be)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> - <BoxOutputIndex>1</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fb)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x00004dc4, 0x000063ae)</Identifier> <Source> @@ -1718,17 +1748,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x00005094, 0x00004918)</Identifier> - <Source> - <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fb)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x00005232, 0x000054a6)</Identifier> <Source> @@ -1773,17 +1792,6 @@ <BoxInputIdentifier>(0x4a942408, 0x0f60530d)</BoxInputIdentifier> </Target> </Link> - <Link> - <Identifier>(0x00005f5d, 0x00002a36)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> - <BoxOutputIndex>2</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fb)</BoxIdentifier> - <BoxInputIndex>2</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x0000641e, 0x00005527)</Identifier> <Source> diff --git a/plugins/processing/classification/test/scenarios-tests/SVM-OneVsAll-test.xml b/plugins/processing/classification/test/scenarios-tests/SVM-OneVsAll-test.xml index 4ac4b4829626eeabbcdaab7a0fd9040369619cce..67177c913fd44abd0ad96b5d519f5be51e7bff31 100644 --- a/plugins/processing/classification/test/scenarios-tests/SVM-OneVsAll-test.xml +++ b/plugins/processing/classification/test/scenarios-tests/SVM-OneVsAll-test.xml @@ -1,7 +1,7 @@ <OpenViBE-Scenario> <FormatVersion>2</FormatVersion> <Creator>OpenViBE Designer</Creator> - <CreatorVersion>3.2.0</CreatorVersion> + <CreatorVersion>3.6.0</CreatorVersion> <Settings> <Setting> <Identifier>(0x00425137, 0xf2a30c29)</Identifier> @@ -14,6 +14,229 @@ <Inputs></Inputs> <Outputs></Outputs> <Boxes> + <Box> + <Identifier>(0x000009d4, 0x0000578f)</Identifier> + <Name>Classifier trainer</Name> + <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Stimulations</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 1</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 2</Name> + </Input> + <Input> + <Identifier>(0x9f2650a0, 0xcf1ade87)</Identifier> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 3</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Train-completed Flag</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Train trigger</Name> + <DefaultValue>OVTK_StimulationId_Train</DefaultValue> + <Value>OVTK_StimulationId_ExperimentStop</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> + <Name>Filename to save configuration to</Name> + <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> + <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> + <Name>Multiclass strategy to apply</Name> + <DefaultValue>Native</DefaultValue> + <Value>OneVsAll</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 1 label</Name> + <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> + <Value>OVTK_StimulationId_Label_01</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 2 label</Name> + <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> + <Value>OVTK_StimulationId_Label_02</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 3 label</Name> + <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> + <Value>OVTK_StimulationId_Label_03</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> + <Name>Algorithm to use</Name> + <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> + <Value>Support Vector Machine (SVM)</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Shrinkage: Force diagonal cov (DDA)</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Epsilon</Name> + <DefaultValue>0.100000</DefaultValue> + <Value>0.100000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier> + <Name>Weight</Name> + <DefaultValue></DefaultValue> + <Value></Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2af426d1, 0x72fb7bac)</TypeIdentifier> + <Name>SVM type</Name> + <DefaultValue>C-SVC</DefaultValue> + <Value>C-SVC</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Degree</Name> + <DefaultValue>3</DefaultValue> + <Value>3</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x54bb0016, 0x6aa27496)</TypeIdentifier> + <Name>Kernel type</Name> + <DefaultValue>Linear</DefaultValue> + <Value>Linear</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier> + <Name>Weight Label</Name> + <DefaultValue></DefaultValue> + <Value></Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Epsilon tolerance</Name> + <DefaultValue>0.001000</DefaultValue> + <Value>0.001000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Cost</Name> + <DefaultValue>1.000000</DefaultValue> + <Value>1.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Cache size</Name> + <DefaultValue>100.000000</DefaultValue> + <Value>100.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Gamma</Name> + <DefaultValue>0.000000</DefaultValue> + <Value>0.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Nu</Name> + <DefaultValue>0.500000</DefaultValue> + <Value>0.500000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Shrinking</Name> + <DefaultValue>true</DefaultValue> + <Value>true</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Coef 0</Name> + <DefaultValue>0.000000</DefaultValue> + <Value>0.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Randomize k-fold cross-validation test data</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Balance classes</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>512</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>1680</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0xac393893, 0x25854082)</Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>7</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>3</Value> + </Attribute> + <Attribute> + <Identifier>(0xfba64161, 0x65304e21)</Identifier> + <Value></Value> + </Attribute> + </Attributes> + </Box> <Box> <Identifier>(0x00000bcc, 0x00007a84)</Identifier> <Name>Temporal Filter</Name> @@ -1288,221 +1511,6 @@ </Attribute> </Attributes> </Box> - <Box> - <Identifier>(0x6cc6b8a7, 0x009107fb)</Identifier> - <Name>Classifier trainer</Name> - <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> - <Inputs> - <Input> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Stimulations</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 1</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 2</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 3</Name> - </Input> - </Inputs> - <Outputs> - <Output> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Train-completed Flag</Name> - </Output> - </Outputs> - <Settings> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Train trigger</Name> - <DefaultValue>OVTK_StimulationId_Train</DefaultValue> - <Value>OVTK_StimulationId_ExperimentStop</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> - <Name>Filename to save configuration to</Name> - <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> - <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> - <Name>Multiclass strategy to apply</Name> - <DefaultValue>Native</DefaultValue> - <Value>OneVsAll</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 1 label</Name> - <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> - <Value>OVTK_StimulationId_Label_01</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 2 label</Name> - <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> - <Value>OVTK_StimulationId_Label_02</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 3 label</Name> - <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> - <Value>OVTK_StimulationId_Label_03</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> - <Name>Algorithm to use</Name> - <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> - <Value>Support Vector Machine (SVM)</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Epsilon</Name> - <DefaultValue>0.100000</DefaultValue> - <Value>0.1</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier> - <Name>Weight</Name> - <DefaultValue></DefaultValue> - <Value></Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2af426d1, 0x72fb7bac)</TypeIdentifier> - <Name>SVM type</Name> - <DefaultValue>C-SVC</DefaultValue> - <Value>C-SVC</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Degree</Name> - <DefaultValue>3</DefaultValue> - <Value>1</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x54bb0016, 0x6aa27496)</TypeIdentifier> - <Name>Kernel type</Name> - <DefaultValue>Linear</DefaultValue> - <Value>Linear</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier> - <Name>Weight Label</Name> - <DefaultValue></DefaultValue> - <Value></Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Epsilon tolerance</Name> - <DefaultValue>0.001000</DefaultValue> - <Value>0.0010</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Cost</Name> - <DefaultValue>1.000000</DefaultValue> - <Value>1</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Cache size</Name> - <DefaultValue>100.000000</DefaultValue> - <Value>100</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Gamma</Name> - <DefaultValue>0.000000</DefaultValue> - <Value>0</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Nu</Name> - <DefaultValue>0.500000</DefaultValue> - <Value>0.5</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Shrinking</Name> - <DefaultValue>true</DefaultValue> - <Value>true</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Coef 0</Name> - <DefaultValue>0.000000</DefaultValue> - <Value>0</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of partitions for k-fold cross-validation test</Name> - <DefaultValue>10</DefaultValue> - <Value>3</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Balance classes</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - </Settings> - <Attributes> - <Attribute> - <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>496</Value> - </Attribute> - <Attribute> - <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>1680</Value> - </Attribute> - <Attribute> - <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x9de21779, 0x37776c89)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> - <Value>1</Value> - </Attribute> - <Attribute> - <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>6</Value> - </Attribute> - <Attribute> - <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> - <Value>3</Value> - </Attribute> - <Attribute> - <Identifier>(0xfba64161, 0x65304e21)</Identifier> - <Value></Value> - </Attribute> - </Attributes> - </Box> <Box> <Identifier>(0x72a5f195, 0x5ef1cbbc)</Identifier> <Name>Feature aggregator</Name> @@ -1586,17 +1594,6 @@ <BoxInputIndex>1</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x00001010, 0x0000273c)</Identifier> - <Source> - <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fb)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x000011f0, 0x00001ba1)</Identifier> <Source> @@ -1641,6 +1638,28 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x00001999, 0x00007fd9)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> + <BoxOutputIndex>3</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000009d4, 0x0000578f)</BoxIdentifier> + <BoxInputIdentifier>(0x9f2650a0, 0xcf1ade87)</BoxInputIdentifier> + </Target> + </Link> + <Link> + <Identifier>(0x00002106, 0x0000095b)</Identifier> + <Source> + <BoxIdentifier>(0x000009d4, 0x0000578f)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x2a62aa62, 0x22b9aa6b)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x0000391f, 0x0000535d)</Identifier> <Source> @@ -1663,17 +1682,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x00003e39, 0x00002f3d)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> - <BoxOutputIndex>2</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fb)</BoxIdentifier> - <BoxInputIndex>2</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x00003e54, 0x000015ec)</Identifier> <Source> @@ -1696,17 +1704,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x00004466, 0x000016c5)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> - <BoxOutputIndex>1</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fb)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x00004dc4, 0x000063ae)</Identifier> <Source> @@ -1729,17 +1726,6 @@ <BoxInputIdentifier>(0x4a942408, 0x0f60530d)</BoxInputIdentifier> </Target> </Link> - <Link> - <Identifier>(0x000055de, 0x00003514)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> - <BoxOutputIndex>3</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fb)</BoxIdentifier> - <BoxInputIndex>3</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x000056a2, 0x00005ae5)</Identifier> <Source> @@ -1751,17 +1737,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x000059b1, 0x000036c0)</Identifier> - <Source> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fb)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x2a62aa62, 0x22b9aa6b)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x00005a71, 0x000019e0)</Identifier> <Source> @@ -1828,6 +1803,39 @@ <BoxInputIndex>1</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x00006971, 0x000002fd)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> + <BoxOutputIndex>1</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000009d4, 0x0000578f)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> + </Target> + </Link> + <Link> + <Identifier>(0x00006bc0, 0x00007a69)</Identifier> + <Source> + <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000009d4, 0x0000578f)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> + <Link> + <Identifier>(0x00007072, 0x000009cc)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> + <BoxOutputIndex>2</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000009d4, 0x0000578f)</BoxIdentifier> + <BoxInputIndex>2</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x0be130d9, 0x31dafc5c)</Identifier> <Source> diff --git a/plugins/processing/classification/test/scenarios-tests/SVM-OneVsOne-HT-test.xml b/plugins/processing/classification/test/scenarios-tests/SVM-OneVsOne-HT-test.xml index 485d33cc3e94b327c4f5e73cb13c5077d572bf59..923ee5e750594c7bbe0851ff922bb361714c6f42 100644 --- a/plugins/processing/classification/test/scenarios-tests/SVM-OneVsOne-HT-test.xml +++ b/plugins/processing/classification/test/scenarios-tests/SVM-OneVsOne-HT-test.xml @@ -1,7 +1,7 @@ <OpenViBE-Scenario> <FormatVersion>2</FormatVersion> <Creator>OpenViBE Designer</Creator> - <CreatorVersion>3.2.0</CreatorVersion> + <CreatorVersion>3.6.0</CreatorVersion> <Settings> <Setting> <Identifier>(0x00425137, 0xf2a30c29)</Identifier> @@ -14,6 +14,236 @@ <Inputs></Inputs> <Outputs></Outputs> <Boxes> + <Box> + <Identifier>(0x000009d4, 0x0000578f)</Identifier> + <Name>Classifier trainer</Name> + <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Stimulations</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 1</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 2</Name> + </Input> + <Input> + <Identifier>(0x9f2650a0, 0xcf1ade87)</Identifier> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 3</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Train-completed Flag</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Train trigger</Name> + <DefaultValue>OVTK_StimulationId_Train</DefaultValue> + <Value>OVTK_StimulationId_ExperimentStop</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> + <Name>Filename to save configuration to</Name> + <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> + <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> + <Name>Multiclass strategy to apply</Name> + <DefaultValue>Native</DefaultValue> + <Value>OneVsOne</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x79146976, 0xd7f01a25)</TypeIdentifier> + <Name>Pairwise Decision Strategy</Name> + <DefaultValue>PKPD</DefaultValue> + <Value>HT</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 1 label</Name> + <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> + <Value>OVTK_StimulationId_Label_01</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 2 label</Name> + <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> + <Value>OVTK_StimulationId_Label_02</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 3 label</Name> + <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> + <Value>OVTK_StimulationId_Label_03</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> + <Name>Algorithm to use</Name> + <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> + <Value>Support Vector Machine (SVM)</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Shrinkage: Force diagonal cov (DDA)</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Epsilon</Name> + <DefaultValue>0.100000</DefaultValue> + <Value>0.100000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier> + <Name>Weight</Name> + <DefaultValue></DefaultValue> + <Value></Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2af426d1, 0x72fb7bac)</TypeIdentifier> + <Name>SVM type</Name> + <DefaultValue>C-SVC</DefaultValue> + <Value>C-SVC</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Degree</Name> + <DefaultValue>3</DefaultValue> + <Value>3</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x54bb0016, 0x6aa27496)</TypeIdentifier> + <Name>Kernel type</Name> + <DefaultValue>Linear</DefaultValue> + <Value>Linear</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier> + <Name>Weight Label</Name> + <DefaultValue></DefaultValue> + <Value></Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Epsilon tolerance</Name> + <DefaultValue>0.001000</DefaultValue> + <Value>0.001000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Cost</Name> + <DefaultValue>1.000000</DefaultValue> + <Value>1.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Cache size</Name> + <DefaultValue>100.000000</DefaultValue> + <Value>100.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Gamma</Name> + <DefaultValue>0.000000</DefaultValue> + <Value>0.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Nu</Name> + <DefaultValue>0.500000</DefaultValue> + <Value>0.500000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Shrinking</Name> + <DefaultValue>true</DefaultValue> + <Value>true</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Coef 0</Name> + <DefaultValue>0.000000</DefaultValue> + <Value>0.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Randomize k-fold cross-validation test data</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Balance classes</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>336</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>1472</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0xac393893, 0x25854082)</Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>7</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>3</Value> + </Attribute> + <Attribute> + <Identifier>(0xfba64161, 0x65304e21)</Identifier> + <Value></Value> + </Attribute> + </Attributes> + </Box> <Box> <Identifier>(0x00000bcc, 0x00007a84)</Identifier> <Name>Temporal Filter</Name> @@ -1288,228 +1518,6 @@ </Attribute> </Attributes> </Box> - <Box> - <Identifier>(0x6cc6b8a7, 0x009107fb)</Identifier> - <Name>Classifier trainer</Name> - <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> - <Inputs> - <Input> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Stimulations</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 1</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 2</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 3</Name> - </Input> - </Inputs> - <Outputs> - <Output> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Train-completed Flag</Name> - </Output> - </Outputs> - <Settings> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Train trigger</Name> - <DefaultValue>OVTK_StimulationId_Train</DefaultValue> - <Value>OVTK_StimulationId_ExperimentStop</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> - <Name>Filename to save configuration to</Name> - <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> - <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> - <Name>Multiclass strategy to apply</Name> - <DefaultValue>Native</DefaultValue> - <Value>OneVsOne</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x79146976, 0xd7f01a25)</TypeIdentifier> - <Name>Pairwise Decision Strategy</Name> - <DefaultValue>PKPD</DefaultValue> - <Value>HT</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 1 label</Name> - <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> - <Value>OVTK_StimulationId_Label_01</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 2 label</Name> - <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> - <Value>OVTK_StimulationId_Label_02</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 3 label</Name> - <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> - <Value>OVTK_StimulationId_Label_03</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> - <Name>Algorithm to use</Name> - <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> - <Value>Support Vector Machine (SVM)</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Epsilon</Name> - <DefaultValue>0.100000</DefaultValue> - <Value>0.1</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier> - <Name>Weight</Name> - <DefaultValue></DefaultValue> - <Value></Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2af426d1, 0x72fb7bac)</TypeIdentifier> - <Name>SVM type</Name> - <DefaultValue>C-SVC</DefaultValue> - <Value>C-SVC</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Degree</Name> - <DefaultValue>3</DefaultValue> - <Value>1</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x54bb0016, 0x6aa27496)</TypeIdentifier> - <Name>Kernel type</Name> - <DefaultValue>Linear</DefaultValue> - <Value>Linear</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier> - <Name>Weight Label</Name> - <DefaultValue></DefaultValue> - <Value></Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Epsilon tolerance</Name> - <DefaultValue>0.001000</DefaultValue> - <Value>0.0010</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Cost</Name> - <DefaultValue>1.000000</DefaultValue> - <Value>1</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Cache size</Name> - <DefaultValue>100.000000</DefaultValue> - <Value>100</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Gamma</Name> - <DefaultValue>0.000000</DefaultValue> - <Value>0</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Nu</Name> - <DefaultValue>0.500000</DefaultValue> - <Value>0.5</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Shrinking</Name> - <DefaultValue>true</DefaultValue> - <Value>true</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Coef 0</Name> - <DefaultValue>0.000000</DefaultValue> - <Value>0</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of partitions for k-fold cross-validation test</Name> - <DefaultValue>10</DefaultValue> - <Value>3</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Balance classes</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - </Settings> - <Attributes> - <Attribute> - <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>336</Value> - </Attribute> - <Attribute> - <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>1472</Value> - </Attribute> - <Attribute> - <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x9de21779, 0x37776c89)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> - <Value>1</Value> - </Attribute> - <Attribute> - <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>6</Value> - </Attribute> - <Attribute> - <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> - <Value>3</Value> - </Attribute> - <Attribute> - <Identifier>(0xfba64161, 0x65304e21)</Identifier> - <Value></Value> - </Attribute> - </Attributes> - </Box> <Box> <Identifier>(0x72a5f195, 0x5ef1cbbc)</Identifier> <Name>Feature aggregator</Name> @@ -1582,6 +1590,17 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x00000d88, 0x00005d5f)</Identifier> + <Source> + <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000009d4, 0x0000578f)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00000dbf, 0x00000a19)</Identifier> <Source> @@ -1638,38 +1657,16 @@ </Target> </Link> <Link> - <Identifier>(0x000020c8, 0x000023af)</Identifier> + <Identifier>(0x0000225b, 0x000025a4)</Identifier> <Source> <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> <BoxOutputIndex>1</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fb)</BoxIdentifier> + <BoxIdentifier>(0x000009d4, 0x0000578f)</BoxIdentifier> <BoxInputIndex>1</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x00002c9e, 0x00004b6a)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> - <BoxOutputIndex>2</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fb)</BoxIdentifier> - <BoxInputIndex>2</BoxInputIndex> - </Target> - </Link> - <Link> - <Identifier>(0x000030e5, 0x0000028b)</Identifier> - <Source> - <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fb)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x0000391f, 0x0000535d)</Identifier> <Source> @@ -1714,6 +1711,17 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x000041c1, 0x0000243d)</Identifier> + <Source> + <BoxIdentifier>(0x000009d4, 0x0000578f)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x2a62aa62, 0x22b9aa6b)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00004dc4, 0x000063ae)</Identifier> <Source> @@ -1769,6 +1777,28 @@ <BoxInputIdentifier>(0x4a942408, 0x0f60530d)</BoxInputIdentifier> </Target> </Link> + <Link> + <Identifier>(0x00005d01, 0x000008e6)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> + <BoxOutputIndex>3</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000009d4, 0x0000578f)</BoxIdentifier> + <BoxInputIdentifier>(0x9f2650a0, 0xcf1ade87)</BoxInputIdentifier> + </Target> + </Link> + <Link> + <Identifier>(0x00006239, 0x00000557)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> + <BoxOutputIndex>2</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000009d4, 0x0000578f)</BoxIdentifier> + <BoxInputIndex>2</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x0000641e, 0x00005527)</Identifier> <Source> @@ -1813,28 +1843,6 @@ <BoxInputIndex>1</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x00006a80, 0x00001167)</Identifier> - <Source> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fb)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x2a62aa62, 0x22b9aa6b)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> - <Link> - <Identifier>(0x00006fd9, 0x00006a52)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> - <BoxOutputIndex>3</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fb)</BoxIdentifier> - <BoxInputIndex>3</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x0be130d9, 0x31dafc5c)</Identifier> <Source> diff --git a/plugins/processing/classification/test/scenarios-tests/SVM-OneVsOne-PKPD-test.xml b/plugins/processing/classification/test/scenarios-tests/SVM-OneVsOne-PKPD-test.xml index 04f473673cc5d9201b500cc3e5b6ae0f44135613..c027b457eafe3ec9c6bff45144a49136c291b6b6 100644 --- a/plugins/processing/classification/test/scenarios-tests/SVM-OneVsOne-PKPD-test.xml +++ b/plugins/processing/classification/test/scenarios-tests/SVM-OneVsOne-PKPD-test.xml @@ -1,7 +1,7 @@ <OpenViBE-Scenario> <FormatVersion>2</FormatVersion> <Creator>OpenViBE Designer</Creator> - <CreatorVersion>3.2.0</CreatorVersion> + <CreatorVersion>3.6.0</CreatorVersion> <Settings> <Setting> <Identifier>(0x00425137, 0xf2a30c29)</Identifier> @@ -14,6 +14,236 @@ <Inputs></Inputs> <Outputs></Outputs> <Boxes> + <Box> + <Identifier>(0x000009d4, 0x0000578f)</Identifier> + <Name>Classifier trainer</Name> + <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Stimulations</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 1</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 2</Name> + </Input> + <Input> + <Identifier>(0x9f2650a0, 0xcf1ade87)</Identifier> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 3</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Train-completed Flag</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Train trigger</Name> + <DefaultValue>OVTK_StimulationId_Train</DefaultValue> + <Value>OVTK_StimulationId_ExperimentStop</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> + <Name>Filename to save configuration to</Name> + <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> + <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> + <Name>Multiclass strategy to apply</Name> + <DefaultValue>Native</DefaultValue> + <Value>OneVsOne</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x79146976, 0xd7f01a25)</TypeIdentifier> + <Name>Pairwise Decision Strategy</Name> + <DefaultValue>PKPD</DefaultValue> + <Value>PKPD</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 1 label</Name> + <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> + <Value>OVTK_StimulationId_Label_01</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 2 label</Name> + <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> + <Value>OVTK_StimulationId_Label_02</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 3 label</Name> + <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> + <Value>OVTK_StimulationId_Label_03</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> + <Name>Algorithm to use</Name> + <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> + <Value>Support Vector Machine (SVM)</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Shrinkage: Force diagonal cov (DDA)</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Epsilon</Name> + <DefaultValue>0.100000</DefaultValue> + <Value>0.100000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier> + <Name>Weight</Name> + <DefaultValue></DefaultValue> + <Value></Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2af426d1, 0x72fb7bac)</TypeIdentifier> + <Name>SVM type</Name> + <DefaultValue>C-SVC</DefaultValue> + <Value>C-SVC</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Degree</Name> + <DefaultValue>3</DefaultValue> + <Value>3</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x54bb0016, 0x6aa27496)</TypeIdentifier> + <Name>Kernel type</Name> + <DefaultValue>Linear</DefaultValue> + <Value>Linear</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier> + <Name>Weight Label</Name> + <DefaultValue></DefaultValue> + <Value></Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Epsilon tolerance</Name> + <DefaultValue>0.001000</DefaultValue> + <Value>0.001000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Cost</Name> + <DefaultValue>1.000000</DefaultValue> + <Value>1.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Cache size</Name> + <DefaultValue>100.000000</DefaultValue> + <Value>100.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Gamma</Name> + <DefaultValue>0.000000</DefaultValue> + <Value>0.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Nu</Name> + <DefaultValue>0.500000</DefaultValue> + <Value>0.500000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Shrinking</Name> + <DefaultValue>true</DefaultValue> + <Value>true</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Coef 0</Name> + <DefaultValue>0.000000</DefaultValue> + <Value>0.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Randomize k-fold cross-validation test data</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Balance classes</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>368</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>1504</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0xac393893, 0x25854082)</Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>7</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>3</Value> + </Attribute> + <Attribute> + <Identifier>(0xfba64161, 0x65304e21)</Identifier> + <Value></Value> + </Attribute> + </Attributes> + </Box> <Box> <Identifier>(0x00000bcc, 0x00007a84)</Identifier> <Name>Temporal Filter</Name> @@ -1288,228 +1518,6 @@ </Attribute> </Attributes> </Box> - <Box> - <Identifier>(0x6cc6b8a7, 0x009107fb)</Identifier> - <Name>Classifier trainer</Name> - <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> - <Inputs> - <Input> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Stimulations</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 1</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 2</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 3</Name> - </Input> - </Inputs> - <Outputs> - <Output> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Train-completed Flag</Name> - </Output> - </Outputs> - <Settings> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Train trigger</Name> - <DefaultValue>OVTK_StimulationId_Train</DefaultValue> - <Value>OVTK_StimulationId_ExperimentStop</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> - <Name>Filename to save configuration to</Name> - <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> - <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> - <Name>Multiclass strategy to apply</Name> - <DefaultValue>Native</DefaultValue> - <Value>OneVsOne</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x79146976, 0xd7f01a25)</TypeIdentifier> - <Name>Pairwise Decision Strategy</Name> - <DefaultValue>PKPD</DefaultValue> - <Value>PKPD</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 1 label</Name> - <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> - <Value>OVTK_StimulationId_Label_01</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 2 label</Name> - <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> - <Value>OVTK_StimulationId_Label_02</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 3 label</Name> - <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> - <Value>OVTK_StimulationId_Label_03</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> - <Name>Algorithm to use</Name> - <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> - <Value>Support Vector Machine (SVM)</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Epsilon</Name> - <DefaultValue>0.100000</DefaultValue> - <Value>0.1</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier> - <Name>Weight</Name> - <DefaultValue></DefaultValue> - <Value></Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2af426d1, 0x72fb7bac)</TypeIdentifier> - <Name>SVM type</Name> - <DefaultValue>C-SVC</DefaultValue> - <Value>C-SVC</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Degree</Name> - <DefaultValue>3</DefaultValue> - <Value>1</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x54bb0016, 0x6aa27496)</TypeIdentifier> - <Name>Kernel type</Name> - <DefaultValue>Linear</DefaultValue> - <Value>Linear</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier> - <Name>Weight Label</Name> - <DefaultValue></DefaultValue> - <Value></Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Epsilon tolerance</Name> - <DefaultValue>0.001000</DefaultValue> - <Value>0.0010</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Cost</Name> - <DefaultValue>1.000000</DefaultValue> - <Value>1</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Cache size</Name> - <DefaultValue>100.000000</DefaultValue> - <Value>100</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Gamma</Name> - <DefaultValue>0.000000</DefaultValue> - <Value>0</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Nu</Name> - <DefaultValue>0.500000</DefaultValue> - <Value>0.5</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Shrinking</Name> - <DefaultValue>true</DefaultValue> - <Value>true</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Coef 0</Name> - <DefaultValue>0.000000</DefaultValue> - <Value>0</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of partitions for k-fold cross-validation test</Name> - <DefaultValue>10</DefaultValue> - <Value>3</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Balance classes</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - </Settings> - <Attributes> - <Attribute> - <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>368</Value> - </Attribute> - <Attribute> - <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>1504</Value> - </Attribute> - <Attribute> - <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x9de21779, 0x37776c89)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> - <Value>1</Value> - </Attribute> - <Attribute> - <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>6</Value> - </Attribute> - <Attribute> - <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> - <Value>3</Value> - </Attribute> - <Attribute> - <Identifier>(0xfba64161, 0x65304e21)</Identifier> - <Value></Value> - </Attribute> - </Attributes> - </Box> <Box> <Identifier>(0x72a5f195, 0x5ef1cbbc)</Identifier> <Name>Feature aggregator</Name> @@ -1582,17 +1590,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x000009ef, 0x00005e8d)</Identifier> - <Source> - <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fb)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x00000dbf, 0x00000a19)</Identifier> <Source> @@ -1649,14 +1646,14 @@ </Target> </Link> <Link> - <Identifier>(0x0000230d, 0x000060a5)</Identifier> + <Identifier>(0x00001d83, 0x000035cb)</Identifier> <Source> <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> - <BoxOutputIndex>2</BoxOutputIndex> + <BoxOutputIndex>1</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fb)</BoxIdentifier> - <BoxInputIndex>2</BoxInputIndex> + <BoxIdentifier>(0x000009d4, 0x0000578f)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> </Target> </Link> <Link> @@ -1703,6 +1700,28 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x000049da, 0x00001601)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> + <BoxOutputIndex>3</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000009d4, 0x0000578f)</BoxIdentifier> + <BoxInputIdentifier>(0x9f2650a0, 0xcf1ade87)</BoxInputIdentifier> + </Target> + </Link> + <Link> + <Identifier>(0x00004a9a, 0x00003c83)</Identifier> + <Source> + <BoxIdentifier>(0x000009d4, 0x0000578f)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x2a62aa62, 0x22b9aa6b)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00004dc4, 0x000063ae)</Identifier> <Source> @@ -1736,6 +1755,17 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x0000590a, 0x0000539e)</Identifier> + <Source> + <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000009d4, 0x0000578f)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00005a71, 0x000019e0)</Identifier> <Source> @@ -1803,36 +1833,14 @@ </Target> </Link> <Link> - <Identifier>(0x00006aa2, 0x00001515)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> - <BoxOutputIndex>1</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fb)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> - </Target> - </Link> - <Link> - <Identifier>(0x00007adf, 0x0000611a)</Identifier> + <Identifier>(0x00007caa, 0x000014ee)</Identifier> <Source> <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> - <BoxOutputIndex>3</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fb)</BoxIdentifier> - <BoxInputIndex>3</BoxInputIndex> - </Target> - </Link> - <Link> - <Identifier>(0x00007f33, 0x0000205c)</Identifier> - <Source> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fb)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> + <BoxOutputIndex>2</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x2a62aa62, 0x22b9aa6b)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> + <BoxIdentifier>(0x000009d4, 0x0000578f)</BoxIdentifier> + <BoxInputIndex>2</BoxInputIndex> </Target> </Link> <Link> diff --git a/plugins/processing/classification/test/scenarios-tests/SVM-OneVsOne-Voting-test.xml b/plugins/processing/classification/test/scenarios-tests/SVM-OneVsOne-Voting-test.xml index 3a0e1eaef0663cf7e84a57e17b77ab68172c2656..3566fbb17907833b3264ea7beab661e5fd99fe9d 100644 --- a/plugins/processing/classification/test/scenarios-tests/SVM-OneVsOne-Voting-test.xml +++ b/plugins/processing/classification/test/scenarios-tests/SVM-OneVsOne-Voting-test.xml @@ -1,7 +1,7 @@ <OpenViBE-Scenario> <FormatVersion>2</FormatVersion> <Creator>OpenViBE Designer</Creator> - <CreatorVersion>3.2.0</CreatorVersion> + <CreatorVersion>3.6.0</CreatorVersion> <Settings> <Setting> <Identifier>(0x00425137, 0xf2a30c29)</Identifier> @@ -14,6 +14,236 @@ <Inputs></Inputs> <Outputs></Outputs> <Boxes> + <Box> + <Identifier>(0x000009d4, 0x0000578f)</Identifier> + <Name>Classifier trainer</Name> + <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Stimulations</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 1</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 2</Name> + </Input> + <Input> + <Identifier>(0x9f2650a0, 0xcf1ade87)</Identifier> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 3</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Train-completed Flag</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Train trigger</Name> + <DefaultValue>OVTK_StimulationId_Train</DefaultValue> + <Value>OVTK_StimulationId_ExperimentStop</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> + <Name>Filename to save configuration to</Name> + <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> + <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> + <Name>Multiclass strategy to apply</Name> + <DefaultValue>Native</DefaultValue> + <Value>OneVsOne</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x79146976, 0xd7f01a25)</TypeIdentifier> + <Name>Pairwise Decision Strategy</Name> + <DefaultValue>PKPD</DefaultValue> + <Value>Voting</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 1 label</Name> + <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> + <Value>OVTK_StimulationId_Label_01</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 2 label</Name> + <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> + <Value>OVTK_StimulationId_Label_02</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 3 label</Name> + <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> + <Value>OVTK_StimulationId_Label_03</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> + <Name>Algorithm to use</Name> + <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> + <Value>Support Vector Machine (SVM)</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Shrinkage: Force diagonal cov (DDA)</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Epsilon</Name> + <DefaultValue>0.100000</DefaultValue> + <Value>0.100000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier> + <Name>Weight</Name> + <DefaultValue></DefaultValue> + <Value></Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2af426d1, 0x72fb7bac)</TypeIdentifier> + <Name>SVM type</Name> + <DefaultValue>C-SVC</DefaultValue> + <Value>C-SVC</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Degree</Name> + <DefaultValue>3</DefaultValue> + <Value>3</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x54bb0016, 0x6aa27496)</TypeIdentifier> + <Name>Kernel type</Name> + <DefaultValue>Linear</DefaultValue> + <Value>Linear</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier> + <Name>Weight Label</Name> + <DefaultValue></DefaultValue> + <Value></Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Epsilon tolerance</Name> + <DefaultValue>0.001000</DefaultValue> + <Value>0.001000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Cost</Name> + <DefaultValue>1.000000</DefaultValue> + <Value>1.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Cache size</Name> + <DefaultValue>100.000000</DefaultValue> + <Value>100.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Gamma</Name> + <DefaultValue>0.000000</DefaultValue> + <Value>0.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Nu</Name> + <DefaultValue>0.500000</DefaultValue> + <Value>0.500000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Shrinking</Name> + <DefaultValue>true</DefaultValue> + <Value>true</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Coef 0</Name> + <DefaultValue>0.000000</DefaultValue> + <Value>0.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Randomize k-fold cross-validation test data</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Balance classes</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>336</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>1600</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0xac393893, 0x25854082)</Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>7</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>3</Value> + </Attribute> + <Attribute> + <Identifier>(0xfba64161, 0x65304e21)</Identifier> + <Value></Value> + </Attribute> + </Attributes> + </Box> <Box> <Identifier>(0x00000bcc, 0x00007a84)</Identifier> <Name>Temporal Filter</Name> @@ -807,7 +1037,7 @@ <Attributes> <Attribute> <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>368</Value> + <Value>400</Value> </Attribute> <Attribute> <Identifier>(0x207c9054, 0x3c841b63)</Identifier> @@ -1288,228 +1518,6 @@ </Attribute> </Attributes> </Box> - <Box> - <Identifier>(0x6cc6b8a7, 0x009107fb)</Identifier> - <Name>Classifier trainer</Name> - <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> - <Inputs> - <Input> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Stimulations</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 1</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 2</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 3</Name> - </Input> - </Inputs> - <Outputs> - <Output> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Train-completed Flag</Name> - </Output> - </Outputs> - <Settings> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Train trigger</Name> - <DefaultValue>OVTK_StimulationId_Train</DefaultValue> - <Value>OVTK_StimulationId_ExperimentStop</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> - <Name>Filename to save configuration to</Name> - <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> - <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> - <Name>Multiclass strategy to apply</Name> - <DefaultValue>Native</DefaultValue> - <Value>OneVsOne</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x79146976, 0xd7f01a25)</TypeIdentifier> - <Name>Pairwise Decision Strategy</Name> - <DefaultValue>PKPD</DefaultValue> - <Value>Voting</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 1 label</Name> - <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> - <Value>OVTK_StimulationId_Label_01</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 2 label</Name> - <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> - <Value>OVTK_StimulationId_Label_02</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 3 label</Name> - <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> - <Value>OVTK_StimulationId_Label_03</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> - <Name>Algorithm to use</Name> - <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> - <Value>Support Vector Machine (SVM)</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Epsilon</Name> - <DefaultValue>0.100000</DefaultValue> - <Value>0.1</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier> - <Name>Weight</Name> - <DefaultValue></DefaultValue> - <Value></Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2af426d1, 0x72fb7bac)</TypeIdentifier> - <Name>SVM type</Name> - <DefaultValue>C-SVC</DefaultValue> - <Value>C-SVC</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Degree</Name> - <DefaultValue>3</DefaultValue> - <Value>1</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x54bb0016, 0x6aa27496)</TypeIdentifier> - <Name>Kernel type</Name> - <DefaultValue>Linear</DefaultValue> - <Value>Linear</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier> - <Name>Weight Label</Name> - <DefaultValue></DefaultValue> - <Value></Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Epsilon tolerance</Name> - <DefaultValue>0.001000</DefaultValue> - <Value>0.0010</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Cost</Name> - <DefaultValue>1.000000</DefaultValue> - <Value>1</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Cache size</Name> - <DefaultValue>100.000000</DefaultValue> - <Value>100</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Gamma</Name> - <DefaultValue>0.000000</DefaultValue> - <Value>0</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Nu</Name> - <DefaultValue>0.500000</DefaultValue> - <Value>0.5</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Shrinking</Name> - <DefaultValue>true</DefaultValue> - <Value>true</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Coef 0</Name> - <DefaultValue>0.000000</DefaultValue> - <Value>0</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of partitions for k-fold cross-validation test</Name> - <DefaultValue>10</DefaultValue> - <Value>3</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Balance classes</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - </Settings> - <Attributes> - <Attribute> - <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>304</Value> - </Attribute> - <Attribute> - <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>1584</Value> - </Attribute> - <Attribute> - <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x9de21779, 0x37776c89)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> - <Value>1</Value> - </Attribute> - <Attribute> - <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>6</Value> - </Attribute> - <Attribute> - <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> - <Value>3</Value> - </Attribute> - <Attribute> - <Identifier>(0xfba64161, 0x65304e21)</Identifier> - <Value></Value> - </Attribute> - </Attributes> - </Box> <Box> <Identifier>(0x72a5f195, 0x5ef1cbbc)</Identifier> <Name>Feature aggregator</Name> @@ -1571,6 +1579,17 @@ </Box> </Boxes> <Links> + <Link> + <Identifier>(0x0000017b, 0x000020bc)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> + <BoxOutputIndex>3</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000009d4, 0x0000578f)</BoxIdentifier> + <BoxInputIdentifier>(0x9f2650a0, 0xcf1ade87)</BoxInputIdentifier> + </Target> + </Link> <Link> <Identifier>(0x00000750, 0x00007192)</Identifier> <Source> @@ -1638,36 +1657,25 @@ </Target> </Link> <Link> - <Identifier>(0x00002024, 0x000013ce)</Identifier> + <Identifier>(0x0000391f, 0x0000535d)</Identifier> <Source> - <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> + <BoxIdentifier>(0x4f494c33, 0x2f8af0f3)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fb)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> - <Link> - <Identifier>(0x00003832, 0x00000df2)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> - <BoxOutputIndex>1</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fb)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> + <BoxIdentifier>(0x0000646c, 0x000059a2)</BoxIdentifier> + <BoxInputIdentifier>(0x4a942408, 0x0f60530d)</BoxInputIdentifier> </Target> </Link> <Link> - <Identifier>(0x0000391f, 0x0000535d)</Identifier> + <Identifier>(0x00003a34, 0x000018b0)</Identifier> <Source> - <BoxIdentifier>(0x4f494c33, 0x2f8af0f3)</BoxIdentifier> + <BoxIdentifier>(0x000009d4, 0x0000578f)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x0000646c, 0x000059a2)</BoxIdentifier> - <BoxInputIdentifier>(0x4a942408, 0x0f60530d)</BoxInputIdentifier> + <BoxIdentifier>(0x2a62aa62, 0x22b9aa6b)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> </Target> </Link> <Link> @@ -1703,6 +1711,17 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x00004134, 0x0000408a)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> + <BoxOutputIndex>1</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000009d4, 0x0000578f)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00004dc4, 0x000063ae)</Identifier> <Source> @@ -1758,17 +1777,6 @@ <BoxInputIdentifier>(0x4a942408, 0x0f60530d)</BoxInputIdentifier> </Target> </Link> - <Link> - <Identifier>(0x00005d9a, 0x00003c1b)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> - <BoxOutputIndex>3</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fb)</BoxIdentifier> - <BoxInputIndex>3</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x0000641e, 0x00005527)</Identifier> <Source> @@ -1791,6 +1799,17 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x00006751, 0x000033c6)</Identifier> + <Source> + <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000009d4, 0x0000578f)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x000068de, 0x00007645)</Identifier> <Source> @@ -1814,27 +1833,16 @@ </Target> </Link> <Link> - <Identifier>(0x000075b1, 0x00000e49)</Identifier> + <Identifier>(0x00007ff9, 0x000054e5)</Identifier> <Source> <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> <BoxOutputIndex>2</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fb)</BoxIdentifier> + <BoxIdentifier>(0x000009d4, 0x0000578f)</BoxIdentifier> <BoxInputIndex>2</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x00007762, 0x00001d24)</Identifier> - <Source> - <BoxIdentifier>(0x6cc6b8a7, 0x009107fb)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x2a62aa62, 0x22b9aa6b)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x0be130d9, 0x31dafc5c)</Identifier> <Source> diff --git a/plugins/processing/classification/test/scenarios-tests/sLDA-Native-test.xml b/plugins/processing/classification/test/scenarios-tests/sLDA-Native-test.xml index 4e850530c802b51a2390cc9a05646179c3b7e4e1..3a172fd141e0feb57629d70aec1b8efcd4934489 100644 --- a/plugins/processing/classification/test/scenarios-tests/sLDA-Native-test.xml +++ b/plugins/processing/classification/test/scenarios-tests/sLDA-Native-test.xml @@ -1,7 +1,7 @@ <OpenViBE-Scenario> <FormatVersion>2</FormatVersion> <Creator>OpenViBE Designer</Creator> - <CreatorVersion>3.2.0</CreatorVersion> + <CreatorVersion>3.6.0</CreatorVersion> <Settings> <Setting> <Identifier>(0x00425137, 0xf2a30c29)</Identifier> @@ -367,6 +367,159 @@ </Attribute> </Attributes> </Box> + <Box> + <Identifier>(0x000058ab, 0x000075df)</Identifier> + <Name>Classifier trainer</Name> + <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Stimulations</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 1</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 2</Name> + </Input> + <Input> + <Identifier>(0xba230fd4, 0x094eb666)</Identifier> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 3</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Train-completed Flag</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Train trigger</Name> + <DefaultValue>OVTK_StimulationId_Train</DefaultValue> + <Value>OVTK_StimulationId_ExperimentStop</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> + <Name>Filename to save configuration to</Name> + <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> + <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> + <Name>Multiclass strategy to apply</Name> + <DefaultValue>Native</DefaultValue> + <Value>Native</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 1 label</Name> + <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> + <Value>OVTK_StimulationId_Label_01</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 2 label</Name> + <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> + <Value>OVTK_StimulationId_Label_02</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 3 label</Name> + <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> + <Value>OVTK_StimulationId_Label_03</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> + <Name>Algorithm to use</Name> + <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> + <Value>Linear Discrimimant Analysis (LDA)</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Number of partitions for k-fold cross-validation test</Name> + <DefaultValue>10</DefaultValue> + <Value>5</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Use shrinkage</Name> + <DefaultValue>false</DefaultValue> + <Value>true</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Shrinkage coefficient (-1 == auto)</Name> + <DefaultValue>-1.000000</DefaultValue> + <Value>-1.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Shrinkage: Force diagonal cov (DDA)</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Randomize k-fold cross-validation test data</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Balance classes</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>288</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>1008</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0xac393893, 0x25854082)</Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>7</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>3</Value> + </Attribute> + <Attribute> + <Identifier>(0xfba64161, 0x65304e21)</Identifier> + <Value></Value> + </Attribute> + </Attributes> + </Box> <Box> <Identifier>(0x0000646c, 0x000059a1)</Identifier> <Name>Signal Power Log</Name> @@ -1083,159 +1236,6 @@ </Attribute> </Attributes> </Box> - <Box> - <Identifier>(0x56fbfd1a, 0x2c474c9e)</Identifier> - <Name>Classifier trainer</Name> - <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> - <Inputs> - <Input> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Stimulations</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 1</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 2</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 3</Name> - </Input> - </Inputs> - <Outputs> - <Output> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Train-completed Flag</Name> - </Output> - </Outputs> - <Settings> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Train trigger</Name> - <DefaultValue>OVTK_StimulationId_Train</DefaultValue> - <Value>OVTK_StimulationId_ExperimentStop</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> - <Name>Filename to save configuration to</Name> - <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> - <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> - <Name>Multiclass strategy to apply</Name> - <DefaultValue>Native</DefaultValue> - <Value>Native</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 1 label</Name> - <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> - <Value>OVTK_StimulationId_Label_01</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 2 label</Name> - <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> - <Value>OVTK_StimulationId_Label_02</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 3 label</Name> - <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> - <Value>OVTK_StimulationId_Label_03</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> - <Name>Algorithm to use</Name> - <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> - <Value>Linear Discrimimant Analysis (LDA)</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Use shrinkage</Name> - <DefaultValue>false</DefaultValue> - <Value>true</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Shrinkage coefficient (-1 == auto)</Name> - <DefaultValue>-1.000000</DefaultValue> - <Value>-1</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Shrinkage: Force diagonal cov (DDA)</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of partitions for k-fold cross-validation test</Name> - <DefaultValue>10</DefaultValue> - <Value>5</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Balance classes</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - </Settings> - <Attributes> - <Attribute> - <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>304</Value> - </Attribute> - <Attribute> - <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>1008</Value> - </Attribute> - <Attribute> - <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x9de21779, 0x37776c89)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier> - <Value>(0x00000000, 0x082a348e)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier> - <Value>false</Value> - </Attribute> - <Attribute> - <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> - <Value>1</Value> - </Attribute> - <Attribute> - <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>5</Value> - </Attribute> - <Attribute> - <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> - <Value>3</Value> - </Attribute> - <Attribute> - <Identifier>(0xfba64161, 0x65304e21)</Identifier> - <Value></Value> - </Attribute> - </Attributes> - </Box> <Box> <Identifier>(0x6292a294, 0x629905c2)</Identifier> <Name>Target Separator</Name> @@ -1524,6 +1524,17 @@ <BoxInputIndex>1</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x00000fb9, 0x00000b67)</Identifier> + <Source> + <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x000011f0, 0x00001ba1)</Identifier> <Source> @@ -1569,14 +1580,14 @@ </Target> </Link> <Link> - <Identifier>(0x00002bf0, 0x0000520c)</Identifier> + <Identifier>(0x00002d69, 0x00000dda)</Identifier> <Source> - <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> + <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> + <BoxOutputIndex>2</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxInputIndex>2</BoxInputIndex> </Target> </Link> <Link> @@ -1645,6 +1656,17 @@ <BoxInputIdentifier>(0x4a942408, 0x0f60530d)</BoxInputIdentifier> </Target> </Link> + <Link> + <Identifier>(0x0000548b, 0x0000500a)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> + <BoxOutputIndex>1</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x000056a2, 0x00005ae5)</Identifier> <Source> @@ -1656,6 +1678,17 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x00005940, 0x00004019)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> + <BoxOutputIndex>3</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxInputIdentifier>(0xba230fd4, 0x094eb666)</BoxInputIdentifier> + </Target> + </Link> <Link> <Identifier>(0x00005a71, 0x000019e0)</Identifier> <Source> @@ -1678,6 +1711,17 @@ <BoxInputIdentifier>(0x4a942408, 0x0f60530d)</BoxInputIdentifier> </Target> </Link> + <Link> + <Identifier>(0x000061fc, 0x000073c0)</Identifier> + <Source> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x2a62aa62, 0x22b9aa6a)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x0000641e, 0x00005527)</Identifier> <Source> @@ -1722,17 +1766,6 @@ <BoxInputIndex>1</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x04425bf5, 0x3335d8a7)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> - <BoxOutputIndex>3</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>3</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x0be130d9, 0x31dafc5b)</Identifier> <Source> @@ -1788,17 +1821,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x55200f87, 0x00b3c658)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> - <BoxOutputIndex>2</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>2</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x584f1915, 0x72e8000a)</Identifier> <Source> @@ -1810,28 +1832,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x72ae14cf, 0x7201ea84)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> - <BoxOutputIndex>1</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> - </Target> - </Link> - <Link> - <Identifier>(0x731aa1b4, 0x14c8e6c0)</Identifier> - <Source> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x2a62aa62, 0x22b9aa6a)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> </Links> <Comments></Comments> <Metadata> diff --git a/plugins/processing/classification/test/scenarios-tests/sLDA-OneVsAll-test.xml b/plugins/processing/classification/test/scenarios-tests/sLDA-OneVsAll-test.xml index 3607d6dcccf5cf3bcf887391faf2fb9fbe451cd4..bf87f011039c89db8a310c36a8010553cc7029c3 100644 --- a/plugins/processing/classification/test/scenarios-tests/sLDA-OneVsAll-test.xml +++ b/plugins/processing/classification/test/scenarios-tests/sLDA-OneVsAll-test.xml @@ -1,7 +1,7 @@ <OpenViBE-Scenario> <FormatVersion>2</FormatVersion> <Creator>OpenViBE Designer</Creator> - <CreatorVersion>3.2.0</CreatorVersion> + <CreatorVersion>3.6.0</CreatorVersion> <Settings> <Setting> <Identifier>(0x00425137, 0xf2a30c29)</Identifier> @@ -367,6 +367,159 @@ </Attribute> </Attributes> </Box> + <Box> + <Identifier>(0x000058ab, 0x000075df)</Identifier> + <Name>Classifier trainer</Name> + <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Stimulations</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 1</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 2</Name> + </Input> + <Input> + <Identifier>(0xba230fd4, 0x094eb666)</Identifier> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 3</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Train-completed Flag</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Train trigger</Name> + <DefaultValue>OVTK_StimulationId_Train</DefaultValue> + <Value>OVTK_StimulationId_ExperimentStop</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> + <Name>Filename to save configuration to</Name> + <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> + <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> + <Name>Multiclass strategy to apply</Name> + <DefaultValue>Native</DefaultValue> + <Value>OneVsAll</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 1 label</Name> + <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> + <Value>OVTK_StimulationId_Label_01</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 2 label</Name> + <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> + <Value>OVTK_StimulationId_Label_02</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 3 label</Name> + <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> + <Value>OVTK_StimulationId_Label_03</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> + <Name>Algorithm to use</Name> + <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> + <Value>Linear Discrimimant Analysis (LDA)</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Number of partitions for k-fold cross-validation test</Name> + <DefaultValue>10</DefaultValue> + <Value>10</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Use shrinkage</Name> + <DefaultValue>false</DefaultValue> + <Value>true</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Shrinkage coefficient (-1 == auto)</Name> + <DefaultValue>-1.000000</DefaultValue> + <Value>-1.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Shrinkage: Force diagonal cov (DDA)</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Randomize k-fold cross-validation test data</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Balance classes</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>448</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>1328</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0xac393893, 0x25854082)</Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>7</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>3</Value> + </Attribute> + <Attribute> + <Identifier>(0xfba64161, 0x65304e21)</Identifier> + <Value></Value> + </Attribute> + </Attributes> + </Box> <Box> <Identifier>(0x0000646c, 0x000059a1)</Identifier> <Name>Signal Power Log</Name> @@ -1083,159 +1236,6 @@ </Attribute> </Attributes> </Box> - <Box> - <Identifier>(0x56fbfd1a, 0x2c474c9e)</Identifier> - <Name>Classifier trainer</Name> - <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> - <Inputs> - <Input> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Stimulations</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 1</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 2</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 3</Name> - </Input> - </Inputs> - <Outputs> - <Output> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Train-completed Flag</Name> - </Output> - </Outputs> - <Settings> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Train trigger</Name> - <DefaultValue>OVTK_StimulationId_Train</DefaultValue> - <Value>OVTK_StimulationId_ExperimentStop</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> - <Name>Filename to save configuration to</Name> - <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> - <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> - <Name>Multiclass strategy to apply</Name> - <DefaultValue>Native</DefaultValue> - <Value>OneVsAll</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 1 label</Name> - <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> - <Value>OVTK_StimulationId_Label_01</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 2 label</Name> - <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> - <Value>OVTK_StimulationId_Label_02</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 3 label</Name> - <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> - <Value>OVTK_StimulationId_Label_03</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> - <Name>Algorithm to use</Name> - <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> - <Value>Linear Discrimimant Analysis (LDA)</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Use shrinkage</Name> - <DefaultValue>false</DefaultValue> - <Value>true</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Shrinkage coefficient (-1 == auto)</Name> - <DefaultValue>-1.000000</DefaultValue> - <Value>-1</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Shrinkage: Force diagonal cov (DDA)</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of partitions for k-fold cross-validation test</Name> - <DefaultValue>10</DefaultValue> - <Value>10</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Balance classes</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - </Settings> - <Attributes> - <Attribute> - <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>448</Value> - </Attribute> - <Attribute> - <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>1328</Value> - </Attribute> - <Attribute> - <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x9de21779, 0x37776c89)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier> - <Value>(0x00000000, 0x082a348e)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier> - <Value>false</Value> - </Attribute> - <Attribute> - <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> - <Value>1</Value> - </Attribute> - <Attribute> - <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>5</Value> - </Attribute> - <Attribute> - <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> - <Value>3</Value> - </Attribute> - <Attribute> - <Identifier>(0xfba64161, 0x65304e21)</Identifier> - <Value></Value> - </Attribute> - </Attributes> - </Box> <Box> <Identifier>(0x6292a294, 0x629905c2)</Identifier> <Name>Target Separator</Name> @@ -1569,16 +1569,27 @@ </Target> </Link> <Link> - <Identifier>(0x00002bf0, 0x0000520c)</Identifier> + <Identifier>(0x00003394, 0x000046aa)</Identifier> <Source> - <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> + <BoxIdentifier>(0x2a62aa62, 0x22b9aa6a)</BoxIdentifier> <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x00003798, 0x00002449)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> + <BoxOutputIndex>2</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxInputIndex>2</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x0000391f, 0x0000535d)</Identifier> <Source> @@ -1623,6 +1634,28 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x00004a54, 0x00003958)</Identifier> + <Source> + <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> + <Link> + <Identifier>(0x00004aee, 0x00002512)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> + <BoxOutputIndex>1</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00004dc4, 0x000063ae)</Identifier> <Source> @@ -1634,6 +1667,17 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x00005058, 0x00006cfa)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> + <BoxOutputIndex>3</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxInputIdentifier>(0xba230fd4, 0x094eb666)</BoxInputIdentifier> + </Target> + </Link> <Link> <Identifier>(0x00005232, 0x000054a6)</Identifier> <Source> @@ -1722,17 +1766,6 @@ <BoxInputIndex>1</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x04425bf5, 0x3335d8a7)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> - <BoxOutputIndex>3</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>3</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x0be130d9, 0x31dafc5b)</Identifier> <Source> @@ -1788,17 +1821,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x55200f87, 0x00b3c658)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> - <BoxOutputIndex>2</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>2</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x584f1915, 0x72e8000a)</Identifier> <Source> @@ -1810,28 +1832,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x72ae14cf, 0x7201ea84)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> - <BoxOutputIndex>1</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> - </Target> - </Link> - <Link> - <Identifier>(0x731aa1b4, 0x14c8e6c0)</Identifier> - <Source> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x2a62aa62, 0x22b9aa6a)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> </Links> <Comments></Comments> <Metadata> diff --git a/plugins/processing/classification/test/scenarios-tests/sLDA-OneVsOne-HT-test.xml b/plugins/processing/classification/test/scenarios-tests/sLDA-OneVsOne-HT-test.xml index 29aca4ef3601f454121594b0de415a589159ae95..75e0568b5bf94c13c3f3e69349850ed59fabe1db 100644 --- a/plugins/processing/classification/test/scenarios-tests/sLDA-OneVsOne-HT-test.xml +++ b/plugins/processing/classification/test/scenarios-tests/sLDA-OneVsOne-HT-test.xml @@ -1,7 +1,7 @@ <OpenViBE-Scenario> <FormatVersion>2</FormatVersion> <Creator>OpenViBE Designer</Creator> - <CreatorVersion>3.3.0</CreatorVersion> + <CreatorVersion>3.6.0</CreatorVersion> <Settings> <Setting> <Identifier>(0x00425137, 0xf2a30c29)</Identifier> @@ -367,6 +367,166 @@ </Attribute> </Attributes> </Box> + <Box> + <Identifier>(0x000058ab, 0x000075df)</Identifier> + <Name>Classifier trainer</Name> + <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Stimulations</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 1</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 2</Name> + </Input> + <Input> + <Identifier>(0xba230fd4, 0x094eb666)</Identifier> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 3</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Train-completed Flag</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Train trigger</Name> + <DefaultValue>OVTK_StimulationId_Train</DefaultValue> + <Value>OVTK_StimulationId_ExperimentStop</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> + <Name>Filename to save configuration to</Name> + <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> + <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> + <Name>Multiclass strategy to apply</Name> + <DefaultValue>Native</DefaultValue> + <Value>OneVsOne</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x79146976, 0xd7f01a25)</TypeIdentifier> + <Name>Pairwise Decision Strategy</Name> + <DefaultValue>PKPD</DefaultValue> + <Value>HT</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 1 label</Name> + <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> + <Value>OVTK_StimulationId_Label_01</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 2 label</Name> + <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> + <Value>OVTK_StimulationId_Label_02</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 3 label</Name> + <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> + <Value>OVTK_StimulationId_Label_03</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> + <Name>Algorithm to use</Name> + <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> + <Value>Linear Discrimimant Analysis (LDA)</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Number of partitions for k-fold cross-validation test</Name> + <DefaultValue>10</DefaultValue> + <Value>10</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Use shrinkage</Name> + <DefaultValue>false</DefaultValue> + <Value>true</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Shrinkage coefficient (-1 == auto)</Name> + <DefaultValue>-1.000000</DefaultValue> + <Value>-1.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Shrinkage: Force diagonal cov (DDA)</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Randomize k-fold cross-validation test data</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Balance classes</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>528</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>1552</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0xac393893, 0x25854082)</Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>7</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>3</Value> + </Attribute> + <Attribute> + <Identifier>(0xfba64161, 0x65304e21)</Identifier> + <Value></Value> + </Attribute> + </Attributes> + </Box> <Box> <Identifier>(0x0000646c, 0x000059a1)</Identifier> <Name>Signal Power Log</Name> @@ -1083,166 +1243,6 @@ </Attribute> </Attributes> </Box> - <Box> - <Identifier>(0x56fbfd1a, 0x2c474c9e)</Identifier> - <Name>Classifier trainer</Name> - <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> - <Inputs> - <Input> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Stimulations</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 1</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 2</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 3</Name> - </Input> - </Inputs> - <Outputs> - <Output> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Train-completed Flag</Name> - </Output> - </Outputs> - <Settings> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Train trigger</Name> - <DefaultValue>OVTK_StimulationId_Train</DefaultValue> - <Value>OVTK_StimulationId_ExperimentStop</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> - <Name>Filename to save configuration to</Name> - <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> - <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> - <Name>Multiclass strategy to apply</Name> - <DefaultValue>Native</DefaultValue> - <Value>OneVsOne</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x79146976, 0xd7f01a25)</TypeIdentifier> - <Name>Pairwise Decision Strategy</Name> - <DefaultValue>PKPD</DefaultValue> - <Value>HT</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 1 label</Name> - <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> - <Value>OVTK_StimulationId_Label_01</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 2 label</Name> - <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> - <Value>OVTK_StimulationId_Label_02</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 3 label</Name> - <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> - <Value>OVTK_StimulationId_Label_03</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> - <Name>Algorithm to use</Name> - <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> - <Value>Linear Discrimimant Analysis (LDA)</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Use shrinkage</Name> - <DefaultValue>false</DefaultValue> - <Value>true</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Shrinkage coefficient (-1 == auto)</Name> - <DefaultValue>-1.000000</DefaultValue> - <Value>-1</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Shrinkage: Force diagonal cov (DDA)</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of partitions for k-fold cross-validation test</Name> - <DefaultValue>10</DefaultValue> - <Value>10</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Balance classes</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - </Settings> - <Attributes> - <Attribute> - <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>528</Value> - </Attribute> - <Attribute> - <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>1552</Value> - </Attribute> - <Attribute> - <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x9de21779, 0x37776c89)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier> - <Value>(0x00000000, 0x082a348e)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier> - <Value>false</Value> - </Attribute> - <Attribute> - <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> - <Value>1</Value> - </Attribute> - <Attribute> - <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>5</Value> - </Attribute> - <Attribute> - <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> - <Value>3</Value> - </Attribute> - <Attribute> - <Identifier>(0xfba64161, 0x65304e21)</Identifier> - <Value></Value> - </Attribute> - </Attributes> - </Box> <Box> <Identifier>(0x6292a294, 0x629905c3)</Identifier> <Name>Target Separator</Name> @@ -1531,6 +1531,17 @@ <BoxInputIndex>1</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x00000e41, 0x00002a6b)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> + <BoxOutputIndex>1</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x000011f0, 0x00001ba1)</Identifier> <Source> @@ -1576,14 +1587,25 @@ </Target> </Link> <Link> - <Identifier>(0x000035b6, 0x000069cd)</Identifier> + <Identifier>(0x00002bcf, 0x000024fb)</Identifier> <Source> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> + <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> + <BoxOutputIndex>3</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x2a62aa62, 0x22b9aa6b)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxInputIdentifier>(0xba230fd4, 0x094eb666)</BoxInputIdentifier> + </Target> + </Link> + <Link> + <Identifier>(0x000032ea, 0x000051df)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> + <BoxOutputIndex>2</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxInputIndex>2</BoxInputIndex> </Target> </Link> <Link> @@ -1608,28 +1630,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x00003b8b, 0x00006fb9)</Identifier> - <Source> - <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> - <Link> - <Identifier>(0x00003dd9, 0x000031e9)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> - <BoxOutputIndex>2</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>2</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x00003e54, 0x000015ec)</Identifier> <Source> @@ -1652,17 +1652,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x0000473e, 0x000023cb)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> - <BoxOutputIndex>3</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>3</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x00004dc4, 0x000063ae)</Identifier> <Source> @@ -1685,17 +1674,6 @@ <BoxInputIdentifier>(0x4a942408, 0x0f60530d)</BoxInputIdentifier> </Target> </Link> - <Link> - <Identifier>(0x00005299, 0x0000422d)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfe)</BoxIdentifier> - <BoxOutputIndex>1</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x000056a2, 0x00005ae5)</Identifier> <Source> @@ -1729,6 +1707,28 @@ <BoxInputIdentifier>(0x4a942408, 0x0f60530d)</BoxInputIdentifier> </Target> </Link> + <Link> + <Identifier>(0x00006072, 0x0000071c)</Identifier> + <Source> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x2a62aa62, 0x22b9aa6b)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> + <Link> + <Identifier>(0x000061c1, 0x0000319d)</Identifier> + <Source> + <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x0000641e, 0x00005527)</Identifier> <Source> diff --git a/plugins/processing/classification/test/scenarios-tests/sLDA-OneVsOne-PKPD-test.xml b/plugins/processing/classification/test/scenarios-tests/sLDA-OneVsOne-PKPD-test.xml index 0f3307c0c9cc8534c0f46619f4d0097e4e6ede41..7589aa9d9f59e94ff99dae9be7c2ac43810a4764 100644 --- a/plugins/processing/classification/test/scenarios-tests/sLDA-OneVsOne-PKPD-test.xml +++ b/plugins/processing/classification/test/scenarios-tests/sLDA-OneVsOne-PKPD-test.xml @@ -1,7 +1,7 @@ <OpenViBE-Scenario> <FormatVersion>2</FormatVersion> <Creator>OpenViBE Designer</Creator> - <CreatorVersion>3.2.0</CreatorVersion> + <CreatorVersion>3.6.0</CreatorVersion> <Settings> <Setting> <Identifier>(0x00425137, 0xf2a30c29)</Identifier> @@ -367,6 +367,166 @@ </Attribute> </Attributes> </Box> + <Box> + <Identifier>(0x000058ab, 0x000075df)</Identifier> + <Name>Classifier trainer</Name> + <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Stimulations</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 1</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 2</Name> + </Input> + <Input> + <Identifier>(0xba230fd4, 0x094eb666)</Identifier> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 3</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Train-completed Flag</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Train trigger</Name> + <DefaultValue>OVTK_StimulationId_Train</DefaultValue> + <Value>OVTK_StimulationId_ExperimentStop</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> + <Name>Filename to save configuration to</Name> + <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> + <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> + <Name>Multiclass strategy to apply</Name> + <DefaultValue>Native</DefaultValue> + <Value>OneVsOne</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x79146976, 0xd7f01a25)</TypeIdentifier> + <Name>Pairwise Decision Strategy</Name> + <DefaultValue>PKPD</DefaultValue> + <Value>PKPD</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 1 label</Name> + <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> + <Value>OVTK_StimulationId_Label_01</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 2 label</Name> + <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> + <Value>OVTK_StimulationId_Label_02</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 3 label</Name> + <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> + <Value>OVTK_StimulationId_Label_03</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> + <Name>Algorithm to use</Name> + <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> + <Value>Linear Discrimimant Analysis (LDA)</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Number of partitions for k-fold cross-validation test</Name> + <DefaultValue>10</DefaultValue> + <Value>10</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Use shrinkage</Name> + <DefaultValue>false</DefaultValue> + <Value>true</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Shrinkage coefficient (-1 == auto)</Name> + <DefaultValue>-1.000000</DefaultValue> + <Value>-1.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Shrinkage: Force diagonal cov (DDA)</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Randomize k-fold cross-validation test data</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Balance classes</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>320</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>1600</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0xac393893, 0x25854082)</Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>7</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>3</Value> + </Attribute> + <Attribute> + <Identifier>(0xfba64161, 0x65304e21)</Identifier> + <Value></Value> + </Attribute> + </Attributes> + </Box> <Box> <Identifier>(0x0000646c, 0x000059a1)</Identifier> <Name>Signal Power Log</Name> @@ -1083,166 +1243,6 @@ </Attribute> </Attributes> </Box> - <Box> - <Identifier>(0x56fbfd1a, 0x2c474c9e)</Identifier> - <Name>Classifier trainer</Name> - <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> - <Inputs> - <Input> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Stimulations</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 1</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 2</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 3</Name> - </Input> - </Inputs> - <Outputs> - <Output> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Train-completed Flag</Name> - </Output> - </Outputs> - <Settings> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Train trigger</Name> - <DefaultValue>OVTK_StimulationId_Train</DefaultValue> - <Value>OVTK_StimulationId_ExperimentStop</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> - <Name>Filename to save configuration to</Name> - <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> - <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> - <Name>Multiclass strategy to apply</Name> - <DefaultValue>Native</DefaultValue> - <Value>OneVsOne</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x79146976, 0xd7f01a25)</TypeIdentifier> - <Name>Pairwise Decision Strategy</Name> - <DefaultValue>PKPD</DefaultValue> - <Value>PKPD</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 1 label</Name> - <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> - <Value>OVTK_StimulationId_Label_01</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 2 label</Name> - <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> - <Value>OVTK_StimulationId_Label_02</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 3 label</Name> - <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> - <Value>OVTK_StimulationId_Label_03</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> - <Name>Algorithm to use</Name> - <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> - <Value>Linear Discrimimant Analysis (LDA)</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Use shrinkage</Name> - <DefaultValue>false</DefaultValue> - <Value>true</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Shrinkage coefficient (-1 == auto)</Name> - <DefaultValue>-1.000000</DefaultValue> - <Value>-1</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Shrinkage: Force diagonal cov (DDA)</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of partitions for k-fold cross-validation test</Name> - <DefaultValue>10</DefaultValue> - <Value>10</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Balance classes</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - </Settings> - <Attributes> - <Attribute> - <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>336</Value> - </Attribute> - <Attribute> - <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>1600</Value> - </Attribute> - <Attribute> - <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x9de21779, 0x37776c89)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier> - <Value>(0x00000000, 0x082a348e)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier> - <Value>false</Value> - </Attribute> - <Attribute> - <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> - <Value>1</Value> - </Attribute> - <Attribute> - <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>5</Value> - </Attribute> - <Attribute> - <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> - <Value>3</Value> - </Attribute> - <Attribute> - <Identifier>(0xfba64161, 0x65304e21)</Identifier> - <Value></Value> - </Attribute> - </Attributes> - </Box> <Box> <Identifier>(0x6292a294, 0x629905c2)</Identifier> <Name>Target Separator</Name> @@ -1576,16 +1576,27 @@ </Target> </Link> <Link> - <Identifier>(0x00002bf0, 0x0000520c)</Identifier> + <Identifier>(0x0000197b, 0x00007ca2)</Identifier> <Source> <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x000036a1, 0x00007ffe)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> + <BoxOutputIndex>3</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxInputIdentifier>(0xba230fd4, 0x094eb666)</BoxInputIdentifier> + </Target> + </Link> <Link> <Identifier>(0x0000391f, 0x0000535d)</Identifier> <Source> @@ -1597,6 +1608,17 @@ <BoxInputIdentifier>(0x4a942408, 0x0f60530d)</BoxInputIdentifier> </Target> </Link> + <Link> + <Identifier>(0x00003abc, 0x00001503)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> + <BoxOutputIndex>2</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxInputIndex>2</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00003b0c, 0x00004fa5)</Identifier> <Source> @@ -1630,6 +1652,17 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x00004d8f, 0x00007975)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> + <BoxOutputIndex>1</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00004dc4, 0x000063ae)</Identifier> <Source> @@ -1730,14 +1763,14 @@ </Target> </Link> <Link> - <Identifier>(0x04425bf5, 0x3335d8a7)</Identifier> + <Identifier>(0x00006fd9, 0x00005d27)</Identifier> <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> - <BoxOutputIndex>3</BoxOutputIndex> + <BoxIdentifier>(0x000058ab, 0x000075df)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>3</BoxInputIndex> + <BoxIdentifier>(0x2a62aa62, 0x22b9aa6a)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> </Target> </Link> <Link> @@ -1795,17 +1828,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x55200f87, 0x00b3c658)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> - <BoxOutputIndex>2</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>2</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x584f1915, 0x72e8000a)</Identifier> <Source> @@ -1817,28 +1839,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x72ae14cf, 0x7201ea84)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> - <BoxOutputIndex>1</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> - </Target> - </Link> - <Link> - <Identifier>(0x731aa1b4, 0x14c8e6c0)</Identifier> - <Source> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x2a62aa62, 0x22b9aa6a)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> </Links> <Comments></Comments> <Metadata> diff --git a/plugins/processing/classification/test/scenarios-tests/sLDA-OneVsOne-Voting-test.xml b/plugins/processing/classification/test/scenarios-tests/sLDA-OneVsOne-Voting-test.xml index d4eb6e8425983b694d48551d1a3e89a6c6702dee..81104ae96d8a8239ce3eba09a0432a20896494e4 100644 --- a/plugins/processing/classification/test/scenarios-tests/sLDA-OneVsOne-Voting-test.xml +++ b/plugins/processing/classification/test/scenarios-tests/sLDA-OneVsOne-Voting-test.xml @@ -1,7 +1,7 @@ <OpenViBE-Scenario> <FormatVersion>2</FormatVersion> <Creator>OpenViBE Designer</Creator> - <CreatorVersion>3.2.0</CreatorVersion> + <CreatorVersion>3.6.0</CreatorVersion> <Settings> <Setting> <Identifier>(0x00425137, 0xf2a30c29)</Identifier> @@ -257,6 +257,166 @@ </Attribute> </Attributes> </Box> + <Box> + <Identifier>(0x000039c9, 0x00000a2d)</Identifier> + <Name>Classifier trainer</Name> + <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Stimulations</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 1</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 2</Name> + </Input> + <Input> + <Identifier>(0x0803a499, 0xb7003aec)</Identifier> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 3</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Train-completed Flag</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Train trigger</Name> + <DefaultValue>OVTK_StimulationId_Train</DefaultValue> + <Value>OVTK_StimulationId_ExperimentStop</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> + <Name>Filename to save configuration to</Name> + <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> + <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> + <Name>Multiclass strategy to apply</Name> + <DefaultValue>Native</DefaultValue> + <Value>OneVsOne</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x79146976, 0xd7f01a25)</TypeIdentifier> + <Name>Pairwise Decision Strategy</Name> + <DefaultValue>PKPD</DefaultValue> + <Value>Voting</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 1 label</Name> + <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> + <Value>OVTK_StimulationId_Label_01</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 2 label</Name> + <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> + <Value>OVTK_StimulationId_Label_02</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 3 label</Name> + <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> + <Value>OVTK_StimulationId_Label_03</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> + <Name>Algorithm to use</Name> + <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> + <Value>Linear Discrimimant Analysis (LDA)</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Number of partitions for k-fold cross-validation test</Name> + <DefaultValue>10</DefaultValue> + <Value>10</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Use shrinkage</Name> + <DefaultValue>false</DefaultValue> + <Value>true</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Shrinkage coefficient (-1 == auto)</Name> + <DefaultValue>-1.000000</DefaultValue> + <Value>-1.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Shrinkage: Force diagonal cov (DDA)</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Randomize k-fold cross-validation test data</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Balance classes</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>368</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>1360</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0xac393893, 0x25854082)</Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>7</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>3</Value> + </Attribute> + <Attribute> + <Identifier>(0xfba64161, 0x65304e21)</Identifier> + <Value></Value> + </Attribute> + </Attributes> + </Box> <Box> <Identifier>(0x000041d8, 0x000004c6)</Identifier> <Name>Identity</Name> @@ -1083,166 +1243,6 @@ </Attribute> </Attributes> </Box> - <Box> - <Identifier>(0x56fbfd1a, 0x2c474c9e)</Identifier> - <Name>Classifier trainer</Name> - <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> - <Inputs> - <Input> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Stimulations</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 1</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 2</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 3</Name> - </Input> - </Inputs> - <Outputs> - <Output> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Train-completed Flag</Name> - </Output> - </Outputs> - <Settings> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Train trigger</Name> - <DefaultValue>OVTK_StimulationId_Train</DefaultValue> - <Value>OVTK_StimulationId_ExperimentStop</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> - <Name>Filename to save configuration to</Name> - <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> - <Value>${Player_ScenarioDirectory}/$var{Test Name}-output.xml</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> - <Name>Multiclass strategy to apply</Name> - <DefaultValue>Native</DefaultValue> - <Value>OneVsOne</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x79146976, 0xd7f01a25)</TypeIdentifier> - <Name>Pairwise Decision Strategy</Name> - <DefaultValue>PKPD</DefaultValue> - <Value>Voting</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 1 label</Name> - <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> - <Value>OVTK_StimulationId_Label_01</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 2 label</Name> - <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> - <Value>OVTK_StimulationId_Label_02</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 3 label</Name> - <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> - <Value>OVTK_StimulationId_Label_03</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> - <Name>Algorithm to use</Name> - <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> - <Value>Linear Discrimimant Analysis (LDA)</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Use shrinkage</Name> - <DefaultValue>false</DefaultValue> - <Value>true</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Shrinkage coefficient (-1 == auto)</Name> - <DefaultValue>-1.000000</DefaultValue> - <Value>-1</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Shrinkage: Force diagonal cov (DDA)</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of partitions for k-fold cross-validation test</Name> - <DefaultValue>10</DefaultValue> - <Value>10</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Balance classes</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - </Settings> - <Attributes> - <Attribute> - <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>368</Value> - </Attribute> - <Attribute> - <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>1360</Value> - </Attribute> - <Attribute> - <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x9de21779, 0x37776c89)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier> - <Value>(0x00000000, 0x082a348e)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier> - <Value>false</Value> - </Attribute> - <Attribute> - <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> - <Value>1</Value> - </Attribute> - <Attribute> - <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>5</Value> - </Attribute> - <Attribute> - <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> - <Value>3</Value> - </Attribute> - <Attribute> - <Identifier>(0xfba64161, 0x65304e21)</Identifier> - <Value></Value> - </Attribute> - </Attributes> - </Box> <Box> <Identifier>(0x6292a294, 0x629905c2)</Identifier> <Name>Target Separator</Name> @@ -1542,6 +1542,17 @@ <BoxInputIndex>1</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x000011f0, 0x000066f4)</Identifier> + <Source> + <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> + <BoxOutputIndex>3</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000039c9, 0x00000a2d)</BoxIdentifier> + <BoxInputIdentifier>(0x0803a499, 0xb7003aec)</BoxInputIdentifier> + </Target> + </Link> <Link> <Identifier>(0x000017f0, 0x00001a31)</Identifier> <Source> @@ -1576,14 +1587,14 @@ </Target> </Link> <Link> - <Identifier>(0x00002bf0, 0x0000520c)</Identifier> + <Identifier>(0x00002332, 0x00001735)</Identifier> <Source> - <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> + <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> + <BoxOutputIndex>1</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> + <BoxIdentifier>(0x000039c9, 0x00000a2d)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> </Target> </Link> <Link> @@ -1597,6 +1608,17 @@ <BoxInputIdentifier>(0x4a942408, 0x0f60530d)</BoxInputIdentifier> </Target> </Link> + <Link> + <Identifier>(0x00003a4b, 0x00006a0c)</Identifier> + <Source> + <BoxIdentifier>(0x000039c9, 0x00000a2d)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x2a62aa62, 0x22b9aa6a)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00003b0c, 0x00004fa5)</Identifier> <Source> @@ -1730,14 +1752,25 @@ </Target> </Link> <Link> - <Identifier>(0x04425bf5, 0x3335d8a7)</Identifier> + <Identifier>(0x00006a3a, 0x00001118)</Identifier> + <Source> + <BoxIdentifier>(0x000041d8, 0x000004c7)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000039c9, 0x00000a2d)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> + <Link> + <Identifier>(0x00006c7f, 0x00007616)</Identifier> <Source> <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> - <BoxOutputIndex>3</BoxOutputIndex> + <BoxOutputIndex>2</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>3</BoxInputIndex> + <BoxIdentifier>(0x000039c9, 0x00000a2d)</BoxIdentifier> + <BoxInputIndex>2</BoxInputIndex> </Target> </Link> <Link> @@ -1795,17 +1828,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x55200f87, 0x00b3c658)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> - <BoxOutputIndex>2</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>2</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x584f1915, 0x72e8000a)</Identifier> <Source> @@ -1817,28 +1839,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x72ae14cf, 0x7201ea84)</Identifier> - <Source> - <BoxIdentifier>(0x68c7947c, 0x0be24bfd)</BoxIdentifier> - <BoxOutputIndex>1</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> - </Target> - </Link> - <Link> - <Identifier>(0x731aa1b4, 0x14c8e6c0)</Identifier> - <Source> - <BoxIdentifier>(0x56fbfd1a, 0x2c474c9e)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x2a62aa62, 0x22b9aa6a)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> </Links> <Comments></Comments> <Metadata> diff --git a/plugins/processing/classification/test/shrinkageLDA/shrinkage_lda.xml b/plugins/processing/classification/test/shrinkageLDA/shrinkage_lda.xml index e151464a80bc4dc555bc76b84d3958e3b7a7abd0..68ce8a6cf1548b3dfbe013c41083af0a97a0df51 100644 --- a/plugins/processing/classification/test/shrinkageLDA/shrinkage_lda.xml +++ b/plugins/processing/classification/test/shrinkageLDA/shrinkage_lda.xml @@ -1,153 +1,11 @@ <OpenViBE-Scenario> <FormatVersion>2</FormatVersion> <Creator>OpenViBE Designer</Creator> - <CreatorVersion>3.2.0</CreatorVersion> + <CreatorVersion>3.5.0</CreatorVersion> <Settings></Settings> <Inputs></Inputs> <Outputs></Outputs> <Boxes> - <Box> - <Identifier>(0x00000b25, 0x0000761b)</Identifier> - <Name>LDA</Name> - <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> - <Inputs> - <Input> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Stimulations</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 1</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 2</Name> - </Input> - </Inputs> - <Outputs> - <Output> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Train-completed Flag</Name> - </Output> - </Outputs> - <Settings> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Train trigger</Name> - <DefaultValue>OVTK_StimulationId_Train</DefaultValue> - <Value>OVTK_StimulationId_TrainCompleted</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> - <Name>Filename to save configuration to</Name> - <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> - <Value>${Player_ScenarioDirectory}/alg2.cfg</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> - <Name>Multiclass strategy to apply</Name> - <DefaultValue>Native</DefaultValue> - <Value>Native</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 1 label</Name> - <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> - <Value>OVTK_StimulationId_Label_01</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 2 label</Name> - <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> - <Value>OVTK_StimulationId_Label_02</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> - <Name>Algorithm to use</Name> - <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> - <Value>Linear Discrimimant Analysis (LDA)</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Use shrinkage</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Shrinkage coefficient (-1 == auto)</Name> - <DefaultValue>-1.000000</DefaultValue> - <Value>-1</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Shrinkage: Force diagonal cov (DDA)</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of partitions for k-fold cross-validation test</Name> - <DefaultValue>10</DefaultValue> - <Value>10</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Balance classes</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - </Settings> - <Attributes> - <Attribute> - <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>560</Value> - </Attribute> - <Attribute> - <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>752</Value> - </Attribute> - <Attribute> - <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x9de21779, 0x37776c89)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier> - <Value>(0x00000000, 0x0042c801)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier> - <Value>false</Value> - </Attribute> - <Attribute> - <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> - <Value>1</Value> - </Attribute> - <Attribute> - <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>6</Value> - </Attribute> - <Attribute> - <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> - <Value>3</Value> - </Attribute> - <Attribute> - <Identifier>(0xfba64161, 0x65304e21)</Identifier> - <Value></Value> - </Attribute> - </Attributes> - </Box> <Box> <Identifier>(0x0000267d, 0x0000641e)</Identifier> <Name>EBML stream spy 2</Name> @@ -277,8 +135,8 @@ </Attributes> </Box> <Box> - <Identifier>(0x000037a9, 0x00003831)</Identifier> - <Name>Shrinkage LDA</Name> + <Identifier>(0x00002cdd, 0x00005e19)</Identifier> + <Name>LDA</Name> <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> <Inputs> <Input> @@ -305,14 +163,14 @@ <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> <Name>Train trigger</Name> <DefaultValue>OVTK_StimulationId_Train</DefaultValue> - <Value>OVTK_StimulationId_Train</Value> + <Value>OVTK_StimulationId_TrainCompleted</Value> <Modifiability>false</Modifiability> </Setting> <Setting> <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> <Name>Filename to save configuration to</Name> <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> - <Value>${Player_ScenarioDirectory}/alg1.cfg</Value> + <Value>${Player_ScenarioDirectory}/alg2.cfg</Value> <Modifiability>false</Modifiability> </Setting> <Setting> @@ -343,18 +201,25 @@ <Value>Linear Discrimimant Analysis (LDA)</Value> <Modifiability>false</Modifiability> </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Number of partitions for k-fold cross-validation test</Name> + <DefaultValue>10</DefaultValue> + <Value>10</Value> + <Modifiability>false</Modifiability> + </Setting> <Setting> <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> <Name>Use shrinkage</Name> <DefaultValue>false</DefaultValue> - <Value>true</Value> + <Value>false</Value> <Modifiability>false</Modifiability> </Setting> <Setting> <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> <Name>Shrinkage coefficient (-1 == auto)</Name> <DefaultValue>-1.000000</DefaultValue> - <Value>-1</Value> + <Value>-1.000000</Value> <Modifiability>false</Modifiability> </Setting> <Setting> @@ -365,10 +230,10 @@ <Modifiability>false</Modifiability> </Setting> <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of partitions for k-fold cross-validation test</Name> - <DefaultValue>10</DefaultValue> - <Value>10</Value> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Randomize k-fold cross-validation test data</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> <Modifiability>false</Modifiability> </Setting> <Setting> @@ -382,23 +247,15 @@ <Attributes> <Attribute> <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>480</Value> + <Value>560</Value> </Attribute> <Attribute> <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>624</Value> + <Value>720</Value> </Attribute> <Attribute> <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x9de21779, 0x37776c89)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier> - <Value>(0x00000000, 0x00451330)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier> - <Value>false</Value> + <Value>(0xac393893, 0x25854082)</Value> </Attribute> <Attribute> <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> @@ -406,7 +263,7 @@ </Attribute> <Attribute> <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>6</Value> + <Value>7</Value> </Attribute> <Attribute> <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> @@ -518,6 +375,147 @@ </Attribute> </Attributes> </Box> + <Box> + <Identifier>(0x000043b3, 0x00001ac9)</Identifier> + <Name>Shrinkage LDA</Name> + <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Stimulations</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 1</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 2</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Train-completed Flag</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Train trigger</Name> + <DefaultValue>OVTK_StimulationId_Train</DefaultValue> + <Value>OVTK_StimulationId_Train</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> + <Name>Filename to save configuration to</Name> + <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> + <Value>${Player_ScenarioDirectory}/alg1.cfg</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> + <Name>Multiclass strategy to apply</Name> + <DefaultValue>Native</DefaultValue> + <Value>Native</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 1 label</Name> + <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> + <Value>OVTK_StimulationId_Label_01</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 2 label</Name> + <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> + <Value>OVTK_StimulationId_Label_02</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> + <Name>Algorithm to use</Name> + <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> + <Value>Linear Discrimimant Analysis (LDA)</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Number of partitions for k-fold cross-validation test</Name> + <DefaultValue>10</DefaultValue> + <Value>10</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Use shrinkage</Name> + <DefaultValue>false</DefaultValue> + <Value>true</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Shrinkage coefficient (-1 == auto)</Name> + <DefaultValue>-1.000000</DefaultValue> + <Value>-1.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Shrinkage: Force diagonal cov (DDA)</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Randomize k-fold cross-validation test data</Name> + <DefaultValue>false</DefaultValue> + <Value>true</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Balance classes</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>480</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>624</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0xac393893, 0x25854082)</Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>7</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>3</Value> + </Attribute> + <Attribute> + <Identifier>(0xfba64161, 0x65304e21)</Identifier> + <Value></Value> + </Attribute> + </Attributes> + </Box> <Box> <Identifier>(0x0000462c, 0x00005b2f)</Identifier> <Name>EBML stream spy 1</Name> @@ -844,25 +842,25 @@ </Target> </Link> <Link> - <Identifier>(0x00001495, 0x00005100)</Identifier> + <Identifier>(0x000003a9, 0x00006a0c)</Identifier> <Source> - <BoxIdentifier>(0x000037a9, 0x00003831)</BoxIdentifier> + <BoxIdentifier>(0x00004dd3, 0x00000d20)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x00007e01, 0x000060bf)</BoxIdentifier> + <BoxIdentifier>(0x000043b3, 0x00001ac9)</BoxIdentifier> <BoxInputIndex>0</BoxInputIndex> </Target> </Link> <Link> - <Identifier>(0x000022c7, 0x00005fc3)</Identifier> + <Identifier>(0x0000196a, 0x0000775c)</Identifier> <Source> - <BoxIdentifier>(0x00000b25, 0x0000761b)</BoxIdentifier> + <BoxIdentifier>(0x000043b3, 0x00001ac9)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x00007e01, 0x000060bf)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> + <BoxIdentifier>(0x00002cdd, 0x00005e19)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> </Target> </Link> <Link> @@ -877,113 +875,113 @@ </Target> </Link> <Link> - <Identifier>(0x00002571, 0x000033ba)</Identifier> + <Identifier>(0x00002d5a, 0x00004a07)</Identifier> <Source> - <BoxIdentifier>(0x00004898, 0x0000252c)</BoxIdentifier> + <BoxIdentifier>(0x00003e59, 0x00005a5c)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x000037a9, 0x00003831)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> + <BoxIdentifier>(0x0000462c, 0x00005b2f)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> </Target> </Link> <Link> - <Identifier>(0x00002d2a, 0x00002869)</Identifier> + <Identifier>(0x000040b5, 0x00003ea5)</Identifier> <Source> - <BoxIdentifier>(0x00005815, 0x00002519)</BoxIdentifier> + <BoxIdentifier>(0x00007e01, 0x000060bf)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x000037a9, 0x00003831)</BoxIdentifier> - <BoxInputIndex>2</BoxInputIndex> + <BoxIdentifier>(0x00002bd8, 0x00003d85)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> </Target> </Link> <Link> - <Identifier>(0x00002d5a, 0x00004a07)</Identifier> + <Identifier>(0x00004cea, 0x00000673)</Identifier> <Source> - <BoxIdentifier>(0x00003e59, 0x00005a5c)</BoxIdentifier> + <BoxIdentifier>(0x00004898, 0x0000252c)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x0000462c, 0x00005b2f)</BoxIdentifier> + <BoxIdentifier>(0x0000267d, 0x0000641e)</BoxIdentifier> <BoxInputIndex>0</BoxInputIndex> </Target> </Link> <Link> - <Identifier>(0x000040b5, 0x00003ea5)</Identifier> + <Identifier>(0x000061d1, 0x000027f2)</Identifier> <Source> - <BoxIdentifier>(0x00007e01, 0x000060bf)</BoxIdentifier> + <BoxIdentifier>(0x00005815, 0x00002519)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x00002bd8, 0x00003d85)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> + <BoxIdentifier>(0x000043b3, 0x00001ac9)</BoxIdentifier> + <BoxInputIndex>2</BoxInputIndex> </Target> </Link> <Link> - <Identifier>(0x000042ab, 0x000047db)</Identifier> + <Identifier>(0x0000631f, 0x000004cb)</Identifier> <Source> - <BoxIdentifier>(0x00004dd3, 0x00000d20)</BoxIdentifier> + <BoxIdentifier>(0x000043b3, 0x00001ac9)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x000037a9, 0x00003831)</BoxIdentifier> + <BoxIdentifier>(0x00007e01, 0x000060bf)</BoxIdentifier> <BoxInputIndex>0</BoxInputIndex> </Target> </Link> <Link> - <Identifier>(0x00004cea, 0x00000673)</Identifier> + <Identifier>(0x00006340, 0x00005429)</Identifier> <Source> - <BoxIdentifier>(0x00004898, 0x0000252c)</BoxIdentifier> + <BoxIdentifier>(0x00003e59, 0x00005a5d)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x0000267d, 0x0000641e)</BoxIdentifier> + <BoxIdentifier>(0x00005815, 0x00002519)</BoxIdentifier> <BoxInputIndex>0</BoxInputIndex> </Target> </Link> <Link> - <Identifier>(0x00004da0, 0x00003510)</Identifier> + <Identifier>(0x0000786b, 0x00000348)</Identifier> <Source> - <BoxIdentifier>(0x00004898, 0x0000252c)</BoxIdentifier> + <BoxIdentifier>(0x00005815, 0x00002519)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x00000b25, 0x0000761b)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> + <BoxIdentifier>(0x00002cdd, 0x00005e19)</BoxIdentifier> + <BoxInputIndex>2</BoxInputIndex> </Target> </Link> <Link> - <Identifier>(0x00004e00, 0x00001fdf)</Identifier> + <Identifier>(0x00007951, 0x000041c2)</Identifier> <Source> - <BoxIdentifier>(0x00005815, 0x00002519)</BoxIdentifier> + <BoxIdentifier>(0x00004898, 0x0000252c)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x00000b25, 0x0000761b)</BoxIdentifier> - <BoxInputIndex>2</BoxInputIndex> + <BoxIdentifier>(0x000043b3, 0x00001ac9)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> </Target> </Link> <Link> - <Identifier>(0x00006340, 0x00005429)</Identifier> + <Identifier>(0x00007a7f, 0x00004ff3)</Identifier> <Source> - <BoxIdentifier>(0x00003e59, 0x00005a5d)</BoxIdentifier> + <BoxIdentifier>(0x00004898, 0x0000252c)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x00005815, 0x00002519)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> + <BoxIdentifier>(0x00002cdd, 0x00005e19)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> </Target> </Link> <Link> - <Identifier>(0x7db092d7, 0x1ef537ae)</Identifier> + <Identifier>(0x00007f97, 0x00005710)</Identifier> <Source> - <BoxIdentifier>(0x000037a9, 0x00003831)</BoxIdentifier> + <BoxIdentifier>(0x00002cdd, 0x00005e19)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x00000b25, 0x0000761b)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> + <BoxIdentifier>(0x00007e01, 0x000060bf)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> </Target> </Link> </Links> diff --git a/plugins/processing/classification/test/shrinkageLDA/shrinkage_lda_rot.xml b/plugins/processing/classification/test/shrinkageLDA/shrinkage_lda_rot.xml index a968d9badde01832f2dcac87d4eab3ec0aa4c225..260bc6c683e729a8dbbdf86c21dc18df85c7484c 100644 --- a/plugins/processing/classification/test/shrinkageLDA/shrinkage_lda_rot.xml +++ b/plugins/processing/classification/test/shrinkageLDA/shrinkage_lda_rot.xml @@ -1,153 +1,11 @@ <OpenViBE-Scenario> <FormatVersion>2</FormatVersion> <Creator>OpenViBE Designer</Creator> - <CreatorVersion>3.2.0</CreatorVersion> + <CreatorVersion>3.5.0</CreatorVersion> <Settings></Settings> <Inputs></Inputs> <Outputs></Outputs> <Boxes> - <Box> - <Identifier>(0x00000b25, 0x0000761b)</Identifier> - <Name>LDA</Name> - <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> - <Inputs> - <Input> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Stimulations</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 1</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 2</Name> - </Input> - </Inputs> - <Outputs> - <Output> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Train-completed Flag</Name> - </Output> - </Outputs> - <Settings> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Train trigger</Name> - <DefaultValue>OVTK_StimulationId_Train</DefaultValue> - <Value>OVTK_StimulationId_TrainCompleted</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> - <Name>Filename to save configuration to</Name> - <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> - <Value>${Player_ScenarioDirectory}/alg2.cfg</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> - <Name>Multiclass strategy to apply</Name> - <DefaultValue>Native</DefaultValue> - <Value>Native</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 1 label</Name> - <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> - <Value>OVTK_StimulationId_Label_01</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 2 label</Name> - <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> - <Value>OVTK_StimulationId_Label_02</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> - <Name>Algorithm to use</Name> - <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> - <Value>Linear Discrimimant Analysis (LDA)</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Use shrinkage</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Shrinkage coefficient (-1 == auto)</Name> - <DefaultValue>-1.000000</DefaultValue> - <Value>-1</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Shrinkage: Force diagonal cov (DDA)</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of partitions for k-fold cross-validation test</Name> - <DefaultValue>10</DefaultValue> - <Value>10</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Balance classes</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - </Settings> - <Attributes> - <Attribute> - <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>592</Value> - </Attribute> - <Attribute> - <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>784</Value> - </Attribute> - <Attribute> - <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x9de21779, 0x37776c89)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier> - <Value>(0x00000000, 0x0049667c)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier> - <Value>false</Value> - </Attribute> - <Attribute> - <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> - <Value>1</Value> - </Attribute> - <Attribute> - <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>6</Value> - </Attribute> - <Attribute> - <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> - <Value>3</Value> - </Attribute> - <Attribute> - <Identifier>(0xfba64161, 0x65304e21)</Identifier> - <Value></Value> - </Attribute> - </Attributes> - </Box> <Box> <Identifier>(0x0000267d, 0x0000641e)</Identifier> <Name>EBML stream spy 2</Name> @@ -277,8 +135,8 @@ </Attributes> </Box> <Box> - <Identifier>(0x000037a9, 0x00003831)</Identifier> - <Name>Shrinkage LDA</Name> + <Identifier>(0x00002cdd, 0x00005e19)</Identifier> + <Name>LDA</Name> <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> <Inputs> <Input> @@ -305,14 +163,14 @@ <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> <Name>Train trigger</Name> <DefaultValue>OVTK_StimulationId_Train</DefaultValue> - <Value>OVTK_StimulationId_Train</Value> + <Value>OVTK_StimulationId_TrainCompleted</Value> <Modifiability>false</Modifiability> </Setting> <Setting> <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> <Name>Filename to save configuration to</Name> <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> - <Value>${Player_ScenarioDirectory}/alg1.cfg</Value> + <Value>${Player_ScenarioDirectory}/alg2.cfg</Value> <Modifiability>false</Modifiability> </Setting> <Setting> @@ -343,18 +201,25 @@ <Value>Linear Discrimimant Analysis (LDA)</Value> <Modifiability>false</Modifiability> </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Number of partitions for k-fold cross-validation test</Name> + <DefaultValue>10</DefaultValue> + <Value>10</Value> + <Modifiability>false</Modifiability> + </Setting> <Setting> <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> <Name>Use shrinkage</Name> <DefaultValue>false</DefaultValue> - <Value>true</Value> + <Value>false</Value> <Modifiability>false</Modifiability> </Setting> <Setting> <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> <Name>Shrinkage coefficient (-1 == auto)</Name> <DefaultValue>-1.000000</DefaultValue> - <Value>-1</Value> + <Value>-1.000000</Value> <Modifiability>false</Modifiability> </Setting> <Setting> @@ -365,10 +230,10 @@ <Modifiability>false</Modifiability> </Setting> <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of partitions for k-fold cross-validation test</Name> - <DefaultValue>10</DefaultValue> - <Value>10</Value> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Randomize k-fold cross-validation test data</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> <Modifiability>false</Modifiability> </Setting> <Setting> @@ -382,23 +247,15 @@ <Attributes> <Attribute> <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>512</Value> + <Value>592</Value> </Attribute> <Attribute> <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>656</Value> + <Value>800</Value> </Attribute> <Attribute> <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x9de21779, 0x37776c89)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier> - <Value>(0x00000000, 0x0052e731)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier> - <Value>false</Value> + <Value>(0xac393893, 0x25854082)</Value> </Attribute> <Attribute> <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> @@ -406,7 +263,7 @@ </Attribute> <Attribute> <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>6</Value> + <Value>7</Value> </Attribute> <Attribute> <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> @@ -518,6 +375,147 @@ </Attribute> </Attributes> </Box> + <Box> + <Identifier>(0x000043b3, 0x00001ac9)</Identifier> + <Name>Shrinkage LDA</Name> + <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Stimulations</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 1</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 2</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Train-completed Flag</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Train trigger</Name> + <DefaultValue>OVTK_StimulationId_Train</DefaultValue> + <Value>OVTK_StimulationId_Train</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> + <Name>Filename to save configuration to</Name> + <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> + <Value>${Player_ScenarioDirectory}/alg1.cfg</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> + <Name>Multiclass strategy to apply</Name> + <DefaultValue>Native</DefaultValue> + <Value>Native</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 1 label</Name> + <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> + <Value>OVTK_StimulationId_Label_01</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 2 label</Name> + <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> + <Value>OVTK_StimulationId_Label_02</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> + <Name>Algorithm to use</Name> + <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> + <Value>Linear Discrimimant Analysis (LDA)</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Number of partitions for k-fold cross-validation test</Name> + <DefaultValue>10</DefaultValue> + <Value>10</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Use shrinkage</Name> + <DefaultValue>false</DefaultValue> + <Value>true</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Shrinkage coefficient (-1 == auto)</Name> + <DefaultValue>-1.000000</DefaultValue> + <Value>-1.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Shrinkage: Force diagonal cov (DDA)</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Randomize k-fold cross-validation test data</Name> + <DefaultValue>false</DefaultValue> + <Value>true</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Balance classes</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>512</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>656</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0xac393893, 0x25854082)</Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>7</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>3</Value> + </Attribute> + <Attribute> + <Identifier>(0xfba64161, 0x65304e21)</Identifier> + <Value></Value> + </Attribute> + </Attributes> + </Box> <Box> <Identifier>(0x0000462c, 0x00005b2f)</Identifier> <Name>EBML stream spy 1</Name> @@ -833,57 +831,68 @@ </Boxes> <Links> <Link> - <Identifier>(0x00001495, 0x00005100)</Identifier> + <Identifier>(0x0000079a, 0x000071c9)</Identifier> <Source> - <BoxIdentifier>(0x000037a9, 0x00003831)</BoxIdentifier> + <BoxIdentifier>(0x00005815, 0x00002519)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x00007e01, 0x000060bf)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> + <BoxIdentifier>(0x000043b3, 0x00001ac9)</BoxIdentifier> + <BoxInputIndex>2</BoxInputIndex> </Target> </Link> <Link> - <Identifier>(0x000022c7, 0x00005fc3)</Identifier> + <Identifier>(0x00000b30, 0x00000f1c)</Identifier> <Source> - <BoxIdentifier>(0x00000b25, 0x0000761b)</BoxIdentifier> + <BoxIdentifier>(0x000043b3, 0x00001ac9)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> <BoxIdentifier>(0x00007e01, 0x000060bf)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> + <BoxInputIndex>0</BoxInputIndex> </Target> </Link> <Link> - <Identifier>(0x00002571, 0x000033ba)</Identifier> + <Identifier>(0x0000290c, 0x00001408)</Identifier> <Source> - <BoxIdentifier>(0x00004898, 0x0000252c)</BoxIdentifier> + <BoxIdentifier>(0x000043b3, 0x00001ac9)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x000037a9, 0x00003831)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> + <BoxIdentifier>(0x00002cdd, 0x00005e19)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> </Target> </Link> <Link> - <Identifier>(0x00002d2a, 0x00002869)</Identifier> + <Identifier>(0x00003062, 0x0000186d)</Identifier> <Source> + <BoxIdentifier>(0x00003e59, 0x00005a5d)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> <BoxIdentifier>(0x00005815, 0x00002519)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> + <Link> + <Identifier>(0x000030e1, 0x00003f4f)</Identifier> + <Source> + <BoxIdentifier>(0x00004898, 0x0000252c)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x000037a9, 0x00003831)</BoxIdentifier> - <BoxInputIndex>2</BoxInputIndex> + <BoxIdentifier>(0x000043b3, 0x00001ac9)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> </Target> </Link> <Link> - <Identifier>(0x00003062, 0x0000186d)</Identifier> + <Identifier>(0x00003d51, 0x00006b57)</Identifier> <Source> - <BoxIdentifier>(0x00003e59, 0x00005a5d)</BoxIdentifier> + <BoxIdentifier>(0x00004dd3, 0x00000d20)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x00005815, 0x00002519)</BoxIdentifier> + <BoxIdentifier>(0x000043b3, 0x00001ac9)</BoxIdentifier> <BoxInputIndex>0</BoxInputIndex> </Target> </Link> @@ -910,60 +919,49 @@ </Target> </Link> <Link> - <Identifier>(0x000042ab, 0x000047db)</Identifier> + <Identifier>(0x00004cea, 0x00000673)</Identifier> <Source> - <BoxIdentifier>(0x00004dd3, 0x00000d20)</BoxIdentifier> + <BoxIdentifier>(0x00004898, 0x0000252c)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x000037a9, 0x00003831)</BoxIdentifier> + <BoxIdentifier>(0x0000267d, 0x0000641e)</BoxIdentifier> <BoxInputIndex>0</BoxInputIndex> </Target> </Link> <Link> - <Identifier>(0x00004cea, 0x00000673)</Identifier> + <Identifier>(0x00005f91, 0x00001708)</Identifier> <Source> - <BoxIdentifier>(0x00004898, 0x0000252c)</BoxIdentifier> + <BoxIdentifier>(0x00003e59, 0x00005a5c)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x0000267d, 0x0000641e)</BoxIdentifier> + <BoxIdentifier>(0x0000462c, 0x00005b2f)</BoxIdentifier> <BoxInputIndex>0</BoxInputIndex> </Target> </Link> <Link> - <Identifier>(0x00004da0, 0x00003510)</Identifier> + <Identifier>(0x00006059, 0x00007e25)</Identifier> <Source> <BoxIdentifier>(0x00004898, 0x0000252c)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x00000b25, 0x0000761b)</BoxIdentifier> + <BoxIdentifier>(0x00002cdd, 0x00005e19)</BoxIdentifier> <BoxInputIndex>1</BoxInputIndex> </Target> </Link> <Link> - <Identifier>(0x00004e00, 0x00001fdf)</Identifier> + <Identifier>(0x00006a23, 0x00003461)</Identifier> <Source> <BoxIdentifier>(0x00005815, 0x00002519)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x00000b25, 0x0000761b)</BoxIdentifier> + <BoxIdentifier>(0x00002cdd, 0x00005e19)</BoxIdentifier> <BoxInputIndex>2</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x00005f91, 0x00001708)</Identifier> - <Source> - <BoxIdentifier>(0x00003e59, 0x00005a5c)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x0000462c, 0x00005b2f)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x00006e92, 0x00006cc8)</Identifier> <Source> @@ -976,14 +974,14 @@ </Target> </Link> <Link> - <Identifier>(0x6c6aff83, 0x0b0821f1)</Identifier> + <Identifier>(0x00007f14, 0x00000c20)</Identifier> <Source> - <BoxIdentifier>(0x000037a9, 0x00003831)</BoxIdentifier> + <BoxIdentifier>(0x00002cdd, 0x00005e19)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x00000b25, 0x0000761b)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> + <BoxIdentifier>(0x00007e01, 0x000060bf)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> </Target> </Link> </Links> diff --git a/plugins/processing/dll-bridge/src/box-algorithms/CBoxAlgorithmDLLBridge.hpp b/plugins/processing/dll-bridge/src/box-algorithms/CBoxAlgorithmDLLBridge.hpp index 5fcbfd59b41f503f43ca1632f635bc3800078201..fefa15138a68d65ac52a0d00284575b3a2b59527 100644 --- a/plugins/processing/dll-bridge/src/box-algorithms/CBoxAlgorithmDLLBridge.hpp +++ b/plugins/processing/dll-bridge/src/box-algorithms/CBoxAlgorithmDLLBridge.hpp @@ -76,6 +76,8 @@ private: HINSTANCE m_library = nullptr; #elif defined(TARGET_OS_Linux) void* m_library = nullptr; +#elif defined(TARGET_OS_MacOS) + void* m_library = nullptr; #endif }; diff --git a/plugins/processing/evaluation/CMakeLists.txt b/plugins/processing/evaluation/CMakeLists.txt index dfce32a01516ddcae892b3813c3dd9785d9af816..637630d1e53b701fe627c15eeee18ee4fafaee7e 100755 --- a/plugins/processing/evaluation/CMakeLists.txt +++ b/plugins/processing/evaluation/CMakeLists.txt @@ -8,7 +8,9 @@ target_link_libraries(${PROJECT_NAME} openvibe-common openvibe-toolkit openvibe-visualization-toolkit - tinyxml2) + tinyxml2::tinyxml2 + gtk2 +) set_target_properties(${PROJECT_NAME} PROPERTIES VERSION ${PROJECT_VERSION} @@ -18,8 +20,7 @@ set_target_properties(${PROJECT_NAME} PROPERTIES add_definitions(-DTARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines) -# --------------------------------- -include("FindThirdPartyGTK") +file(COPY share/ DESTINATION ${BUILD_DATADIR}/plugins/evaluation) # --------------------------------- # Test applications diff --git a/plugins/processing/evaluation/src/box-algorithms/CBoxAlgorithmClassifierAccuracyMeasure.cpp b/plugins/processing/evaluation/src/box-algorithms/CBoxAlgorithmClassifierAccuracyMeasure.cpp index e8d6d42fbfc6ecc1a6441c759075706739d0367f..7e8875c8ee00f775df6840f52aa922964c18b57e 100644 --- a/plugins/processing/evaluation/src/box-algorithms/CBoxAlgorithmClassifierAccuracyMeasure.cpp +++ b/plugins/processing/evaluation/src/box-algorithms/CBoxAlgorithmClassifierAccuracyMeasure.cpp @@ -264,7 +264,7 @@ bool CBoxAlgorithmClassifierAccuracyMeasure::process() return true; } -#endif } // namespace Evaluation } // namespace Plugins } // namespace OpenViBE +#endif diff --git a/plugins/processing/evaluation/src/box-algorithms/CBoxAlgorithmClassifierAccuracyMeasure.hpp b/plugins/processing/evaluation/src/box-algorithms/CBoxAlgorithmClassifierAccuracyMeasure.hpp index dbfd8fc9c1ab184c27a3896161568768e38112a9..a92f280a8cd8688f9531f2060989e69e30a9c83a 100644 --- a/plugins/processing/evaluation/src/box-algorithms/CBoxAlgorithmClassifierAccuracyMeasure.hpp +++ b/plugins/processing/evaluation/src/box-algorithms/CBoxAlgorithmClassifierAccuracyMeasure.hpp @@ -66,7 +66,7 @@ protected: GtkWidget* m_toolbarWidget = nullptr; public: - typedef struct + typedef struct SProgress { GtkLabel* labelClassifier; GtkProgressBar* progressBar; diff --git a/plugins/processing/evaluation/src/box-algorithms/CBoxAlgorithmKappaCoefficient.cpp b/plugins/processing/evaluation/src/box-algorithms/CBoxAlgorithmKappaCoefficient.cpp index 2e2347f7014b85b22a59797db295e44146aff98b..801bd3ff3195006c5c12a31d0423af492bd20b59 100644 --- a/plugins/processing/evaluation/src/box-algorithms/CBoxAlgorithmKappaCoefficient.cpp +++ b/plugins/processing/evaluation/src/box-algorithms/CBoxAlgorithmKappaCoefficient.cpp @@ -219,7 +219,8 @@ void CBoxAlgorithmKappaCoef::updateKappaValue() const } -#endif } // namespace Evaluation } // namespace Plugins } // namespace OpenViBE + +#endif \ No newline at end of file diff --git a/plugins/processing/evaluation/src/box-algorithms/CBoxAlgorithmROCCurve.cpp b/plugins/processing/evaluation/src/box-algorithms/CBoxAlgorithmROCCurve.cpp index a04545f1756cc3a02363c0aff9051ac7a8afda0c..7c7126f7e898ad3e00641c71f3b209a1fb888504 100644 --- a/plugins/processing/evaluation/src/box-algorithms/CBoxAlgorithmROCCurve.cpp +++ b/plugins/processing/evaluation/src/box-algorithms/CBoxAlgorithmROCCurve.cpp @@ -196,7 +196,7 @@ void CBoxAlgorithmROCCurve::computeOneROCCurve(const CIdentifier& classID, const m_drawerList[classIdx]->GenerateCurve(); } -#endif } // namespace Evaluation } // namespace Plugins } // namespace OpenViBE +#endif diff --git a/plugins/processing/evaluation/src/box-algorithms/CBoxAlgorithmStatisticGenerator.hpp b/plugins/processing/evaluation/src/box-algorithms/CBoxAlgorithmStatisticGenerator.hpp index cd56d773ac86378f9f6254a281e4aa54f4e8eae1..2b8db76ed0bdba8e40c8f826948b6d22d5f705a2 100644 --- a/plugins/processing/evaluation/src/box-algorithms/CBoxAlgorithmStatisticGenerator.hpp +++ b/plugins/processing/evaluation/src/box-algorithms/CBoxAlgorithmStatisticGenerator.hpp @@ -33,7 +33,7 @@ namespace OpenViBE { namespace Plugins { namespace Evaluation { -typedef struct +typedef struct SSignal { CString name; double min; diff --git a/plugins/processing/evaluation/src/box-algorithms/CROCCurveDraw.cpp b/plugins/processing/evaluation/src/box-algorithms/CROCCurveDraw.cpp index 5cb98a2c199bb6220d693f007a522c8d1b0120de..6dd6932b85e42677787a128b71e4a0b8226c4071 100644 --- a/plugins/processing/evaluation/src/box-algorithms/CROCCurveDraw.cpp +++ b/plugins/processing/evaluation/src/box-algorithms/CROCCurveDraw.cpp @@ -36,7 +36,7 @@ CROCCurveDraw::CROCCurveDraw(GtkNotebook* notebook, const std::string& className { gtk_widget_set_size_request(m_drawableArea, 700, 600); - g_signal_connect(G_OBJECT(m_drawableArea), "expose_event", G_CALLBACK(AreaExposeCB), this); + g_signal_connect(G_OBJECT(m_drawableArea), "expose-event", G_CALLBACK(AreaExposeCB), this); g_signal_connect(G_OBJECT(m_drawableArea), "size-allocate", G_CALLBACK(SizeAllocateCB), this); GtkWidget* label = gtk_label_new(className.c_str()); diff --git a/plugins/processing/evaluation/test/CMakeLists.txt b/plugins/processing/evaluation/test/CMakeLists.txt index 353bb55b504863feb2093856c04b10e7cefe371c..367ee4e75dffffec9a6c12e7abe12b4827d9e759 100644 --- a/plugins/processing/evaluation/test/CMakeLists.txt +++ b/plugins/processing/evaluation/test/CMakeLists.txt @@ -12,12 +12,4 @@ add_definitions(-DTARGET_ARCHITECTURE_i386) include_directories(../src) add_executable(${PROJECT_NAME} test_kappa.cpp) set_property(TARGET ${PROJECT_NAME} PROPERTY FOLDER ${TESTS_FOLDER}) # Place project in folder unit-test (for some IDE) - -# Unfortunately we need to install the tests as any application to find .dll/.so files -# on both Windows and Linux. -OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX "${PROJECT_NAME}" EXECUTABLE_NAME "${PROJECT_NAME}") -install(TARGETS ${PROJECT_NAME} - RUNTIME DESTINATION ${DIST_BINDIR} - LIBRARY DESTINATION ${DIST_LIBDIR} - ARCHIVE DESTINATION ${DIST_LIBDIR}) \ No newline at end of file diff --git a/plugins/processing/examples/CMakeLists.txt b/plugins/processing/examples/CMakeLists.txt index ef1577d682fed769c386966c54b8f8a0ab76087b..4d01578ef8845074241c330fd959372589923174 100755 --- a/plugins/processing/examples/CMakeLists.txt +++ b/plugins/processing/examples/CMakeLists.txt @@ -7,7 +7,9 @@ target_link_libraries(${PROJECT_NAME} openvibe openvibe-common openvibe-toolkit - openvibe-visualization-toolkit) + openvibe-visualization-toolkit + gtk2 +) set_target_properties(${PROJECT_NAME} PROPERTIES VERSION ${PROJECT_VERSION} @@ -17,9 +19,9 @@ set_target_properties(${PROJECT_NAME} PROPERTIES add_definitions(-DTARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines) -# --------------------------------- -include("FindThirdPartyGTK") +file(COPY box-tutorials DESTINATION ${BUILD_DATADIR}/scenarios/) +file(COPY metaboxes DESTINATION ${BUILD_DATADIR}/) # ----------------------------- # Install files @@ -29,6 +31,14 @@ install(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION ${DIST_LIBDIR} ARCHIVE DESTINATION ${DIST_LIBDIR}) +file(COPY box-tutorials DESTINATION ${BUILD_DATADIR}/scenarios/) +file(COPY metaboxes DESTINATION ${BUILD_DATADIR}/) + install(DIRECTORY box-tutorials DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) install(DIRECTORY metaboxes DESTINATION ${DIST_DATADIR}/openvibe/) + +if(BUILD_DOCUMENTATION) + file(COPY "metaboxes/doc/Doc_BoxAlgorithm_AsymmetryIndex_DesignerLayout.png" + DESTINATION ${CMAKE_SOURCE_DIR}/build/documentation/html) +endif() diff --git a/plugins/processing/examples/metaboxes/Asymetry-Index.xml b/plugins/processing/examples/metaboxes/Asymetry-Index.xml new file mode 100644 index 0000000000000000000000000000000000000000..1a2112ec613e18fc5b60b080b5cd7bd19d7beda4 --- /dev/null +++ b/plugins/processing/examples/metaboxes/Asymetry-Index.xml @@ -0,0 +1,774 @@ +<OpenViBE-Scenario> + <FormatVersion>2</FormatVersion> + <Creator>OpenViBE Designer</Creator> + <CreatorVersion>3.5.0</CreatorVersion> + <Settings> + <Setting> + <Identifier>(0x9e606e8c, 0x4e95e882)</Identifier> + <TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier> + <Name>Left Channel List</Name> + <DefaultValue>F3</DefaultValue> + <Value>F3</Value> + </Setting> + <Setting> + <Identifier>(0x4a180d50, 0x5116f50d)</Identifier> + <TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier> + <Name>Right Channel List</Name> + <DefaultValue>F4</DefaultValue> + <Value>F4</Value> + </Setting> + <Setting> + <Identifier>(0x1439f9bc, 0x21247879)</Identifier> + <TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier> + <Name>Output channels names</Name> + <DefaultValue>Frontal alpha asymetry</DefaultValue> + <Value>Frontal alpha asymetry</Value> + </Setting> + <Setting> + <Identifier>(0x9e139d03, 0x2022299d)</Identifier> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Filter Order</Name> + <DefaultValue>4</DefaultValue> + <Value>4</Value> + </Setting> + <Setting> + <Identifier>(0x58573213, 0xa5f977bb)</Identifier> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Filter Low Cut Frequency (Hz)</Name> + <DefaultValue>8</DefaultValue> + <Value>8</Value> + </Setting> + <Setting> + <Identifier>(0x7ef899ff, 0xe5b7af5d)</Identifier> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Filter High Cut Frequency (Hz)</Name> + <DefaultValue>12</DefaultValue> + <Value>13</Value> + </Setting> + <Setting> + <Identifier>(0x9d4a731f, 0x6394bf45)</Identifier> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Epoching duration (s)</Name> + <DefaultValue>1</DefaultValue> + <Value>1</Value> + </Setting> + <Setting> + <Identifier>(0xe14895ed, 0x31840ee2)</Identifier> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Epoching intervals (s)</Name> + <DefaultValue>0.5</DefaultValue> + <Value>0.5</Value> + </Setting> + </Settings> + <Inputs> + <Input> + <Identifier>(0x965ac0e9, 0xb76a7560)</Identifier> + <TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier> + <Name>Input Signal</Name> + <LinkedBoxIdentifier>(0x000034f1, 0x000008fd)</LinkedBoxIdentifier> + <LinkedBoxInputIndex>0</LinkedBoxInputIndex> + </Input> + </Inputs> + <Outputs> + <Output> + <Identifier>(0xd1411019, 0xf961b51e)</Identifier> + <TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier> + <Name>Asymmetry Index</Name> + <LinkedBoxIdentifier>(0x00004a15, 0x0000544e)</LinkedBoxIdentifier> + <LinkedBoxOutputIndex>0</LinkedBoxOutputIndex> + </Output> + </Outputs> + <Boxes> + <Box> + <Identifier>(0x00000ba9, 0x00007c2f)</Identifier> + <Name>Power</Name> + <AlgorithmClassIdentifier>(0x00e26fa1, 0x1dbab1b2)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier> + <Name>Input - A</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier> + <Name>Output</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier> + <Name>Equation</Name> + <DefaultValue>x</DefaultValue> + <Value>x*x</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>320</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>944</Value> + </Attribute> + <Attribute> + <Identifier>(0x30a4e5c9, 0x83502953)</Identifier> + <Value></Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0x21889dc4, 0x1126497e)</Value> + </Attribute> + <Attribute> + <Identifier>(0x527ad68d, 0x16d746a0)</Identifier> + <Value></Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xfba64161, 0x65304e21)</Identifier> + <Value></Value> + </Attribute> + </Attributes> + </Box> + <Box> + <Identifier>(0x000034f1, 0x000008fb)</Identifier> + <Name>Left Channel List</Name> + <AlgorithmClassIdentifier>(0x361722e8, 0x311574e8)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier> + <Name>Input signal</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier> + <Name>Output signal</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier> + <Name>Channel List</Name> + <DefaultValue>:</DefaultValue> + <Value>$var{Left Channel List}</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x3bcf9e67, 0x0c23994d)</TypeIdentifier> + <Name>Action</Name> + <DefaultValue>Select</DefaultValue> + <Value>Select</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x666f25e9, 0x3e5738d6)</TypeIdentifier> + <Name>Channel Matching Method</Name> + <DefaultValue>Smart</DefaultValue> + <Value>Name</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>400</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>880</Value> + </Attribute> + <Attribute> + <Identifier>(0x30a4e5c9, 0x83502953)</Identifier> + <Value></Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0x277826e1, 0xa30a3bd0)</Value> + </Attribute> + <Attribute> + <Identifier>(0x527ad68d, 0x16d746a0)</Identifier> + <Value></Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>3</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>1</Value> + </Attribute> + </Attributes> + </Box> + <Box> + <Identifier>(0x000034f1, 0x000008fc)</Identifier> + <Name>Right Channel List</Name> + <AlgorithmClassIdentifier>(0x361722e8, 0x311574e8)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier> + <Name>Input signal</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier> + <Name>Output signal</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier> + <Name>Channel List</Name> + <DefaultValue>:</DefaultValue> + <Value>$var{Right Channel List}</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x3bcf9e67, 0x0c23994d)</TypeIdentifier> + <Name>Action</Name> + <DefaultValue>Select</DefaultValue> + <Value>Select</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x666f25e9, 0x3e5738d6)</TypeIdentifier> + <Name>Channel Matching Method</Name> + <DefaultValue>Smart</DefaultValue> + <Value>Name</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>400</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>1008</Value> + </Attribute> + <Attribute> + <Identifier>(0x30a4e5c9, 0x83502953)</Identifier> + <Value></Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0x277826e1, 0xa30a3bd0)</Value> + </Attribute> + <Attribute> + <Identifier>(0x527ad68d, 0x16d746a0)</Identifier> + <Value></Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>3</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>1</Value> + </Attribute> + </Attributes> + </Box> + <Box> + <Identifier>(0x000034f1, 0x000008fd)</Identifier> + <Name>Left Channel List;Right Channel List</Name> + <AlgorithmClassIdentifier>(0x361722e8, 0x311574e8)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier> + <Name>Input signal</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier> + <Name>Output signal</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier> + <Name>Channel List</Name> + <DefaultValue>:</DefaultValue> + <Value>$var{Left Channel List};$var{Right Channel List}</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x3bcf9e67, 0x0c23994d)</TypeIdentifier> + <Name>Action</Name> + <DefaultValue>Select</DefaultValue> + <Value>Select</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x666f25e9, 0x3e5738d6)</TypeIdentifier> + <Name>Channel Matching Method</Name> + <DefaultValue>Smart</DefaultValue> + <Value>Name</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>112</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>944</Value> + </Attribute> + <Attribute> + <Identifier>(0x30a4e5c9, 0x83502953)</Identifier> + <Value></Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0x277826e1, 0xa30a3bd0)</Value> + </Attribute> + <Attribute> + <Identifier>(0x527ad68d, 0x16d746a0)</Identifier> + <Value></Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>3</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>1</Value> + </Attribute> + </Attributes> + </Box> + <Box> + <Identifier>(0x00003c49, 0x000055f8)</Identifier> + <Name>Time based epoching</Name> + <AlgorithmClassIdentifier>(0x00777fa0, 0x5dc3f560)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier> + <Name>Input signal</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier> + <Name>Epoched signal</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Epoch duration (in sec)</Name> + <DefaultValue>1</DefaultValue> + <Value>$var{Epoching duration (s)}</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Epoch intervals (in sec)</Name> + <DefaultValue>0.5</DefaultValue> + <Value>$var{Epoching intervals (s)}</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>256</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>944</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0xc5ff41e9, 0xccc59a01)</Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>2</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>1</Value> + </Attribute> + </Attributes> + </Box> + <Box> + <Identifier>(0x0000492f, 0x00002122)</Identifier> + <Name>Log(Right Channel List) - Log(Left Channel List)</Name> + <AlgorithmClassIdentifier>(0x00e26fa1, 0x1dbab1b2)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier> + <Name>Input - A</Name> + </Input> + <Input> + <Identifier>(0xaf232dcc, 0xc3b09912)</Identifier> + <TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier> + <Name>Input - B</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier> + <Name>Output</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier> + <Name>Equation</Name> + <DefaultValue>x</DefaultValue> + <Value>log(b)-log(a)</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>480</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>944</Value> + </Attribute> + <Attribute> + <Identifier>(0x30a4e5c9, 0x83502953)</Identifier> + <Value></Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0x21889dc4, 0x1126497e)</Value> + </Attribute> + <Attribute> + <Identifier>(0x527ad68d, 0x16d746a0)</Identifier> + <Value></Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xfba64161, 0x65304e21)</Identifier> + <Value></Value> + </Attribute> + </Attributes> + </Box> + <Box> + <Identifier>(0x00004a15, 0x0000544e)</Identifier> + <Name>Channel Rename</Name> + <AlgorithmClassIdentifier>(0x1fe50479, 0x39040f40)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier> + <Name>Input matrix</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier> + <Name>Output matrix</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier> + <Name>New channel names</Name> + <DefaultValue>Channel 1;Channel 2</DefaultValue> + <Value>$var{Output channels names}</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>544</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>944</Value> + </Attribute> + <Attribute> + <Identifier>(0x30a4e5c9, 0x83502953)</Identifier> + <Value></Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0x74d8d30c, 0xfa7bdf43)</Value> + </Attribute> + <Attribute> + <Identifier>(0x527ad68d, 0x16d746a0)</Identifier> + <Value></Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>1</Value> + </Attribute> + </Attributes> + </Box> + <Box> + <Identifier>(0x00007180, 0x00006c44)</Identifier> + <Name>Select Frequency Band</Name> + <AlgorithmClassIdentifier>(0xb4f9d042, 0x9d79f2e5)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier> + <Name>Input signal</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier> + <Name>Output signal</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0xfa20178e, 0x4cba62e9)</TypeIdentifier> + <Name>Filter Type</Name> + <DefaultValue>Band Pass</DefaultValue> + <Value>Band Pass</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Filter Order</Name> + <DefaultValue>4</DefaultValue> + <Value>$var{Filter Order}</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Low Cut-off Frequency (Hz)</Name> + <DefaultValue>1</DefaultValue> + <Value>$var{Filter Low Cut Frequency (Hz)}</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>High Cut-off Frequency (Hz)</Name> + <DefaultValue>40</DefaultValue> + <Value>$var{Filter High Cut Frequency (Hz)}</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x17ee7c08, 0x94c14893)</Identifier> + <Value></Value> + </Attribute> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>192</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>944</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0x6a7c1e9b, 0x6b00b5c5)</Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>4</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>1</Value> + </Attribute> + </Attributes> + </Box> + </Boxes> + <Links> + <Link> + <Identifier>(0x00001c9c, 0x00001d7e)</Identifier> + <Source> + <BoxIdentifier>(0x00000ba9, 0x00007c2f)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000034f1, 0x000008fc)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> + <Link> + <Identifier>(0x00004442, 0x000025e7)</Identifier> + <Source> + <BoxIdentifier>(0x00003c49, 0x000055f8)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x00000ba9, 0x00007c2f)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> + <Link> + <Identifier>(0x00005141, 0x00003037)</Identifier> + <Source> + <BoxIdentifier>(0x0000492f, 0x00002122)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x00004a15, 0x0000544e)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> + <Link> + <Identifier>(0x00005177, 0x000038b3)</Identifier> + <Source> + <BoxIdentifier>(0x00000ba9, 0x00007c2f)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000034f1, 0x000008fb)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> + <Link> + <Identifier>(0x0000522b, 0x00002558)</Identifier> + <Source> + <BoxIdentifier>(0x000034f1, 0x000008fb)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x0000492f, 0x00002122)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> + <Link> + <Identifier>(0x000053a1, 0x00002b91)</Identifier> + <Source> + <BoxIdentifier>(0x00007180, 0x00006c44)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x00003c49, 0x000055f8)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> + <Link> + <Identifier>(0x0000591a, 0x000078f9)</Identifier> + <Source> + <BoxIdentifier>(0x000034f1, 0x000008fc)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x0000492f, 0x00002122)</BoxIdentifier> + <BoxInputIdentifier>(0xaf232dcc, 0xc3b09912)</BoxInputIdentifier> + </Target> + </Link> + <Link> + <Identifier>(0x00006e4a, 0x0000288c)</Identifier> + <Source> + <BoxIdentifier>(0x000034f1, 0x000008fd)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x00007180, 0x00006c44)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> + </Links> + <Comments></Comments> + <Metadata> + <Entry> + <Identifier>(0x00006643, 0x00002a5e)</Identifier> + <Type>(0x3bcce5d2, 0x43f2d968)</Type> + <Data>[{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x00003385, 0x000070a1)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x0000758d, 0x0000347d)","index":0,"name":"Default tab","parentIdentifier":"(0x00003385, 0x000070a1)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x0000473c, 0x00003645)","index":0,"name":"Empty","parentIdentifier":"(0x0000758d, 0x0000347d)","type":0}]</Data> + </Entry> + </Metadata> + <Attributes> + <Attribute> + <Identifier>(0x198dd621, 0xab7f153f)</Identifier> + <Value>(0xae97735b, 0xc19cd8e1)</Value> + </Attribute> + <Attribute> + <Identifier>(0x20c6d158, 0xfe90aadd)</Identifier> + <Value>(0x0e906dc2, 0x8681c09d)</Value> + </Attribute> + <Attribute> + <Identifier>(0x790d75b8, 0x3bb90c33)</Identifier> + <Value></Value> + </Attribute> + <Attribute> + <Identifier>(0x7a3a1558, 0xf12c63c2)</Identifier> + <Value></Value> + </Attribute> + <Attribute> + <Identifier>(0x84009d7c, 0x3c4e763b)</Identifier> + <Value>Computes the asymmetry index of a given EEG signal. Default parameters correspond to frontal alpha asymmetry.</Value> + </Attribute> + <Attribute> + <Identifier>(0x8c1fc55b, 0x7b433dc2)</Identifier> + <Value>1.0</Value> + </Attribute> + <Attribute> + <Identifier>(0x9f5c4075, 0x4a0d3666)</Identifier> + <Value>Asymmetry Index</Value> + </Attribute> + <Attribute> + <Identifier>(0xf36a1567, 0xd13c53da)</Identifier> + <Value></Value> + </Attribute> + <Attribute> + <Identifier>(0xf6b2e3fa, 0x7bd43926)</Identifier> + <Value>Signal processing/Filtering</Value> + </Attribute> + <Attribute> + <Identifier>(0xf8034a49, 0x8b3f37cc)</Identifier> + <Value>Inria</Value> + </Attribute> + </Attributes> +</OpenViBE-Scenario> \ No newline at end of file diff --git a/plugins/processing/examples/metaboxes/doc/Doc_BoxAlgorithm_AsymmetryIndex.dox b/plugins/processing/examples/metaboxes/doc/Doc_BoxAlgorithm_AsymmetryIndex.dox new file mode 100644 index 0000000000000000000000000000000000000000..cd5dd2527d46d86b5b6ab7308efa307f944d21dd --- /dev/null +++ b/plugins/processing/examples/metaboxes/doc/Doc_BoxAlgorithm_AsymmetryIndex.dox @@ -0,0 +1,88 @@ +/** + * \page Doc_BoxAlgorithm_AsymmetryIndex Asymmetry Index + + * \section Doc_BoxAlgorithm_AsymmetryIndexSection1 Description + + Computes the asymmetry index of a given EEG signal. Default parameters correspond to frontal alpha asymmetry. + +__________________________________________________________________ + + + * \section Doc_BoxAlgorithm_AsymmetryIndexSection2 Inputs + + * \subsection Doc_BoxAlgorithm_AsymmetryIndex_Section2Subsection1 1. Signal + + An EEG signal. + \li Type identifier : <em>Signal (0x5ba36127, 0x195feae1)</em> + +__________________________________________________________________ + + + * \section Doc_BoxAlgorithm_AsymmetryIndexSection3 Outputs + + * \subsection Doc_BoxAlgorithm_AsymmetryIndex_Section3Subsection1 1. Asymmetry Index + + \li Type identifier : <em>Signal (0x5ba36127, 0x195feae1)</em> + +__________________________________________________________________ + + * \section Doc_BoxAlgorithm_AsymmetryIndexSection4 Pipeline + + This metabox consists of five parts: + \li A channel selector box, that selects the channels to be compared in the calculation of the asymmetry. + \li A temporal filter box, that applies a band pass filter to the selected channels. + \li A time based epoching box and a simple DSP box, that compute a sliding window based power estimation of the selected channels, in the selected frequency band. + \li A simple DSP box that computes the asymmetry index. + \li A channel rename box that gives consistent names to the output channels + + \image html Doc_BoxAlgorithm_AsymmetryIndex_DesignerLayout.png "Designer layout" + \image latex Doc_BoxAlgorithm_AsymmetryIndex_DesignerLayout.png "Designer layout" width=\textwidth + + +__________________________________________________________________ + + + * \section Doc_BoxAlgorithm_AsymmetryIndex_Section5 Settings + + * \subsection Doc_BoxAlgorithm_AsymmetryIndex_Section5Subsection1 1. Left channel list and Right channel list + The lists of the channels the asymmetry will be based on. The asymmetry is computed between the elements (semicolon separated) of the two lists with the same indexes (both list should therefore contain the same number of semicolon separated strings). + If Left Channel List = F3;P3 and Right Channel List = F4;P4, the first output channel will contain frontal asymmetry (log(F4)-log(F3)) and the second output channel will contain the parietal asymmetry (log(P4)-log(P3)). + * \subsubsection Doc_BoxAlgorithm_AsymmetryIndex_Section5Subsection1Subsubsection1 Left Channel List + \li Type identifier : <em>String (0x79a9edeb, 0x245d83fc)</em> + \li Default value : [ <em>F3</em> ] + * \subsubsection Doc_BoxAlgorithm_AsymmetryIndex_Section5Subsection1Subsubsection2 Right Channel List + \li Type identifier : <em>String (0x79a9edeb, 0x245d83fc)</em> + \li Default value : [ <em>F4</em> ] + + * \subsection Doc_BoxAlgorithm_AsymmetryIndex_Section5Subsection2 2. Output channels names + The list of the output channels. This list should contain as many semicolon separated strings as there are channels in Left Channel List. + If Left Channel List = F3;P3 and Right Channel List = F4;P4, Output channels names = Frontal alpha asymmetry;Parietal alpha asymmetry would be a consistent value. + + * \subsubsection Doc_BoxAlgorithm_AsymmetryIndex_Section5Subsection2Subsubsection1 Output Channels Names + \li Type identifier : <em>String (0x79a9edeb, 0x245d83fc)</em> + \li Default value : [ <em>Frontal Alpha Asymmetry</em> ] + + * \subsection Doc_BoxAlgorithm_AsymmetryIndex_Section5Subsection3 3. Filter Order, Low cut frequency (Hz) and High cut frequency (Hz) + The parameters of the temporal filter. + * \subsubsection Doc_BoxAlgorithm_AsymmetryIndex_Section5Subsection3Subsubsection1 Filter Order + \li Type identifier : <em>Integer (0x007deef9, 0x2f3e95c6)</em> + \li Default value : [ <em>4</em> ] + * \subsubsection Doc_BoxAlgorithm_AsymmetryIndex_Section5Subsection3Subsubsection2 Filter Low Cut Frequency + \li Type identifier : <em>Integer (0x007deef9, 0x2f3e95c6)</em> + \li Default value : [ <em>8</em> ] + * \subsubsection Doc_BoxAlgorithm_AsymmetryIndex_Section5Subsection3Subsubsection2 Filer High Cut Frequency + \li Type identifier : <em>Integer (0x007deef9, 0x2f3e95c6)</em> + \li Default value : [ <em>13</em> ] + + + * \subsection Doc_BoxAlgorithm_AsymmetryIndex_Section5Subsection4 4. Epoching duration (s) and intervals (s) + The parameters of the time based epoching. + * \subsubsection Doc_BoxAlgorithm_AsymmetryIndex_Section5Subsection4Subsubsection1 Epoching duration (s) + \li Type identifier : <em>Float (0x512a166f, 0x5c3ef83f)</em> + \li Default value : [ <em>1</em> ] + * \subsubsection Doc_BoxAlgorithm_AsymmetryIndex_Section5Subsection4Subsubsection2 Epoching intervals (s) + \li Type identifier : <em>Float (0x512a166f, 0x5c3ef83f)</em> + \li Default value : [ <em>0.5</em> ] + + + */ diff --git a/plugins/processing/examples/metaboxes/doc/Doc_BoxAlgorithm_AsymmetryIndex_DesignerLayout.png b/plugins/processing/examples/metaboxes/doc/Doc_BoxAlgorithm_AsymmetryIndex_DesignerLayout.png new file mode 100644 index 0000000000000000000000000000000000000000..2d6655689f502ba41f290f0a0db80d053deb1485 Binary files /dev/null and b/plugins/processing/examples/metaboxes/doc/Doc_BoxAlgorithm_AsymmetryIndex_DesignerLayout.png differ diff --git a/plugins/processing/examples/src/box-algorithms/ovpCLog.h b/plugins/processing/examples/src/box-algorithms/ovpCLog.h index 93141cbeecc02fdd3f549270bba30415228be900..3e713b31c4f3a98248904f4f2e079e7ade4dedf0 100644 --- a/plugins/processing/examples/src/box-algorithms/ovpCLog.h +++ b/plugins/processing/examples/src/box-algorithms/ovpCLog.h @@ -229,7 +229,7 @@ public: CString getStockItemName() const override { return "gtk-edit"; } IBoxListener* createBoxListener() const override { return new CLogListener; } - virtual void releaseBoxListener(IBoxListener* listener) { delete listener; } + void releaseBoxListener(IBoxListener* listener) const override { delete listener; } _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_LogDesc) }; diff --git a/plugins/processing/features-selection/CMakeLists.txt b/plugins/processing/features-selection/CMakeLists.txt index 40087faec6c335fa01d2cfe64b7bbf6231409326..d3720cb65f0b77cf8f64f0b6c55ef4e1b3e18560 100644 --- a/plugins/processing/features-selection/CMakeLists.txt +++ b/plugins/processing/features-selection/CMakeLists.txt @@ -25,6 +25,10 @@ include_directories("src") # --------------------------------- SET_BUILD_PLATFORM() +set(SUB_DIR_NAME features-selection) + +file(COPY box-tutorials/ DESTINATION ${BUILD_DATADIR}/scenarios/box-tutorials/${SUB_DIR_NAME}) +file(COPY bci-examples/ DESTINATION ${BUILD_DATADIR}/scenarios/bci-examples/filter-bank-CSP) # ----------------------------- # Install files # ----------------------------- @@ -33,7 +37,6 @@ install(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION ${DIST_LIBDIR} ARCHIVE DESTINATION ${DIST_LIBDIR}) -set(SUB_DIR_NAME features-selection) install(DIRECTORY box-tutorials/ DESTINATION ${DIST_DATADIR}/openvibe/scenarios/box-tutorials/${SUB_DIR_NAME}) install(DIRECTORY bci-examples/ DESTINATION ${DIST_DATADIR}/openvibe/scenarios/bci-examples/filter-bank-CSP) diff --git a/plugins/processing/features-selection/bci-examples/6-train-classifier.xml b/plugins/processing/features-selection/bci-examples/6-train-classifier.xml index 0b2f8dfcf0a7d269a46735277c390634ce05c29c..c9c1f70af924e4e0ad10e3789320aefe7994a4f0 100644 --- a/plugins/processing/features-selection/bci-examples/6-train-classifier.xml +++ b/plugins/processing/features-selection/bci-examples/6-train-classifier.xml @@ -1,7 +1,7 @@ <OpenViBE-Scenario> <FormatVersion>2</FormatVersion> <Creator>OpenViBE Designer</Creator> - <CreatorVersion>3.2.0</CreatorVersion> + <CreatorVersion>3.6.0</CreatorVersion> <Settings> <Setting> <Identifier>(0x003874e6, 0x80815878)</Identifier> @@ -91,6 +91,147 @@ <Inputs></Inputs> <Outputs></Outputs> <Boxes> + <Box> + <Identifier>(0x000012d8, 0x00002ca6)</Identifier> + <Name>Classifier trainer</Name> + <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Stimulations</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 1</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 2</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Train-completed Flag</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Train trigger</Name> + <DefaultValue>OVTK_StimulationId_Train</DefaultValue> + <Value>OVTK_StimulationId_Train</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> + <Name>Filename to save configuration to</Name> + <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> + <Value>$var{Scripts Path}/classifier.xml</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> + <Name>Multiclass strategy to apply</Name> + <DefaultValue>Native</DefaultValue> + <Value>Native</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 1 label</Name> + <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> + <Value>$var{Class 1}</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 2 label</Name> + <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> + <Value>$var{Class 2}</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> + <Name>Algorithm to use</Name> + <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> + <Value>Linear Discrimimant Analysis (LDA)</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Number of partitions for k-fold cross-validation test</Name> + <DefaultValue>10</DefaultValue> + <Value>5</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Use shrinkage</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Shrinkage coefficient (-1 == auto)</Name> + <DefaultValue>-1.000000</DefaultValue> + <Value>-1.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Shrinkage: Force diagonal cov (DDA)</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Randomize k-fold cross-validation test data</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Balance classes</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>512</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>976</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0xac393893, 0x25854082)</Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>7</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>3</Value> + </Attribute> + <Attribute> + <Identifier>(0xfba64161, 0x65304e21)</Identifier> + <Value></Value> + </Attribute> + </Attributes> + </Box> <Box> <Identifier>(0x00001449, 0x00001173)</Identifier> <Name>Identity</Name> @@ -1877,144 +2018,6 @@ </Attribute> </Attributes> </Box> - <Box> - <Identifier>(0x0a5a6a4a, 0x1d92a778)</Identifier> - <Name>Classifier trainer</Name> - <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> - <Inputs> - <Input> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Stimulations</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 1</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 2</Name> - </Input> - </Inputs> - <Outputs> - <Output> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Train-completed Flag</Name> - </Output> - </Outputs> - <Settings> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Train trigger</Name> - <DefaultValue>OVTK_StimulationId_Train</DefaultValue> - <Value>OVTK_StimulationId_Train</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> - <Name>Filename to save configuration to</Name> - <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> - <Value>$var{Scripts Path}/classifier.xml</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> - <Name>Multiclass strategy to apply</Name> - <DefaultValue>Native</DefaultValue> - <Value>Native</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 1 label</Name> - <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> - <Value>$var{Class 1}</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 2 label</Name> - <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> - <Value>$var{Class 2}</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> - <Name>Algorithm to use</Name> - <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> - <Value>Linear Discrimimant Analysis (LDA)</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Use shrinkage</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Shrinkage coefficient (-1 == auto)</Name> - <DefaultValue>-1.000000</DefaultValue> - <Value>-1</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Shrinkage: Force diagonal cov (DDA)</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> - <Name>Number of partitions for k-fold cross-validation test</Name> - <DefaultValue>10</DefaultValue> - <Value>5</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Balance classes</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - </Settings> - <Attributes> - <Attribute> - <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>512</Value> - </Attribute> - <Attribute> - <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>976</Value> - </Attribute> - <Attribute> - <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x9de21779, 0x37776c89)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier> - <Value>false</Value> - </Attribute> - <Attribute> - <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> - <Value>1</Value> - </Attribute> - <Attribute> - <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>6</Value> - </Attribute> - <Attribute> - <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> - <Value>3</Value> - </Attribute> - <Attribute> - <Identifier>(0xfba64161, 0x65304e21)</Identifier> - <Value></Value> - </Attribute> - </Attributes> - </Box> <Box> <Identifier>(0x24757b65, 0x29027b6f)</Identifier> <Name>Player Controller</Name> @@ -2312,17 +2315,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x00001d35, 0x00007c7e)</Identifier> - <Source> - <BoxIdentifier>(0x00001449, 0x00001173)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x0a5a6a4a, 0x1d92a778)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x0000203b, 0x000026a7)</Identifier> <Source> @@ -2433,28 +2425,6 @@ <BoxInputIdentifier>(0x4a942408, 0x0f60530d)</BoxInputIdentifier> </Target> </Link> - <Link> - <Identifier>(0x00003a48, 0x000000fd)</Identifier> - <Source> - <BoxIdentifier>(0x000040a1, 0x00002f8e)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x0a5a6a4a, 0x1d92a778)</BoxIdentifier> - <BoxInputIndex>2</BoxInputIndex> - </Target> - </Link> - <Link> - <Identifier>(0x00003b2a, 0x00005e0e)</Identifier> - <Source> - <BoxIdentifier>(0x000040a1, 0x00002f8d)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x0a5a6a4a, 0x1d92a778)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x00003df2, 0x00006373)</Identifier> <Source> @@ -2543,6 +2513,17 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x00004ef3, 0x00004121)</Identifier> + <Source> + <BoxIdentifier>(0x000040a1, 0x00002f8e)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000012d8, 0x00002ca6)</BoxIdentifier> + <BoxInputIndex>2</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x000057c9, 0x00007f2b)</Identifier> <Source> @@ -2587,6 +2568,28 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x000063eb, 0x0000377c)</Identifier> + <Source> + <BoxIdentifier>(0x00001449, 0x00001173)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000012d8, 0x00002ca6)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> + <Link> + <Identifier>(0x0000666c, 0x0000482b)</Identifier> + <Source> + <BoxIdentifier>(0x000012d8, 0x00002ca6)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x24757b65, 0x29027b6f)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00006ae7, 0x00000cf9)</Identifier> <Source> @@ -2653,6 +2656,17 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x00007666, 0x00004d72)</Identifier> + <Source> + <BoxIdentifier>(0x000040a1, 0x00002f8d)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000012d8, 0x00002ca6)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x000079fc, 0x000022e3)</Identifier> <Source> @@ -2686,17 +2700,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x75fc2227, 0x282c4631)</Identifier> - <Source> - <BoxIdentifier>(0x0a5a6a4a, 0x1d92a778)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x24757b65, 0x29027b6f)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> </Links> <Comments> <Comment> diff --git a/plugins/processing/file-io/CMakeLists.txt b/plugins/processing/file-io/CMakeLists.txt index f76aeffd031052f8824870d73dc99dd7ef37d4dd..b5ca6cd443372e5698c0fa4890b00e471b115a63 100644 --- a/plugins/processing/file-io/CMakeLists.txt +++ b/plugins/processing/file-io/CMakeLists.txt @@ -27,6 +27,10 @@ include_directories("src") # --------------------------------- SET_BUILD_PLATFORM() +file(COPY signals DESTINATION ${BUILD_DATADIR}/scenarios) +file(COPY box-tutorials DESTINATION ${BUILD_DATADIR}/scenarios) +file(COPY electrode_sets DESTINATION ${BUILD_DATADIR}) + # ----------------------------- # Install files # ----------------------------- @@ -35,7 +39,6 @@ install(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION ${DIST_LIBDIR} ARCHIVE DESTINATION ${DIST_LIBDIR}) - install(DIRECTORY signals DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) install(DIRECTORY box-tutorials DESTINATION ${DIST_DATADIR}/openvibe/scenarios/) install(DIRECTORY electrode_sets DESTINATION ${DIST_DATADIR}/openvibe/) diff --git a/plugins/processing/file-io/src/algorithms/brainamp/ovpCAlgorithmBrainampFileReader.h b/plugins/processing/file-io/src/algorithms/brainamp/ovpCAlgorithmBrainampFileReader.h index cd332748740b59fb3fb763b8222b9248e407a9f7..ce8ba8927b947fccd9eb2a7d6d830637da4cee9f 100644 --- a/plugins/processing/file-io/src/algorithms/brainamp/ovpCAlgorithmBrainampFileReader.h +++ b/plugins/processing/file-io/src/algorithms/brainamp/ovpCAlgorithmBrainampFileReader.h @@ -27,7 +27,7 @@ protected: enum class EEndianness { LittleEndian, BigEndian }; - typedef struct + typedef struct SStimulaton { uint64_t id; uint64_t startIdx; diff --git a/plugins/processing/file-io/src/box-algorithms/ovpCGDFFileWriter.cpp b/plugins/processing/file-io/src/box-algorithms/ovpCGDFFileWriter.cpp index d826c14fb8ab7e27f208ad1f2a94c3466991ca95..806be08210be29a3b970fd1451fd3286daafa019 100644 --- a/plugins/processing/file-io/src/box-algorithms/ovpCGDFFileWriter.cpp +++ b/plugins/processing/file-io/src/box-algorithms/ovpCGDFFileWriter.cpp @@ -111,11 +111,11 @@ void CGDFFileWriter::setSampleBuffer(const double* buffer) void CGDFFileWriter::setExperimentInfo() { uint64_t value = m_xpInfoDecoder->getOutputExperimentID(); - sprintf(m_fixedHeader.m_RecordingID, "0x%08X", value); + sprintf(m_fixedHeader.m_RecordingID, "0x%08llX", value); m_fixedHeader.m_RecordingID[10] = ' '; value = m_xpInfoDecoder->getOutputSubjectID(); - sprintf(m_fixedHeader.m_PatientID, "0x%08X ", value); + sprintf(m_fixedHeader.m_PatientID, "0x%08llX ", value); m_fixedHeader.m_PatientID[11] = ' '; @@ -336,7 +336,7 @@ void CGDFFileWriter::saveEvents() //number of events uint8_t littleEndianBuffer[sizeof(size_t)]; // Needs to be as long as the type returned by m_events.size() (see impl. of hostToLittleEndian()) - System::Memory::hostToLittleEndian(m_events.size(), littleEndianBuffer); + System::Memory::hostToLittleEndian((int)m_events.size(), littleEndianBuffer); m_file.write(reinterpret_cast<char*>(littleEndianBuffer), sizeof(uint32_t)); // write event positions diff --git a/plugins/processing/games/CMakeLists.txt b/plugins/processing/games/CMakeLists.txt index 67d1cba57ad300040437aaa1cff3a6e4790359b9..ffad57e8c802c7b32c20aa9606b59fcd0eed56ef 100644 --- a/plugins/processing/games/CMakeLists.txt +++ b/plugins/processing/games/CMakeLists.txt @@ -9,7 +9,9 @@ target_link_libraries(${PROJECT_NAME} openvibe-toolkit openvibe-module-lsl Boost::boost - Boost::system) + Boost::system + LSL::lsl + ) set_target_properties(${PROJECT_NAME} PROPERTIES VERSION ${PROJECT_VERSION} @@ -22,9 +24,6 @@ add_definitions(-DTARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines) # --------------------------------- include_directories("src") -# OpenViBE Third Party -include("FindThirdPartyLSL") - # --------------------------------- # Target macros # Defines target operating system, architecture, compiler @@ -34,6 +33,10 @@ SET_BUILD_PLATFORM() #so that boost won't need to link against DateTime when using the interprocess communication library shared memory writer box #add_definitions(-DBOOST_DATE_TIME_NO_LIB) +set(SUB_DIR_NAME Games) + +file(COPY box-tutorials/ DESTINATION ${BUILD_DATADIR}/scenarios/box-tutorials/${SUB_DIR_NAME}) + # ----------------------------- # Install files # ----------------------------- @@ -42,7 +45,6 @@ install(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION ${DIST_LIBDIR} ARCHIVE DESTINATION ${DIST_LIBDIR}) -set(SUB_DIR_NAME Games) install(DIRECTORY box-tutorials/ DESTINATION ${DIST_DATADIR}/openvibe/scenarios/box-tutorials/${SUB_DIR_NAME}) # --------------------------------- diff --git a/plugins/processing/matlab/CMakeLists.txt b/plugins/processing/matlab/CMakeLists.txt index e1d654e0a6463a6e71b1174c751a2d806f8982bd..0e03ea191ef656c2699da6ef1c861f2da3bba752 100755 --- a/plugins/processing/matlab/CMakeLists.txt +++ b/plugins/processing/matlab/CMakeLists.txt @@ -37,6 +37,9 @@ add_definitions(-DTARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines) include("FindThirdPartyMatlab") +file(COPY share/ DESTINATION ${BUILD_DATADIR}/plugins/matlab) +file(COPY box-tutorials DESTINATION ${BUILD_DATADIR}/scenarios/) + # ----------------------------- # Install files # ----------------------------- diff --git a/plugins/processing/network-io/CMakeLists.txt b/plugins/processing/network-io/CMakeLists.txt index e11c8a02e6fda679e1703bc7971d3c40e2fb21ea..56e08038b343cf159bd6ca5b3973524d368ccce3 100644 --- a/plugins/processing/network-io/CMakeLists.txt +++ b/plugins/processing/network-io/CMakeLists.txt @@ -11,6 +11,7 @@ target_link_libraries(${PROJECT_NAME} openvibe-module-lsl Boost::boost Boost::system + LSL::lsl ) target_include_directories(${PROJECT_NAME} PRIVATE src) @@ -29,8 +30,6 @@ if(WIN32) add_definitions(-D_WIN32_WINNT=0x0501) # for boost::asio endif(WIN32) -include("FindThirdPartyLSL") - #so that boost won't need to link against DateTime when using the interprocess communication library #shared memory writer box add_definitions(-DBOOST_DATE_TIME_NO_LIB) @@ -50,6 +49,8 @@ if(WIN32) endif(LIB_STANDARD_MODULE_WINMM) endif(WIN32) +file(COPY box-tutorials/ DESTINATION ${BUILD_DATADIR}/scenarios/box-tutorials) + # ----------------------------- # Install files # ----------------------------- @@ -59,4 +60,4 @@ install(TARGETS ${PROJECT_NAME} ARCHIVE DESTINATION ${DIST_LIBDIR}) -install(DIRECTORY box-tutorials/ DESTINATION ${DIST_DATADIR}/openvibe/scenarios/box-tutorials) \ No newline at end of file +install(DIRECTORY box-tutorials/ DESTINATION ${DIST_DATADIR}/openvibe/scenarios/box-tutorials) diff --git a/plugins/processing/network-io/src/box-algorithms/CBoxLSLExport.cpp b/plugins/processing/network-io/src/box-algorithms/CBoxLSLExport.cpp index 8ca866429f2b72c3765d18c821f32a669c368ed6..b39f22ae9d2a40b6c4cbcc3e211efe095e1cd99c 100644 --- a/plugins/processing/network-io/src/box-algorithms/CBoxLSLExport.cpp +++ b/plugins/processing/network-io/src/box-algorithms/CBoxLSLExport.cpp @@ -234,7 +234,8 @@ bool CBoxLSLExport::process() } //-------------------------------------------------------------------------------- -#endif } // namespace NetworkIO } // namespace Plugins } // namespace OpenViBE + +#endif diff --git a/plugins/processing/riemannian/CMakeLists.txt b/plugins/processing/riemannian/CMakeLists.txt index 20a2302bdec1cc25505c470e78ff6c55196fe4e6..011de279390d1a7498df09a466d84d14ebd77f03 100644 --- a/plugins/processing/riemannian/CMakeLists.txt +++ b/plugins/processing/riemannian/CMakeLists.txt @@ -1,4 +1,4 @@ -project(openvibe-plugins-riemannian VERSION ${OPENVIBE_MAJOR_VERSION}.${OPENVIBE_MINOR_VERSION}.${OPENVIBE_PATCH_VERSION}) +project(openvibe-plugins-riemannian VERSION ${OPENVIBE_MAJOR_VERSION}.${OPENVIBE_MINOR_VERSION}.${OPENVIBE_PATCH_VERSION}) file(GLOB_RECURSE SRC_FILES src/*.cpp src/*.hpp src/*.h src/*.inl src/*.c) add_library(${PROJECT_NAME} SHARED ${SRC_FILES}) @@ -10,7 +10,7 @@ target_link_libraries(${PROJECT_NAME} openvibe-module-eigen Boost::boost Eigen3::Eigen - tinyxml2) + tinyxml2::tinyxml2) set_target_properties(${PROJECT_NAME} PROPERTIES VERSION ${PROJECT_VERSION} @@ -31,6 +31,11 @@ include("FindModuleGeometry") # --------------------------------- SET_BUILD_PLATFORM() +set(SUB_DIR_NAME riemannian) + +file(COPY box-tutorials/ DESTINATION ${BUILD_DATADIR}/scenarios/box-tutorials/${SUB_DIR_NAME}) +file(COPY bci-examples/ DESTINATION ${BUILD_DATADIR}/scenarios/bci-examples/${SUB_DIR_NAME}) + # ----------------------------- # Install files # ----------------------------- @@ -39,8 +44,6 @@ install(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION ${DIST_LIBDIR} ARCHIVE DESTINATION ${DIST_LIBDIR}) -set(SUB_DIR_NAME riemannian) - install(DIRECTORY box-tutorials/ DESTINATION ${DIST_DATADIR}/openvibe/scenarios/box-tutorials/${SUB_DIR_NAME}) install(DIRECTORY bci-examples/ DESTINATION ${DIST_DATADIR}/openvibe/scenarios/bci-examples/${SUB_DIR_NAME}) diff --git a/plugins/processing/riemannian/bci-examples/0.2-Riemann-Classic-NOISE-Training.xml b/plugins/processing/riemannian/bci-examples/0.2-Riemann-Classic-NOISE-Training.xml index 688b7833e1257374d5acbafbcc1829b6afb3b022..07d6414e425e2c2d612e3d747c6805dcd41c7673 100644 --- a/plugins/processing/riemannian/bci-examples/0.2-Riemann-Classic-NOISE-Training.xml +++ b/plugins/processing/riemannian/bci-examples/0.2-Riemann-Classic-NOISE-Training.xml @@ -1,7 +1,7 @@ <OpenViBE-Scenario> <FormatVersion>2</FormatVersion> <Creator>OpenViBE Designer</Creator> - <CreatorVersion>3.2.0</CreatorVersion> + <CreatorVersion>3.6.0</CreatorVersion> <Settings> <Setting> <Identifier>(0x004d2731, 0x8fa767ea)</Identifier> @@ -182,6 +182,171 @@ </Attribute> </Attributes> </Box> + <Box> + <Identifier>(0x00002886, 0x00006c02)</Identifier> + <Name>Classifier trainer</Name> + <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Stimulations</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 1</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 2</Name> + </Input> + <Input> + <Identifier>(0xca023fe4, 0x55147ae5)</Identifier> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 3</Name> + </Input> + <Input> + <Identifier>(0x1f5ae7f1, 0xf17cdbcb)</Identifier> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 4</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Train-completed Flag</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Train trigger</Name> + <DefaultValue>OVTK_StimulationId_Train</DefaultValue> + <Value>OVTK_StimulationId_Train</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> + <Name>Filename to save configuration to</Name> + <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> + <Value>$var{Directory}/$var{Model Filename}</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> + <Name>Multiclass strategy to apply</Name> + <DefaultValue>Native</DefaultValue> + <Value>Native</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 1 label</Name> + <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> + <Value>OVTK_StimulationId_Label_01</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 2 label</Name> + <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> + <Value>OVTK_StimulationId_Label_02</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 3 label</Name> + <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> + <Value>OVTK_StimulationId_Label_03</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 4 label</Name> + <DefaultValue>OVTK_StimulationId_Label_04</DefaultValue> + <Value>OVTK_StimulationId_Label_04</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> + <Name>Algorithm to use</Name> + <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> + <Value>Linear Discrimimant Analysis (LDA)</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Number of partitions for k-fold cross-validation test</Name> + <DefaultValue>10</DefaultValue> + <Value>10</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Use shrinkage</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Shrinkage coefficient (-1 == auto)</Name> + <DefaultValue>-1.000000</DefaultValue> + <Value>-1.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Shrinkage: Force diagonal cov (DDA)</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Randomize k-fold cross-validation test data</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Balance classes</Name> + <DefaultValue>false</DefaultValue> + <Value>true</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>512</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>656</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0xac393893, 0x25854082)</Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>7</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>3</Value> + </Attribute> + <Attribute> + <Identifier>(0xfba64161, 0x65304e21)</Identifier> + <Value></Value> + </Attribute> + </Attributes> + </Box> <Box> <Identifier>(0x00003577, 0x00001a8d)</Identifier> <Name>Timeout</Name> @@ -601,170 +766,6 @@ </Attribute> </Attributes> </Box> - <Box> - <Identifier>(0x00005062, 0x000009d6)</Identifier> - <Name>Classifier trainer</Name> - <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> - <Inputs> - <Input> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Stimulations</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 1</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 2</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 3</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 4</Name> - </Input> - </Inputs> - <Outputs> - <Output> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Train-completed Flag</Name> - </Output> - </Outputs> - <Settings> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Train trigger</Name> - <DefaultValue>OVTK_StimulationId_Train</DefaultValue> - <Value>OVTK_StimulationId_Train</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> - <Name>Filename to save configuration to</Name> - <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> - <Value>$var{Directory}/$var{Model Filename}</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> - <Name>Multiclass strategy to apply</Name> - <DefaultValue>Native</DefaultValue> - <Value>Native</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 1 label</Name> - <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> - <Value>OVTK_StimulationId_Label_01</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 2 label</Name> - <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> - <Value>OVTK_StimulationId_Label_02</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 3 label</Name> - <DefaultValue>OVTK_StimulationId_Label_03</DefaultValue> - <Value>OVTK_StimulationId_Label_03</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 4 label</Name> - <DefaultValue>OVTK_StimulationId_Label_04</DefaultValue> - <Value>OVTK_StimulationId_Label_04</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> - <Name>Algorithm to use</Name> - <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> - <Value>Linear Discrimimant Analysis (LDA)</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Use shrinkage</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Shrinkage coefficient (-1 == auto)</Name> - <DefaultValue>-1.000000</DefaultValue> - <Value>-1</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Shrinkage: Force diagonal cov (DDA)</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Shrinkage: Force diagonal cov (DDA)(1)</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Balance classes</Name> - <DefaultValue>false</DefaultValue> - <Value>true</Value> - <Modifiability>false</Modifiability> - </Setting> - </Settings> - <Attributes> - <Attribute> - <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>496</Value> - </Attribute> - <Attribute> - <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>656</Value> - </Attribute> - <Attribute> - <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x9de21779, 0x37776c89)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier> - <Value>(0x00000000, 0x0177ec55)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier> - <Value>false</Value> - </Attribute> - <Attribute> - <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> - <Value>1</Value> - </Attribute> - <Attribute> - <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>6</Value> - </Attribute> - <Attribute> - <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> - <Value>3</Value> - </Attribute> - <Attribute> - <Identifier>(0xfba64161, 0x65304e21)</Identifier> - <Value></Value> - </Attribute> - </Attributes> - </Box> <Box> <Identifier>(0x00005607, 0x00006ea5)</Identifier> <Name>Player Controller</Name> @@ -1162,14 +1163,14 @@ </Target> </Link> <Link> - <Identifier>(0x000015b4, 0x00003fc7)</Identifier> + <Identifier>(0x00001d61, 0x00000587)</Identifier> <Source> - <BoxIdentifier>(0x000044b9, 0x00003dae)</BoxIdentifier> + <BoxIdentifier>(0x00002886, 0x00006c02)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x00005062, 0x000009d6)</BoxIdentifier> - <BoxInputIndex>4</BoxInputIndex> + <BoxIdentifier>(0x00005607, 0x00006ea5)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> </Target> </Link> <Link> @@ -1183,28 +1184,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x0000253c, 0x000007cd)</Identifier> - <Source> - <BoxIdentifier>(0x00005062, 0x000009d6)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x00005607, 0x00006ea5)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> - <Link> - <Identifier>(0x000025d0, 0x00004e62)</Identifier> - <Source> - <BoxIdentifier>(0x000044b9, 0x00003dad)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x00005062, 0x000009d6)</BoxIdentifier> - <BoxInputIndex>3</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x0000267f, 0x0000556d)</Identifier> <Source> @@ -1239,14 +1218,25 @@ </Target> </Link> <Link> - <Identifier>(0x000046df, 0x00001885)</Identifier> + <Identifier>(0x000040f9, 0x0000311f)</Identifier> <Source> - <BoxIdentifier>(0x00003577, 0x00001a8d)</BoxIdentifier> + <BoxIdentifier>(0x000044b9, 0x00003dab)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x00005062, 0x000009d6)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> + <BoxIdentifier>(0x00002886, 0x00006c02)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> + </Target> + </Link> + <Link> + <Identifier>(0x00004323, 0x000039c5)</Identifier> + <Source> + <BoxIdentifier>(0x000044b9, 0x00003dad)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x00002886, 0x00006c02)</BoxIdentifier> + <BoxInputIdentifier>(0xca023fe4, 0x55147ae5)</BoxInputIdentifier> </Target> </Link> <Link> @@ -1261,14 +1251,14 @@ </Target> </Link> <Link> - <Identifier>(0x00004acb, 0x000025a9)</Identifier> + <Identifier>(0x0000609e, 0x000012c3)</Identifier> <Source> - <BoxIdentifier>(0x000044b9, 0x00003dac)</BoxIdentifier> + <BoxIdentifier>(0x00003577, 0x00001a8d)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x00005062, 0x000009d6)</BoxIdentifier> - <BoxInputIndex>2</BoxInputIndex> + <BoxIdentifier>(0x00002886, 0x00006c02)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> </Target> </Link> <Link> @@ -1293,6 +1283,17 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x00006beb, 0x000036da)</Identifier> + <Source> + <BoxIdentifier>(0x000044b9, 0x00003dac)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x00002886, 0x00006c02)</BoxIdentifier> + <BoxInputIndex>2</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00006fb3, 0x00007389)</Identifier> <Source> @@ -1316,14 +1317,14 @@ </Target> </Link> <Link> - <Identifier>(0x00007b2f, 0x00001c30)</Identifier> + <Identifier>(0x00007aa2, 0x00004f74)</Identifier> <Source> - <BoxIdentifier>(0x000044b9, 0x00003dab)</BoxIdentifier> + <BoxIdentifier>(0x000044b9, 0x00003dae)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x00005062, 0x000009d6)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> + <BoxIdentifier>(0x00002886, 0x00006c02)</BoxIdentifier> + <BoxInputIdentifier>(0x1f5ae7f1, 0xf17cdbcb)</BoxInputIdentifier> </Target> </Link> </Links> diff --git a/plugins/processing/riemannian/bci-examples/1.2-Riemann-Classic-SAMPLE-Training.xml b/plugins/processing/riemannian/bci-examples/1.2-Riemann-Classic-SAMPLE-Training.xml index 894b5fd251c074fb94c10497892b8387ab83ea87..c6c7519bb076b5a9b4375049337c074e1d95e9f1 100644 --- a/plugins/processing/riemannian/bci-examples/1.2-Riemann-Classic-SAMPLE-Training.xml +++ b/plugins/processing/riemannian/bci-examples/1.2-Riemann-Classic-SAMPLE-Training.xml @@ -1,7 +1,7 @@ <OpenViBE-Scenario> <FormatVersion>2</FormatVersion> <Creator>OpenViBE Designer</Creator> - <CreatorVersion>3.2.0</CreatorVersion> + <CreatorVersion>3.6.0</CreatorVersion> <Settings> <Setting> <Identifier>(0x0028f139, 0x9f535b8a)</Identifier> @@ -274,60 +274,127 @@ </Attributes> </Box> <Box> - <Identifier>(0x000044b9, 0x00003dab)</Identifier> - <Name>Tangent Space</Name> - <AlgorithmClassIdentifier>(0x7c265dba, 0x202c1f70)</AlgorithmClassIdentifier> + <Identifier>(0x000031c9, 0x00002c17)</Identifier> + <Name>Classifier trainer</Name> + <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> <Inputs> <Input> - <TypeIdentifier>(0x544a003e, 0x6dcba5f6)</TypeIdentifier> - <Name>Input Covariance Matrix</Name> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Stimulations</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 1</Name> + </Input> + <Input> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Features for class 2</Name> </Input> </Inputs> <Outputs> <Output> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Output Feature Vector</Name> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Train-completed Flag</Name> </Output> </Outputs> <Settings> <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Tangent Space</Name> - <DefaultValue>true</DefaultValue> - <Value>true</Value> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Train trigger</Name> + <DefaultValue>OVTK_StimulationId_Train</DefaultValue> + <Value>OVTK_StimulationId_Train</Value> <Modifiability>false</Modifiability> </Setting> <Setting> <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> - <Name>Filename to Reference Matrix (CSV, empty for Identity)</Name> - <DefaultValue>${Player_ScenarioDirectory}/Mean.csv</DefaultValue> - <Value>$var{Directory}/$var{Mean}</Value> + <Name>Filename to save configuration to</Name> + <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> + <Value>$var{Directory}/$var{Model Filename}</Value> <Modifiability>false</Modifiability> </Setting> <Setting> - <TypeIdentifier>(0xa88b3667, 0x0871638c)</TypeIdentifier> - <Name>Log Level</Name> - <DefaultValue>Information</DefaultValue> - <Value>$var{Log Level}</Value> + <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> + <Name>Multiclass strategy to apply</Name> + <DefaultValue>Native</DefaultValue> + <Value>Native</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 1 label</Name> + <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> + <Value>$var{Stimulation Class 1}</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Class 2 label</Name> + <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> + <Value>$var{Stimulation Class 2}</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> + <Name>Algorithm to use</Name> + <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> + <Value>Linear Discrimimant Analysis (LDA)</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Number of partitions for k-fold cross-validation test</Name> + <DefaultValue>10</DefaultValue> + <Value>10</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Use shrinkage</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> + <Name>Shrinkage coefficient (-1 == auto)</Name> + <DefaultValue>-1.000000</DefaultValue> + <Value>-1.000000</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Shrinkage: Force diagonal cov (DDA)</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Randomize k-fold cross-validation test data</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Balance classes</Name> + <DefaultValue>false</DefaultValue> + <Value>true</Value> <Modifiability>false</Modifiability> </Setting> </Settings> <Attributes> <Attribute> <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>704</Value> + <Value>768</Value> </Attribute> <Attribute> <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>784</Value> + <Value>912</Value> </Attribute> <Attribute> <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0xbfd23954, 0x40c20e2d)</Value> - </Attribute> - <Attribute> - <Identifier>(0x666fffff, 0x666fffff)</Identifier> - <Value></Value> + <Value>(0xac393893, 0x25854082)</Value> </Attribute> <Attribute> <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> @@ -335,16 +402,20 @@ </Attribute> <Attribute> <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>3</Value> + <Value>7</Value> </Attribute> <Attribute> <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> - <Value>1</Value> + <Value>3</Value> + </Attribute> + <Attribute> + <Identifier>(0xfba64161, 0x65304e21)</Identifier> + <Value></Value> </Attribute> </Attributes> </Box> <Box> - <Identifier>(0x000044b9, 0x00003dac)</Identifier> + <Identifier>(0x000044b9, 0x00003dab)</Identifier> <Name>Tangent Space</Name> <AlgorithmClassIdentifier>(0x7c265dba, 0x202c1f70)</AlgorithmClassIdentifier> <Inputs> @@ -389,7 +460,7 @@ </Attribute> <Attribute> <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>1040</Value> + <Value>784</Value> </Attribute> <Attribute> <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> @@ -414,128 +485,60 @@ </Attributes> </Box> <Box> - <Identifier>(0x00005062, 0x000009d7)</Identifier> - <Name>Classifier trainer</Name> - <AlgorithmClassIdentifier>(0xf3dae8a8, 0x3b444154)</AlgorithmClassIdentifier> + <Identifier>(0x000044b9, 0x00003dac)</Identifier> + <Name>Tangent Space</Name> + <AlgorithmClassIdentifier>(0x7c265dba, 0x202c1f70)</AlgorithmClassIdentifier> <Inputs> <Input> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Stimulations</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 1</Name> - </Input> - <Input> - <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> - <Name>Features for class 2</Name> + <TypeIdentifier>(0x544a003e, 0x6dcba5f6)</TypeIdentifier> + <Name>Input Covariance Matrix</Name> </Input> </Inputs> <Outputs> <Output> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Train-completed Flag</Name> + <TypeIdentifier>(0x17341935, 0x152ff448)</TypeIdentifier> + <Name>Output Feature Vector</Name> </Output> </Outputs> <Settings> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Train trigger</Name> - <DefaultValue>OVTK_StimulationId_Train</DefaultValue> - <Value>OVTK_StimulationId_Train</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> - <Name>Filename to save configuration to</Name> - <DefaultValue>${Path_UserData}/my-classifier.xml</DefaultValue> - <Value>$var{Directory}/$var{Model Filename}</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xbe9eba5c, 0xa8415d37)</TypeIdentifier> - <Name>Multiclass strategy to apply</Name> - <DefaultValue>Native</DefaultValue> - <Value>Native</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 1 label</Name> - <DefaultValue>OVTK_StimulationId_Label_01</DefaultValue> - <Value>$var{Stimulation Class 1}</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Class 2 label</Name> - <DefaultValue>OVTK_StimulationId_Label_02</DefaultValue> - <Value>$var{Stimulation Class 2}</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0xd765a736, 0xed708c65)</TypeIdentifier> - <Name>Algorithm to use</Name> - <DefaultValue>Linear Discrimimant Analysis (LDA)</DefaultValue> - <Value>Linear Discrimimant Analysis (LDA)</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Use shrinkage</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Shrinkage coefficient (-1 == auto)</Name> - <DefaultValue>-1.000000</DefaultValue> - <Value>-1</Value> - <Modifiability>false</Modifiability> - </Setting> <Setting> <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Shrinkage: Force diagonal cov (DDA)</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> + <Name>Tangent Space</Name> + <DefaultValue>true</DefaultValue> + <Value>true</Value> <Modifiability>false</Modifiability> </Setting> <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Shrinkage: Force diagonal cov (DDA)(1)</Name> - <DefaultValue>false</DefaultValue> - <Value>false</Value> + <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> + <Name>Filename to Reference Matrix (CSV, empty for Identity)</Name> + <DefaultValue>${Player_ScenarioDirectory}/Mean.csv</DefaultValue> + <Value>$var{Directory}/$var{Mean}</Value> <Modifiability>false</Modifiability> </Setting> <Setting> - <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> - <Name>Balance classes</Name> - <DefaultValue>false</DefaultValue> - <Value>true</Value> + <TypeIdentifier>(0xa88b3667, 0x0871638c)</TypeIdentifier> + <Name>Log Level</Name> + <DefaultValue>Information</DefaultValue> + <Value>$var{Log Level}</Value> <Modifiability>false</Modifiability> </Setting> </Settings> <Attributes> <Attribute> <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>768</Value> + <Value>704</Value> </Attribute> <Attribute> <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>912</Value> + <Value>1040</Value> </Attribute> <Attribute> <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x9de21779, 0x37776c89)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc46b3d00, 0x3e0454e1)</Identifier> - <Value>(0x00000000, 0x0177ec55)</Value> + <Value>(0xbfd23954, 0x40c20e2d)</Value> </Attribute> <Attribute> - <Identifier>(0xc73e83ec, 0xf855c5bc)</Identifier> - <Value>false</Value> + <Identifier>(0x666fffff, 0x666fffff)</Identifier> + <Value></Value> </Attribute> <Attribute> <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> @@ -543,15 +546,11 @@ </Attribute> <Attribute> <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>6</Value> - </Attribute> - <Attribute> - <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> <Value>3</Value> </Attribute> <Attribute> - <Identifier>(0xfba64161, 0x65304e21)</Identifier> - <Value></Value> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>1</Value> </Attribute> </Attributes> </Box> @@ -1331,6 +1330,17 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x000017d7, 0x0000038c)</Identifier> + <Source> + <BoxIdentifier>(0x000044b9, 0x00003dab)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000031c9, 0x00002c17)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x000021ff, 0x00006e10)</Identifier> <Source> @@ -1365,36 +1375,36 @@ </Target> </Link> <Link> - <Identifier>(0x00004927, 0x000042c3)</Identifier> + <Identifier>(0x00003c45, 0x000039ee)</Identifier> <Source> - <BoxIdentifier>(0x000044b9, 0x00003dab)</BoxIdentifier> + <BoxIdentifier>(0x000031c9, 0x00002c17)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x000078f6, 0x0000791d)</BoxIdentifier> + <BoxIdentifier>(0x00005607, 0x00006ea6)</BoxIdentifier> <BoxInputIndex>0</BoxInputIndex> </Target> </Link> <Link> - <Identifier>(0x00004eb1, 0x000045d0)</Identifier> + <Identifier>(0x00004927, 0x000042c3)</Identifier> <Source> - <BoxIdentifier>(0x1396fde6, 0x1c649749)</BoxIdentifier> + <BoxIdentifier>(0x000044b9, 0x00003dab)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x1f046833, 0x21a8a876)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> + <BoxIdentifier>(0x000078f6, 0x0000791d)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> </Target> </Link> <Link> - <Identifier>(0x00005363, 0x00001229)</Identifier> + <Identifier>(0x00004eb1, 0x000045d0)</Identifier> <Source> - <BoxIdentifier>(0x00005062, 0x000009d7)</BoxIdentifier> + <BoxIdentifier>(0x1396fde6, 0x1c649749)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x00005607, 0x00006ea6)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> + <BoxIdentifier>(0x1f046833, 0x21a8a876)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> </Target> </Link> <Link> @@ -1420,13 +1430,13 @@ </Target> </Link> <Link> - <Identifier>(0x00005bee, 0x00000d2a)</Identifier> + <Identifier>(0x0000632b, 0x00005f3c)</Identifier> <Source> <BoxIdentifier>(0x1f046833, 0x21a8a876)</BoxIdentifier> <BoxOutputIndex>1</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x00005062, 0x000009d7)</BoxIdentifier> + <BoxIdentifier>(0x000031c9, 0x00002c17)</BoxIdentifier> <BoxInputIndex>0</BoxInputIndex> </Target> </Link> @@ -1441,17 +1451,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x00006c36, 0x000012e4)</Identifier> - <Source> - <BoxIdentifier>(0x000044b9, 0x00003dac)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x00005062, 0x000009d7)</BoxIdentifier> - <BoxInputIndex>2</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x00007095, 0x000016f0)</Identifier> <Source> @@ -1486,14 +1485,14 @@ </Target> </Link> <Link> - <Identifier>(0x00007e87, 0x00001ca6)</Identifier> + <Identifier>(0x00007fca, 0x000067e7)</Identifier> <Source> - <BoxIdentifier>(0x000044b9, 0x00003dab)</BoxIdentifier> + <BoxIdentifier>(0x000044b9, 0x00003dac)</BoxIdentifier> <BoxOutputIndex>0</BoxOutputIndex> </Source> <Target> - <BoxIdentifier>(0x00005062, 0x000009d7)</BoxIdentifier> - <BoxInputIndex>1</BoxInputIndex> + <BoxIdentifier>(0x000031c9, 0x00002c17)</BoxIdentifier> + <BoxInputIndex>2</BoxInputIndex> </Target> </Link> <Link> diff --git a/plugins/processing/signal-processing/CMakeLists.txt b/plugins/processing/signal-processing/CMakeLists.txt index f916dd60e779141fb64271b0a112a02d877d0b5d..cc809d78dc2803a055085c503aaa5338b294da5f 100755 --- a/plugins/processing/signal-processing/CMakeLists.txt +++ b/plugins/processing/signal-processing/CMakeLists.txt @@ -13,6 +13,7 @@ target_link_libraries(${PROJECT_NAME} openvibe-module-eigen Boost::boost Eigen3::Eigen + fftw3 ) target_include_directories(${PROJECT_NAME} @@ -35,13 +36,13 @@ include_directories("../../../contrib/packages/wavelet2d") add_definitions(-D_USE_MATH_DEFINES) -# --------------------------------- -include("FindThirdPartyFFTW3") # used by the wavelet library - if(OV_COMPILE_TESTS) ADD_SUBDIRECTORY("test") endif(OV_COMPILE_TESTS) +file(COPY signals/ DESTINATION ${BUILD_DATADIR}/scenarios/signals) +file(COPY box-tutorials/ DESTINATION ${BUILD_DATADIR}/scenarios/box-tutorials) + # ----------------------------- # Install files # ----------------------------- diff --git a/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_PulseRateCalculator.dox-part b/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_PulseRateCalculator.dox-part new file mode 100644 index 0000000000000000000000000000000000000000..f637ef7b16f86c4c9bd487408d33ed69a877f26e --- /dev/null +++ b/plugins/processing/signal-processing/doc/Doc_BoxAlgorithm_PulseRateCalculator.dox-part @@ -0,0 +1,66 @@ +/** + * \page BoxAlgorithm_PulseRateCalculator Pulse Rate Calculator +__________________________________________________________________ + +Detailed description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_PulseRateCalculator_Description| + + * |OVP_DocEnd_BoxAlgorithm_PulseRateCalculator_Description| +__________________________________________________________________ + +Inputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_PulseRateCalculator_Inputs| + * |OVP_DocEnd_BoxAlgorithm_PulseRateCalculator_Inputs| + + * |OVP_DocBegin_BoxAlgorithm_PulseRateCalculator_Input1| + The input PPG signal. + * |OVP_DocEnd_BoxAlgorithm_PulseRateCalculator_Input1| +__________________________________________________________________ + +Outputs description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_PulseRateCalculator_Outputs| + * |OVP_DocEnd_BoxAlgorithm_PulseRateCalculator_Outputs| + + * |OVP_DocBegin_BoxAlgorithm_PulseRateCalculator_Output1| + The pulse rate variability corresponding to the input signal, in milliseconds. + * |OVP_DocEnd_BoxAlgorithm_PulseRateCalculator_Output1| + * |OVP_DocBegin_BoxAlgorithm_PulseRateCalculator_Output2| + Stimulations corresponding to the subject's heart beats: when the signal starts to decrease right after + a peak corresponding to a heart beat, a stimulation is sent (OVTK_StimulationId_Label_00). Stimulations can also be sent to indicate the algorithm's + false positives and false negatives. + - False positive: this happens when a peak is identified as a heart beat when it was actually not (usualy the P-peak of the PQRST complex). + The algorithm detects such a peak when it notices another peak (the actual R peak), higher than the "false one", very close to it + (such close that two healthy human heart beats could not have been that close). When that happens, the smallest of the + two peaks is removed and a stimulation is sent (OVTK_StimulationId_Label_01). + - False negative: this happens when an actual heart beat is not detected because its amplitude is lower than expected + (due to a quick drop in the signal amplitude). When a peak is detected, the algorithm predicts when the next peak should + be, and if there is no peak around that time, the algorithm concludes that a peak was missed, so it registers one and + sends a stimulation (OVTK_StimulationId_Label_00). + * |OVP_DocEnd_BoxAlgorithm_PulseRateCalculator_Output2| +__________________________________________________________________ + +Settings description +__________________________________________________________________ + + * |OVP_DocBegin_BoxAlgorithm_PulseRateCalculator_Settings| + * |OVP_DocEnd_BoxAlgorithm_PulseRateCalculator_Settings| + + * |OVP_DocBegin_BoxAlgorithm_PulseRateCalculator_Setting1| + A time window of n seconds means that at any point in time, only the last n seconds of signal will be used + to compute the average interbeat interval of the subject (which is used to track and correct errors in the peak detection algorithm). + The shorter the time window, the less impact rapid interbeat interval changes in the input signal will have on the PRV calculation. + Note that a Time Window parameter set to a value lower than twice the subject's interbeat interval will result in incoherent + results, as the algorithm needs at least two intervals for the false peaks detetection to work properly. + Setting it to 5 seconds or more should be safe for most subjects. + * |OVP_DocEnd_BoxAlgorithm_PulseRateCalculator_Setting1| + + * |OVP_DocBegin_BoxAlgorithm_PulseRateCalculator_Setting2| + Choose whether or not you want the box to send stimulations when heart beats are detected. + * |OVP_DocEnd_BoxAlgorithm_PulseRateCalculator_Setting2| + */ diff --git a/plugins/processing/signal-processing/src/algorithms/basic/spectrumTools.cpp b/plugins/processing/signal-processing/src/algorithms/basic/spectrumTools.cpp index a7ed6e413eeae2c8b01a41bef93a6b2eb463ea36..1b05e34a7806dddb89f3465899eb4c1da06fdfaa 100644 --- a/plugins/processing/signal-processing/src/algorithms/basic/spectrumTools.cpp +++ b/plugins/processing/signal-processing/src/algorithms/basic/spectrumTools.cpp @@ -25,7 +25,7 @@ #include <cmath> #include <complex> #include <iostream> -#include <omp.h> +//#include <omp.h> #include <Eigen/Dense> #include <Eigen/Core> diff --git a/plugins/processing/signal-processing/src/algorithms/connectivity/connectivityMeasure.hpp b/plugins/processing/signal-processing/src/algorithms/connectivity/connectivityMeasure.hpp index 2207e37150ecb390aa1178a178db04f1f1c167c6..14f9a23ab18600367aba8326441fa8484dbc81a2 100644 --- a/plugins/processing/signal-processing/src/algorithms/connectivity/connectivityMeasure.hpp +++ b/plugins/processing/signal-processing/src/algorithms/connectivity/connectivityMeasure.hpp @@ -266,7 +266,6 @@ private: int m_windowLength = 128; // size of one Welch window (samples) int m_windowOverlap = 50; // overlap btw windows (%) int m_windowOverlapSamples = 64; - int m_nbWindows = 8; // Burg Specific... int m_autoRegOrder = 11; diff --git a/plugins/processing/signal-processing/src/box-algorithms/CBoxAlgorithmInverse_DWT.cpp b/plugins/processing/signal-processing/src/box-algorithms/CBoxAlgorithmInverse_DWT.cpp index 1f56ded64ef55c3eda71c35ac2429c72106d434c..a506aceb5e6c9dfac18235b438ebead12bc72623 100644 --- a/plugins/processing/signal-processing/src/box-algorithms/CBoxAlgorithmInverse_DWT.cpp +++ b/plugins/processing/signal-processing/src/box-algorithms/CBoxAlgorithmInverse_DWT.cpp @@ -15,158 +15,156 @@ namespace SignalProcessing { bool CBoxAlgorithmInverse_DWT::initialize() { - const size_t nInput = this->getStaticBoxContext().getInputCount(); - m_algoInfoDecoder.initialize(*this, 0); + const size_t nInput = this->getStaticBoxContext().getInputCount(); + m_algoInfoDecoder.initialize(*this, 0); - m_waveletType = CString(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0)).toASCIIString(); - m_decompositionLevel = CString(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1)).toASCIIString(); + m_waveletType = CString(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0)).toASCIIString(); + m_decompositionLevel = CString(FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1)).toASCIIString(); - m_algoXDecoder = new Toolkit::TSignalDecoder<CBoxAlgorithmInverse_DWT> [nInput]; + m_algoXDecoder = new Toolkit::TSignalDecoder<CBoxAlgorithmInverse_DWT> [nInput]; - for (size_t o = 0; o < nInput - 1; ++o) { m_algoXDecoder[o].initialize(*this, o + 1); } + for (size_t o = 0; o < nInput - 1; ++o) { m_algoXDecoder[o].initialize(*this, o + 1); } - m_encoder.initialize(*this, 0); - return true; + m_encoder.initialize(*this, 0); + return true; } bool CBoxAlgorithmInverse_DWT::uninitialize() { - const size_t nInput = this->getStaticBoxContext().getInputCount(); + const size_t nInput = this->getStaticBoxContext().getInputCount(); - m_algoInfoDecoder.uninitialize(); + m_algoInfoDecoder.uninitialize(); - for (size_t o = 0; o < nInput - 1; ++o) { m_algoXDecoder[o].uninitialize(); } - delete[] m_algoXDecoder; + for (size_t o = 0; o < nInput - 1; ++o) { m_algoXDecoder[o].uninitialize(); } + delete[] m_algoXDecoder; - m_encoder.uninitialize(); + m_encoder.uninitialize(); - return true; + return true; } bool CBoxAlgorithmInverse_DWT::processInput(const size_t /*index*/) { - Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); - //Check if all inputs have some information to decode - - bool readyToProcess = true; - for (size_t i = 0; i < this->getStaticBoxContext().getInputCount(); ++i) { - readyToProcess &= (boxContext.getInputChunkCount(i) == 1); - } - - if (readyToProcess) { - getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); - } - return true; + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + //Check if all inputs have some information to decode + + bool readyToProcess = true; + for (size_t i = 0; i < this->getStaticBoxContext().getInputCount(); ++i) { + readyToProcess &= (boxContext.getInputChunkCount(i) == 1); + } + + if (readyToProcess) { + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + } + return true; } bool CBoxAlgorithmInverse_DWT::process() { - // the dynamic box context describes the current state of the box inputs and outputs (i.e. the chunks) - Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); - - // size_t J = std::atoi(m_decompositionLevel); - const size_t nInput = this->getStaticBoxContext().getInputCount(); - - std::vector<size_t> nChannels(nInput); - std::vector<size_t> nSamples(nInput); - - size_t flagReceveid = 0; - std::vector<std::vector<double>> flag; - std::vector<std::vector<size_t>> length; - //Decode the first input (Informations) - for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) { - m_algoInfoDecoder.decode(i); - - if(m_algoInfoDecoder.isBufferReceived()) { - - nChannels[0] = m_algoInfoDecoder.getOutputMatrix()->getDimensionSize(0); - nSamples[0] = m_algoInfoDecoder.getOutputMatrix()->getDimensionSize(1); - - const double* buffer = m_algoInfoDecoder.getOutputMatrix()->getBuffer(); - - length.resize(nChannels[0]); - flag.resize(nChannels[0]); - - for (size_t j = 0; j < nChannels[0]; ++j) { - size_t f = 0; - for (size_t l = 0; l < size_t(buffer[0]); ++l) { - length[j].push_back(size_t(buffer[l + 1])); - f = l; - } - for (size_t l = 0; l < size_t(buffer[f + 2]); ++l) { flag[j].push_back(std::floor(buffer[f + 3 + l])); } - } - } - } - - static int numBuff = 0; - //If Informations is decoded - std::vector<std::vector<double>> dwtop; - std::vector<std::vector<double>> idwtOutput; - //Decode each decomposition level - for (size_t o = 0; o < nInput - 1; ++o) { - //Decode data of channels - for (size_t i = 0; i < boxContext.getInputChunkCount(o + 1); ++i) { - m_algoXDecoder[o].decode(i); - if (m_algoXDecoder[o].isBufferReceived()) { - nChannels[o + 1] = m_algoXDecoder[o].getOutputMatrix()->getDimensionSize(0); - nSamples[o + 1] = m_algoXDecoder[o].getOutputMatrix()->getDimensionSize(1); - const double *buffer = m_algoXDecoder[o].getOutputMatrix()->getBuffer(); - - //dwtop is the dwt coefficients - dwtop.resize(nChannels[0]); - - //Store input data (dwt coefficients) in just one vector (dwtop) - for (size_t j = 0; j < nChannels[0]; ++j) { - for (size_t k = 0; k < nSamples[o + 1]; ++k) { - dwtop[j].push_back(buffer[k + j * nSamples[o + 1]]); - } - } - - //Check if received informations about dwt box are coherent with inverse dwt box settings - if (!length[0].empty() && o == nInput - 2) { - //Check if quantity of samples received are the same - if (length[0].at(nInput - 1) == dwtop[0].size()) { - //Resize idwt vector - idwtOutput.resize(nChannels[0]); - - //Calculate idwt for each channel - for (size_t j = 0; j < nChannels[0]; ++j) { - idwt(dwtop[j], flag[j], m_waveletType, idwtOutput[j], length[j]); - } - - //Only first time : - if (!m_hasHeader) { - m_encoder.getInputSamplingRate() = 2 * m_algoXDecoder[o].getOutputSamplingRate(); - m_encoder.getInputMatrix()->resize(nChannels[0], length[0].at(nInput - 1)); - - for (size_t j = 0; j < nChannels[0]; j++) { - m_encoder.getInputMatrix()->setDimensionLabel(0, j, m_algoXDecoder[o].getOutputMatrix()->getDimensionLabel(0, j)); - } - - m_encoder.encodeHeader(); - boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(o, i), boxContext.getInputChunkEndTime(o, i)); - m_hasHeader = true; - } - - //Encode resultant signal to output - for (size_t j = 0; j < nChannels[0]; ++j) { - for (size_t k = 0; k < size_t(idwtOutput[j].size()); ++k) { - m_encoder.getInputMatrix()->getBuffer()[k + j * size_t(idwtOutput[j].size())] = idwtOutput[j][k]; - } - } - - m_encoder.encodeBuffer(); - boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(o, i), boxContext.getInputChunkEndTime(o, i)); - } - } - } - } - } - return true; + // the dynamic box context describes the current state of the box inputs and outputs (i.e. the chunks) + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + // size_t J = std::atoi(m_decompositionLevel); + const size_t nInput = this->getStaticBoxContext().getInputCount(); + + std::vector<size_t> nChannels(nInput); + std::vector<size_t> nSamples(nInput); + + std::vector<std::vector<double>> flag; + std::vector<std::vector<size_t>> length; + //Decode the first input (Informations) + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) { + m_algoInfoDecoder.decode(i); + + if(m_algoInfoDecoder.isBufferReceived()) { + + nChannels[0] = m_algoInfoDecoder.getOutputMatrix()->getDimensionSize(0); + nSamples[0] = m_algoInfoDecoder.getOutputMatrix()->getDimensionSize(1); + + const double* buffer = m_algoInfoDecoder.getOutputMatrix()->getBuffer(); + + length.resize(nChannels[0]); + flag.resize(nChannels[0]); + + for (size_t j = 0; j < nChannels[0]; ++j) { + size_t f = 0; + for (size_t l = 0; l < size_t(buffer[0]); ++l) { + length[j].push_back(size_t(buffer[l + 1])); + f = l; + } + for (size_t l = 0; l < size_t(buffer[f + 2]); ++l) { flag[j].push_back(std::floor(buffer[f + 3 + l])); } + } + } + } + + //If Informations is decoded + std::vector<std::vector<double>> dwtop; + std::vector<std::vector<double>> idwtOutput; + //Decode each decomposition level + for (size_t o = 0; o < nInput - 1; ++o) { + //Decode data of channels + for (size_t i = 0; i < boxContext.getInputChunkCount(o + 1); ++i) { + m_algoXDecoder[o].decode(i); + if (m_algoXDecoder[o].isBufferReceived()) { + nChannels[o + 1] = m_algoXDecoder[o].getOutputMatrix()->getDimensionSize(0); + nSamples[o + 1] = m_algoXDecoder[o].getOutputMatrix()->getDimensionSize(1); + const double *buffer = m_algoXDecoder[o].getOutputMatrix()->getBuffer(); + + //dwtop is the dwt coefficients + dwtop.resize(nChannels[0]); + + //Store input data (dwt coefficients) in just one vector (dwtop) + for (size_t j = 0; j < nChannels[0]; ++j) { + for (size_t k = 0; k < nSamples[o + 1]; ++k) { + dwtop[j].push_back(buffer[k + j * nSamples[o + 1]]); + } + } + + //Check if received informations about dwt box are coherent with inverse dwt box settings + if (!length[0].empty() && o == nInput - 2) { + //Check if quantity of samples received are the same + if (length[0].at(nInput - 1) == dwtop[0].size()) { + //Resize idwt vector + idwtOutput.resize(nChannels[0]); + + //Calculate idwt for each channel + for (size_t j = 0; j < nChannels[0]; ++j) { + idwt(dwtop[j], flag[j], m_waveletType, idwtOutput[j], length[j]); + } + + //Only first time : + if (!m_hasHeader) { + m_encoder.getInputSamplingRate() = 2 * m_algoXDecoder[o].getOutputSamplingRate(); + m_encoder.getInputMatrix()->resize(nChannels[0], length[0].at(nInput - 1)); + + for (size_t j = 0; j < nChannels[0]; j++) { + m_encoder.getInputMatrix()->setDimensionLabel(0, j, m_algoXDecoder[o].getOutputMatrix()->getDimensionLabel(0, j)); + } + + m_encoder.encodeHeader(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(o, i), boxContext.getInputChunkEndTime(o, i)); + m_hasHeader = true; + } + + //Encode resultant signal to output + for (size_t j = 0; j < nChannels[0]; ++j) { + for (size_t k = 0; k < size_t(idwtOutput[j].size()); ++k) { + m_encoder.getInputMatrix()->getBuffer()[k + j * size_t(idwtOutput[j].size())] = idwtOutput[j][k]; + } + } + + m_encoder.encodeBuffer(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(o, i), boxContext.getInputChunkEndTime(o, i)); + } + } + } + } + } + return true; } -#endif } // namespace SignalProcessing } // namespace Plugins -} // namespace OpenViBE +} // namespace OpenViB +#endif diff --git a/plugins/processing/signal-processing/src/box-algorithms/CBoxAlgorithmPulseRateCalculator.cpp b/plugins/processing/signal-processing/src/box-algorithms/CBoxAlgorithmPulseRateCalculator.cpp new file mode 100644 index 0000000000000000000000000000000000000000..0409c2eb1d6a9ee0cd7d2f5eaa1c79606e98b41e --- /dev/null +++ b/plugins/processing/signal-processing/src/box-algorithms/CBoxAlgorithmPulseRateCalculator.cpp @@ -0,0 +1,326 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CBoxAlgorithmPulseRateCalculator.cpp +/// \brief Classes of the Box Pulse Rate Calculator. +/// \author Axel Bouneau (Inria). +/// \version 1.0. +/// \date Tue June 13 16:05:42 2023. +/// \Copyright (C) 2023 Inria +/// +/// This program is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Affero General Public License as published by +/// the Free Software Foundation, either version 3 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Affero General Public License for more details. +/// +/// You should have received a copy of the GNU Affero General Public License +/// along with this program. If not, see <http://www.gnu.org/licenses/>. +/// +///------------------------------------------------------------------------------------------------- + +#include "CBoxAlgorithmPulseRateCalculator.hpp" + +#include <algorithm> + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { + +bool CBoxAlgorithmPulseRateCalculator::initialize() +{ + m_inputDecoder.initialize(*this, 0); + m_outputEncoder.initialize(*this, 0); + m_outputStimEncoder.initialize(*this, 1); + + m_outputEncoder.getInputMatrix().setReferenceTarget(m_inputDecoder.getOutputMatrix()); + m_outputEncoder.getInputSamplingRate().setReferenceTarget(m_inputDecoder.getOutputSamplingRate()); + + m_timeWindow = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + if (m_timeWindow < 2) { + m_timeWindow = 2; + this->getLogManager() << Kernel::LogLevel_Warning << "Time windows shouldn't be shorter than 2 seconds. Time window overwritten to 2 seconds." << "\n"; + } + m_sendStim = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + + this->getLogManager() << Kernel::LogLevel_Info << "Waiting to have some peaks before any calculation.\n"; + + return true; +} +/*******************************************************************************/ + +bool CBoxAlgorithmPulseRateCalculator::uninitialize() +{ + m_inputDecoder.uninitialize(); + m_outputEncoder.uninitialize(); + m_outputStimEncoder.uninitialize(); + + return true; +} +/*******************************************************************************/ + +bool CBoxAlgorithmPulseRateCalculator::processInput(const size_t index) +{ + // some pre-processing code if needed... + m_samplingRate = m_inputDecoder.getOutputSamplingRate(); + // ready to process ! + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + + return true; +} + +/*******************************************************************************/ + + +bool CBoxAlgorithmPulseRateCalculator::process() +{ + // the static box context describes the box inputs, outputs, settings structures + const Kernel::IBox& staticBoxContext = this->getStaticBoxContext(); + + // the dynamic box context describes the current state of the box inputs and outputs (i.e. the chunks) + Kernel::IBoxIO& dynamicBoxContext = this->getDynamicBoxContext(); + m_stimSet = m_outputStimEncoder.getInputStimulationSet(); + + + + for (uint32_t i = 0; i < dynamicBoxContext.getInputChunkCount(0); i++) + { + m_start = dynamicBoxContext.getInputChunkStartTime(0, i); + m_end = dynamicBoxContext.getInputChunkEndTime(0, i); + + // decode the chunk i + m_inputDecoder.decode(i); + + if (m_inputDecoder.isHeaderReceived()) + { + // Pass the header to the next boxes, by encoding a header: + m_outputEncoder.encodeHeader(); + m_outputStimEncoder.encodeHeader(); + } + + if (m_inputDecoder.isBufferReceived()) + { + double threshold = calibrateThreshold(); + + int nbNewPeaks = detectPeaks(threshold); + + calculateInterPeakIntervals(nbNewPeaks); + + m_lastIPIAverage = vectorAverage(m_interPeakIntervals); + + IMatrix* PRVSignal = m_outputEncoder.getInputMatrix(); + for (uint32_t j = 0; j < PRVSignal->getBufferElementCount(); j++) { + if (m_nbSamples > m_samplingRate && m_interPeakIntervals.size() >= 2) { // start outputing signal after 1 second of recording, and only if there are at least 2 intervals + // Take into account not the latest interval but the one before, as the latest one could be due to a false peak that will be removed in the next iteration + PRVSignal->getBuffer()[j] = m_interPeakIntervals[m_interPeakIntervals.size() - 2] * 1000; + } + else { + PRVSignal->getBuffer()[j] = 0; // before 1 second of recording, send a signal with IBI of 0ms + } + } + + m_outputEncoder.encodeBuffer(); + m_outputStimEncoder.encodeBuffer(); + + m_stimSet->clear(); + m_stimSet->resize(0); + } + + if (m_inputDecoder.isEndReceived()) + { + m_outputEncoder.encodeEnd(); + m_outputStimEncoder.encodeEnd(); + } + + dynamicBoxContext.markOutputAsReadyToSend(0, m_start, m_end); + dynamicBoxContext.markOutputAsReadyToSend(1, m_start, m_end); + } // for + + + return true; +} + +double CBoxAlgorithmPulseRateCalculator::calibrateThreshold() +{ + double* inputBuffer = m_inputDecoder.getOutputMatrix()->getBuffer(); + uint32_t inputBufferSize = m_inputDecoder.getOutputMatrix()->getDimensionSize(1); + + for (int i = 0; i < inputBufferSize; i++) { + m_ppgSignal.push_back(inputBuffer[i]); + if (m_ppgSignal.size() > m_samplingRate * 3) { // adapt the threshold to the latest 3 seconds of signal + m_ppgSignal.pop_front(); + } + } + + // The threshold can only be computed after 3 seconds of signal + // to make sure the signal has enough peaks + if (m_ppgSignal.size() < m_samplingRate * 3) { + return std::numeric_limits<double>::max(); + } + + // set the threshold so that 80% of the samples are below it + // so that the threshold will adapt in case of variability in the PPG amplitude + std::deque<double> tmp; + tmp.resize(m_ppgSignal.size()); + std::copy(m_ppgSignal.begin(), m_ppgSignal.end(), tmp.begin()); + std::sort(tmp.begin(), tmp.end()); + double threshold = tmp[(int)tmp.size() * 0.80]; + + return threshold; +} + +int CBoxAlgorithmPulseRateCalculator::detectPeaks(double threshold) { + + double* inputBuffer = m_inputDecoder.getOutputMatrix()->getBuffer(); + uint32_t inputBufferSize = m_inputDecoder.getOutputMatrix()->getDimensionSize(1); + + if (m_nbSamples == 0) { + m_lastValue = inputBuffer[0]; // first sample of the first buffer following the initial threshold calibration + } + + int nbNewPeaks = 0; + + for (int i = 0; i < inputBufferSize; i++) { + + // if there hasn't been a peak for too long, the algorithm must have missed a peak because it was lower than the threshold + // Only valid if at least 3 peaks have been recorded in order to have a decent estimation of the IPI + if (m_nbSamples + i >= m_nextPeakEstimSampleIndexUpperBound && m_peaks.size() >= 3) { + // the last recorded peak is then duplicated, at the date that was estimated + std::pair<uint32_t, double> p = { m_nextPeakEstimSampleIndex, m_peaks.back().second }; + m_peaks.push_back(p); + nbNewPeaks++; + m_nextPeakEstimSampleIndex = m_nextPeakEstimSampleIndex + m_lastIPIAverage * m_samplingRate; + m_nextPeakEstimSampleIndexUpperBound = m_nextPeakEstimSampleIndex + 0.5 * m_lastIPIAverage * m_samplingRate; + + if (m_sendStim) { // if the user wants to have a stimulation for every peak detected + m_stimSet->push_back(OVTK_StimulationId_Label_00, m_start + (m_end - m_start) / inputBufferSize * i, 0); + this->getLogManager() << Kernel::LogLevel_Info << "A peak was probably missed, so the previous one was duplicated" << "\n"; + } + } + + // if signal increasing + if (m_lastValue < inputBuffer[i]) { + m_increasing = true; + } + // if signal decreasing + if (m_lastValue > inputBuffer[i]) { + //if signal was increasing just before and signal above threshold, then it's a peak + if (m_increasing && m_lastValue > threshold) { + std::pair<uint32_t, double> p = { m_nbSamples + i, inputBuffer[i] }; + m_peaks.push_back(p); // add index of current sample to m_peaks + nbNewPeaks++; + + m_nextPeakEstimSampleIndex = m_nbSamples + (i - 1) + m_lastIPIAverage * m_samplingRate; + m_nextPeakEstimSampleIndexUpperBound = m_nextPeakEstimSampleIndex + 0.5 * m_lastIPIAverage * m_samplingRate; + + if (m_sendStim) { // if the user wants to have a stimulation for every peak detected + m_stimSet->push_back(OVTK_StimulationId_Label_00, m_start + (m_end - m_start)/inputBufferSize * i, 0); + } + } + m_increasing = false; + } + m_lastValue = inputBuffer[i]; + } + + m_nbSamples += inputBufferSize; + + // remove the peaks that were recorded more than m_timeWindow seconds ago (and the corresponding intervals) + while (!m_peaks.empty() && m_nbSamples - m_peaks.front().first > m_timeWindow * m_samplingRate) { + m_peaks.pop_front(); + if (!m_interPeakIntervals.empty()) { + m_interPeakIntervals.pop_front(); + } + } + + return nbNewPeaks; + +} + +void CBoxAlgorithmPulseRateCalculator::calculateInterPeakIntervals(int nbNewPeaks) +{ + std::vector<double> interPeakIntervals; + + if (m_peaks.empty() || m_peaks.size() < nbNewPeaks) { + return; + } + + if (m_peaks.size() == nbNewPeaks) { + // if there are as many peaks as new peaks, reduce the number of new peaks by 1 + // for the algorithm to process the intervals + nbNewPeaks--; + } + + // Iterate over the peaks of m_peaks that form new intervals + for (int i = (int)m_peaks.size() - nbNewPeaks - 1; i < (int)m_peaks.size() - 1; i++) { + + // Calculate the inter-peak interval as the difference of the samples they were recorded at + uint32_t nbSamplesBetweenPeaks = m_peaks[i + 1].first - m_peaks[i].first; + + // Convert the inter-peak interval to time + double intervalTime = ((double) nbSamplesBetweenPeaks) / m_samplingRate; + + //If two beats are too close, there must be one false peak (a peak that isn't actually a heart beat) + if (intervalTime < m_lastIPIAverage / 2) { // if a peak is detected less than half the averageIPI away from another peak, it's probably a P or T peak (or an artifact), and should be removed + + double removedPeakDate; + // Remove the smallest peak between i and i+1 (P and T peaks are lower than R peaks) + if (m_peaks[i].second <= m_peaks[i + 1].second) { + // in that case, the interval previously computed between peaks[i-1] and peaks[i] must be replaced by the interval between peaks[i-1] and peaks[i+1] + if (i > 0) { + m_interPeakIntervals[i - 1] = (m_peaks[i + 1].first - m_peaks[i - 1].first) / m_samplingRate; + } + // and peaks[i] is removed + removedPeakDate = m_peaks[i].first / m_samplingRate; + m_peaks.erase(m_peaks.begin() + i); + } + else { + // in that case, the false peak is the one that was just added, so nothing was added to m_interPeakIntervals yet, so nothing to replace + removedPeakDate = m_peaks[i + 1].first / m_samplingRate; + m_peaks.erase(m_peaks.begin() + i + 1); + } + + + + // Send a stimulation to communicate that a peak was removed + if (m_sendStim) { + uint32_t inputBufferSize = m_inputDecoder.getOutputMatrix()->getDimensionSize(1); + m_stimSet->push_back(OVTK_StimulationId_Label_01, m_start + (m_end - m_start) / inputBufferSize * i, 0); + this->getLogManager() << Kernel::LogLevel_Info << "A false peak (recorded at time [" << removedPeakDate << " sec]) was removed" << "\n"; + } + + i--; // Correct the index to account for the removed peak + } + + // If the two peaks are not too close, interpret them as actual heartbeats + else { + // Add the inter-peak interval to the vector + m_interPeakIntervals.push_back(intervalTime); + } + + } + +} + +double CBoxAlgorithmPulseRateCalculator::vectorAverage(const std::deque<double>& interPeakIntervals) +{ + double sum = 0.0; + + for (const double interval : interPeakIntervals) { + sum += interval; + } + + double average = 0.0; + + if (!interPeakIntervals.empty()) { + average = sum / interPeakIntervals.size(); + } + + return average; +} + +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/plugins/processing/signal-processing/src/box-algorithms/CBoxAlgorithmPulseRateCalculator.hpp b/plugins/processing/signal-processing/src/box-algorithms/CBoxAlgorithmPulseRateCalculator.hpp new file mode 100644 index 0000000000000000000000000000000000000000..2d6f26fe323b569a470acae6fef924b351feb92f --- /dev/null +++ b/plugins/processing/signal-processing/src/box-algorithms/CBoxAlgorithmPulseRateCalculator.hpp @@ -0,0 +1,172 @@ +///------------------------------------------------------------------------------------------------- +/// +/// \file CBoxAlgorithmPulseRateCalculator.hpp +/// \brief Classes of the Box Pulse Rate Calculator. +/// \author Axel Bouneau (Inria). +/// \version 1.0. +/// \date Tue June 13 16:05:42 2023. +/// \Copyright (C) 2023 Inria +/// +/// This program is free software: you can redistribute it and/or modify +/// it under the terms of the GNU Affero General Public License as published by +/// the Free Software Foundation, either version 3 of the License, or +/// (at your option) any later version. +/// +/// This program is distributed in the hope that it will be useful, +/// but WITHOUT ANY WARRANTY; without even the implied warranty of +/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +/// GNU Affero General Public License for more details. +/// +/// You should have received a copy of the GNU Affero General Public License +/// along with this program. If not, see <http://www.gnu.org/licenses/>. +/// +///------------------------------------------------------------------------------------------------- + +#pragma once + +#include <queue> +//You may have to change this path to match your folder organisation +#include "../defines.hpp" + +#include <openvibe/ov_all.h> +#include <toolkit/ovtk_all.h> + + +// The unique identifiers for the box and its descriptor. +// Identifier are randomly chosen by the skeleton-generator. +#define OV_AttributeId_Box_FlagIsUnstable OpenViBE::CIdentifier(0x666FFFFF, 0x666FFFFF) + +namespace OpenViBE { +namespace Plugins { +namespace SignalProcessing { +/// <summary> The class CBoxAlgorithmPulseRateCalculator describes the box Pulse Rate Calculator. </summary> +class CBoxAlgorithmPulseRateCalculator final : virtual public Toolkit::TBoxAlgorithm<IBoxAlgorithm> +{ +public: + void release() override { delete this; } + + bool initialize() override; + bool uninitialize() override; + + //Here is the different process callbacks possible + // - On clock ticks : + //bool processClock(Kernel::CMessageClock& msg) override; + // - On new input received (the most common behaviour for signal processing) : + bool processInput(const size_t index) override; + + // If you want to use processClock, you must provide the clock frequency. + //uint64_t getClockFrequency() override; + + bool process() override; + + // As we do with any class in openvibe, we use the macro below to associate this box to an unique identifier. + // The inheritance information is also made available, as we provide the superclass Toolkit::TBoxAlgorithm < IBoxAlgorithm > + _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm<IBoxAlgorithm>, OVP_ClassId_BoxAlgorithm_PulseRateCalculator) + +protected: + // Input decoder: + Toolkit::TSignalDecoder<CBoxAlgorithmPulseRateCalculator> m_inputDecoder; + // Output decoder: + Toolkit::TSignalEncoder<CBoxAlgorithmPulseRateCalculator> m_outputEncoder; + + Toolkit::TStimulationEncoder<CBoxAlgorithmPulseRateCalculator> m_outputStimEncoder; + + +private: + uint64_t m_start = 0; + uint64_t m_end = 0; + + double m_samplingRate = 0.0; + + // Stimulations + const CStimulationSet* m_stimSet = nullptr; + bool m_sendStim = false; + + // Threshold calibration + std::deque<double> m_ppgSignal; // contains the last seconds of the signal, on which the threshold will be based + + // Peak detection + uint32_t m_nbSamples = 0; + + double m_lastValue = 0.0; + bool m_increasing = false; + + int m_timeWindow = 0; + std::deque<std::pair<uint32_t, double>> m_peaks; // contains the timestamps and values peaks recorded less than m_timeWindow ago + + uint64_t m_nextPeakEstimSampleIndex = 0; // The index of the sample that will likely contain the next peak + uint64_t m_nextPeakEstimSampleIndexUpperBound = 0; // The next peak should not have a sample index greater than this + + // IBI and HR calculation + std::deque<double> m_interPeakIntervals; + double m_lastIPIAverage = 0.0; + + // Methods + + /** + * @brief Defines an amplitude threshold according the previous 3 seconds of signal. + * @return The amplitude threshold, that will be used to detect peaks. + */ + double calibrateThreshold(); + + /** + * @brief Populates the m_peaks deque with newly detected peaks, and removes from m_peaks and m_interPeakIntervals the peaks and intervals that were recorded too long ago. + * Some actual peaks might be missed by the algorithm when the threshold is too high, in which case they will be recovered on the next call. + * @param threshold The amplitude of signal above which peaks will be considered as peaks. Any peak detected below that threshold will be discarded. + * @return The number of detected peaks. + */ + int detectPeaks(double threshold); + + /** + * @brief Populates the m_interPeakIntervals queue with the time intervals separating the most recently detected peaks, + * and removes the false peaks (peaks that are too close to another higher peak). + * @param nbNewPeaks The numbers of new peaks that were detected in the detectPeaks method. + */ + void calculateInterPeakIntervals(int nbNewPeaks); + + /** + * @brief Computes the average of the input vector. + * + * @param interPeakIntervals The vector that will be averaged. + * @return The average of the input vector. + */ + double vectorAverage(const std::deque<double>& interPeakIntervals); + + +}; + +/// <summary> Descriptor of the box Pulse Rate Calculator. </summary> +class CBoxAlgorithmPulseRateCalculatorDesc final : virtual public IBoxAlgorithmDesc +{ +public: + void release() override { } + + CString getName() const override { return CString("Pulse Rate Calculator"); } + CString getAuthorName() const override { return CString("Axel Bouneau"); } + CString getAuthorCompanyName() const override { return CString("Inria"); } + CString getShortDescription() const override { return CString("Computes the Pulse Rate Variability (PRV) of a PPG signal"); } + CString getDetailedDescription() const override { return CString("Detects the peaks (corresponding to the subject's pulse) in the PPG signal, in order to compute the pulse rate variability."); } + CString getCategory() const override { return CString("Physio/PPG"); } + CString getVersion() const override { return CString("1.0"); } + CString getStockItemName() const override { return CString("gtk-remove"); } + + CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_PulseRateCalculator; } + IPluginObject* create() override { return new CBoxAlgorithmPulseRateCalculator; } + + bool getBoxPrototype(Kernel::IBoxProto& prototype) const override + { + prototype.addInput("Signal",OV_TypeId_Signal); + + prototype.addOutput("PRV",OV_TypeId_Signal); + prototype.addOutput("Heart beats", OV_TypeId_Stimulations); + + prototype.addSetting("Time window (s)",OV_TypeId_Integer, "12"); + prototype.addSetting("Send stimulation when beat detected", OV_TypeId_Boolean, "false"); + + return true; + } + _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_PulseRateCalculatorDesc) +}; +} // namespace SignalProcessing +} // namespace Plugins +} // namespace OpenViBE diff --git a/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmARCoefficients.cpp b/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmARCoefficients.cpp index ca0fc248b72dea3a34b282211b6c80651b911f7d..8c6d8732591649285a14e3f2db3ff277ce04fb6a 100644 --- a/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmARCoefficients.cpp +++ b/plugins/processing/signal-processing/src/box-algorithms/basic/ovpCBoxAlgorithmARCoefficients.cpp @@ -121,9 +121,12 @@ bool CBoxAlgorithmARCoefficients::process() m_arPsd.resize(m_nbChannels); // vector of channels x fftsize/2+1 m_samplesBuffer.resize(m_nbChannels); // vector of channels x samples + for (size_t idx = 0; idx < m_nbChannels; ++idx) { + m_oSpectrum->setDimensionLabel(0, idx, m_iMatrix->getDimensionLabel(0, idx)); + } + for (size_t idx = 0; idx < m_fftSize/2+1; ++idx) { m_frequencyAbscissa->getBuffer()[idx] = idx * m_sampRate / m_fftSize; - m_oSpectrum->setDimensionLabel(0, idx, m_iMatrix->getDimensionLabel(0, idx)); m_oSpectrum->setDimensionLabel(1, idx, std::to_string((double)(idx * m_sampRate / m_fftSize)).c_str()); } @@ -154,8 +157,8 @@ bool CBoxAlgorithmARCoefficients::process() OV_ERROR_UNLESS_KRF(autoregressiveCoeffsAndPsd(m_samplesBuffer, m_arCoeffs, m_arPsd, m_order, m_fftSize, m_detrend), "AR Burg error", Kernel::ErrorType::BadProcessing); - this->getLogManager() << Kernel::LogLevel_Debug << "Exited powerspectrum.process() : PSD size " << m_arPsd.size() << " x " << m_arPsd[0].size() << "\n"; - this->getLogManager() << Kernel::LogLevel_Debug << "Coeffs size " << m_arCoeffs.size() << " x " << m_arCoeffs[0].size() << "\n"; + this->getLogManager() << Kernel::LogLevel_Debug << "Exited powerspectrum.process() : PSD size " << m_arPsd.size() << " x " << (size_t)m_arPsd[0].size() << "\n"; + this->getLogManager() << Kernel::LogLevel_Debug << "Coeffs size " << m_arCoeffs.size() << " x " << (size_t)m_arCoeffs[0].size() << "\n"; for (size_t j = 0; j < m_nbChannels; ++j) { for (size_t k = 0; k < (m_fftSize/2+1); ++k) { diff --git a/plugins/processing/signal-processing/src/box-algorithms/connectivity/CBoxAlgorithmConnectivityMeasure.cpp b/plugins/processing/signal-processing/src/box-algorithms/connectivity/CBoxAlgorithmConnectivityMeasure.cpp index 815a01822423700417ecd4f2f9acbbe7ea0425cb..f1e863187b5ed27be3f53ba9ea63a7364131ed5b 100644 --- a/plugins/processing/signal-processing/src/box-algorithms/connectivity/CBoxAlgorithmConnectivityMeasure.cpp +++ b/plugins/processing/signal-processing/src/box-algorithms/connectivity/CBoxAlgorithmConnectivityMeasure.cpp @@ -178,7 +178,7 @@ bool CBoxAlgorithmConnectivityMeasure::process() m_vectorXdBuffer[aa] = Eigen::VectorXd::Map(m_signalChannelBuffers[aa].data(), Eigen::Index(m_connectLength)); } this->getLogManager() << Kernel::LogLevel_Debug << "Signal buffers : FULL (" << m_signalChannelBuffers[0].size() << ") / " - << " size of data sent to connectivity algo : " << m_vectorXdBuffer[0].size() << "\n"; + << " size of data sent to connectivity algo : " << (size_t)m_vectorXdBuffer[0].size() << "\n"; // Connectivity chunk overlap for next processing loop: Keep the overlapping part in the vectors, discard the rest for (size_t aa = 0; aa < m_nbChannels; ++aa) { @@ -192,7 +192,7 @@ bool CBoxAlgorithmConnectivityMeasure::process() Kernel::ErrorType::BadProcessing); this->getLogManager() << Kernel::LogLevel_Debug << "Exited connectivityMeasure.process() : connect size " - << connectivityMatrix.size() << " x " << connectivityMatrix[0].rows() << " x " << connectivityMatrix[0].cols() << "\n"; + << (size_t)connectivityMatrix.size() << " x " << (size_t)connectivityMatrix[0].rows() << " x " << (size_t)connectivityMatrix[0].cols() << "\n"; // Convert output matrix (nchan x nchan x fftsize) to matrix (fftsize x nchan x nchan) MatrixConvert(connectivityMatrix, *m_oMatrix, 5); diff --git a/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmDiscreteWaveletTransform.cpp b/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmDiscreteWaveletTransform.cpp index 8cbc6cb453443aca02d93f3977ab5a59a5b5891c..f357bc74dc9c75bdd7e5183ee9356b8cf4b610e3 100644 --- a/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmDiscreteWaveletTransform.cpp +++ b/plugins/processing/signal-processing/src/box-algorithms/ovpCBoxAlgorithmDiscreteWaveletTransform.cpp @@ -17,187 +17,187 @@ namespace SignalProcessing { bool CBoxAlgorithmDiscreteWaveletTransform::initialize() { - const size_t nOutput = this->getStaticBoxContext().getOutputCount(); - m_decoder.initialize(*this, 0); // Signal stream decoder - m_encoder.initialize(*this, 0); // Signal stream encoder + const size_t nOutput = this->getStaticBoxContext().getOutputCount(); + m_decoder.initialize(*this, 0); // Signal stream decoder + m_encoder.initialize(*this, 0); // Signal stream encoder - m_waveletType = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); - m_decompositionLevel = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); + m_waveletType = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); + m_decompositionLevel = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); - for (size_t o = 0; o < nOutput - 1; ++o) { m_encoders.push_back(new Toolkit::TSignalEncoder<CBoxAlgorithmDiscreteWaveletTransform>(*this, o + 1)); } + for (size_t o = 0; o < nOutput - 1; ++o) { m_encoders.push_back(new Toolkit::TSignalEncoder<CBoxAlgorithmDiscreteWaveletTransform>(*this, o + 1)); } - m_infolength = 0; + m_infolength = 0; - return true; + return true; } bool CBoxAlgorithmDiscreteWaveletTransform::uninitialize() { - m_decoder.uninitialize(); - m_encoder.uninitialize(); + m_decoder.uninitialize(); + m_encoder.uninitialize(); - for (auto& elem : m_encoders) { - elem->uninitialize(); - delete elem; - } - m_encoders.clear(); + for (auto& elem : m_encoders) { + elem->uninitialize(); + delete elem; + } + m_encoders.clear(); - return true; + return true; } bool CBoxAlgorithmDiscreteWaveletTransform::processInput(const size_t /*index*/) { - getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); - return true; + getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); + return true; } bool CBoxAlgorithmDiscreteWaveletTransform::process() { - // the dynamic box context describes the current state of the box inputs and outputs (i.e. the chunks) - Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); - - const int j = std::atoi(m_decompositionLevel); - const std::string nm(m_waveletType.toASCIIString()); - - for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) { - //Decode input signal - m_decoder.decode(i); - - // Construct header when we receive one - if (m_decoder.isHeaderReceived()) { - const size_t nChannels0 = m_decoder.getOutputMatrix()->getDimensionSize(0); - const size_t nSamples0 = m_decoder.getOutputMatrix()->getDimensionSize(1); - - if (double(nSamples0) <= std::pow(2.0, j + 1)) { - this->getLogManager() << Kernel::LogLevel_Error << "Number of samples [" << nSamples0 << "] is smaller or equal than 2^{J+1} == [" - << std::pow(2.0, j + 1) << "]\n"; - this->getLogManager() << Kernel::LogLevel_Error << "Verify quantity of samples and number of decomposition levels" << "\n"; - this->getLogManager() << Kernel::LogLevel_Error << - "You can introduce a Time based epoching to have more samples per chunk or reduce the decomposition levels" << "\n"; - return false; - } - - //sig will be resized to the number of channels and the total number of samples (Channels x Samples) - m_sig.resize(nChannels0); - for (size_t c = 0; c < nChannels0; ++c) { m_sig[c].resize(nSamples0); } - - //Do one dummy transform to get the m_flag and m_length filled. Since all channels & blocks have the same chunk size in OV, once is enough. - std::vector<double> flag; //flag is an auxiliar vector (see wavelet2d library) - std::vector<size_t> length; //length contains the length of each decomposition level. last entry is the length of the original signal. - std::vector<double> dwtOutput; //dwt_output is the vector containing the decomposition levels - - dwt(m_sig[0], j, nm, dwtOutput, flag, length); - - // Set info stream dimension - m_infolength = (length.size() + flag.size() + 2); - m_encoder.getInputMatrix()->resize(nChannels0, m_infolength); - - // Set decomposition stream dimensions - for (size_t e = 0; e < m_encoders.size(); ++e) { m_encoders[e]->getInputMatrix()->resize(nChannels0, length[e]); } - - // Set decomposition stream channel names - for (size_t c = 0; c < nChannels0; c++) { - for (const auto& encoder : m_encoders) { - encoder->getInputMatrix()->setDimensionLabel(0, c, m_decoder.getOutputMatrix()->getDimensionLabel(0, c)); - } - } - - - // Info stream header - m_encoder.getInputSamplingRate().setReferenceTarget(m_decoder.getOutputSamplingRate()); - m_encoder.encodeHeader(); - boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); - - // Decomposition stream headers - for (size_t e = 0; e < m_encoders.size(); ++e) { - const double sampling = double(m_decoder.getOutputSamplingRate()) / std::pow(2.0, int(e)); - m_encoders[e]->getInputSamplingRate() = uint64_t(std::floor(sampling)); - - m_encoders[e]->encodeHeader(); - boxContext.markOutputAsReadyToSend(e + 1, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); - } - } - - if (m_decoder.isBufferReceived()) { - const CMatrix* matrix = m_decoder.getOutputMatrix(); - const double* buffer0 = matrix->getBuffer(); - - const size_t nChannels0 = matrix->getDimensionSize(0); - const size_t nSamples0 = matrix->getDimensionSize(1); - - //sig will store the samples of the different channels - for (size_t c = 0; c < nChannels0; ++c) //Number of EEG channels - { - for (size_t s = 0; s < nSamples0; ++s) //Number of Samples per Chunk - { - m_sig[c][s] = (buffer0[s + c * nSamples0]); - } - } - - // Due to how wavelet2s works, we'll have to have the output variables empty before each call. - std::vector<std::vector<double>> flag; - std::vector<std::vector<size_t>> length; - std::vector<std::vector<double>> dwtOutput; - flag.resize(nChannels0); - length.resize(nChannels0); - dwtOutput.resize(nChannels0); - - //Calculation of wavelets coefficients for each channel. - for (size_t c = 0; c < nChannels0; ++c) { dwt(m_sig[c], j, nm, dwtOutput[c], flag[c], length[c]); } - - //Transmission of some information (flag and legth) to the inverse dwt box - //@fixme since the data dimensions do not change runtime, it should be sufficient to send this only once - for (size_t c = 0; c < nChannels0; ++c) { - size_t f = 0; - m_encoder.getInputMatrix()->getBuffer()[f + c * m_infolength] = double(length[c].size()); - for (size_t l = 0; l < length[c].size(); ++l) { - m_encoder.getInputMatrix()->getBuffer()[l + 1 + c * m_infolength] = double(length[c][l]); - f = l; - } - m_encoder.getInputMatrix()->getBuffer()[f + 2 + c * m_infolength] = double(flag[c].size()); - for (size_t l = 0; l < flag[c].size(); ++l) { m_encoder.getInputMatrix()->getBuffer()[f + 3 + l + c * m_infolength] = flag[c][l]; } - } - - //Decode the dwt coefficients of each decomposition level to separate channels - for (size_t c = 0; c < nChannels0; ++c) { - for (size_t e = 0, vectorPos = 0; e < m_encoders.size(); ++e) { - double* oBuffer = m_encoders[e]->getInputMatrix()->getBuffer(); - - // loop levels - for (size_t l = 0; l < size_t(length[c][e]); ++l) { oBuffer[l + c * length[c][e]] = dwtOutput[c][l + vectorPos]; } - - vectorPos = vectorPos + length[c][e]; - } - } - - m_encoder.encodeBuffer(); - boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); - - for (size_t e = 0; e < m_encoders.size(); ++e) { - m_encoders[e]->encodeBuffer(); - boxContext.markOutputAsReadyToSend(e + 1, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); - } - } - - if (m_decoder.isEndReceived()) { - m_encoder.encodeEnd(); - boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); - - for (size_t e = 0; e < m_encoders.size(); ++e) { - m_encoders[e]->encodeEnd(); - boxContext.markOutputAsReadyToSend(e + 1, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); - } - } - } - - return true; + // the dynamic box context describes the current state of the box inputs and outputs (i.e. the chunks) + Kernel::IBoxIO& boxContext = this->getDynamicBoxContext(); + + const int j = std::atoi(m_decompositionLevel); + const std::string nm(m_waveletType.toASCIIString()); + + for (size_t i = 0; i < boxContext.getInputChunkCount(0); ++i) { + //Decode input signal + m_decoder.decode(i); + + // Construct header when we receive one + if (m_decoder.isHeaderReceived()) { + const size_t nChannels0 = m_decoder.getOutputMatrix()->getDimensionSize(0); + const size_t nSamples0 = m_decoder.getOutputMatrix()->getDimensionSize(1); + + if (double(nSamples0) <= std::pow(2.0, j + 1)) { + this->getLogManager() << Kernel::LogLevel_Error << "Number of samples [" << nSamples0 << "] is smaller or equal than 2^{J+1} == [" + << std::pow(2.0, j + 1) << "]\n"; + this->getLogManager() << Kernel::LogLevel_Error << "Verify quantity of samples and number of decomposition levels" << "\n"; + this->getLogManager() << Kernel::LogLevel_Error << + "You can introduce a Time based epoching to have more samples per chunk or reduce the decomposition levels" << "\n"; + return false; + } + + //sig will be resized to the number of channels and the total number of samples (Channels x Samples) + m_sig.resize(nChannels0); + for (size_t c = 0; c < nChannels0; ++c) { m_sig[c].resize(nSamples0); } + + //Do one dummy transform to get the m_flag and m_length filled. Since all channels & blocks have the same chunk size in OV, once is enough. + std::vector<double> flag; //flag is an auxiliar vector (see wavelet2d library) + std::vector<size_t> length; //length contains the length of each decomposition level. last entry is the length of the original signal. + std::vector<double> dwtOutput; //dwt_output is the vector containing the decomposition levels + + dwt(m_sig[0], j, nm, dwtOutput, flag, length); + + // Set info stream dimension + m_infolength = (length.size() + flag.size() + 2); + m_encoder.getInputMatrix()->resize(nChannels0, m_infolength); + + // Set decomposition stream dimensions + for (size_t e = 0; e < m_encoders.size(); ++e) { m_encoders[e]->getInputMatrix()->resize(nChannels0, length[e]); } + + // Set decomposition stream channel names + for (size_t c = 0; c < nChannels0; c++) { + for (const auto& encoder : m_encoders) { + encoder->getInputMatrix()->setDimensionLabel(0, c, m_decoder.getOutputMatrix()->getDimensionLabel(0, c)); + } + } + + + // Info stream header + m_encoder.getInputSamplingRate().setReferenceTarget(m_decoder.getOutputSamplingRate()); + m_encoder.encodeHeader(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + + // Decomposition stream headers + for (size_t e = 0; e < m_encoders.size(); ++e) { + const double sampling = double(m_decoder.getOutputSamplingRate()) / std::pow(2.0, int(e)); + m_encoders[e]->getInputSamplingRate() = uint64_t(std::floor(sampling)); + + m_encoders[e]->encodeHeader(); + boxContext.markOutputAsReadyToSend(e + 1, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + } + + if (m_decoder.isBufferReceived()) { + const CMatrix* matrix = m_decoder.getOutputMatrix(); + const double* buffer0 = matrix->getBuffer(); + + const size_t nChannels0 = matrix->getDimensionSize(0); + const size_t nSamples0 = matrix->getDimensionSize(1); + + //sig will store the samples of the different channels + for (size_t c = 0; c < nChannels0; ++c) //Number of EEG channels + { + for (size_t s = 0; s < nSamples0; ++s) //Number of Samples per Chunk + { + m_sig[c][s] = (buffer0[s + c * nSamples0]); + } + } + + // Due to how wavelet2s works, we'll have to have the output variables empty before each call. + std::vector<std::vector<double>> flag; + std::vector<std::vector<size_t>> length; + std::vector<std::vector<double>> dwtOutput; + flag.resize(nChannels0); + length.resize(nChannels0); + dwtOutput.resize(nChannels0); + + //Calculation of wavelets coefficients for each channel. + for (size_t c = 0; c < nChannels0; ++c) { dwt(m_sig[c], j, nm, dwtOutput[c], flag[c], length[c]); } + + //Transmission of some information (flag and legth) to the inverse dwt box + //@fixme since the data dimensions do not change runtime, it should be sufficient to send this only once + for (size_t c = 0; c < nChannels0; ++c) { + size_t f = 0; + m_encoder.getInputMatrix()->getBuffer()[f + c * m_infolength] = double(length[c].size()); + for (size_t l = 0; l < length[c].size(); ++l) { + m_encoder.getInputMatrix()->getBuffer()[l + 1 + c * m_infolength] = double(length[c][l]); + f = l; + } + m_encoder.getInputMatrix()->getBuffer()[f + 2 + c * m_infolength] = double(flag[c].size()); + for (size_t l = 0; l < flag[c].size(); ++l) { m_encoder.getInputMatrix()->getBuffer()[f + 3 + l + c * m_infolength] = flag[c][l]; } + } + + //Decode the dwt coefficients of each decomposition level to separate channels + for (size_t c = 0; c < nChannels0; ++c) { + for (size_t e = 0, vectorPos = 0; e < m_encoders.size(); ++e) { + double* oBuffer = m_encoders[e]->getInputMatrix()->getBuffer(); + + // loop levels + for (size_t l = 0; l < size_t(length[c][e]); ++l) { oBuffer[l + c * length[c][e]] = dwtOutput[c][l + vectorPos]; } + + vectorPos = vectorPos + length[c][e]; + } + } + + m_encoder.encodeBuffer(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + + for (size_t e = 0; e < m_encoders.size(); ++e) { + m_encoders[e]->encodeBuffer(); + boxContext.markOutputAsReadyToSend(e + 1, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + } + + if (m_decoder.isEndReceived()) { + m_encoder.encodeEnd(); + boxContext.markOutputAsReadyToSend(0, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + + for (size_t e = 0; e < m_encoders.size(); ++e) { + m_encoders[e]->encodeEnd(); + boxContext.markOutputAsReadyToSend(e + 1, boxContext.getInputChunkStartTime(0, i), boxContext.getInputChunkEndTime(0, i)); + } + } + } + + return true; } -#endif } // namespace SignalProcessing } // namespace Plugins } // namespace OpenViBE +#endif diff --git a/plugins/processing/signal-processing/src/defines.hpp b/plugins/processing/signal-processing/src/defines.hpp index 1de7e3f02937a70a927b667cc722950b59d6c1c6..e893a4bc88af8570b9950362ccb52c5253015ea9 100644 --- a/plugins/processing/signal-processing/src/defines.hpp +++ b/plugins/processing/signal-processing/src/defines.hpp @@ -54,6 +54,8 @@ #define OVP_ClassId_BoxAlgorithm_Matrix2dToVectorDesc OpenViBE::CIdentifier(0xf40bf934, 0x3589c71e) #define OVP_ClassId_BoxAlgorithm_ConnectivitySpectrumExtract OpenViBE::CIdentifier(0x860ae55c, 0x836a6271) #define OVP_ClassId_BoxAlgorithm_ConnectivitySpectrumExtractDesc OpenViBE::CIdentifier(0xb6e4b7c1, 0x7331662d) +#define OVP_ClassId_BoxAlgorithm_PulseRateCalculator OpenViBE::CIdentifier(0x034466a7, 0x8059bcf3) +#define OVP_ClassId_BoxAlgorithm_PulseRateCalculatorDesc OpenViBE::CIdentifier(0x04d32034, 0x096c0b42) #define Box_EpochVariance OpenViBE::CIdentifier(0x335384EA, 0x88C917D0) #define Box_EpochVarianceDesc OpenViBE::CIdentifier(0xA15EAEC5, 0xAB0CE730) diff --git a/plugins/processing/signal-processing/src/main.cpp b/plugins/processing/signal-processing/src/main.cpp index 80741721d2b4bc705a6d9d6e4b7014600a2d2ad7..2b27d3d3de1439a3e31761e7f933f28108baf13a 100644 --- a/plugins/processing/signal-processing/src/main.cpp +++ b/plugins/processing/signal-processing/src/main.cpp @@ -23,6 +23,9 @@ #include "box-algorithms/connectivity/CBoxAlgorithmConnectivityMeasure.hpp" #include "box-algorithms/connectivity/CBoxAlgorithmConnectivitySpectrumExtract.hpp" +#include "box-algorithms/CBoxAlgorithmPulseRateCalculator.hpp" + + namespace OpenViBE { namespace Plugins { namespace SignalProcessing { @@ -49,6 +52,9 @@ OVP_Declare_Begin() OVP_Declare_New(CBoxAlgorithmHilbertDesc) OVP_Declare_New(CBoxIFFTDesc) + OVP_Declare_New(CBoxAlgorithmPulseRateCalculatorDesc); + + #if defined(TARGET_HAS_ThirdPartyFFTW3) OVP_Declare_New(CBoxAlgorithmDiscreteWaveletTransformDesc) OVP_Declare_New(CBoxAlgorithmInverse_DWTDesc) diff --git a/plugins/processing/signal-processing/test/CMakeLists.txt b/plugins/processing/signal-processing/test/CMakeLists.txt index c8e5fc9c492159c997f4b029d29e42920a0f3e4a..62e1a7491af8d7d6dc50af6905bd7c99eb1fb861 100644 --- a/plugins/processing/signal-processing/test/CMakeLists.txt +++ b/plugins/processing/signal-processing/test/CMakeLists.txt @@ -1,3 +1,4 @@ + project(test_eigen VERSION ${OPENVIBE_MAJOR_VERSION}.${OPENVIBE_MINOR_VERSION}.${OPENVIBE_PATCH_VERSION}) if(WIN32) @@ -25,12 +26,3 @@ if(WIN32) # Since cert, getting timeBeginPeriod() linker issues without this target_link_libraries(${PROJECT_NAME} winmm) endif(WIN32) - -# Unfortunately we need to install the tests as any application to find .dll/.so files -# on both Windows and Linux. -OV_INSTALL_LAUNCH_SCRIPT(SCRIPT_PREFIX ${PROJECT_NAME} EXECUTABLE_NAME ${PROJECT_NAME}) -install(TARGETS ${PROJECT_NAME} - RUNTIME DESTINATION ${DIST_BINDIR} - LIBRARY DESTINATION ${DIST_LIBDIR} - ARCHIVE DESTINATION ${DIST_LIBDIR}) - diff --git a/plugins/processing/signal-processing/test/DartTestfile.txt b/plugins/processing/signal-processing/test/DartTestfile.txt index 87681f9d6667ea70505da61f4db10517656b073a..5d100a81069107a077bdb85fe74914eb1569efc9 100644 --- a/plugins/processing/signal-processing/test/DartTestfile.txt +++ b/plugins/processing/signal-processing/test/DartTestfile.txt @@ -16,4 +16,5 @@ validation_test_with_csv(scenarios-tests Spectral-Analysis) validation_test_with_csv(scenarios-tests Discrete-Wavelet-Transform) validation_test_with_csv(scenarios-tests Discrete-Wavelet-Transform-Inverse) validation_test_with_csv(scenarios-tests ConnectivityWelch) -validation_test_with_csv(scenarios-tests ConnectivityMVAR) \ No newline at end of file +validation_test_with_csv(scenarios-tests ConnectivityMVAR) +validation_test_with_csv(scenarios-tests Pulse-Rate-Calculator) \ No newline at end of file diff --git a/plugins/processing/signal-processing/test/scenarios-tests/Pulse-Rate-Calculator-input.csv b/plugins/processing/signal-processing/test/scenarios-tests/Pulse-Rate-Calculator-input.csv new file mode 100644 index 0000000000000000000000000000000000000000..0841381a7a2550baed5fe434c910716937383c61 --- /dev/null +++ b/plugins/processing/signal-processing/test/scenarios-tests/Pulse-Rate-Calculator-input.csv @@ -0,0 +1,30785 @@ +Time:512Hz,Epoch,Internal ADC A13,Event Id,Event Date,Event Duration +0.0000000000,0,1248.3516845703,,, +0.0019531250,0,1249.8168945312,,, +0.0039062500,0,1250.5494384766,,, +0.0058593750,0,1252.7471923828,,, +0.0078125000,0,1253.4798583984,,, +0.0097656250,0,1255.6776123047,,, +0.0117187500,0,1257.8754882812,,, +0.0136718750,0,1260.0732421875,,, +0.0156250000,0,1263.7362060547,,, +0.0175781250,0,1265.9340820312,,, +0.0195312500,0,1268.8645019531,,, +0.0214843750,0,1271.7949218750,,, +0.0234375000,0,1274.7252197266,,, +0.0253906250,0,1279.8535156250,,, +0.0273437500,0,1282.7839355469,,, +0.0292968750,0,1285.7142333984,,, +0.0312500000,0,1290.8425292969,,, +0.0332031250,0,1292.3077392578,,, +0.0351562500,0,1297.4359130859,,, +0.0371093750,0,1300.3663330078,,, +0.0390625000,0,1303.2967529297,,, +0.0410156250,0,1307.6922607422,,, +0.0429687500,0,1309.8901367188,,, +0.0449218750,0,1314.2857666016,,, +0.0468750000,0,1317.2160644531,,, +0.0488281250,0,1321.6116943359,,, +0.0507812500,0,1324.5421142578,,, +0.0527343750,0,1328.2050781250,,, +0.0546875000,0,1333.3333740234,,, +0.0566406250,0,1336.2637939453,,, +0.0585937500,0,1340.6593017578,,, +0.0605468750,0,1344.3223876953,,, +0.0625000000,1,1349.4505615234,,, +0.0644531250,1,1352.3809814453,,, +0.0664062500,1,1356.7766113281,,, +0.0683593750,1,1359.7069091797,,, +0.0703125000,1,1364.1025390625,,, +0.0722656250,1,1366.3004150391,,, +0.0742187500,1,1369.9633789062,,, +0.0761718750,1,1371.4285888672,,, +0.0781250000,1,1375.8242187500,,, +0.0800781250,1,1375.8242187500,,, +0.0820312500,1,1378.7546386719,,, +0.0839843750,1,1378.0219726562,,, +0.0859375000,1,1380.2197265625,,, +0.0878906250,1,1379.4871826172,,, +0.0898437500,1,1380.9523925781,,, +0.0917968750,1,1380.2197265625,,, +0.0937500000,1,1380.2197265625,,, +0.0957031250,1,1379.4871826172,,, +0.0976562500,1,1380.2197265625,,, +0.0996093750,1,1379.4871826172,,, +0.1015625000,1,1378.7546386719,,, +0.1035156250,1,1378.0219726562,,, +0.1054687500,1,1378.0219726562,,, +0.1074218750,1,1376.5567626953,,, +0.1093750000,1,1374.3590087891,,, +0.1113281250,1,1372.8937988281,,, +0.1132812500,1,1370.6959228516,,, +0.1152343750,1,1369.2307128906,,, +0.1171875000,1,1367.0329589844,,, +0.1191406250,1,1365.5677490234,,, +0.1210937500,1,1363.3699951172,,, +0.1230468750,1,1361.1721191406,,, +0.1250000000,2,1359.7069091797,,, +0.1269531250,2,1356.0439453125,,, +0.1289062500,2,1355.3114013672,,, +0.1308593750,2,1351.6483154297,,, +0.1328125000,2,1349.4505615234,,, +0.1347656250,2,1347.2528076172,,, +0.1367187500,2,1344.3223876953,,, +0.1386718750,2,1342.8571777344,,, +0.1406250000,2,1339.9267578125,,, +0.1425781250,2,1338.4615478516,,, +0.1445312500,2,1335.5311279297,,, +0.1464843750,2,1334.7985839844,,, +0.1484375000,2,1332.6007080078,,, +0.1503906250,2,1331.1354980469,,, +0.1523437500,2,1328.2050781250,,, +0.1542968750,2,1326.7398681641,,, +0.1562500000,2,1323.0769042969,,, +0.1582031250,2,1320.8791503906,,, +0.1601562500,2,1317.2160644531,,, +0.1621093750,2,1313.5531005859,,, +0.1640625000,2,1310.6226806641,,, +0.1660156250,2,1308.4249267578,,, +0.1679687500,2,1305.4945068359,,, +0.1699218750,2,1304.0292968750,,, +0.1718750000,2,1300.3663330078,,, +0.1738281250,2,1298.1684570312,,, +0.1757812500,2,1295.2380371094,,, +0.1777343750,2,1293.7729492188,,, +0.1796875000,2,1290.8425292969,,, +0.1816406250,2,1288.6446533203,,, +0.1835937500,2,1285.7142333984,,, +0.1855468750,2,1283.5164794922,,, +0.1875000000,3,1282.7839355469,,, +0.1894531250,3,1280.5860595703,,, +0.1914062500,3,1279.1208496094,,, +0.1933593750,3,1276.1904296875,,, +0.1953125000,3,1276.9230957031,,, +0.1972656250,3,1276.1904296875,,, +0.1992187500,3,1275.4578857422,,, +0.2011718750,3,1274.7252197266,,, +0.2031250000,3,1275.4578857422,,, +0.2050781250,3,1274.7252197266,,, +0.2070312500,3,1275.4578857422,,, +0.2089843750,3,1274.7252197266,,, +0.2109375000,3,1276.1904296875,,, +0.2128906250,3,1274.7252197266,,, +0.2148437500,3,1276.1904296875,,, +0.2167968750,3,1276.9230957031,,, +0.2187500000,3,1278.3883056641,,, +0.2207031250,3,1278.3883056641,,, +0.2226562500,3,1279.8535156250,,, +0.2246093750,3,1281.3187255859,,, +0.2265625000,3,1282.0512695312,,, +0.2285156250,3,1282.0512695312,,, +0.2304687500,3,1283.5164794922,,, +0.2324218750,3,1283.5164794922,,, +0.2343750000,3,1284.2490234375,,, +0.2363281250,3,1285.7142333984,,, +0.2382812500,3,1286.4468994141,,, +0.2402343750,3,1286.4468994141,,, +0.2421875000,3,1285.7142333984,,, +0.2441406250,3,1287.1794433594,,, +0.2460937500,3,1287.9121093750,,, +0.2480468750,3,1288.6446533203,,, +0.2500000000,4,1287.9121093750,,, +0.2519531250,4,1288.6446533203,,, +0.2539062500,4,1287.9121093750,,, +0.2558593750,4,1288.6446533203,,, +0.2578125000,4,1287.1794433594,,, +0.2597656250,4,1287.1794433594,,, +0.2617187500,4,1286.4468994141,,, +0.2636718750,4,1285.7142333984,,, +0.2656250000,4,1284.9816894531,,, +0.2675781250,4,1284.2490234375,,, +0.2695312500,4,1283.5164794922,,, +0.2714843750,4,1283.5164794922,,, +0.2734375000,4,1282.0512695312,,, +0.2753906250,4,1282.0512695312,,, +0.2773437500,4,1281.3187255859,,, +0.2792968750,4,1282.0512695312,,, +0.2812500000,4,1280.5860595703,,, +0.2832031250,4,1282.0512695312,,, +0.2851562500,4,1281.3187255859,,, +0.2871093750,4,1280.5860595703,,, +0.2890625000,4,1280.5860595703,,, +0.2910156250,4,1280.5860595703,,, +0.2929687500,4,1280.5860595703,,, +0.2949218750,4,1280.5860595703,,, +0.2968750000,4,1279.8535156250,,, +0.2988281250,4,1279.1208496094,,, +0.3007812500,4,1279.1208496094,,, +0.3027343750,4,1279.1208496094,,, +0.3046875000,4,1279.1208496094,,, +0.3066406250,4,1280.5860595703,,, +0.3085937500,4,1280.5860595703,,, +0.3105468750,4,1281.3187255859,,, +0.3125000000,5,1281.3187255859,,, +0.3144531250,5,1284.2490234375,,, +0.3164062500,5,1284.2490234375,,, +0.3183593750,5,1285.7142333984,,, +0.3203125000,5,1286.4468994141,,, +0.3222656250,5,1288.6446533203,,, +0.3242187500,5,1287.9121093750,,, +0.3261718750,5,1290.1098632812,,, +0.3281250000,5,1289.3773193359,,, +0.3300781250,5,1290.8425292969,,, +0.3320312500,5,1289.3773193359,,, +0.3339843750,5,1290.8425292969,,, +0.3359375000,5,1290.8425292969,,, +0.3378906250,5,1290.8425292969,,, +0.3398437500,5,1290.1098632812,,, +0.3417968750,5,1290.1098632812,,, +0.3437500000,5,1289.3773193359,,, +0.3457031250,5,1288.6446533203,,, +0.3476562500,5,1288.6446533203,,, +0.3496093750,5,1287.9121093750,,, +0.3515625000,5,1287.9121093750,,, +0.3535156250,5,1287.1794433594,,, +0.3554687500,5,1287.9121093750,,, +0.3574218750,5,1287.9121093750,,, +0.3593750000,5,1288.6446533203,,, +0.3613281250,5,1289.3773193359,,, +0.3632812500,5,1289.3773193359,,, +0.3652343750,5,1290.8425292969,,, +0.3671875000,5,1290.1098632812,,, +0.3691406250,5,1292.3077392578,,, +0.3710937500,5,1291.5750732422,,, +0.3730468750,5,1293.0402832031,,, +0.3750000000,6,1293.0402832031,,, +0.3769531250,6,1294.5054931641,,, +0.3789062500,6,1293.7729492188,,, +0.3808593750,6,1295.2380371094,,, +0.3828125000,6,1295.2380371094,,, +0.3847656250,6,1295.9707031250,,, +0.3867187500,6,1295.2380371094,,, +0.3886718750,6,1295.9707031250,,, +0.3906250000,6,1295.9707031250,,, +0.3925781250,6,1297.4359130859,,, +0.3945312500,6,1296.7032470703,,, +0.3964843750,6,1297.4359130859,,, +0.3984375000,6,1297.4359130859,,, +0.4003906250,6,1298.9011230469,,, +0.4023437500,6,1298.9011230469,,, +0.4042968750,6,1299.6336669922,,, +0.4062500000,6,1299.6336669922,,, +0.4082031250,6,1301.0988769531,,, +0.4101562500,6,1301.0988769531,,, +0.4121093750,6,1301.8315429688,,, +0.4140625000,6,1301.8315429688,,, +0.4160156250,6,1302.5640869141,,, +0.4179687500,6,1301.0988769531,,, +0.4199218750,6,1301.8315429688,,, +0.4218750000,6,1301.0988769531,,, +0.4238281250,6,1301.0988769531,,, +0.4257812500,6,1300.3663330078,,, +0.4277343750,6,1300.3663330078,,, +0.4296875000,6,1298.9011230469,,, +0.4316406250,6,1299.6336669922,,, +0.4335937500,6,1298.1684570312,,, +0.4355468750,6,1299.6336669922,,, +0.4375000000,7,1298.1684570312,,, +0.4394531250,7,1298.9011230469,,, +0.4414062500,7,1296.7032470703,,, +0.4433593750,7,1297.4359130859,,, +0.4453125000,7,1295.2380371094,,, +0.4472656250,7,1295.9707031250,,, +0.4492187500,7,1293.7729492188,,, +0.4511718750,7,1293.7729492188,,, +0.4531250000,7,1292.3077392578,,, +0.4550781250,7,1293.0402832031,,, +0.4570312500,7,1291.5750732422,,, +0.4589843750,7,1292.3077392578,,, +0.4609375000,7,1290.1098632812,,, +0.4628906250,7,1290.1098632812,,, +0.4648437500,7,1288.6446533203,,, +0.4667968750,7,1287.9121093750,,, +0.4687500000,7,1287.1794433594,,, +0.4707031250,7,1284.9816894531,,, +0.4726562500,7,1285.7142333984,,, +0.4746093750,7,1284.9816894531,,, +0.4765625000,7,1286.4468994141,,, +0.4785156250,7,1285.7142333984,,, +0.4804687500,7,1289.3773193359,,, +0.4824218750,7,1290.8425292969,,, +0.4843750000,7,1290.8425292969,,, +0.4863281250,7,1293.7729492188,,, +0.4882812500,7,1295.9707031250,,, +0.4902343750,7,1301.0988769531,,, +0.4921875000,7,1304.7619628906,,, +0.4941406250,7,1309.1574707031,,, +0.4960937500,7,1315.0183105469,,, +0.4980468750,7,1320.8791503906,,, +0.5000000000,8,1328.9377441406,,, +0.5019531250,8,1335.5311279297,,, +0.5039062500,8,1345.7875976562,,, +0.5058593750,8,1355.3114013672,,, +0.5078125000,8,1367.7656250000,,, +0.5097656250,8,1378.0219726562,,, +0.5117187500,8,1391.2087402344,,, +0.5136718750,8,1403.6629638672,,, +0.5156250000,8,1417.5823974609,,, +0.5175781250,8,1432.2343750000,,, +0.5195312500,8,1446.8864746094,,, +0.5214843750,8,1463.7362060547,,, +0.5234375000,8,1479.1208496094,,, +0.5253906250,8,1497.4359130859,,, +0.5273437500,8,1515.0183105469,,, +0.5292968750,8,1531.8681640625,,, +0.5312500000,8,1549.4505615234,,, +0.5332031250,8,1567.7656250000,,, +0.5351562500,8,1587.5457763672,,, +0.5371093750,8,1605.1281738281,,, +0.5390625000,8,1624.9084472656,,, +0.5410156250,8,1643.2233886719,,, +0.5429687500,8,1662.2711181641,,, +0.5449218750,8,1679.8535156250,,, +0.5468750000,8,1698.1684570312,,, +0.5488281250,8,1715.0183105469,,, +0.5507812500,8,1731.8681640625,,, +0.5527343750,8,1747.9853515625,,, +0.5546875000,8,1764.1025390625,,, +0.5566406250,8,1779.4871826172,,, +0.5585937500,8,1793.4066162109,,, +0.5605468750,8,1807.3260498047,,, +0.5625000000,9,1820.5128173828,,, +0.5644531250,9,1834.4322509766,,, +0.5664062500,9,1844.6885986328,,, +0.5683593750,9,1857.1428222656,,, +0.5703125000,9,1866.6666259766,,, +0.5722656250,9,1876.9230957031,,, +0.5742187500,9,1883.5164794922,,, +0.5761718750,9,1892.3077392578,,, +0.5781250000,9,1898.1684570312,,, +0.5800781250,9,1904.0292968750,,, +0.5820312500,9,1908.4249267578,,, +0.5839843750,9,1912.8205566406,,, +0.5859375000,9,1915.7509765625,,, +0.5878906250,9,1916.4835205078,,, +0.5898437500,9,1918.6812744141,,, +0.5917968750,9,1919.4139404297,,, +0.5937500000,9,1919.4139404297,,, +0.5957031250,9,1917.2160644531,,, +0.5976562500,9,1916.4835205078,,, +0.5996093750,9,1913.5531005859,,, +0.6015625000,9,1909.8901367188,,, +0.6035156250,9,1904.7619628906,,, +0.6054687500,9,1900.3663330078,,, +0.6074218750,9,1893.7729492188,,, +0.6093750000,9,1887.9121093750,,, +0.6113281250,9,1879.8535156250,,, +0.6132812500,9,1872.5274658203,,, +0.6152343750,9,1862.2711181641,,, +0.6171875000,9,1852.7471923828,,, +0.6191406250,9,1842.4908447266,,, +0.6210937500,9,1831.5018310547,,, +0.6230468750,9,1820.5128173828,,, +0.6250000000,10,1807.3260498047,,, +0.6269531250,10,1796.3370361328,,, +0.6289062500,10,1783.1501464844,,, +0.6308593750,10,1771.4285888672,,, +0.6328125000,10,1757.5091552734,,, +0.6347656250,10,1744.3223876953,,, +0.6367187500,10,1731.1354980469,,, +0.6386718750,10,1717.9487304688,,, +0.6406250000,10,1703.2967529297,,, +0.6425781250,10,1690.1098632812,,, +0.6445312500,10,1675.4578857422,,, +0.6464843750,10,1660.0732421875,,, +0.6484375000,10,1646.8864746094,,, +0.6503906250,10,1632.9670410156,,, +0.6523437500,10,1621.2453613281,,, +0.6542968750,10,1607.3260498047,,, +0.6562500000,10,1594.1391601562,,, +0.6582031250,10,1580.9523925781,,, +0.6601562500,10,1568.4981689453,,, +0.6621093750,10,1555.3114013672,,, +0.6640625000,10,1542.8571777344,,, +0.6660156250,10,1529.6702880859,,, +0.6679687500,10,1517.2160644531,,, +0.6699218750,10,1504.7619628906,,, +0.6718750000,10,1492.3077392578,,, +0.6738281250,10,1482.0512695312,,, +0.6757812500,10,1470.3297119141,,, +0.6777343750,10,1460.8059082031,,, +0.6796875000,10,1449.8168945312,,, +0.6816406250,10,1441.0256347656,,, +0.6835937500,10,1430.7692871094,,, +0.6855468750,10,1422.7105712891,,, +0.6875000000,11,1412.4542236328,,, +0.6894531250,11,1404.3956298828,,, +0.6914062500,11,1394.1391601562,,, +0.6933593750,11,1385.3480224609,,, +0.6953125000,11,1375.8242187500,,, +0.6972656250,11,1368.4981689453,,, +0.6992187500,11,1359.7069091797,,, +0.7011718750,11,1353.1135253906,,, +0.7031250000,11,1344.3223876953,,, +0.7050781250,11,1336.9963378906,,, +0.7070312500,11,1330.4029541016,,, +0.7089843750,11,1324.5421142578,,, +0.7109375000,11,1317.2160644531,,, +0.7128906250,11,1312.8205566406,,, +0.7148437500,11,1306.2270507812,,, +0.7167968750,11,1303.2967529297,,, +0.7187500000,11,1298.1684570312,,, +0.7207031250,11,1294.5054931641,,, +0.7226562500,11,1290.1098632812,,, +0.7246093750,11,1287.1794433594,,, +0.7265625000,11,1283.5164794922,,, +0.7285156250,11,1280.5860595703,,, +0.7304687500,11,1276.9230957031,,, +0.7324218750,11,1273.9926757812,,, +0.7343750000,11,1271.0622558594,,, +0.7363281250,11,1268.1318359375,,, +0.7382812500,11,1265.9340820312,,, +0.7402343750,11,1263.7362060547,,, +0.7421875000,11,1261.5384521484,,, +0.7441406250,11,1260.0732421875,,, +0.7460937500,11,1258.6080322266,,, +0.7480468750,11,1256.4102783203,,, +0.7500000000,12,1256.4102783203,,, +0.7519531250,12,1254.2124023438,,, +0.7539062500,12,1254.9450683594,,, +0.7558593750,12,1253.4798583984,,, +0.7578125000,12,1254.9450683594,,, +0.7597656250,12,1254.2124023438,,, +0.7617187500,12,1255.6776123047,,, +0.7636718750,12,1254.2124023438,,, +0.7656250000,12,1255.6776123047,,, +0.7675781250,12,1255.6776123047,,, +0.7695312500,12,1256.4102783203,,, +0.7714843750,12,1258.6080322266,,, +0.7734375000,12,1259.3406982422,,, +0.7753906250,12,1261.5384521484,,, +0.7773437500,12,1264.4688720703,,, +0.7792968750,12,1267.3992919922,,, +0.7812500000,12,1268.8645019531,,, +0.7832031250,12,1272.5274658203,,, +0.7851562500,12,1275.4578857422,,, +0.7871093750,12,1279.1208496094,,, +0.7890625000,12,1281.3187255859,,, +0.7910156250,12,1285.7142333984,,, +0.7929687500,12,1287.9121093750,,, +0.7949218750,12,1291.5750732422,,, +0.7968750000,12,1294.5054931641,,, +0.7988281250,12,1299.6336669922,,, +0.8007812500,12,1302.5640869141,,, +0.8027343750,12,1306.2270507812,,, +0.8046875000,12,1309.1574707031,,, +0.8066406250,12,1313.5531005859,,, +0.8085937500,12,1316.4835205078,,, +0.8105468750,12,1320.1464843750,,, +0.8125000000,13,1323.0769042969,,, +0.8144531250,13,1326.7398681641,,, +0.8164062500,13,1330.4029541016,,, +0.8183593750,13,1334.0659179688,,, +0.8203125000,13,1337.7288818359,,, +0.8222656250,13,1342.1245117188,,, +0.8242187500,13,1344.3223876953,,, +0.8261718750,13,1347.9853515625,,, +0.8281250000,13,1350.1831054688,,, +0.8300781250,13,1354.5787353516,,, +0.8320312500,13,1357.5091552734,,, +0.8339843750,13,1359.7069091797,,, +0.8359375000,13,1361.9047851562,,, +0.8378906250,13,1365.5677490234,,, +0.8398437500,13,1367.0329589844,,, +0.8417968750,13,1369.9633789062,,, +0.8437500000,13,1371.4285888672,,, +0.8457031250,13,1372.8937988281,,, +0.8476562500,13,1375.0915527344,,, +0.8496093750,13,1376.5567626953,,, +0.8515625000,13,1377.2894287109,,, +0.8535156250,13,1378.0219726562,,, +0.8554687500,13,1379.4871826172,,, +0.8574218750,13,1379.4871826172,,, +0.8593750000,13,1379.4871826172,,, +0.8613281250,13,1378.0219726562,,, +0.8632812500,13,1378.7546386719,,, +0.8652343750,13,1376.5567626953,,, +0.8671875000,13,1377.2894287109,,, +0.8691406250,13,1375.8242187500,,, +0.8710937500,13,1375.0915527344,,, +0.8730468750,13,1373.6263427734,,, +0.8750000000,14,1374.3590087891,,, +0.8769531250,14,1372.8937988281,,, +0.8789062500,14,1372.8937988281,,, +0.8808593750,14,1372.1611328125,,, +0.8828125000,14,1372.1611328125,,, +0.8847656250,14,1369.9633789062,,, +0.8867187500,14,1369.9633789062,,, +0.8886718750,14,1367.7656250000,,, +0.8906250000,14,1367.0329589844,,, +0.8925781250,14,1366.3004150391,,, +0.8945312500,14,1364.8352050781,,, +0.8964843750,14,1364.8352050781,,, +0.8984375000,14,1362.6373291016,,, +0.9003906250,14,1362.6373291016,,, +0.9023437500,14,1361.1721191406,,, +0.9042968750,14,1361.1721191406,,, +0.9062500000,14,1357.5091552734,,, +0.9082031250,14,1358.2416992188,,, +0.9101562500,14,1355.3114013672,,, +0.9121093750,14,1353.8461914062,,, +0.9140625000,14,1350.9157714844,,, +0.9160156250,14,1349.4505615234,,, +0.9179687500,14,1347.2528076172,,, +0.9199218750,14,1345.0549316406,,, +0.9218750000,14,1342.8571777344,,, +0.9238281250,14,1340.6593017578,,, +0.9257812500,14,1337.7288818359,,, +0.9277343750,14,1334.7985839844,,, +0.9296875000,14,1334.0659179688,,, +0.9316406250,14,1331.1354980469,,, +0.9335937500,14,1329.6702880859,,, +0.9355468750,14,1326.0073242188,,, +0.9375000000,15,1326.0073242188,,, +0.9394531250,15,1323.0769042969,,, +0.9414062500,15,1322.3443603516,,, +0.9433593750,15,1319.4139404297,,, +0.9453125000,15,1319.4139404297,,, +0.9472656250,15,1317.2160644531,,, +0.9492187500,15,1315.7509765625,,, +0.9511718750,15,1313.5531005859,,, +0.9531250000,15,1311.3553466797,,, +0.9550781250,15,1309.8901367188,,, +0.9570312500,15,1306.2270507812,,, +0.9589843750,15,1305.4945068359,,, +0.9609375000,15,1302.5640869141,,, +0.9628906250,15,1301.0988769531,,, +0.9648437500,15,1298.1684570312,,, +0.9667968750,15,1298.1684570312,,, +0.9687500000,15,1294.5054931641,,, +0.9707031250,15,1293.7729492188,,, +0.9726562500,15,1290.8425292969,,, +0.9746093750,15,1289.3773193359,,, +0.9765625000,15,1286.4468994141,,, +0.9785156250,15,1284.2490234375,,, +0.9804687500,15,1281.3187255859,,, +0.9824218750,15,1279.8535156250,,, +0.9843750000,15,1276.9230957031,,, +0.9863281250,15,1274.7252197266,,, +0.9882812500,15,1272.5274658203,,, +0.9902343750,15,1270.3297119141,,, +0.9921875000,15,1269.5970458984,,, +0.9941406250,15,1268.1318359375,,, +0.9960937500,15,1268.1318359375,,, +0.9980468750,15,1266.6666259766,,, +1.0000000000,16,1267.3992919922,,, +1.0019531250,16,1265.2014160156,,, +1.0039062500,16,1265.9340820312,,, +1.0058593750,16,1264.4688720703,,, +1.0078125000,16,1264.4688720703,,, +1.0097656250,16,1263.7362060547,,, +1.0117187500,16,1262.2711181641,,, +1.0136718750,16,1263.0036621094,,, +1.0156250000,16,1261.5384521484,,, +1.0175781250,16,1262.2711181641,,, +1.0195312500,16,1260.8059082031,,, +1.0214843750,16,1260.8059082031,,, +1.0234375000,16,1260.0732421875,,, +1.0253906250,16,1260.0732421875,,, +1.0273437500,16,1261.5384521484,,, +1.0292968750,16,1261.5384521484,,, +1.0312500000,16,1262.2711181641,,, +1.0332031250,16,1263.7362060547,,, +1.0351562500,16,1263.7362060547,,, +1.0371093750,16,1265.2014160156,,, +1.0390625000,16,1265.2014160156,,, +1.0410156250,16,1267.3992919922,,, +1.0429687500,16,1267.3992919922,,, +1.0449218750,16,1269.5970458984,,, +1.0468750000,16,1269.5970458984,,, +1.0488281250,16,1269.5970458984,,, +1.0507812500,16,1271.0622558594,,, +1.0527343750,16,1271.0622558594,,, +1.0546875000,16,1271.7949218750,,, +1.0566406250,16,1272.5274658203,,, +1.0585937500,16,1272.5274658203,,, +1.0605468750,16,1273.2601318359,,, +1.0625000000,17,1273.9926757812,,, +1.0644531250,17,1274.7252197266,,, +1.0664062500,17,1274.7252197266,,, +1.0683593750,17,1276.1904296875,,, +1.0703125000,17,1276.1904296875,,, +1.0722656250,17,1277.6556396484,,, +1.0742187500,17,1276.9230957031,,, +1.0761718750,17,1280.5860595703,,, +1.0781250000,17,1279.1208496094,,, +1.0800781250,17,1281.3187255859,,, +1.0820312500,17,1282.0512695312,,, +1.0839843750,17,1282.7839355469,,, +1.0859375000,17,1283.5164794922,,, +1.0878906250,17,1284.2490234375,,, +1.0898437500,17,1285.7142333984,,, +1.0917968750,17,1285.7142333984,,, +1.0937500000,17,1287.9121093750,,, +1.0957031250,17,1287.9121093750,,, +1.0976562500,17,1287.9121093750,,, +1.0996093750,17,1289.3773193359,,, +1.1015625000,17,1288.6446533203,,, +1.1035156250,17,1290.1098632812,,, +1.1054687500,17,1290.1098632812,,, +1.1074218750,17,1291.5750732422,,, +1.1093750000,17,1290.8425292969,,, +1.1113281250,17,1291.5750732422,,, +1.1132812500,17,1292.3077392578,,, +1.1152343750,17,1292.3077392578,,, +1.1171875000,17,1293.7729492188,,, +1.1191406250,17,1293.0402832031,,, +1.1210937500,17,1295.2380371094,,, +1.1230468750,17,1295.2380371094,,, +1.1250000000,18,1295.2380371094,,, +1.1269531250,18,1294.5054931641,,, +1.1289062500,18,1294.5054931641,,, +1.1308593750,18,1295.9707031250,,, +1.1328125000,18,1294.5054931641,,, +1.1347656250,18,1296.7032470703,,, +1.1367187500,18,1297.4359130859,,, +1.1386718750,18,1297.4359130859,,, +1.1406250000,18,1298.9011230469,,, +1.1425781250,18,1298.9011230469,,, +1.1445312500,18,1300.3663330078,,, +1.1464843750,18,1299.6336669922,,, +1.1484375000,18,1298.9011230469,,, +1.1503906250,18,1298.9011230469,,, +1.1523437500,18,1297.4359130859,,, +1.1542968750,18,1298.1684570312,,, +1.1562500000,18,1297.4359130859,,, +1.1582031250,18,1297.4359130859,,, +1.1601562500,18,1297.4359130859,,, +1.1621093750,18,1295.9707031250,,, +1.1640625000,18,1298.1684570312,,, +1.1660156250,18,1296.7032470703,,, +1.1679687500,18,1298.1684570312,,, +1.1699218750,18,1296.7032470703,,, +1.1718750000,18,1297.4359130859,,, +1.1738281250,18,1297.4359130859,,, +1.1757812500,18,1297.4359130859,,, +1.1777343750,18,1296.7032470703,,, +1.1796875000,18,1298.1684570312,,, +1.1816406250,18,1297.4359130859,,, +1.1835937500,18,1298.1684570312,,, +1.1855468750,18,1298.1684570312,,, +1.1875000000,19,1297.4359130859,,, +1.1894531250,19,1298.9011230469,,, +1.1914062500,19,1297.4359130859,,, +1.1933593750,19,1298.1684570312,,, +1.1953125000,19,1296.7032470703,,, +1.1972656250,19,1298.1684570312,,, +1.1992187500,19,1298.1684570312,,, +1.2011718750,19,1297.4359130859,,, +1.2031250000,19,1298.1684570312,,, +1.2050781250,19,1298.1684570312,,, +1.2070312500,19,1299.6336669922,,, +1.2089843750,19,1298.1684570312,,, +1.2109375000,19,1298.9011230469,,, +1.2128906250,19,1298.9011230469,,, +1.2148437500,19,1297.4359130859,,, +1.2167968750,19,1298.1684570312,,, +1.2187500000,19,1297.4359130859,,, +1.2207031250,19,1298.1684570312,,, +1.2226562500,19,1296.7032470703,,, +1.2246093750,19,1297.4359130859,,, +1.2265625000,19,1295.2380371094,,, +1.2285156250,19,1294.5054931641,,, +1.2304687500,19,1294.5054931641,,, +1.2324218750,19,1293.7729492188,,, +1.2343750000,19,1294.5054931641,,, +1.2363281250,19,1294.5054931641,,, +1.2382812500,19,1294.5054931641,,, +1.2402343750,19,1296.7032470703,,, +1.2421875000,19,1297.4359130859,,, +1.2441406250,19,1298.9011230469,,, +1.2460937500,19,1300.3663330078,,, +1.2480468750,19,1301.0988769531,,, +1.2500000000,20,1302.5640869141,,, +1.2519531250,20,1304.0292968750,,, +1.2539062500,20,1306.2270507812,,, +1.2558593750,20,1309.8901367188,,, +1.2578125000,20,1312.0878906250,,, +1.2597656250,20,1315.7509765625,,, +1.2617187500,20,1319.4139404297,,, +1.2636718750,20,1323.8095703125,,, +1.2656250000,20,1328.2050781250,,, +1.2675781250,20,1332.6007080078,,, +1.2695312500,20,1338.4615478516,,, +1.2714843750,20,1345.0549316406,,, +1.2734375000,20,1350.9157714844,,, +1.2753906250,20,1358.9743652344,,, +1.2773437500,20,1367.0329589844,,, +1.2792968750,20,1376.5567626953,,, +1.2812500000,20,1384.6153564453,,, +1.2832031250,20,1394.8718261719,,, +1.2851562500,20,1404.3956298828,,, +1.2871093750,20,1416.1171875000,,, +1.2890625000,20,1427.1062011719,,, +1.2910156250,20,1438.8278808594,,, +1.2929687500,20,1450.5494384766,,, +1.2949218750,20,1463.7362060547,,, +1.2968750000,20,1476.9230957031,,, +1.2988281250,20,1490.8425292969,,, +1.3007812500,20,1506.2270507812,,, +1.3027343750,20,1506.2270507812,,, +1.3046875000,20,1520.8791503906,,, +1.3066406250,20,1536.2637939453,,, +1.3085937500,20,1551.6483154297,,, +1.3105468750,20,1568.4981689453,,, +1.3125000000,21,1583.8828125000,,, +1.3144531250,21,1600.7325439453,,, +1.3164062500,21,1616.1171875000,,, +1.3183593750,21,1632.9670410156,,, +1.3203125000,21,1648.3516845703,,, +1.3222656250,21,1664.4688720703,,, +1.3242187500,21,1679.8535156250,,, +1.3261718750,21,1695.9707031250,,, +1.3281250000,21,1711.3553466797,,, +1.3300781250,21,1727.4725341797,,, +1.3320312500,21,1742.1245117188,,, +1.3339843750,21,1757.5091552734,,, +1.3359375000,21,1771.4285888672,,, +1.3378906250,21,1786.0805664062,,, +1.3398437500,21,1798.5347900391,,, +1.3417968750,21,1812.4542236328,,, +1.3437500000,21,1824.1757812500,,, +1.3457031250,21,1835.8974609375,,, +1.3476562500,21,1846.1538085938,,, +1.3496093750,21,1856.4102783203,,, +1.3515625000,21,1863.7362060547,,, +1.3535156250,21,1872.5274658203,,, +1.3554687500,21,1876.9230957031,,, +1.3574218750,21,1884.9816894531,,, +1.3593750000,21,1888.6446533203,,, +1.3613281250,21,1893.7729492188,,, +1.3632812500,21,1895.9707031250,,, +1.3652343750,21,1898.9011230469,,, +1.3671875000,21,1899.6336669922,,, +1.3691406250,21,1901.0988769531,,, +1.3710937500,21,1900.3663330078,,, +1.3730468750,21,1900.3663330078,,, +1.3750000000,22,1898.1684570312,,, +1.3769531250,22,1895.9707031250,,, +1.3789062500,22,1892.3077392578,,, +1.3808593750,22,1888.6446533203,,, +1.3828125000,22,1883.5164794922,,, +1.3847656250,22,1877.6556396484,,, +1.3867187500,22,1871.7949218750,,, +1.3886718750,22,1864.4688720703,,, +1.3906250000,22,1855.6776123047,,, +1.3925781250,22,1846.8864746094,,, +1.3945312500,22,1837.3626708984,,, +1.3964843750,22,1827.8388671875,,, +1.3984375000,22,1816.8498535156,,, +1.4003906250,22,1807.3260498047,,, +1.4023437500,22,1795.6043701172,,, +1.4042968750,22,1785.3480224609,,, +1.4062500000,22,1772.1611328125,,, +1.4082031250,22,1760.4395751953,,, +1.4101562500,22,1746.5201416016,,, +1.4121093750,22,1734.7985839844,,, +1.4140625000,22,1719.4139404297,,, +1.4160156250,22,1706.9597167969,,, +1.4179687500,22,1692.3077392578,,, +1.4199218750,22,1679.8535156250,,, +1.4218750000,22,1665.2014160156,,, +1.4238281250,22,1652.7471923828,,, +1.4257812500,22,1638.0952148438,,, +1.4277343750,22,1626.3736572266,,, +1.4296875000,22,1611.7215576172,,, +1.4316406250,22,1600.0000000000,,, +1.4335937500,22,1586.0805664062,,, +1.4355468750,22,1573.6263427734,,, +1.4375000000,23,1560.4395751953,,, +1.4394531250,23,1548.7178955078,,, +1.4414062500,23,1536.2637939453,,, +1.4433593750,23,1524.5421142578,,, +1.4453125000,23,1514.2857666016,,, +1.4472656250,23,1502.5640869141,,, +1.4492187500,23,1493.0402832031,,, +1.4511718750,23,1482.0512695312,,, +1.4531250000,23,1473.2601318359,,, +1.4550781250,23,1462.2711181641,,, +1.4570312500,23,1452.7471923828,,, +1.4589843750,23,1442.4908447266,,, +1.4609375000,23,1432.9670410156,,, +1.4628906250,23,1423.4432373047,,, +1.4648437500,23,1415.3846435547,,, +1.4667968750,23,1406.5933837891,,, +1.4687500000,23,1398.5347900391,,, +1.4707031250,23,1390.4761962891,,, +1.4726562500,23,1383.1501464844,,, +1.4746093750,23,1375.8242187500,,, +1.4765625000,23,1368.4981689453,,, +1.4785156250,23,1362.6373291016,,, +1.4804687500,23,1356.0439453125,,, +1.4824218750,23,1351.6483154297,,, +1.4843750000,23,1345.7875976562,,, +1.4863281250,23,1342.1245117188,,, +1.4882812500,23,1336.2637939453,,, +1.4902343750,23,1332.6007080078,,, +1.4921875000,23,1328.9377441406,,, +1.4941406250,23,1326.0073242188,,, +1.4960937500,23,1321.6116943359,,, +1.4980468750,23,1318.6812744141,,, +1.5000000000,24,1315.7509765625,,, +1.5019531250,24,1313.5531005859,,, +1.5039062500,24,1310.6226806641,,, +1.5058593750,24,1308.4249267578,,, +1.5078125000,24,1306.2270507812,,, +1.5097656250,24,1303.2967529297,,, +1.5117187500,24,1301.8315429688,,, +1.5136718750,24,1298.9011230469,,, +1.5156250000,24,1298.1684570312,,, +1.5175781250,24,1295.9707031250,,, +1.5195312500,24,1294.5054931641,,, +1.5214843750,24,1291.5750732422,,, +1.5234375000,24,1289.3773193359,,, +1.5253906250,24,1287.1794433594,,, +1.5273437500,24,1284.9816894531,,, +1.5292968750,24,1282.7839355469,,, +1.5312500000,24,1283.5164794922,,, +1.5332031250,24,1282.7839355469,,, +1.5351562500,24,1282.0512695312,,, +1.5371093750,24,1282.0512695312,,, +1.5390625000,24,1282.7839355469,,, +1.5410156250,24,1283.5164794922,,, +1.5429687500,24,1283.5164794922,,, +1.5449218750,24,1284.2490234375,,, +1.5468750000,24,1284.2490234375,,, +1.5488281250,24,1286.4468994141,,, +1.5507812500,24,1287.1794433594,,, +1.5527343750,24,1289.3773193359,,, +1.5546875000,24,1290.8425292969,,, +1.5566406250,24,1293.0402832031,,, +1.5585937500,24,1293.7729492188,,, +1.5605468750,24,1296.7032470703,,, +1.5625000000,25,1299.6336669922,,, +1.5644531250,25,1301.0988769531,,, +1.5664062500,25,1303.2967529297,,, +1.5683593750,25,1306.2270507812,,, +1.5703125000,25,1310.6226806641,,, +1.5722656250,25,1312.8205566406,,, +1.5742187500,25,1317.2160644531,,, +1.5761718750,25,1320.1464843750,,, +1.5781250000,25,1324.5421142578,,, +1.5800781250,25,1326.0073242188,,, +1.5820312500,25,1330.4029541016,,, +1.5839843750,25,1333.3333740234,,, +1.5859375000,25,1336.2637939453,,, +1.5878906250,25,1339.9267578125,,, +1.5898437500,25,1343.5897216797,,, +1.5917968750,25,1347.2528076172,,, +1.5937500000,25,1349.4505615234,,, +1.5957031250,25,1352.3809814453,,, +1.5976562500,25,1354.5787353516,,, +1.5996093750,25,1357.5091552734,,, +1.6015625000,25,1358.9743652344,,, +1.6035156250,25,1361.1721191406,,, +1.6054687500,25,1363.3699951172,,, +1.6074218750,25,1364.8352050781,,, +1.6093750000,25,1367.0329589844,,, +1.6113281250,25,1369.2307128906,,, +1.6132812500,25,1371.4285888672,,, +1.6152343750,25,1372.8937988281,,, +1.6171875000,25,1375.0915527344,,, +1.6191406250,25,1375.0915527344,,, +1.6210937500,25,1377.2894287109,,, +1.6230468750,25,1378.0219726562,,, +1.6250000000,26,1378.7546386719,,, +1.6269531250,26,1380.9523925781,,, +1.6289062500,26,1381.6849365234,,, +1.6308593750,26,1382.4176025391,,, +1.6328125000,26,1383.8828125000,,, +1.6347656250,26,1382.4176025391,,, +1.6367187500,26,1385.3480224609,,, +1.6386718750,26,1385.3480224609,,, +1.6406250000,26,1385.3480224609,,, +1.6425781250,26,1386.8132324219,,, +1.6445312500,26,1386.8132324219,,, +1.6464843750,26,1388.2784423828,,, +1.6484375000,26,1387.5457763672,,, +1.6503906250,26,1387.5457763672,,, +1.6523437500,26,1388.2784423828,,, +1.6542968750,26,1386.8132324219,,, +1.6562500000,26,1386.0805664062,,, +1.6582031250,26,1386.8132324219,,, +1.6601562500,26,1385.3480224609,,, +1.6621093750,26,1384.6153564453,,, +1.6640625000,26,1384.6153564453,,, +1.6660156250,26,1383.1501464844,,, +1.6679687500,26,1383.1501464844,,, +1.6699218750,26,1381.6849365234,,, +1.6718750000,26,1379.4871826172,,, +1.6738281250,26,1378.7546386719,,, +1.6757812500,26,1377.2894287109,,, +1.6777343750,26,1375.0915527344,,, +1.6796875000,26,1374.3590087891,,, +1.6816406250,26,1372.8937988281,,, +1.6835937500,26,1369.9633789062,,, +1.6855468750,26,1369.2307128906,,, +1.6875000000,27,1367.0329589844,,, +1.6894531250,27,1364.1025390625,,, +1.6914062500,27,1363.3699951172,,, +1.6933593750,27,1360.4395751953,,, +1.6953125000,27,1357.5091552734,,, +1.6972656250,27,1356.0439453125,,, +1.6992187500,27,1353.1135253906,,, +1.7011718750,27,1350.1831054688,,, +1.7031250000,27,1348.7178955078,,, +1.7050781250,27,1344.3223876953,,, +1.7070312500,27,1342.1245117188,,, +1.7089843750,27,1338.4615478516,,, +1.7109375000,27,1335.5311279297,,, +1.7128906250,27,1332.6007080078,,, +1.7148437500,27,1328.9377441406,,, +1.7167968750,27,1324.5421142578,,, +1.7187500000,27,1323.0769042969,,, +1.7207031250,27,1319.4139404297,,, +1.7226562500,27,1317.2160644531,,, +1.7246093750,27,1315.7509765625,,, +1.7265625000,27,1312.0878906250,,, +1.7285156250,27,1309.1574707031,,, +1.7304687500,27,1306.9597167969,,, +1.7324218750,27,1304.0292968750,,, +1.7343750000,27,1300.3663330078,,, +1.7363281250,27,1298.1684570312,,, +1.7382812500,27,1294.5054931641,,, +1.7402343750,27,1293.0402832031,,, +1.7421875000,27,1293.0402832031,,, +1.7441406250,27,1290.8425292969,,, +1.7460937500,27,1288.6446533203,,, +1.7480468750,27,1287.1794433594,,, +1.7500000000,28,1285.7142333984,,, +1.7519531250,28,1282.7839355469,,, +1.7539062500,28,1282.0512695312,,, +1.7558593750,28,1279.8535156250,,, +1.7578125000,28,1277.6556396484,,, +1.7597656250,28,1277.6556396484,,, +1.7617187500,28,1276.1904296875,,, +1.7636718750,28,1274.7252197266,,, +1.7656250000,28,1275.4578857422,,, +1.7675781250,28,1273.9926757812,,, +1.7695312500,28,1273.2601318359,,, +1.7714843750,28,1273.9926757812,,, +1.7734375000,28,1273.2601318359,,, +1.7753906250,28,1272.5274658203,,, +1.7773437500,28,1273.2601318359,,, +1.7792968750,28,1272.5274658203,,, +1.7812500000,28,1273.9926757812,,, +1.7832031250,28,1273.9926757812,,, +1.7851562500,28,1274.7252197266,,, +1.7871093750,28,1276.1904296875,,, +1.7890625000,28,1276.9230957031,,, +1.7910156250,28,1276.9230957031,,, +1.7929687500,28,1279.8535156250,,, +1.7949218750,28,1279.8535156250,,, +1.7968750000,28,1280.5860595703,,, +1.7988281250,28,1282.7839355469,,, +1.8007812500,28,1282.7839355469,,, +1.8027343750,28,1284.2490234375,,, +1.8046875000,28,1286.4468994141,,, +1.8066406250,28,1287.1794433594,,, +1.8085937500,28,1289.3773193359,,, +1.8105468750,28,1291.5750732422,,, +1.8125000000,29,1291.5750732422,,, +1.8144531250,29,1294.5054931641,,, +1.8164062500,29,1295.2380371094,,, +1.8183593750,29,1295.2380371094,,, +1.8203125000,29,1298.1684570312,,, +1.8222656250,29,1298.9011230469,,, +1.8242187500,29,1299.6336669922,,, +1.8261718750,29,1302.5640869141,,, +1.8281250000,29,1303.2967529297,,, +1.8300781250,29,1304.0292968750,,, +1.8320312500,29,1305.4945068359,,, +1.8339843750,29,1305.4945068359,,, +1.8359375000,29,1306.9597167969,,, +1.8378906250,29,1308.4249267578,,, +1.8398437500,29,1308.4249267578,,, +1.8417968750,29,1309.1574707031,,, +1.8437500000,29,1309.1574707031,,, +1.8457031250,29,1309.1574707031,,, +1.8476562500,29,1310.6226806641,,, +1.8496093750,29,1309.8901367188,,, +1.8515625000,29,1309.8901367188,,, +1.8535156250,29,1310.6226806641,,, +1.8554687500,29,1309.1574707031,,, +1.8574218750,29,1308.4249267578,,, +1.8593750000,29,1309.1574707031,,, +1.8613281250,29,1307.6922607422,,, +1.8632812500,29,1309.1574707031,,, +1.8652343750,29,1309.1574707031,,, +1.8671875000,29,1308.4249267578,,, +1.8691406250,29,1309.8901367188,,, +1.8710937500,29,1310.6226806641,,, +1.8730468750,29,1311.3553466797,,, +1.8750000000,30,1312.8205566406,,, +1.8769531250,30,1312.8205566406,,, +1.8789062500,30,1314.2857666016,,, +1.8808593750,30,1316.4835205078,,, +1.8828125000,30,1317.2160644531,,, +1.8847656250,30,1319.4139404297,,, +1.8867187500,30,1320.8791503906,,, +1.8886718750,30,1320.8791503906,,, +1.8906250000,30,1323.0769042969,,, +1.8925781250,30,1324.5421142578,,, +1.8945312500,30,1324.5421142578,,, +1.8964843750,30,1326.7398681641,,, +1.8984375000,30,1326.0073242188,,, +1.9003906250,30,1327.4725341797,,, +1.9023437500,30,1327.4725341797,,, +1.9042968750,30,1328.2050781250,,, +1.9062500000,30,1326.7398681641,,, +1.9082031250,30,1326.0073242188,,, +1.9101562500,30,1327.4725341797,,, +1.9121093750,30,1326.7398681641,,, +1.9140625000,30,1327.4725341797,,, +1.9160156250,30,1327.4725341797,,, +1.9179687500,30,1326.7398681641,,, +1.9199218750,30,1328.9377441406,,, +1.9218750000,30,1328.2050781250,,, +1.9238281250,30,1328.2050781250,,, +1.9257812500,30,1329.6702880859,,, +1.9277343750,30,1329.6702880859,,, +1.9296875000,30,1329.6702880859,,, +1.9316406250,30,1329.6702880859,,, +1.9335937500,30,1330.4029541016,,, +1.9355468750,30,1329.6702880859,,, +1.9375000000,31,1330.4029541016,,, +1.9394531250,31,1330.4029541016,,, +1.9414062500,31,1328.9377441406,,, +1.9433593750,31,1330.4029541016,,, +1.9453125000,31,1328.9377441406,,, +1.9472656250,31,1328.9377441406,,, +1.9492187500,31,1328.9377441406,,, +1.9511718750,31,1327.4725341797,,, +1.9531250000,31,1328.2050781250,,, +1.9550781250,31,1326.7398681641,,, +1.9570312500,31,1325.2747802734,,, +1.9589843750,31,1325.2747802734,,, +1.9609375000,31,1323.8095703125,,, +1.9628906250,31,1324.5421142578,,, +1.9648437500,31,1323.0769042969,,, +1.9667968750,31,1321.6116943359,,, +1.9687500000,31,1323.0769042969,,, +1.9707031250,31,1320.1464843750,,, +1.9726562500,31,1319.4139404297,,, +1.9746093750,31,1317.9487304688,,, +1.9765625000,31,1317.2160644531,,, +1.9785156250,31,1317.9487304688,,, +1.9804687500,31,1317.2160644531,,, +1.9824218750,31,1315.7509765625,,, +1.9843750000,31,1317.2160644531,,, +1.9863281250,31,1315.7509765625,,, +1.9882812500,31,1314.2857666016,,, +1.9902343750,31,1315.7509765625,,, +1.9921875000,31,1313.5531005859,,, +1.9941406250,31,1313.5531005859,,, +1.9960937500,31,1313.5531005859,,, +1.9980468750,31,1312.0878906250,,, +2.0000000000,32,1311.3553466797,,, +2.0019531250,32,1312.0878906250,,, +2.0039062500,32,1309.8901367188,,, +2.0058593750,32,1310.6226806641,,, +2.0078125000,32,1309.8901367188,,, +2.0097656250,32,1309.1574707031,,, +2.0117187500,32,1309.8901367188,,, +2.0136718750,32,1309.1574707031,,, +2.0156250000,32,1308.4249267578,,, +2.0175781250,32,1309.1574707031,,, +2.0195312500,32,1309.1574707031,,, +2.0214843750,32,1309.1574707031,,, +2.0234375000,32,1311.3553466797,,, +2.0253906250,32,1310.6226806641,,, +2.0273437500,32,1312.0878906250,,, +2.0292968750,32,1312.8205566406,,, +2.0312500000,32,1312.8205566406,,, +2.0332031250,32,1315.0183105469,,, +2.0351562500,32,1315.7509765625,,, +2.0371093750,32,1315.7509765625,,, +2.0390625000,32,1318.6812744141,,, +2.0410156250,32,1319.4139404297,,, +2.0429687500,32,1321.6116943359,,, +2.0449218750,32,1324.5421142578,,, +2.0468750000,32,1326.0073242188,,, +2.0488281250,32,1330.4029541016,,, +2.0507812500,32,1333.3333740234,,, +2.0527343750,32,1336.9963378906,,, +2.0546875000,32,1341.3919677734,,, +2.0566406250,32,1346.5201416016,,, +2.0585937500,32,1351.6483154297,,, +2.0605468750,32,1358.2416992188,,, +2.0625000000,33,1364.1025390625,,, +2.0644531250,33,1370.6959228516,,, +2.0664062500,33,1379.4871826172,,, +2.0683593750,33,1386.8132324219,,, +2.0703125000,33,1393.4066162109,,, +2.0722656250,33,1403.6629638672,,, +2.0742187500,33,1412.4542236328,,, +2.0761718750,33,1420.5128173828,,, +2.0781250000,33,1432.2343750000,,, +2.0800781250,33,1442.4908447266,,, +2.0820312500,33,1452.7471923828,,, +2.0839843750,33,1465.9340820312,,, +2.0859375000,33,1477.6556396484,,, +2.0878906250,33,1490.8425292969,,, +2.0898437500,33,1506.2270507812,,, +2.0917968750,33,1520.1464843750,,, +2.0937500000,33,1535.5311279297,,, +2.0957031250,33,1551.6483154297,,, +2.0976562500,33,1566.3004150391,,, +2.0996093750,33,1583.1501464844,,, +2.1015625000,33,1597.8022460938,,, +2.1035156250,33,1613.1867675781,,, +2.1054687500,33,1628.5714111328,,, +2.1074218750,33,1643.9560546875,,, +2.1093750000,33,1660.0732421875,,, +2.1113281250,33,1673.9926757812,,, +2.1132812500,33,1687.9121093750,,, +2.1152343750,33,1703.2967529297,,, +2.1171875000,33,1717.2160644531,,, +2.1191406250,33,1729.6702880859,,, +2.1210937500,33,1743.5897216797,,, +2.1230468750,33,1755.3114013672,,, +2.1250000000,34,1767.0329589844,,, +2.1269531250,34,1778.7546386719,,, +2.1289062500,34,1789.0109863281,,, +2.1308593750,34,1800.7325439453,,, +2.1328125000,34,1810.2564697266,,, +2.1347656250,34,1821.2453613281,,, +2.1367187500,34,1829.3040771484,,, +2.1386718750,34,1838.0952148438,,, +2.1406250000,34,1845.4212646484,,, +2.1425781250,34,1852.0146484375,,, +2.1445312500,34,1859.3406982422,,, +2.1464843750,34,1865.2014160156,,, +2.1484375000,34,1871.0622558594,,, +2.1503906250,34,1873.9926757812,,, +2.1523437500,34,1879.1208496094,,, +2.1542968750,34,1880.5860595703,,, +2.1562500000,34,1881.3187255859,,, +2.1582031250,34,1882.0512695312,,, +2.1601562500,34,1881.3187255859,,, +2.1621093750,34,1881.3187255859,,, +2.1640625000,34,1879.1208496094,,, +2.1660156250,34,1878.3883056641,,, +2.1679687500,34,1873.9926757812,,, +2.1699218750,34,1870.3297119141,,, +2.1718750000,34,1866.6666259766,,, +2.1738281250,34,1860.8059082031,,, +2.1757812500,34,1856.4102783203,,, +2.1777343750,34,1848.3516845703,,, +2.1796875000,34,1841.0256347656,,, +2.1816406250,34,1824.1757812500,,, +2.1835937500,34,1816.8498535156,,, +2.1855468750,34,1807.3260498047,,, +2.1875000000,35,1798.5347900391,,, +2.1894531250,35,1788.2784423828,,, +2.1914062500,35,1777.2894287109,,, +2.1933593750,35,1767.7656250000,,, +2.1953125000,35,1756.7766113281,,, +2.1972656250,35,1745.7875976562,,, +2.1992187500,35,1733.3333740234,,, +2.2011718750,35,1721.6116943359,,, +2.2031250000,35,1711.3553466797,,, +2.2050781250,35,1698.9011230469,,, +2.2070312500,35,1687.1794433594,,, +2.2089843750,35,1675.4578857422,,, +2.2109375000,35,1661.5384521484,,, +2.2128906250,35,1650.5494384766,,, +2.2148437500,35,1638.0952148438,,, +2.2167968750,35,1627.1062011719,,, +2.2187500000,35,1614.6519775391,,, +2.2207031250,35,1602.1977539062,,, +2.2226562500,35,1591.2087402344,,, +2.2246093750,35,1578.7546386719,,, +2.2265625000,35,1568.4981689453,,, +2.2285156250,35,1557.5091552734,,, +2.2304687500,35,1547.2528076172,,, +2.2324218750,35,1536.2637939453,,, +2.2343750000,35,1525.2747802734,,, +2.2363281250,35,1515.7509765625,,, +2.2382812500,35,1506.2270507812,,, +2.2402343750,35,1495.9707031250,,, +2.2421875000,35,1486.4468994141,,, +2.2441406250,35,1476.9230957031,,, +2.2460937500,35,1467.3992919922,,, +2.2480468750,35,1459.3406982422,,, +2.2500000000,36,1449.0842285156,,, +2.2519531250,36,1438.0952148438,,, +2.2539062500,36,1429.3040771484,,, +2.2558593750,36,1420.5128173828,,, +2.2578125000,36,1410.9890136719,,, +2.2597656250,36,1402.9304199219,,, +2.2617187500,36,1394.8718261719,,, +2.2636718750,36,1386.0805664062,,, +2.2656250000,36,1378.0219726562,,, +2.2675781250,36,1371.4285888672,,, +2.2695312500,36,1362.6373291016,,, +2.2714843750,36,1355.3114013672,,, +2.2734375000,36,1348.7178955078,,, +2.2753906250,36,1340.6593017578,,, +2.2773437500,36,1335.5311279297,,, +2.2792968750,36,1330.4029541016,,, +2.2812500000,36,1323.8095703125,,, +2.2832031250,36,1319.4139404297,,, +2.2851562500,36,1315.0183105469,,, +2.2871093750,36,1309.1574707031,,, +2.2890625000,36,1307.6922607422,,, +2.2910156250,36,1304.0292968750,,, +2.2929687500,36,1299.6336669922,,, +2.2949218750,36,1297.4359130859,,, +2.2968750000,36,1293.7729492188,,, +2.2988281250,36,1290.1098632812,,, +2.3007812500,36,1288.6446533203,,, +2.3027343750,36,1284.9816894531,,, +2.3046875000,36,1283.5164794922,,, +2.3066406250,36,1281.3187255859,,, +2.3085937500,36,1279.8535156250,,, +2.3105468750,36,1279.1208496094,,, +2.3125000000,37,1276.9230957031,,, +2.3144531250,37,1276.9230957031,,, +2.3164062500,37,1276.1904296875,,, +2.3183593750,37,1275.4578857422,,, +2.3203125000,37,1277.6556396484,,, +2.3222656250,37,1277.6556396484,,, +2.3242187500,37,1277.6556396484,,, +2.3261718750,37,1280.5860595703,,, +2.3281250000,37,1282.0512695312,,, +2.3300781250,37,1282.7839355469,,, +2.3320312500,37,1285.7142333984,,, +2.3339843750,37,1288.6446533203,,, +2.3359375000,37,1290.8425292969,,, +2.3378906250,37,1293.7729492188,,, +2.3398437500,37,1295.9707031250,,, +2.3417968750,37,1298.1684570312,,, +2.3437500000,37,1301.8315429688,,, +2.3457031250,37,1305.4945068359,,, +2.3476562500,37,1307.6922607422,,, +2.3496093750,37,1310.6226806641,,, +2.3515625000,37,1315.0183105469,,, +2.3535156250,37,1317.2160644531,,, +2.3554687500,37,1320.1464843750,,, +2.3574218750,37,1324.5421142578,,, +2.3593750000,37,1327.4725341797,,, +2.3613281250,37,1330.4029541016,,, +2.3632812500,37,1335.5311279297,,, +2.3652343750,37,1339.1940917969,,, +2.3671875000,37,1342.8571777344,,, +2.3691406250,37,1347.9853515625,,, +2.3710937500,37,1352.3809814453,,, +2.3730468750,37,1356.7766113281,,, +2.3750000000,38,1362.6373291016,,, +2.3769531250,38,1367.0329589844,,, +2.3789062500,38,1370.6959228516,,, +2.3808593750,38,1376.5567626953,,, +2.3828125000,38,1378.7546386719,,, +2.3847656250,38,1383.1501464844,,, +2.3867187500,38,1387.5457763672,,, +2.3886718750,38,1391.9414062500,,, +2.3906250000,38,1394.8718261719,,, +2.3925781250,38,1398.5347900391,,, +2.3945312500,38,1401.4652099609,,, +2.3964843750,38,1404.3956298828,,, +2.3984375000,38,1406.5933837891,,, +2.4003906250,38,1410.9890136719,,, +2.4023437500,38,1412.4542236328,,, +2.4042968750,38,1414.6519775391,,, +2.4062500000,38,1418.3150634766,,, +2.4082031250,38,1419.0476074219,,, +2.4101562500,38,1419.7802734375,,, +2.4121093750,38,1421.2453613281,,, +2.4140625000,38,1422.7105712891,,, +2.4160156250,38,1422.7105712891,,, +2.4179687500,38,1424.1757812500,,, +2.4199218750,38,1424.1757812500,,, +2.4218750000,38,1424.1757812500,,, +2.4238281250,38,1424.9084472656,,, +2.4257812500,38,1424.1757812500,,, +2.4277343750,38,1423.4432373047,,, +2.4296875000,38,1424.1757812500,,, +2.4316406250,38,1423.4432373047,,, +2.4335937500,38,1422.7105712891,,, +2.4355468750,38,1421.9780273438,,, +2.4375000000,39,1421.9780273438,,, +2.4394531250,39,1420.5128173828,,, +2.4414062500,39,1419.0476074219,,, +2.4433593750,39,1418.3150634766,,, +2.4453125000,39,1416.8498535156,,, +2.4472656250,39,1414.6519775391,,, +2.4492187500,39,1413.9194335938,,, +2.4511718750,39,1411.7215576172,,, +2.4531250000,39,1408.7912597656,,, +2.4550781250,39,1408.0585937500,,, +2.4570312500,39,1405.1281738281,,, +2.4589843750,39,1402.1977539062,,, +2.4609375000,39,1400.7325439453,,, +2.4628906250,39,1397.8022460938,,, +2.4648437500,39,1394.8718261719,,, +2.4667968750,39,1392.6739501953,,, +2.4687500000,39,1389.7435302734,,, +2.4707031250,39,1385.3480224609,,, +2.4726562500,39,1383.8828125000,,, +2.4746093750,39,1380.9523925781,,, +2.4765625000,39,1377.2894287109,,, +2.4785156250,39,1375.0915527344,,, +2.4804687500,39,1371.4285888672,,, +2.4824218750,39,1367.0329589844,,, +2.4843750000,39,1364.1025390625,,, +2.4863281250,39,1360.4395751953,,, +2.4882812500,39,1356.7766113281,,, +2.4902343750,39,1353.8461914062,,, +2.4921875000,39,1350.9157714844,,, +2.4941406250,39,1347.2528076172,,, +2.4960937500,39,1343.5897216797,,, +2.4980468750,39,1342.8571777344,,, +2.5000000000,40,1339.1940917969,,, +2.5019531250,40,1336.2637939453,,, +2.5039062500,40,1335.5311279297,,, +2.5058593750,40,1333.3333740234,,, +2.5078125000,40,1331.1354980469,,, +2.5097656250,40,1329.6702880859,,, +2.5117187500,40,1327.4725341797,,, +2.5136718750,40,1326.0073242188,,, +2.5156250000,40,1324.5421142578,,, +2.5175781250,40,1323.0769042969,,, +2.5195312500,40,1320.8791503906,,, +2.5214843750,40,1320.1464843750,,, +2.5234375000,40,1321.6116943359,,, +2.5253906250,40,1320.8791503906,,, +2.5273437500,40,1319.4139404297,,, +2.5292968750,40,1320.1464843750,,, +2.5312500000,40,1318.6812744141,,, +2.5332031250,40,1317.2160644531,,, +2.5351562500,40,1317.9487304688,,, +2.5371093750,40,1316.4835205078,,, +2.5390625000,40,1315.0183105469,,, +2.5410156250,40,1313.5531005859,,, +2.5429687500,40,1312.8205566406,,, +2.5449218750,40,1311.3553466797,,, +2.5468750000,40,1309.8901367188,,, +2.5488281250,40,1309.8901367188,,, +2.5507812500,40,1307.6922607422,,, +2.5527343750,40,1307.6922607422,,, +2.5546875000,40,1307.6922607422,,, +2.5566406250,40,1306.2270507812,,, +2.5585937500,40,1305.4945068359,,, +2.5605468750,40,1305.4945068359,,, +2.5625000000,41,1304.7619628906,,, +2.5644531250,41,1303.2967529297,,, +2.5664062500,41,1304.0292968750,,, +2.5683593750,41,1303.2967529297,,, +2.5703125000,41,1301.8315429688,,, +2.5722656250,41,1301.0988769531,,, +2.5742187500,41,1301.0988769531,,, +2.5761718750,41,1299.6336669922,,, +2.5781250000,41,1298.9011230469,,, +2.5800781250,41,1298.1684570312,,, +2.5820312500,41,1295.9707031250,,, +2.5839843750,41,1294.5054931641,,, +2.5859375000,41,1294.5054931641,,, +2.5878906250,41,1293.0402832031,,, +2.5898437500,41,1293.0402832031,,, +2.5917968750,41,1292.3077392578,,, +2.5937500000,41,1290.8425292969,,, +2.5957031250,41,1290.1098632812,,, +2.5976562500,41,1290.1098632812,,, +2.5996093750,41,1288.6446533203,,, +2.6015625000,41,1287.9121093750,,, +2.6035156250,41,1290.1098632812,,, +2.6054687500,41,1289.3773193359,,, +2.6074218750,41,1289.3773193359,,, +2.6093750000,41,1289.3773193359,,, +2.6113281250,41,1290.1098632812,,, +2.6132812500,41,1290.1098632812,,, +2.6152343750,41,1290.8425292969,,, +2.6171875000,41,1291.5750732422,,, +2.6191406250,41,1291.5750732422,,, +2.6210937500,41,1293.0402832031,,, +2.6230468750,41,1295.2380371094,,, +2.6250000000,42,1295.9707031250,,, +2.6269531250,42,1295.9707031250,,, +2.6289062500,42,1298.9011230469,,, +2.6308593750,42,1298.9011230469,,, +2.6328125000,42,1300.3663330078,,, +2.6347656250,42,1303.2967529297,,, +2.6367187500,42,1303.2967529297,,, +2.6386718750,42,1304.7619628906,,, +2.6406250000,42,1306.2270507812,,, +2.6425781250,42,1307.6922607422,,, +2.6445312500,42,1308.4249267578,,, +2.6464843750,42,1310.6226806641,,, +2.6484375000,42,1312.8205566406,,, +2.6503906250,42,1312.8205566406,,, +2.6523437500,42,1312.8205566406,,, +2.6542968750,42,1315.0183105469,,, +2.6562500000,42,1315.0183105469,,, +2.6582031250,42,1315.7509765625,,, +2.6601562500,42,1317.9487304688,,, +2.6621093750,42,1319.4139404297,,, +2.6640625000,42,1320.1464843750,,, +2.6660156250,42,1320.8791503906,,, +2.6679687500,42,1323.8095703125,,, +2.6699218750,42,1323.0769042969,,, +2.6718750000,42,1323.0769042969,,, +2.6738281250,42,1325.2747802734,,, +2.6757812500,42,1326.7398681641,,, +2.6777343750,42,1325.2747802734,,, +2.6796875000,42,1326.0073242188,,, +2.6816406250,42,1328.2050781250,,, +2.6835937500,42,1327.4725341797,,, +2.6855468750,42,1327.4725341797,,, +2.6875000000,43,1329.6702880859,,, +2.6894531250,43,1329.6702880859,,, +2.6914062500,43,1329.6702880859,,, +2.6933593750,43,1331.1354980469,,, +2.6953125000,43,1331.1354980469,,, +2.6972656250,43,1331.1354980469,,, +2.6992187500,43,1331.8681640625,,, +2.7011718750,43,1334.0659179688,,, +2.7031250000,43,1334.0659179688,,, +2.7050781250,43,1334.7985839844,,, +2.7070312500,43,1336.2637939453,,, +2.7089843750,43,1336.9963378906,,, +2.7109375000,43,1336.9963378906,,, +2.7128906250,43,1337.7288818359,,, +2.7148437500,43,1339.1940917969,,, +2.7167968750,43,1339.1940917969,,, +2.7187500000,43,1339.1940917969,,, +2.7207031250,43,1339.1940917969,,, +2.7226562500,43,1340.6593017578,,, +2.7246093750,43,1339.9267578125,,, +2.7265625000,43,1339.9267578125,,, +2.7285156250,43,1341.3919677734,,, +2.7304687500,43,1339.9267578125,,, +2.7324218750,43,1339.1940917969,,, +2.7343750000,43,1339.1940917969,,, +2.7363281250,43,1337.7288818359,,, +2.7382812500,43,1336.2637939453,,, +2.7402343750,43,1335.5311279297,,, +2.7421875000,43,1335.5311279297,,, +2.7441406250,43,1333.3333740234,,, +2.7460937500,43,1332.6007080078,,, +2.7480468750,43,1333.3333740234,,, +2.7500000000,44,1331.8681640625,,, +2.7519531250,44,1331.1354980469,,, +2.7539062500,44,1330.4029541016,,, +2.7558593750,44,1331.8681640625,,, +2.7578125000,44,1329.6702880859,,, +2.7597656250,44,1328.2050781250,,, +2.7617187500,44,1328.9377441406,,, +2.7636718750,44,1328.2050781250,,, +2.7656250000,44,1326.0073242188,,, +2.7675781250,44,1326.0073242188,,, +2.7695312500,44,1324.5421142578,,, +2.7714843750,44,1323.8095703125,,, +2.7734375000,44,1323.0769042969,,, +2.7753906250,44,1322.3443603516,,, +2.7773437500,44,1320.1464843750,,, +2.7792968750,44,1318.6812744141,,, +2.7812500000,44,1317.9487304688,,, +2.7832031250,44,1316.4835205078,,, +2.7851562500,44,1314.2857666016,,, +2.7871093750,44,1314.2857666016,,, +2.7890625000,44,1312.8205566406,,, +2.7910156250,44,1312.0878906250,,, +2.7929687500,44,1311.3553466797,,, +2.7949218750,44,1311.3553466797,,, +2.7968750000,44,1310.6226806641,,, +2.7988281250,44,1309.1574707031,,, +2.8007812500,44,1309.1574707031,,, +2.8027343750,44,1309.8901367188,,, +2.8046875000,44,1309.8901367188,,, +2.8066406250,44,1310.6226806641,,, +2.8085937500,44,1312.0878906250,,, +2.8105468750,44,1313.5531005859,,, +2.8125000000,45,1315.0183105469,,, +2.8144531250,45,1315.7509765625,,, +2.8164062500,45,1320.1464843750,,, +2.8183593750,45,1323.8095703125,,, +2.8203125000,45,1326.7398681641,,, +2.8222656250,45,1332.6007080078,,, +2.8242187500,45,1338.4615478516,,, +2.8261718750,45,1342.1245117188,,, +2.8281250000,45,1351.6483154297,,, +2.8300781250,45,1359.7069091797,,, +2.8320312500,45,1367.7656250000,,, +2.8339843750,45,1375.8242187500,,, +2.8359375000,45,1387.5457763672,,, +2.8378906250,45,1397.8022460938,,, +2.8398437500,45,1408.0585937500,,, +2.8417968750,45,1420.5128173828,,, +2.8437500000,45,1432.9670410156,,, +2.8457031250,45,1445.4212646484,,, +2.8476562500,45,1456.4102783203,,, +2.8496093750,45,1471.0622558594,,, +2.8515625000,45,1485.7142333984,,, +2.8535156250,45,1498.9011230469,,, +2.8554687500,45,1515.0183105469,,, +2.8574218750,45,1529.6702880859,,, +2.8593750000,45,1544.3223876953,,, +2.8613281250,45,1559.7069091797,,, +2.8632812500,45,1576.5567626953,,, +2.8652343750,45,1591.2087402344,,, +2.8671875000,45,1605.8608398438,,, +2.8691406250,45,1621.9780273438,,, +2.8710937500,45,1636.6300048828,,, +2.8730468750,45,1651.2821044922,,, +2.8750000000,46,1665.9340820312,,, +2.8769531250,46,1681.3187255859,,, +2.8789062500,46,1693.7729492188,,, +2.8808593750,46,1707.6922607422,,, +2.8828125000,46,1722.3443603516,,, +2.8847656250,46,1734.0659179688,,, +2.8867187500,46,1746.5201416016,,, +2.8886718750,46,1759.7069091797,,, +2.8906250000,46,1770.6959228516,,, +2.8925781250,46,1780.2197265625,,, +2.8945312500,46,1790.4761962891,,, +2.8964843750,46,1801.4652099609,,, +2.8984375000,46,1809.5238037109,,, +2.9003906250,46,1816.8498535156,,, +2.9023437500,46,1824.9084472656,,, +2.9042968750,46,1831.5018310547,,, +2.9062500000,46,1836.6300048828,,, +2.9082031250,46,1841.0256347656,,, +2.9101562500,46,1846.1538085938,,, +2.9121093750,46,1848.3516845703,,, +2.9140625000,46,1851.2821044922,,, +2.9160156250,46,1854.2124023438,,, +2.9179687500,46,1854.2124023438,,, +2.9199218750,46,1854.2124023438,,, +2.9218750000,46,1855.6776123047,,, +2.9238281250,46,1854.9450683594,,, +2.9257812500,46,1852.0146484375,,, +2.9277343750,46,1849.8168945312,,, +2.9296875000,46,1841.7583007812,,, +2.9316406250,46,1835.8974609375,,, +2.9335937500,46,1830.7692871094,,, +2.9355468750,46,1823.4432373047,,, +2.9375000000,47,1817.5823974609,,, +2.9394531250,47,1808.7912597656,,, +2.9414062500,47,1799.2674560547,,, +2.9433593750,47,1791.9414062500,,, +2.9453125000,47,1782.4176025391,,, +2.9472656250,47,1771.4285888672,,, +2.9492187500,47,1761.1721191406,,, +2.9511718750,47,1749.4505615234,,, +2.9531250000,47,1738.4615478516,,, +2.9550781250,47,1726.7398681641,,, +2.9570312500,47,1713.5531005859,,, +2.9589843750,47,1702.5640869141,,, +2.9609375000,47,1688.6446533203,,, +2.9628906250,47,1675.4578857422,,, +2.9648437500,47,1663.7362060547,,, +2.9667968750,47,1650.5494384766,,, +2.9687500000,47,1638.0952148438,,, +2.9707031250,47,1627.1062011719,,, +2.9726562500,47,1613.9194335938,,, +2.9746093750,47,1603.6629638672,,, +2.9765625000,47,1591.2087402344,,, +2.9785156250,47,1579.4871826172,,, +2.9804687500,47,1569.2307128906,,, +2.9824218750,47,1557.5091552734,,, +2.9843750000,47,1546.5201416016,,, +2.9863281250,47,1536.2637939453,,, +2.9882812500,47,1525.2747802734,,, +2.9902343750,47,1515.7509765625,,, +2.9921875000,47,1506.2270507812,,, +2.9941406250,47,1495.2380371094,,, +2.9960937500,47,1486.4468994141,,, +2.9980468750,47,1476.9230957031,,, +3.0000000000,48,1467.3992919922,,, +3.0019531250,48,1459.3406982422,,, +3.0039062500,48,1450.5494384766,,, +3.0058593750,48,1442.4908447266,,, +3.0078125000,48,1435.8974609375,,, +3.0097656250,48,1427.8388671875,,, +3.0117187500,48,1419.7802734375,,, +3.0136718750,48,1413.1867675781,,, +3.0156250000,48,1405.1281738281,,, +3.0175781250,48,1400.0000000000,,, +3.0195312500,48,1393.4066162109,,, +3.0214843750,48,1387.5457763672,,, +3.0234375000,48,1382.4176025391,,, +3.0253906250,48,1376.5567626953,,, +3.0273437500,48,1369.9633789062,,, +3.0292968750,48,1366.3004150391,,, +3.0312500000,48,1360.4395751953,,, +3.0332031250,48,1355.3114013672,,, +3.0351562500,48,1352.3809814453,,, +3.0371093750,48,1347.2528076172,,, +3.0390625000,48,1342.8571777344,,, +3.0410156250,48,1339.9267578125,,, +3.0429687500,48,1335.5311279297,,, +3.0449218750,48,1334.0659179688,,, +3.0468750000,48,1330.4029541016,,, +3.0488281250,48,1326.7398681641,,, +3.0507812500,48,1325.2747802734,,, +3.0527343750,48,1322.3443603516,,, +3.0546875000,48,1322.3443603516,,, +3.0566406250,48,1319.4139404297,,, +3.0585937500,48,1318.6812744141,,, +3.0605468750,48,1315.7509765625,,, +3.0625000000,49,1314.2857666016,,, +3.0644531250,49,1312.8205566406,,, +3.0664062500,49,1312.0878906250,,, +3.0683593750,49,1310.6226806641,,, +3.0703125000,49,1309.8901367188,,, +3.0722656250,49,1307.6922607422,,, +3.0742187500,49,1307.6922607422,,, +3.0761718750,49,1308.4249267578,,, +3.0781250000,49,1307.6922607422,,, +3.0800781250,49,1309.1574707031,,, +3.0820312500,49,1309.1574707031,,, +3.0839843750,49,1309.1574707031,,, +3.0859375000,49,1310.6226806641,,, +3.0878906250,49,1311.3553466797,,, +3.0898437500,49,1312.0878906250,,, +3.0917968750,49,1313.5531005859,,, +3.0937500000,49,1315.0183105469,,, +3.0957031250,49,1315.7509765625,,, +3.0976562500,49,1317.2160644531,,, +3.0996093750,49,1320.1464843750,,, +3.1015625000,49,1321.6116943359,,, +3.1035156250,49,1323.8095703125,,, +3.1054687500,49,1326.0073242188,,, +3.1074218750,49,1329.6702880859,,, +3.1093750000,49,1331.8681640625,,, +3.1113281250,49,1332.6007080078,,, +3.1132812500,49,1334.7985839844,,, +3.1152343750,49,1338.4615478516,,, +3.1171875000,49,1341.3919677734,,, +3.1191406250,49,1341.3919677734,,, +3.1210937500,49,1341.3919677734,,, +3.1230468750,49,1344.3223876953,,, +3.1250000000,50,1345.7875976562,,, +3.1269531250,50,1350.1831054688,,, +3.1289062500,50,1354.5787353516,,, +3.1308593750,50,1357.5091552734,,, +3.1328125000,50,1361.1721191406,,, +3.1347656250,50,1366.3004150391,,, +3.1367187500,50,1370.6959228516,,, +3.1386718750,50,1374.3590087891,,, +3.1406250000,50,1378.7546386719,,, +3.1425781250,50,1385.3480224609,,, +3.1445312500,50,1389.0109863281,,, +3.1464843750,50,1392.6739501953,,, +3.1484375000,50,1397.8022460938,,, +3.1503906250,50,1402.9304199219,,, +3.1523437500,50,1405.8608398438,,, +3.1542968750,50,1408.7912597656,,, +3.1562500000,50,1413.1867675781,,, +3.1582031250,50,1416.1171875000,,, +3.1601562500,50,1417.5823974609,,, +3.1621093750,50,1419.0476074219,,, +3.1640625000,50,1421.9780273438,,, +3.1660156250,50,1422.7105712891,,, +3.1679687500,50,1422.7105712891,,, +3.1699218750,50,1422.7105712891,,, +3.1718750000,50,1424.1757812500,,, +3.1738281250,50,1424.9084472656,,, +3.1757812500,50,1424.1757812500,,, +3.1777343750,50,1423.4432373047,,, +3.1796875000,50,1424.9084472656,,, +3.1816406250,50,1423.4432373047,,, +3.1835937500,50,1421.9780273438,,, +3.1855468750,50,1421.2453613281,,, +3.1875000000,51,1421.9780273438,,, +3.1894531250,51,1420.5128173828,,, +3.1914062500,51,1419.7802734375,,, +3.1933593750,51,1419.0476074219,,, +3.1953125000,51,1418.3150634766,,, +3.1972656250,51,1416.8498535156,,, +3.1992187500,51,1414.6519775391,,, +3.2011718750,51,1414.6519775391,,, +3.2031250000,51,1413.1867675781,,, +3.2050781250,51,1409.5238037109,,, +3.2070312500,51,1408.0585937500,,, +3.2089843750,51,1407.3260498047,,, +3.2109375000,51,1405.1281738281,,, +3.2128906250,51,1402.9304199219,,, +3.2148437500,51,1400.7325439453,,, +3.2167968750,51,1400.0000000000,,, +3.2187500000,51,1396.3370361328,,, +3.2207031250,51,1394.1391601562,,, +3.2226562500,51,1391.2087402344,,, +3.2246093750,51,1390.4761962891,,, +3.2265625000,51,1387.5457763672,,, +3.2285156250,51,1384.6153564453,,, +3.2304687500,51,1382.4176025391,,, +3.2324218750,51,1380.9523925781,,, +3.2343750000,51,1378.0219726562,,, +3.2363281250,51,1374.3590087891,,, +3.2382812500,51,1372.8937988281,,, +3.2402343750,51,1369.2307128906,,, +3.2421875000,51,1365.5677490234,,, +3.2441406250,51,1362.6373291016,,, +3.2460937500,51,1360.4395751953,,, +3.2480468750,51,1356.7766113281,,, +3.2500000000,52,1353.8461914062,,, +3.2519531250,52,1350.9157714844,,, +3.2539062500,52,1348.7178955078,,, +3.2558593750,52,1345.7875976562,,, +3.2578125000,52,1342.1245117188,,, +3.2597656250,52,1340.6593017578,,, +3.2617187500,52,1338.4615478516,,, +3.2636718750,52,1335.5311279297,,, +3.2656250000,52,1334.0659179688,,, +3.2675781250,52,1333.3333740234,,, +3.2695312500,52,1331.1354980469,,, +3.2714843750,52,1329.6702880859,,, +3.2734375000,52,1328.9377441406,,, +3.2753906250,52,1327.4725341797,,, +3.2773437500,52,1325.2747802734,,, +3.2792968750,52,1323.0769042969,,, +3.2812500000,52,1323.0769042969,,, +3.2832031250,52,1321.6116943359,,, +3.2851562500,52,1319.4139404297,,, +3.2871093750,52,1318.6812744141,,, +3.2890625000,52,1319.4139404297,,, +3.2910156250,52,1318.6812744141,,, +3.2929687500,52,1317.9487304688,,, +3.2949218750,52,1316.4835205078,,, +3.2968750000,52,1317.2160644531,,, +3.2988281250,52,1316.4835205078,,, +3.3007812500,52,1315.0183105469,,, +3.3027343750,52,1314.2857666016,,, +3.3046875000,52,1314.2857666016,,, +3.3066406250,52,1312.8205566406,,, +3.3085937500,52,1311.3553466797,,, +3.3105468750,52,1309.8901367188,,, +3.3125000000,53,1309.8901367188,,, +3.3144531250,53,1308.4249267578,,, +3.3164062500,53,1307.6922607422,,, +3.3183593750,53,1307.6922607422,,, +3.3203125000,53,1305.4945068359,,, +3.3222656250,53,1304.7619628906,,, +3.3242187500,53,1304.7619628906,,, +3.3261718750,53,1304.0292968750,,, +3.3281250000,53,1303.2967529297,,, +3.3300781250,53,1304.0292968750,,, +3.3320312500,53,1303.2967529297,,, +3.3339843750,53,1301.8315429688,,, +3.3359375000,53,1302.5640869141,,, +3.3378906250,53,1301.8315429688,,, +3.3398437500,53,1301.0988769531,,, +3.3417968750,53,1301.8315429688,,, +3.3437500000,53,1301.0988769531,,, +3.3457031250,53,1299.6336669922,,, +3.3476562500,53,1301.8315429688,,, +3.3496093750,53,1300.3663330078,,, +3.3515625000,53,1300.3663330078,,, +3.3535156250,53,1301.8315429688,,, +3.3554687500,53,1301.8315429688,,, +3.3574218750,53,1300.3663330078,,, +3.3593750000,53,1302.5640869141,,, +3.3613281250,53,1302.5640869141,,, +3.3632812500,53,1302.5640869141,,, +3.3652343750,53,1304.0292968750,,, +3.3671875000,53,1304.0292968750,,, +3.3691406250,53,1304.0292968750,,, +3.3710937500,53,1305.4945068359,,, +3.3730468750,53,1306.2270507812,,, +3.3750000000,54,1306.2270507812,,, +3.3769531250,54,1308.4249267578,,, +3.3789062500,54,1307.6922607422,,, +3.3808593750,54,1307.6922607422,,, +3.3828125000,54,1308.4249267578,,, +3.3847656250,54,1309.1574707031,,, +3.3867187500,54,1309.8901367188,,, +3.3886718750,54,1312.0878906250,,, +3.3906250000,54,1311.3553466797,,, +3.3925781250,54,1312.8205566406,,, +3.3945312500,54,1314.2857666016,,, +3.3964843750,54,1313.5531005859,,, +3.3984375000,54,1314.2857666016,,, +3.4003906250,54,1315.0183105469,,, +3.4023437500,54,1317.2160644531,,, +3.4042968750,54,1316.4835205078,,, +3.4062500000,54,1317.2160644531,,, +3.4082031250,54,1319.4139404297,,, +3.4101562500,54,1321.6116943359,,, +3.4121093750,54,1322.3443603516,,, +3.4140625000,54,1323.0769042969,,, +3.4160156250,54,1323.8095703125,,, +3.4179687500,54,1326.0073242188,,, +3.4199218750,54,1326.7398681641,,, +3.4218750000,54,1326.7398681641,,, +3.4238281250,54,1327.4725341797,,, +3.4257812500,54,1328.9377441406,,, +3.4277343750,54,1328.9377441406,,, +3.4296875000,54,1328.2050781250,,, +3.4316406250,54,1330.4029541016,,, +3.4335937500,54,1330.4029541016,,, +3.4355468750,54,1330.4029541016,,, +3.4375000000,55,1329.6702880859,,, +3.4394531250,55,1330.4029541016,,, +3.4414062500,55,1330.4029541016,,, +3.4433593750,55,1329.6702880859,,, +3.4453125000,55,1328.9377441406,,, +3.4472656250,55,1329.6702880859,,, +3.4492187500,55,1329.6702880859,,, +3.4511718750,55,1328.9377441406,,, +3.4531250000,55,1328.2050781250,,, +3.4550781250,55,1329.6702880859,,, +3.4570312500,55,1330.4029541016,,, +3.4589843750,55,1328.9377441406,,, +3.4609375000,55,1327.4725341797,,, +3.4628906250,55,1328.2050781250,,, +3.4648437500,55,1328.2050781250,,, +3.4667968750,55,1326.7398681641,,, +3.4687500000,55,1326.0073242188,,, +3.4707031250,55,1327.4725341797,,, +3.4726562500,55,1326.7398681641,,, +3.4746093750,55,1326.7398681641,,, +3.4765625000,55,1325.2747802734,,, +3.4785156250,55,1326.7398681641,,, +3.4804687500,55,1326.7398681641,,, +3.4824218750,55,1326.0073242188,,, +3.4843750000,55,1326.0073242188,,, +3.4863281250,55,1326.0073242188,,, +3.4882812500,55,1327.4725341797,,, +3.4902343750,55,1328.2050781250,,, +3.4921875000,55,1326.7398681641,,, +3.4941406250,55,1326.0073242188,,, +3.4960937500,55,1327.4725341797,,, +3.4980468750,55,1327.4725341797,,, +3.5000000000,56,1327.4725341797,,, +3.5019531250,56,1326.7398681641,,, +3.5039062500,56,1328.2050781250,,, +3.5058593750,56,1330.4029541016,,, +3.5078125000,56,1330.4029541016,,, +3.5097656250,56,1330.4029541016,,, +3.5117187500,56,1330.4029541016,,, +3.5136718750,56,1332.6007080078,,, +3.5156250000,56,1333.3333740234,,, +3.5175781250,56,1331.8681640625,,, +3.5195312500,56,1331.8681640625,,, +3.5214843750,56,1333.3333740234,,, +3.5234375000,56,1334.0659179688,,, +3.5253906250,56,1333.3333740234,,, +3.5273437500,56,1333.3333740234,,, +3.5292968750,56,1334.0659179688,,, +3.5312500000,56,1334.7985839844,,, +3.5332031250,56,1334.7985839844,,, +3.5351562500,56,1334.7985839844,,, +3.5371093750,56,1334.0659179688,,, +3.5390625000,56,1335.5311279297,,, +3.5410156250,56,1334.7985839844,,, +3.5429687500,56,1334.0659179688,,, +3.5449218750,56,1331.8681640625,,, +3.5468750000,56,1333.3333740234,,, +3.5488281250,56,1332.6007080078,,, +3.5507812500,56,1331.8681640625,,, +3.5527343750,56,1329.6702880859,,, +3.5546875000,56,1330.4029541016,,, +3.5566406250,56,1329.6702880859,,, +3.5585937500,56,1328.2050781250,,, +3.5605468750,56,1326.7398681641,,, +3.5625000000,57,1326.7398681641,,, +3.5644531250,57,1327.4725341797,,, +3.5664062500,57,1325.2747802734,,, +3.5683593750,57,1323.0769042969,,, +3.5703125000,57,1322.3443603516,,, +3.5722656250,57,1323.0769042969,,, +3.5742187500,57,1322.3443603516,,, +3.5761718750,57,1320.8791503906,,, +3.5781250000,57,1318.6812744141,,, +3.5800781250,57,1319.4139404297,,, +3.5820312500,57,1318.6812744141,,, +3.5839843750,57,1317.9487304688,,, +3.5859375000,57,1317.2160644531,,, +3.5878906250,57,1316.4835205078,,, +3.5898437500,57,1317.2160644531,,, +3.5917968750,57,1317.9487304688,,, +3.5937500000,57,1317.2160644531,,, +3.5957031250,57,1315.7509765625,,, +3.5976562500,57,1317.2160644531,,, +3.5996093750,57,1318.6812744141,,, +3.6015625000,57,1318.6812744141,,, +3.6035156250,57,1317.9487304688,,, +3.6054687500,57,1317.2160644531,,, +3.6074218750,57,1319.4139404297,,, +3.6093750000,57,1318.6812744141,,, +3.6113281250,57,1318.6812744141,,, +3.6132812500,57,1319.4139404297,,, +3.6152343750,57,1321.6116943359,,, +3.6171875000,57,1323.0769042969,,, +3.6191406250,57,1324.5421142578,,, +3.6210937500,57,1326.0073242188,,, +3.6230468750,57,1328.9377441406,,, +3.6250000000,58,1333.3333740234,,, +3.6269531250,58,1336.9963378906,,, +3.6289062500,58,1340.6593017578,,, +3.6308593750,58,1344.3223876953,,, +3.6328125000,58,1349.4505615234,,, +3.6347656250,58,1356.7766113281,,, +3.6367187500,58,1362.6373291016,,, +3.6386718750,58,1368.4981689453,,, +3.6406250000,58,1374.3590087891,,, +3.6425781250,58,1383.1501464844,,, +3.6445312500,58,1391.9414062500,,, +3.6464843750,58,1400.0000000000,,, +3.6484375000,58,1408.7912597656,,, +3.6503906250,58,1419.0476074219,,, +3.6523437500,58,1430.0366210938,,, +3.6542968750,58,1441.0256347656,,, +3.6562500000,58,1451.2821044922,,, +3.6582031250,58,1464.4688720703,,, +3.6601562500,58,1479.1208496094,,, +3.6621093750,58,1491.5750732422,,, +3.6640625000,58,1504.7619628906,,, +3.6660156250,58,1518.6812744141,,, +3.6679687500,58,1535.5311279297,,, +3.6699218750,58,1551.6483154297,,, +3.6718750000,58,1567.0329589844,,, +3.6738281250,58,1580.9523925781,,, +3.6757812500,58,1596.3370361328,,, +3.6777343750,58,1612.4542236328,,, +3.6796875000,58,1629.3040771484,,, +3.6816406250,58,1644.6885986328,,, +3.6835937500,58,1660.0732421875,,, +3.6855468750,58,1676.1904296875,,, +3.6875000000,59,1693.0402832031,,, +3.6894531250,59,1708.4249267578,,, +3.6914062500,59,1723.0769042969,,, +3.6933593750,59,1737.7288818359,,, +3.6953125000,59,1751.6483154297,,, +3.6972656250,59,1767.0329589844,,, +3.6992187500,59,1780.9523925781,,, +3.7011718750,59,1794.1391601562,,, +3.7031250000,59,1805.1281738281,,, +3.7050781250,59,1816.8498535156,,, +3.7070312500,59,1827.1062011719,,, +3.7089843750,59,1838.0952148438,,, +3.7109375000,59,1848.3516845703,,, +3.7128906250,59,1857.8754882812,,, +3.7148437500,59,1864.4688720703,,, +3.7167968750,59,1870.3297119141,,, +3.7187500000,59,1876.1904296875,,, +3.7207031250,59,1882.0512695312,,, +3.7226562500,59,1887.9121093750,,, +3.7246093750,59,1890.1098632812,,, +3.7265625000,59,1891.5750732422,,, +3.7285156250,59,1892.3077392578,,, +3.7304687500,59,1893.0402832031,,, +3.7324218750,59,1893.7729492188,,, +3.7343750000,59,1893.0402832031,,, +3.7363281250,59,1890.1098632812,,, +3.7382812500,59,1886.4468994141,,, +3.7402343750,59,1882.0512695312,,, +3.7421875000,59,1878.3883056641,,, +3.7441406250,59,1873.2601318359,,, +3.7460937500,59,1866.6666259766,,, +3.7480468750,59,1859.3406982422,,, +3.7500000000,60,1852.0146484375,,, +3.7519531250,60,1846.8864746094,,, +3.7539062500,60,1837.3626708984,,, +3.7558593750,60,1827.8388671875,,, +3.7578125000,60,1818.3150634766,,, +3.7597656250,60,1809.5238037109,,, +3.7617187500,60,1800.0000000000,,, +3.7636718750,60,1788.2784423828,,, +3.7656250000,60,1777.2894287109,,, +3.7675781250,60,1765.5677490234,,, +3.7695312500,60,1755.3114013672,,, +3.7714843750,60,1745.0549316406,,, +3.7734375000,60,1732.6007080078,,, +3.7753906250,60,1719.4139404297,,, +3.7773437500,60,1708.4249267578,,, +3.7792968750,60,1697.4359130859,,, +3.7812500000,60,1686.4468994141,,, +3.7832031250,60,1673.2601318359,,, +3.7851562500,60,1660.0732421875,,, +3.7871093750,60,1649.0842285156,,, +3.7890625000,60,1638.8278808594,,, +3.7910156250,60,1627.8388671875,,, +3.7929687500,60,1616.1171875000,,, +3.7949218750,60,1605.8608398438,,, +3.7968750000,60,1597.0695800781,,, +3.7988281250,60,1587.5457763672,,, +3.8007812500,60,1576.5567626953,,, +3.8027343750,60,1567.0329589844,,, +3.8046875000,60,1558.9743652344,,, +3.8066406250,60,1550.9157714844,,, +3.8085937500,60,1541.3919677734,,, +3.8105468750,60,1531.1354980469,,, +3.8125000000,61,1523.0769042969,,, +3.8144531250,61,1515.0183105469,,, +3.8164062500,61,1508.4249267578,,, +3.8183593750,61,1500.3663330078,,, +3.8203125000,61,1492.3077392578,,, +3.8222656250,61,1484.2490234375,,, +3.8242187500,61,1478.3883056641,,, +3.8261718750,61,1471.0622558594,,, +3.8281250000,61,1463.7362060547,,, +3.8300781250,61,1455.6776123047,,, +3.8320312500,61,1448.3516845703,,, +3.8339843750,61,1442.4908447266,,, +3.8359375000,61,1435.8974609375,,, +3.8378906250,61,1428.5714111328,,, +3.8398437500,61,1421.9780273438,,, +3.8417968750,61,1416.1171875000,,, +3.8437500000,61,1410.2564697266,,, +3.8457031250,61,1403.6629638672,,, +3.8476562500,61,1397.8022460938,,, +3.8496093750,61,1393.4066162109,,, +3.8515625000,61,1387.5457763672,,, +3.8535156250,61,1381.6849365234,,, +3.8554687500,61,1376.5567626953,,, +3.8574218750,61,1373.6263427734,,, +3.8593750000,61,1367.0329589844,,, +3.8613281250,61,1361.9047851562,,, +3.8632812500,61,1357.5091552734,,, +3.8652343750,61,1353.1135253906,,, +3.8671875000,61,1349.4505615234,,, +3.8691406250,61,1345.7875976562,,, +3.8710937500,61,1341.3919677734,,, +3.8730468750,61,1336.9963378906,,, +3.8750000000,62,1333.3333740234,,, +3.8769531250,62,1331.1354980469,,, +3.8789062500,62,1328.9377441406,,, +3.8808593750,62,1326.0073242188,,, +3.8828125000,62,1323.0769042969,,, +3.8847656250,62,1320.1464843750,,, +3.8867187500,62,1319.4139404297,,, +3.8886718750,62,1319.4139404297,,, +3.8906250000,62,1318.6812744141,,, +3.8925781250,62,1317.9487304688,,, +3.8945312500,62,1317.2160644531,,, +3.8964843750,62,1317.2160644531,,, +3.8984375000,62,1320.1464843750,,, +3.9003906250,62,1322.3443603516,,, +3.9023437500,62,1322.3443603516,,, +3.9042968750,62,1323.0769042969,,, +3.9062500000,62,1323.8095703125,,, +3.9082031250,62,1326.0073242188,,, +3.9101562500,62,1327.4725341797,,, +3.9121093750,62,1328.2050781250,,, +3.9140625000,62,1327.4725341797,,, +3.9160156250,62,1328.9377441406,,, +3.9179687500,62,1331.1354980469,,, +3.9199218750,62,1333.3333740234,,, +3.9218750000,62,1333.3333740234,,, +3.9238281250,62,1334.7985839844,,, +3.9257812500,62,1336.9963378906,,, +3.9277343750,62,1337.7288818359,,, +3.9296875000,62,1338.4615478516,,, +3.9316406250,62,1341.3919677734,,, +3.9335937500,62,1342.8571777344,,, +3.9355468750,62,1343.5897216797,,, +3.9375000000,63,1345.7875976562,,, +3.9394531250,63,1349.4505615234,,, +3.9414062500,63,1351.6483154297,,, +3.9433593750,63,1352.3809814453,,, +3.9453125000,63,1356.0439453125,,, +3.9472656250,63,1358.2416992188,,, +3.9492187500,63,1360.4395751953,,, +3.9511718750,63,1362.6373291016,,, +3.9531250000,63,1366.3004150391,,, +3.9550781250,63,1367.7656250000,,, +3.9570312500,63,1369.2307128906,,, +3.9589843750,63,1372.1611328125,,, +3.9609375000,63,1374.3590087891,,, +3.9628906250,63,1375.8242187500,,, +3.9648437500,63,1376.5567626953,,, +3.9667968750,63,1379.4871826172,,, +3.9687500000,63,1380.9523925781,,, +3.9707031250,63,1381.6849365234,,, +3.9726562500,63,1383.1501464844,,, +3.9746093750,63,1386.0805664062,,, +3.9765625000,63,1385.3480224609,,, +3.9785156250,63,1386.0805664062,,, +3.9804687500,63,1387.5457763672,,, +3.9824218750,63,1389.7435302734,,, +3.9843750000,63,1389.7435302734,,, +3.9863281250,63,1390.4761962891,,, +3.9882812500,63,1391.2087402344,,, +3.9902343750,63,1393.4066162109,,, +3.9921875000,63,1394.1391601562,,, +3.9941406250,63,1394.8718261719,,, +3.9960937500,63,1394.1391601562,,, +3.9980468750,63,1394.1391601562,,, +4.0000000000,64,1394.8718261719,,, +4.0019531250,64,1395.6043701172,,, +4.0039062500,64,1396.3370361328,,, +4.0058593750,64,1397.0695800781,,, +4.0078125000,64,1396.3370361328,,, +4.0097656250,64,1396.3370361328,,, +4.0117187500,64,1397.0695800781,,, +4.0136718750,64,1397.0695800781,,, +4.0156250000,64,1397.8022460938,,, +4.0175781250,64,1397.8022460938,,, +4.0195312500,64,1397.0695800781,,, +4.0214843750,64,1396.3370361328,,, +4.0234375000,64,1397.0695800781,,, +4.0253906250,64,1397.8022460938,,, +4.0273437500,64,1397.0695800781,,, +4.0292968750,64,1395.6043701172,,, +4.0312500000,64,1394.8718261719,,, +4.0332031250,64,1394.1391601562,,, +4.0351562500,64,1393.4066162109,,, +4.0371093750,64,1393.4066162109,,, +4.0390625000,64,1390.4761962891,,, +4.0410156250,64,1388.2784423828,,, +4.0429687500,64,1385.3480224609,,, +4.0449218750,64,1383.8828125000,,, +4.0468750000,64,1382.4176025391,,, +4.0488281250,64,1380.2197265625,,, +4.0507812500,64,1377.2894287109,,, +4.0527343750,64,1375.0915527344,,, +4.0546875000,64,1373.6263427734,,, +4.0566406250,64,1372.1611328125,,, +4.0585937500,64,1364.8352050781,,, +4.0605468750,64,1362.6373291016,,, +4.0625000000,65,1361.1721191406,,, +4.0644531250,65,1358.2416992188,,, +4.0664062500,65,1356.0439453125,,, +4.0683593750,65,1353.1135253906,,, +4.0703125000,65,1351.6483154297,,, +4.0722656250,65,1351.6483154297,,, +4.0742187500,65,1349.4505615234,,, +4.0761718750,65,1347.2528076172,,, +4.0781250000,65,1345.0549316406,,, +4.0800781250,65,1342.1245117188,,, +4.0820312500,65,1342.1245117188,,, +4.0839843750,65,1340.6593017578,,, +4.0859375000,65,1339.9267578125,,, +4.0878906250,65,1337.7288818359,,, +4.0898437500,65,1335.5311279297,,, +4.0917968750,65,1334.7985839844,,, +4.0937500000,65,1334.7985839844,,, +4.0957031250,65,1333.3333740234,,, +4.0976562500,65,1331.1354980469,,, +4.0996093750,65,1328.9377441406,,, +4.1015625000,65,1327.4725341797,,, +4.1035156250,65,1327.4725341797,,, +4.1054687500,65,1328.2050781250,,, +4.1074218750,65,1326.7398681641,,, +4.1093750000,65,1326.0073242188,,, +4.1113281250,65,1323.8095703125,,, +4.1132812500,65,1323.8095703125,,, +4.1152343750,65,1324.5421142578,,, +4.1171875000,65,1319.4139404297,,, +4.1191406250,65,1318.6812744141,,, +4.1210937500,65,1317.2160644531,,, +4.1230468750,65,1317.2160644531,,, +4.1250000000,66,1316.4835205078,,, +4.1269531250,66,1314.2857666016,,, +4.1289062500,66,1312.8205566406,,, +4.1308593750,66,1312.0878906250,,, +4.1328125000,66,1312.8205566406,,, +4.1347656250,66,1312.8205566406,,, +4.1367187500,66,1311.3553466797,,, +4.1386718750,66,1309.8901367188,,, +4.1406250000,66,1309.1574707031,,, +4.1425781250,66,1309.1574707031,,, +4.1445312500,66,1309.1574707031,,, +4.1464843750,66,1308.4249267578,,, +4.1484375000,66,1306.9597167969,,, +4.1503906250,66,1306.9597167969,,, +4.1523437500,66,1307.6922607422,,, +4.1542968750,66,1306.9597167969,,, +4.1562500000,66,1306.2270507812,,, +4.1582031250,66,1306.9597167969,,, +4.1601562500,66,1308.4249267578,,, +4.1621093750,66,1308.4249267578,,, +4.1640625000,66,1309.1574707031,,, +4.1660156250,66,1309.8901367188,,, +4.1679687500,66,1310.6226806641,,, +4.1699218750,66,1310.6226806641,,, +4.1718750000,66,1309.8901367188,,, +4.1738281250,66,1312.0878906250,,, +4.1757812500,66,1312.0878906250,,, +4.1777343750,66,1312.0878906250,,, +4.1796875000,66,1312.0878906250,,, +4.1816406250,66,1314.2857666016,,, +4.1835937500,66,1315.7509765625,,, +4.1855468750,66,1315.7509765625,,, +4.1875000000,67,1315.7509765625,,, +4.1894531250,67,1317.9487304688,,, +4.1914062500,67,1320.1464843750,,, +4.1933593750,67,1320.1464843750,,, +4.1953125000,67,1321.6116943359,,, +4.1972656250,67,1322.3443603516,,, +4.1992187500,67,1323.0769042969,,, +4.2011718750,67,1322.3443603516,,, +4.2031250000,67,1323.0769042969,,, +4.2050781250,67,1323.8095703125,,, +4.2070312500,67,1323.8095703125,,, +4.2089843750,67,1322.3443603516,,, +4.2109375000,67,1323.0769042969,,, +4.2128906250,67,1323.8095703125,,, +4.2148437500,67,1323.0769042969,,, +4.2167968750,67,1323.8095703125,,, +4.2187500000,67,1325.2747802734,,, +4.2207031250,67,1324.5421142578,,, +4.2226562500,67,1325.2747802734,,, +4.2246093750,67,1326.7398681641,,, +4.2265625000,67,1326.7398681641,,, +4.2285156250,67,1326.7398681641,,, +4.2304687500,67,1327.4725341797,,, +4.2324218750,67,1328.2050781250,,, +4.2343750000,67,1328.2050781250,,, +4.2363281250,67,1328.9377441406,,, +4.2382812500,67,1330.4029541016,,, +4.2402343750,67,1330.4029541016,,, +4.2421875000,67,1331.1354980469,,, +4.2441406250,67,1332.6007080078,,, +4.2460937500,67,1334.0659179688,,, +4.2480468750,67,1333.3333740234,,, +4.2500000000,68,1334.0659179688,,, +4.2519531250,68,1335.5311279297,,, +4.2539062500,68,1336.2637939453,,, +4.2558593750,68,1336.9963378906,,, +4.2578125000,68,1336.9963378906,,, +4.2597656250,68,1339.1940917969,,, +4.2617187500,68,1338.4615478516,,, +4.2636718750,68,1338.4615478516,,, +4.2656250000,68,1339.1940917969,,, +4.2675781250,68,1340.6593017578,,, +4.2695312500,68,1339.9267578125,,, +4.2714843750,68,1339.1940917969,,, +4.2734375000,68,1339.9267578125,,, +4.2753906250,68,1338.4615478516,,, +4.2773437500,68,1337.7288818359,,, +4.2792968750,68,1336.9963378906,,, +4.2812500000,68,1336.2637939453,,, +4.2832031250,68,1334.7985839844,,, +4.2851562500,68,1333.3333740234,,, +4.2871093750,68,1333.3333740234,,, +4.2890625000,68,1333.3333740234,,, +4.2910156250,68,1330.4029541016,,, +4.2929687500,68,1328.9377441406,,, +4.2949218750,68,1329.6702880859,,, +4.2968750000,68,1328.9377441406,,, +4.2988281250,68,1326.7398681641,,, +4.3007812500,68,1326.0073242188,,, +4.3027343750,68,1326.7398681641,,, +4.3046875000,68,1325.2747802734,,, +4.3066406250,68,1323.8095703125,,, +4.3085937500,68,1323.8095703125,,, +4.3105468750,68,1322.3443603516,,, +4.3125000000,69,1320.1464843750,,, +4.3144531250,69,1319.4139404297,,, +4.3164062500,69,1319.4139404297,,, +4.3183593750,69,1316.4835205078,,, +4.3203125000,69,1314.2857666016,,, +4.3222656250,69,1313.5531005859,,, +4.3242187500,69,1313.5531005859,,, +4.3261718750,69,1311.3553466797,,, +4.3281250000,69,1309.8901367188,,, +4.3300781250,69,1309.8901367188,,, +4.3320312500,69,1309.8901367188,,, +4.3339843750,69,1309.1574707031,,, +4.3359375000,69,1308.4249267578,,, +4.3378906250,69,1308.4249267578,,, +4.3398437500,69,1309.1574707031,,, +4.3417968750,69,1308.4249267578,,, +4.3437500000,69,1308.4249267578,,, +4.3457031250,69,1309.8901367188,,, +4.3476562500,69,1309.1574707031,,, +4.3496093750,69,1308.4249267578,,, +4.3515625000,69,1308.4249267578,,, +4.3535156250,69,1309.8901367188,,, +4.3554687500,69,1309.8901367188,,, +4.3574218750,69,1309.1574707031,,, +4.3593750000,69,1309.8901367188,,, +4.3613281250,69,1312.0878906250,,, +4.3632812500,69,1311.3553466797,,, +4.3652343750,69,1310.6226806641,,, +4.3671875000,69,1312.0878906250,,, +4.3691406250,69,1312.0878906250,,, +4.3710937500,69,1310.6226806641,,, +4.3730468750,69,1309.8901367188,,, +4.3750000000,70,1310.6226806641,,, +4.3769531250,70,1309.8901367188,,, +4.3789062500,70,1309.1574707031,,, +4.3808593750,70,1309.1574707031,,, +4.3828125000,70,1310.6226806641,,, +4.3847656250,70,1309.8901367188,,, +4.3867187500,70,1309.8901367188,,, +4.3886718750,70,1309.8901367188,,, +4.3906250000,70,1311.3553466797,,, +4.3925781250,70,1312.0878906250,,, +4.3945312500,70,1312.0878906250,,, +4.3964843750,70,1312.0878906250,,, +4.3984375000,70,1313.5531005859,,, +4.4003906250,70,1315.7509765625,,, +4.4023437500,70,1316.4835205078,,, +4.4042968750,70,1316.4835205078,,, +4.4062500000,70,1317.2160644531,,, +4.4082031250,70,1318.6812744141,,, +4.4101562500,70,1319.4139404297,,, +4.4121093750,70,1318.6812744141,,, +4.4140625000,70,1320.1464843750,,, +4.4160156250,70,1322.3443603516,,, +4.4179687500,70,1321.6116943359,,, +4.4199218750,70,1321.6116943359,,, +4.4218750000,70,1321.6116943359,,, +4.4238281250,70,1323.8095703125,,, +4.4257812500,70,1323.8095703125,,, +4.4277343750,70,1323.8095703125,,, +4.4296875000,70,1323.0769042969,,, +4.4316406250,70,1325.2747802734,,, +4.4335937500,70,1324.5421142578,,, +4.4355468750,70,1323.0769042969,,, +4.4375000000,71,1322.3443603516,,, +4.4394531250,71,1323.8095703125,,, +4.4414062500,71,1323.8095703125,,, +4.4433593750,71,1323.8095703125,,, +4.4453125000,71,1323.8095703125,,, +4.4472656250,71,1325.2747802734,,, +4.4492187500,71,1325.2747802734,,, +4.4511718750,71,1324.5421142578,,, +4.4531250000,71,1325.2747802734,,, +4.4550781250,71,1326.7398681641,,, +4.4570312500,71,1326.7398681641,,, +4.4589843750,71,1327.4725341797,,, +4.4609375000,71,1328.9377441406,,, +4.4628906250,71,1330.4029541016,,, +4.4648437500,71,1330.4029541016,,, +4.4667968750,71,1329.6702880859,,, +4.4687500000,71,1329.6702880859,,, +4.4707031250,71,1331.8681640625,,, +4.4726562500,71,1331.1354980469,,, +4.4746093750,71,1331.1354980469,,, +4.4765625000,71,1331.1354980469,,, +4.4785156250,71,1331.8681640625,,, +4.4804687500,71,1333.3333740234,,, +4.4824218750,71,1333.3333740234,,, +4.4843750000,71,1334.0659179688,,, +4.4863281250,71,1335.5311279297,,, +4.4882812500,71,1339.1940917969,,, +4.4902343750,71,1340.6593017578,,, +4.4921875000,71,1340.6593017578,,, +4.4941406250,71,1342.8571777344,,, +4.4960937500,71,1346.5201416016,,, +4.4980468750,71,1353.1135253906,,, +4.5000000000,72,1358.2416992188,,, +4.5019531250,72,1362.6373291016,,, +4.5039062500,72,1367.7656250000,,, +4.5058593750,72,1376.5567626953,,, +4.5078125000,72,1383.8828125000,,, +4.5097656250,72,1390.4761962891,,, +4.5117187500,72,1397.8022460938,,, +4.5136718750,72,1407.3260498047,,, +4.5156250000,72,1417.5823974609,,, +4.5175781250,72,1427.8388671875,,, +4.5195312500,72,1438.8278808594,,, +4.5214843750,72,1449.8168945312,,, +4.5234375000,72,1463.7362060547,,, +4.5253906250,72,1476.9230957031,,, +4.5273437500,72,1489.3773193359,,, +4.5292968750,72,1502.5640869141,,, +4.5312500000,72,1517.2160644531,,, +4.5332031250,72,1534.0659179688,,, +4.5351562500,72,1547.9853515625,,, +4.5371093750,72,1562.6373291016,,, +4.5390625000,72,1578.7546386719,,, +4.5410156250,72,1596.3370361328,,, +4.5429687500,72,1610.9890136719,,, +4.5449218750,72,1625.6409912109,,, +4.5468750000,72,1641.7583007812,,, +4.5488281250,72,1658.6080322266,,, +4.5507812500,72,1671.7949218750,,, +4.5527343750,72,1684.9816894531,,, +4.5546875000,72,1701.0988769531,,, +4.5566406250,72,1715.7509765625,,, +4.5585937500,72,1729.6702880859,,, +4.5605468750,72,1742.1245117188,,, +4.5625000000,73,1756.0439453125,,, +4.5644531250,73,1767.7656250000,,, +4.5664062500,73,1779.4871826172,,, +4.5683593750,73,1790.4761962891,,, +4.5703125000,73,1802.1977539062,,, +4.5722656250,73,1810.2564697266,,, +4.5742187500,73,1818.3150634766,,, +4.5761718750,73,1826.3736572266,,, +4.5781250000,73,1835.8974609375,,, +4.5800781250,73,1841.7583007812,,, +4.5820312500,73,1846.8864746094,,, +4.5839843750,73,1852.0146484375,,, +4.5859375000,73,1857.8754882812,,, +4.5878906250,73,1860.0732421875,,, +4.5898437500,73,1861.5384521484,,, +4.5917968750,73,1863.7362060547,,, +4.5937500000,73,1866.6666259766,,, +4.5957031250,73,1866.6666259766,,, +4.5976562500,73,1866.6666259766,,, +4.5996093750,73,1865.2014160156,,, +4.6015625000,73,1864.4688720703,,, +4.6035156250,73,1862.2711181641,,, +4.6054687500,73,1858.6080322266,,, +4.6074218750,73,1854.2124023438,,, +4.6093750000,73,1851.2821044922,,, +4.6113281250,73,1846.8864746094,,, +4.6132812500,73,1841.0256347656,,, +4.6152343750,73,1833.6995849609,,, +4.6171875000,73,1826.3736572266,,, +4.6191406250,73,1819.0476074219,,, +4.6210937500,73,1811.7215576172,,, +4.6230468750,73,1802.9304199219,,, +4.6250000000,74,1791.9414062500,,, +4.6269531250,74,1782.4176025391,,, +4.6289062500,74,1773.6263427734,,, +4.6308593750,74,1764.8352050781,,, +4.6328125000,74,1753.1135253906,,, +4.6347656250,74,1742.1245117188,,, +4.6367187500,74,1731.8681640625,,, +4.6386718750,74,1721.6116943359,,, +4.6406250000,74,1712.8205566406,,, +4.6425781250,74,1701.8315429688,,, +4.6445312500,74,1690.8425292969,,, +4.6464843750,74,1680.5860595703,,, +4.6484375000,74,1671.0622558594,,, +4.6503906250,74,1663.0036621094,,, +4.6523437500,74,1652.7471923828,,, +4.6542968750,74,1641.7583007812,,, +4.6562500000,74,1630.7692871094,,, +4.6582031250,74,1619.7802734375,,, +4.6601562500,74,1610.9890136719,,, +4.6621093750,74,1600.7325439453,,, +4.6640625000,74,1590.4761962891,,, +4.6660156250,74,1579.4871826172,,, +4.6679687500,74,1570.6959228516,,, +4.6699218750,74,1561.9047851562,,, +4.6718750000,74,1551.6483154297,,, +4.6738281250,74,1541.3919677734,,, +4.6757812500,74,1531.8681640625,,, +4.6777343750,74,1524.5421142578,,, +4.6796875000,74,1515.0183105469,,, +4.6816406250,74,1506.2270507812,,, +4.6835937500,74,1497.4359130859,,, +4.6855468750,74,1490.8425292969,,, +4.6875000000,75,1484.9816894531,,, +4.6894531250,75,1476.1904296875,,, +4.6914062500,75,1468.1318359375,,, +4.6933593750,75,1460.8059082031,,, +4.6953125000,75,1457.1428222656,,, +4.6972656250,75,1449.8168945312,,, +4.6992187500,75,1443.2233886719,,, +4.7011718750,75,1437.3626708984,,, +4.7031250000,75,1432.2343750000,,, +4.7050781250,75,1427.1062011719,,, +4.7070312500,75,1420.5128173828,,, +4.7089843750,75,1414.6519775391,,, +4.7109375000,75,1410.2564697266,,, +4.7128906250,75,1405.8608398438,,, +4.7148437500,75,1401.4652099609,,, +4.7167968750,75,1396.3370361328,,, +4.7187500000,75,1391.2087402344,,, +4.7207031250,75,1387.5457763672,,, +4.7226562500,75,1384.6153564453,,, +4.7246093750,75,1379.4871826172,,, +4.7265625000,75,1375.0915527344,,, +4.7285156250,75,1370.6959228516,,, +4.7304687500,75,1367.7656250000,,, +4.7324218750,75,1364.8352050781,,, +4.7343750000,75,1359.7069091797,,, +4.7363281250,75,1355.3114013672,,, +4.7382812500,75,1350.9157714844,,, +4.7402343750,75,1347.9853515625,,, +4.7421875000,75,1344.3223876953,,, +4.7441406250,75,1339.9267578125,,, +4.7460937500,75,1336.2637939453,,, +4.7480468750,75,1334.0659179688,,, +4.7500000000,76,1333.3333740234,,, +4.7519531250,76,1331.1354980469,,, +4.7539062500,76,1328.2050781250,,, +4.7558593750,76,1325.2747802734,,, +4.7578125000,76,1325.2747802734,,, +4.7597656250,76,1324.5421142578,,, +4.7617187500,76,1322.3443603516,,, +4.7636718750,76,1320.8791503906,,, +4.7656250000,76,1320.8791503906,,, +4.7675781250,76,1322.3443603516,,, +4.7695312500,76,1321.6116943359,,, +4.7714843750,76,1321.6116943359,,, +4.7734375000,76,1320.1464843750,,, +4.7753906250,76,1320.1464843750,,, +4.7773437500,76,1321.6116943359,,, +4.7792968750,76,1323.0769042969,,, +4.7812500000,76,1322.3443603516,,, +4.7832031250,76,1322.3443603516,,, +4.7851562500,76,1323.8095703125,,, +4.7871093750,76,1326.0073242188,,, +4.7890625000,76,1326.0073242188,,, +4.7910156250,76,1326.0073242188,,, +4.7929687500,76,1327.4725341797,,, +4.7949218750,76,1330.4029541016,,, +4.7968750000,76,1330.4029541016,,, +4.7988281250,76,1330.4029541016,,, +4.8007812500,76,1331.8681640625,,, +4.8027343750,76,1333.3333740234,,, +4.8046875000,76,1336.2637939453,,, +4.8066406250,76,1338.4615478516,,, +4.8085937500,76,1339.9267578125,,, +4.8105468750,76,1342.1245117188,,, +4.8125000000,77,1344.3223876953,,, +4.8144531250,77,1348.7178955078,,, +4.8164062500,77,1350.1831054688,,, +4.8183593750,77,1352.3809814453,,, +4.8203125000,77,1354.5787353516,,, +4.8222656250,77,1358.9743652344,,, +4.8242187500,77,1361.1721191406,,, +4.8261718750,77,1364.1025390625,,, +4.8281250000,77,1365.5677490234,,, +4.8300781250,77,1368.4981689453,,, +4.8320312500,77,1372.8937988281,,, +4.8339843750,77,1375.8242187500,,, +4.8359375000,77,1378.0219726562,,, +4.8378906250,77,1378.7546386719,,, +4.8398437500,77,1380.2197265625,,, +4.8417968750,77,1382.4176025391,,, +4.8437500000,77,1386.0805664062,,, +4.8457031250,77,1388.2784423828,,, +4.8476562500,77,1389.7435302734,,, +4.8496093750,77,1389.0109863281,,, +4.8515625000,77,1390.4761962891,,, +4.8535156250,77,1391.2087402344,,, +4.8554687500,77,1393.4066162109,,, +4.8574218750,77,1393.4066162109,,, +4.8593750000,77,1392.6739501953,,, +4.8613281250,77,1392.6739501953,,, +4.8632812500,77,1394.1391601562,,, +4.8652343750,77,1394.1391601562,,, +4.8671875000,77,1394.1391601562,,, +4.8691406250,77,1394.1391601562,,, +4.8710937500,77,1392.6739501953,,, +4.8730468750,77,1393.4066162109,,, +4.8750000000,78,1394.8718261719,,, +4.8769531250,78,1393.4066162109,,, +4.8789062500,78,1391.9414062500,,, +4.8808593750,78,1391.2087402344,,, +4.8828125000,78,1391.2087402344,,, +4.8847656250,78,1393.4066162109,,, +4.8867187500,78,1391.2087402344,,, +4.8886718750,78,1390.4761962891,,, +4.8906250000,78,1389.7435302734,,, +4.8925781250,78,1389.0109863281,,, +4.8945312500,78,1389.7435302734,,, +4.8964843750,78,1388.2784423828,,, +4.8984375000,78,1386.0805664062,,, +4.9003906250,78,1383.1501464844,,, +4.9023437500,78,1383.1501464844,,, +4.9042968750,78,1382.4176025391,,, +4.9062500000,78,1378.7546386719,,, +4.9082031250,78,1376.5567626953,,, +4.9101562500,78,1375.0915527344,,, +4.9121093750,78,1374.3590087891,,, +4.9140625000,78,1372.8937988281,,, +4.9160156250,78,1369.9633789062,,, +4.9179687500,78,1367.7656250000,,, +4.9199218750,78,1364.1025390625,,, +4.9218750000,78,1362.6373291016,,, +4.9238281250,78,1360.4395751953,,, +4.9257812500,78,1356.7766113281,,, +4.9277343750,78,1353.8461914062,,, +4.9296875000,78,1350.9157714844,,, +4.9316406250,78,1350.9157714844,,, +4.9335937500,78,1350.1831054688,,, +4.9355468750,78,1347.9853515625,,, +4.9375000000,79,1344.3223876953,,, +4.9394531250,79,1340.6593017578,,, +4.9414062500,79,1337.7288818359,,, +4.9433593750,79,1336.2637939453,,, +4.9453125000,79,1334.0659179688,,, +4.9472656250,79,1331.1354980469,,, +4.9492187500,79,1328.2050781250,,, +4.9511718750,79,1326.0073242188,,, +4.9531250000,79,1326.0073242188,,, +4.9550781250,79,1323.8095703125,,, +4.9570312500,79,1320.8791503906,,, +4.9589843750,79,1318.6812744141,,, +4.9609375000,79,1317.9487304688,,, +4.9628906250,79,1317.9487304688,,, +4.9648437500,79,1317.2160644531,,, +4.9667968750,79,1315.7509765625,,, +4.9687500000,79,1314.2857666016,,, +4.9707031250,79,1314.2857666016,,, +4.9726562500,79,1315.0183105469,,, +4.9746093750,79,1313.5531005859,,, +4.9765625000,79,1311.3553466797,,, +4.9785156250,79,1309.1574707031,,, +4.9804687500,79,1308.4249267578,,, +4.9824218750,79,1308.4249267578,,, +4.9843750000,79,1306.9597167969,,, +4.9863281250,79,1305.4945068359,,, +4.9882812500,79,1303.2967529297,,, +4.9902343750,79,1301.0988769531,,, +4.9921875000,79,1302.5640869141,,, +4.9941406250,79,1301.0988769531,,, +4.9960937500,79,1298.9011230469,,, +4.9980468750,79,1298.1684570312,,, +5.0000000000,80,1297.4359130859,,, +5.0019531250,80,1298.1684570312,,, +5.0039062500,80,1298.1684570312,,, +5.0058593750,80,1298.9011230469,,, +5.0078125000,80,1297.4359130859,,, +5.0097656250,80,1296.7032470703,,, +5.0117187500,80,1295.2380371094,,, +5.0136718750,80,1295.9707031250,,, +5.0156250000,80,1295.9707031250,,, +5.0175781250,80,1295.9707031250,,, +5.0195312500,80,1294.5054931641,,, +5.0214843750,80,1295.2380371094,,, +5.0234375000,80,1296.7032470703,,, +5.0253906250,80,1297.4359130859,,, +5.0273437500,80,1297.4359130859,,, +5.0292968750,80,1296.7032470703,,, +5.0312500000,80,1298.1684570312,,, +5.0332031250,80,1299.6336669922,,, +5.0351562500,80,1300.3663330078,,, +5.0371093750,80,1300.3663330078,,, +5.0390625000,80,1299.6336669922,,, +5.0410156250,80,1301.0988769531,,, +5.0429687500,80,1302.5640869141,,, +5.0449218750,80,1303.2967529297,,, +5.0468750000,80,1303.2967529297,,, +5.0488281250,80,1303.2967529297,,, +5.0507812500,80,1304.0292968750,,, +5.0527343750,80,1306.9597167969,,, +5.0546875000,80,1306.2270507812,,, +5.0566406250,80,1307.6922607422,,, +5.0585937500,80,1308.4249267578,,, +5.0605468750,80,1308.4249267578,,, +5.0625000000,81,1310.6226806641,,, +5.0644531250,81,1311.3553466797,,, +5.0664062500,81,1312.0878906250,,, +5.0683593750,81,1312.8205566406,,, +5.0703125000,81,1314.2857666016,,, +5.0722656250,81,1316.4835205078,,, +5.0742187500,81,1318.6812744141,,, +5.0761718750,81,1318.6812744141,,, +5.0781250000,81,1319.4139404297,,, +5.0800781250,81,1320.1464843750,,, +5.0820312500,81,1320.8791503906,,, +5.0839843750,81,1322.3443603516,,, +5.0859375000,81,1322.3443603516,,, +5.0878906250,81,1322.3443603516,,, +5.0898437500,81,1322.3443603516,,, +5.0917968750,81,1323.0769042969,,, +5.0937500000,81,1324.5421142578,,, +5.0957031250,81,1325.2747802734,,, +5.0976562500,81,1325.2747802734,,, +5.0996093750,81,1324.5421142578,,, +5.1015625000,81,1324.5421142578,,, +5.1035156250,81,1325.2747802734,,, +5.1054687500,81,1326.0073242188,,, +5.1074218750,81,1326.0073242188,,, +5.1093750000,81,1325.2747802734,,, +5.1113281250,81,1323.8095703125,,, +5.1132812500,81,1323.0769042969,,, +5.1152343750,81,1323.8095703125,,, +5.1171875000,81,1325.2747802734,,, +5.1191406250,81,1324.5421142578,,, +5.1210937500,81,1323.8095703125,,, +5.1230468750,81,1323.0769042969,,, +5.1250000000,82,1321.6116943359,,, +5.1269531250,82,1323.0769042969,,, +5.1289062500,82,1323.0769042969,,, +5.1308593750,82,1321.6116943359,,, +5.1328125000,82,1320.1464843750,,, +5.1347656250,82,1320.1464843750,,, +5.1367187500,82,1320.8791503906,,, +5.1386718750,82,1320.8791503906,,, +5.1406250000,82,1320.1464843750,,, +5.1425781250,82,1319.4139404297,,, +5.1445312500,82,1318.6812744141,,, +5.1464843750,82,1318.6812744141,,, +5.1484375000,82,1320.8791503906,,, +5.1503906250,82,1321.6116943359,,, +5.1523437500,82,1321.6116943359,,, +5.1542968750,82,1320.1464843750,,, +5.1562500000,82,1320.1464843750,,, +5.1582031250,82,1318.6812744141,,, +5.1601562500,82,1319.4139404297,,, +5.1621093750,82,1320.1464843750,,, +5.1640625000,82,1319.4139404297,,, +5.1660156250,82,1318.6812744141,,, +5.1679687500,82,1317.2160644531,,, +5.1699218750,82,1318.6812744141,,, +5.1718750000,82,1320.1464843750,,, +5.1738281250,82,1320.8791503906,,, +5.1757812500,82,1319.4139404297,,, +5.1777343750,82,1318.6812744141,,, +5.1796875000,82,1317.9487304688,,, +5.1816406250,82,1317.2160644531,,, +5.1835937500,82,1317.9487304688,,, +5.1855468750,82,1319.4139404297,,, +5.1875000000,83,1320.8791503906,,, +5.1894531250,83,1319.4139404297,,, +5.1914062500,83,1318.6812744141,,, +5.1933593750,83,1317.9487304688,,, +5.1953125000,83,1317.2160644531,,, +5.1972656250,83,1318.6812744141,,, +5.1992187500,83,1319.4139404297,,, +5.2011718750,83,1319.4139404297,,, +5.2031250000,83,1317.9487304688,,, +5.2050781250,83,1317.2160644531,,, +5.2070312500,83,1316.4835205078,,, +5.2089843750,83,1317.2160644531,,, +5.2109375000,83,1317.9487304688,,, +5.2128906250,83,1317.9487304688,,, +5.2148437500,83,1317.2160644531,,, +5.2167968750,83,1315.7509765625,,, +5.2187500000,83,1314.2857666016,,, +5.2207031250,83,1313.5531005859,,, +5.2226562500,83,1313.5531005859,,, +5.2246093750,83,1312.8205566406,,, +5.2265625000,83,1312.8205566406,,, +5.2285156250,83,1311.3553466797,,, +5.2304687500,83,1311.3553466797,,, +5.2324218750,83,1309.8901367188,,, +5.2343750000,83,1311.3553466797,,, +5.2363281250,83,1311.3553466797,,, +5.2382812500,83,1311.3553466797,,, +5.2402343750,83,1310.6226806641,,, +5.2421875000,83,1310.6226806641,,, +5.2441406250,83,1309.8901367188,,, +5.2460937500,83,1309.1574707031,,, +5.2480468750,83,1310.6226806641,,, +5.2500000000,84,1313.5531005859,,, +5.2519531250,84,1312.8205566406,,, +5.2539062500,84,1312.8205566406,,, +5.2558593750,84,1312.8205566406,,, +5.2578125000,84,1313.5531005859,,, +5.2597656250,84,1314.2857666016,,, +5.2617187500,84,1316.4835205078,,, +5.2636718750,84,1317.2160644531,,, +5.2656250000,84,1317.9487304688,,, +5.2675781250,84,1317.2160644531,,, +5.2695312500,84,1317.2160644531,,, +5.2714843750,84,1317.9487304688,,, +5.2734375000,84,1320.1464843750,,, +5.2753906250,84,1320.8791503906,,, +5.2773437500,84,1321.6116943359,,, +5.2792968750,84,1321.6116943359,,, +5.2812500000,84,1320.8791503906,,, +5.2832031250,84,1320.1464843750,,, +5.2851562500,84,1321.6116943359,,, +5.2871093750,84,1323.8095703125,,, +5.2890625000,84,1322.3443603516,,, +5.2910156250,84,1322.3443603516,,, +5.2929687500,84,1321.6116943359,,, +5.2949218750,84,1320.8791503906,,, +5.2968750000,84,1321.6116943359,,, +5.2988281250,84,1323.0769042969,,, +5.3007812500,84,1321.6116943359,,, +5.3027343750,84,1320.1464843750,,, +5.3046875000,84,1318.6812744141,,, +5.3066406250,84,1318.6812744141,,, +5.3085937500,84,1319.4139404297,,, +5.3105468750,84,1319.4139404297,,, +5.3125000000,85,1318.6812744141,,, +5.3144531250,85,1317.2160644531,,, +5.3164062500,85,1315.7509765625,,, +5.3183593750,85,1314.2857666016,,, +5.3203125000,85,1315.0183105469,,, +5.3222656250,85,1315.7509765625,,, +5.3242187500,85,1315.7509765625,,, +5.3261718750,85,1314.2857666016,,, +5.3281250000,85,1313.5531005859,,, +5.3300781250,85,1313.5531005859,,, +5.3320312500,85,1314.2857666016,,, +5.3339843750,85,1315.0183105469,,, +5.3359375000,85,1313.5531005859,,, +5.3378906250,85,1312.0878906250,,, +5.3398437500,85,1312.8205566406,,, +5.3417968750,85,1312.8205566406,,, +5.3437500000,85,1312.0878906250,,, +5.3457031250,85,1311.3553466797,,, +5.3476562500,85,1312.0878906250,,, +5.3496093750,85,1312.0878906250,,, +5.3515625000,85,1311.3553466797,,, +5.3535156250,85,1309.1574707031,,, +5.3554687500,85,1309.1574707031,,, +5.3574218750,85,1309.1574707031,,, +5.3593750000,85,1308.4249267578,,, +5.3613281250,85,1306.2270507812,,, +5.3632812500,85,1306.9597167969,,, +5.3652343750,85,1306.9597167969,,, +5.3671875000,85,1306.2270507812,,, +5.3691406250,85,1306.2270507812,,, +5.3710937500,85,1307.6922607422,,, +5.3730468750,85,1308.4249267578,,, +5.3750000000,86,1309.1574707031,,, +5.3769531250,86,1308.4249267578,,, +5.3789062500,86,1309.8901367188,,, +5.3808593750,86,1310.6226806641,,, +5.3828125000,86,1311.3553466797,,, +5.3847656250,86,1311.3553466797,,, +5.3867187500,86,1312.8205566406,,, +5.3886718750,86,1315.0183105469,,, +5.3906250000,86,1316.4835205078,,, +5.3925781250,86,1317.2160644531,,, +5.3945312500,86,1320.1464843750,,, +5.3964843750,86,1323.8095703125,,, +5.3984375000,86,1325.2747802734,,, +5.4003906250,86,1328.2050781250,,, +5.4023437500,86,1333.3333740234,,, +5.4042968750,86,1338.4615478516,,, +5.4062500000,86,1343.5897216797,,, +5.4082031250,86,1349.4505615234,,, +5.4101562500,86,1356.7766113281,,, +5.4121093750,86,1364.8352050781,,, +5.4140625000,86,1372.1611328125,,, +5.4160156250,86,1380.2197265625,,, +5.4179687500,86,1388.2784423828,,, +5.4199218750,86,1397.8022460938,,, +5.4218750000,86,1408.0585937500,,, +5.4238281250,86,1420.5128173828,,, +5.4257812500,86,1432.2343750000,,, +5.4277343750,86,1443.9560546875,,, +5.4296875000,86,1455.6776123047,,, +5.4316406250,86,1468.1318359375,,, +5.4335937500,86,1481.3187255859,,, +5.4355468750,86,1496.7032470703,,, +5.4375000000,87,1512.0878906250,,, +5.4394531250,87,1526.0073242188,,, +5.4414062500,87,1539.9267578125,,, +5.4433593750,87,1554.5787353516,,, +5.4453125000,87,1570.6959228516,,, +5.4472656250,87,1587.5457763672,,, +5.4492187500,87,1603.6629638672,,, +5.4511718750,87,1618.3150634766,,, +5.4531250000,87,1633.6995849609,,, +5.4550781250,87,1648.3516845703,,, +5.4570312500,87,1662.2711181641,,, +5.4589843750,87,1678.3883056641,,, +5.4609375000,87,1693.7729492188,,, +5.4628906250,87,1708.4249267578,,, +5.4648437500,87,1721.6116943359,,, +5.4667968750,87,1734.7985839844,,, +5.4687500000,87,1746.5201416016,,, +5.4707031250,87,1759.7069091797,,, +5.4726562500,87,1773.6263427734,,, +5.4746093750,87,1786.0805664062,,, +5.4765625000,87,1797.0695800781,,, +5.4785156250,87,1807.3260498047,,, +5.4804687500,87,1817.5823974609,,, +5.4824218750,87,1826.3736572266,,, +5.4843750000,87,1835.8974609375,,, +5.4863281250,87,1845.4212646484,,, +5.4882812500,87,1854.2124023438,,, +5.4902343750,87,1861.5384521484,,, +5.4921875000,87,1865.9340820312,,, +5.4941406250,87,1869.5970458984,,, +5.4960937500,87,1873.2601318359,,, +5.4980468750,87,1876.9230957031,,, +5.5000000000,88,1879.8535156250,,, +5.5019531250,88,1880.5860595703,,, +5.5039062500,88,1880.5860595703,,, +5.5058593750,88,1881.3187255859,,, +5.5078125000,88,1882.0512695312,,, +5.5097656250,88,1879.1208496094,,, +5.5117187500,88,1876.1904296875,,, +5.5136718750,88,1871.7949218750,,, +5.5156250000,88,1868.8645019531,,, +5.5175781250,88,1863.0036621094,,, +5.5195312500,88,1857.1428222656,,, +5.5214843750,88,1849.8168945312,,, +5.5234375000,88,1843.9560546875,,, +5.5253906250,88,1836.6300048828,,, +5.5273437500,88,1827.1062011719,,, +5.5292968750,88,1817.5823974609,,, +5.5312500000,88,1808.7912597656,,, +5.5332031250,88,1800.0000000000,,, +5.5351562500,88,1788.2784423828,,, +5.5371093750,88,1776.5567626953,,, +5.5390625000,88,1765.5677490234,,, +5.5410156250,88,1754.5787353516,,, +5.5429687500,88,1742.1245117188,,, +5.5449218750,88,1729.6702880859,,, +5.5468750000,88,1716.4835205078,,, +5.5488281250,88,1704.7619628906,,, +5.5507812500,88,1693.0402832031,,, +5.5527343750,88,1682.7839355469,,, +5.5546875000,88,1671.0622558594,,, +5.5566406250,88,1657.8754882812,,, +5.5585937500,88,1643.9560546875,,, +5.5605468750,88,1630.7692871094,,, +5.5625000000,89,1617.5823974609,,, +5.5644531250,89,1605.1281738281,,, +5.5664062500,89,1594.1391601562,,, +5.5683593750,89,1582.4176025391,,, +5.5703125000,89,1569.9633789062,,, +5.5722656250,89,1557.5091552734,,, +5.5742187500,89,1546.5201416016,,, +5.5761718750,89,1536.9963378906,,, +5.5781250000,89,1528.9377441406,,, +5.5800781250,89,1519.4139404297,,, +5.5820312500,89,1509.1574707031,,, +5.5839843750,89,1499.6336669922,,, +5.5859375000,89,1490.1098632812,,, +5.5878906250,89,1482.0512695312,,, +5.5898437500,89,1474.7252197266,,, +5.5917968750,89,1466.6666259766,,, +5.5937500000,89,1458.6080322266,,, +5.5957031250,89,1450.5494384766,,, +5.5976562500,89,1443.2233886719,,, +5.5996093750,89,1438.0952148438,,, +5.6015625000,89,1431.5018310547,,, +5.6035156250,89,1423.4432373047,,, +5.6054687500,89,1416.8498535156,,, +5.6074218750,89,1409.5238037109,,, +5.6093750000,89,1405.1281738281,,, +5.6113281250,89,1400.7325439453,,, +5.6132812500,89,1395.6043701172,,, +5.6152343750,89,1388.2784423828,,, +5.6171875000,89,1382.4176025391,,, +5.6191406250,89,1377.2894287109,,, +5.6210937500,89,1372.8937988281,,, +5.6230468750,89,1369.9633789062,,, +5.6250000000,90,1364.1025390625,,, +5.6269531250,90,1359.7069091797,,, +5.6289062500,90,1355.3114013672,,, +5.6308593750,90,1350.9157714844,,, +5.6328125000,90,1349.4505615234,,, +5.6347656250,90,1346.5201416016,,, +5.6367187500,90,1343.5897216797,,, +5.6386718750,90,1339.9267578125,,, +5.6406250000,90,1336.2637939453,,, +5.6425781250,90,1333.3333740234,,, +5.6445312500,90,1331.1354980469,,, +5.6464843750,90,1330.4029541016,,, +5.6484375000,90,1329.6702880859,,, +5.6503906250,90,1326.7398681641,,, +5.6523437500,90,1324.5421142578,,, +5.6542968750,90,1322.3443603516,,, +5.6562500000,90,1320.1464843750,,, +5.6582031250,90,1319.4139404297,,, +5.6601562500,90,1320.1464843750,,, +5.6621093750,90,1318.6812744141,,, +5.6640625000,90,1317.9487304688,,, +5.6660156250,90,1316.4835205078,,, +5.6679687500,90,1316.4835205078,,, +5.6699218750,90,1315.7509765625,,, +5.6718750000,90,1316.4835205078,,, +5.6738281250,90,1317.9487304688,,, +5.6757812500,90,1317.9487304688,,, +5.6777343750,90,1317.9487304688,,, +5.6796875000,90,1317.9487304688,,, +5.6816406250,90,1317.2160644531,,, +5.6835937500,90,1317.9487304688,,, +5.6855468750,90,1320.1464843750,,, +5.6875000000,91,1321.6116943359,,, +5.6894531250,91,1322.3443603516,,, +5.6914062500,91,1323.0769042969,,, +5.6933593750,91,1322.3443603516,,, +5.6953125000,91,1321.6116943359,,, +5.6972656250,91,1323.8095703125,,, +5.6992187500,91,1326.0073242188,,, +5.7011718750,91,1326.0073242188,,, +5.7031250000,91,1327.4725341797,,, +5.7050781250,91,1327.4725341797,,, +5.7070312500,91,1328.9377441406,,, +5.7089843750,91,1332.6007080078,,, +5.7109375000,91,1334.0659179688,,, +5.7128906250,91,1335.5311279297,,, +5.7148437500,91,1336.2637939453,,, +5.7167968750,91,1338.4615478516,,, +5.7187500000,91,1340.6593017578,,, +5.7207031250,91,1343.5897216797,,, +5.7226562500,91,1345.0549316406,,, +5.7246093750,91,1346.5201416016,,, +5.7265625000,91,1347.9853515625,,, +5.7285156250,91,1350.1831054688,,, +5.7304687500,91,1353.8461914062,,, +5.7324218750,91,1357.5091552734,,, +5.7343750000,91,1358.9743652344,,, +5.7363281250,91,1360.4395751953,,, +5.7382812500,91,1361.9047851562,,, +5.7402343750,91,1363.3699951172,,, +5.7421875000,91,1366.3004150391,,, +5.7441406250,91,1369.9633789062,,, +5.7460937500,91,1372.8937988281,,, +5.7480468750,91,1373.6263427734,,, +5.7500000000,92,1374.3590087891,,, +5.7519531250,92,1375.0915527344,,, +5.7539062500,92,1378.7546386719,,, +5.7558593750,92,1380.2197265625,,, +5.7578125000,92,1380.2197265625,,, +5.7597656250,92,1380.2197265625,,, +5.7617187500,92,1380.2197265625,,, +5.7636718750,92,1380.9523925781,,, +5.7656250000,92,1383.1501464844,,, +5.7675781250,92,1383.8828125000,,, +5.7695312500,92,1383.8828125000,,, +5.7714843750,92,1383.8828125000,,, +5.7734375000,92,1383.1501464844,,, +5.7753906250,92,1383.8828125000,,, +5.7773437500,92,1385.3480224609,,, +5.7792968750,92,1384.6153564453,,, +5.7812500000,92,1383.8828125000,,, +5.7832031250,92,1382.4176025391,,, +5.7851562500,92,1382.4176025391,,, +5.7871093750,92,1382.4176025391,,, +5.7890625000,92,1383.1501464844,,, +5.7910156250,92,1381.6849365234,,, +5.7929687500,92,1379.4871826172,,, +5.7949218750,92,1378.7546386719,,, +5.7968750000,92,1377.2894287109,,, +5.7988281250,92,1377.2894287109,,, +5.8007812500,92,1376.5567626953,,, +5.8027343750,92,1375.8242187500,,, +5.8046875000,92,1373.6263427734,,, +5.8066406250,92,1371.4285888672,,, +5.8085937500,92,1369.9633789062,,, +5.8105468750,92,1369.2307128906,,, +5.8125000000,93,1367.0329589844,,, +5.8144531250,93,1364.8352050781,,, +5.8164062500,93,1361.1721191406,,, +5.8183593750,93,1358.9743652344,,, +5.8203125000,93,1356.7766113281,,, +5.8222656250,93,1354.5787353516,,, +5.8242187500,93,1352.3809814453,,, +5.8261718750,93,1349.4505615234,,, +5.8281250000,93,1347.2528076172,,, +5.8300781250,93,1345.7875976562,,, +5.8320312500,93,1344.3223876953,,, +5.8339843750,93,1341.3919677734,,, +5.8359375000,93,1337.7288818359,,, +5.8378906250,93,1335.5311279297,,, +5.8398437500,93,1334.0659179688,,, +5.8417968750,93,1333.3333740234,,, +5.8437500000,93,1329.6702880859,,, +5.8457031250,93,1327.4725341797,,, +5.8476562500,93,1326.0073242188,,, +5.8496093750,93,1323.8095703125,,, +5.8515625000,93,1323.0769042969,,, +5.8535156250,93,1321.6116943359,,, +5.8554687500,93,1320.1464843750,,, +5.8574218750,93,1317.2160644531,,, +5.8593750000,93,1315.0183105469,,, +5.8613281250,93,1314.2857666016,,, +5.8632812500,93,1314.2857666016,,, +5.8652343750,93,1312.8205566406,,, +5.8671875000,93,1311.3553466797,,, +5.8691406250,93,1309.8901367188,,, +5.8710937500,93,1308.4249267578,,, +5.8730468750,93,1309.1574707031,,, +5.8750000000,94,1309.1574707031,,, +5.8769531250,94,1307.6922607422,,, +5.8789062500,94,1306.2270507812,,, +5.8808593750,94,1304.7619628906,,, +5.8828125000,94,1304.7619628906,,, +5.8847656250,94,1305.4945068359,,, +5.8867187500,94,1304.7619628906,,, +5.8886718750,94,1304.0292968750,,, +5.8906250000,94,1303.2967529297,,, +5.8925781250,94,1303.2967529297,,, +5.8945312500,94,1301.8315429688,,, +5.8964843750,94,1300.3663330078,,, +5.8984375000,94,1299.6336669922,,, +5.9003906250,94,1300.3663330078,,, +5.9023437500,94,1300.3663330078,,, +5.9042968750,94,1300.3663330078,,, +5.9062500000,94,1298.9011230469,,, +5.9082031250,94,1300.3663330078,,, +5.9101562500,94,1301.0988769531,,, +5.9121093750,94,1300.3663330078,,, +5.9140625000,94,1298.9011230469,,, +5.9160156250,94,1299.6336669922,,, +5.9179687500,94,1299.6336669922,,, +5.9199218750,94,1298.1684570312,,, +5.9218750000,94,1297.4359130859,,, +5.9238281250,94,1298.1684570312,,, +5.9257812500,94,1298.9011230469,,, +5.9277343750,94,1298.9011230469,,, +5.9296875000,94,1298.1684570312,,, +5.9316406250,94,1299.6336669922,,, +5.9335937500,94,1299.6336669922,,, +5.9355468750,94,1298.9011230469,,, +5.9375000000,95,1298.1684570312,,, +5.9394531250,95,1298.1684570312,,, +5.9414062500,95,1299.6336669922,,, +5.9433593750,95,1299.6336669922,,, +5.9453125000,95,1298.9011230469,,, +5.9472656250,95,1299.6336669922,,, +5.9492187500,95,1301.0988769531,,, +5.9511718750,95,1303.2967529297,,, +5.9531250000,95,1304.0292968750,,, +5.9550781250,95,1304.0292968750,,, +5.9570312500,95,1305.4945068359,,, +5.9589843750,95,1307.6922607422,,, +5.9609375000,95,1309.1574707031,,, +5.9628906250,95,1309.1574707031,,, +5.9648437500,95,1309.1574707031,,, +5.9667968750,95,1309.8901367188,,, +5.9687500000,95,1312.0878906250,,, +5.9707031250,95,1311.3553466797,,, +5.9726562500,95,1312.0878906250,,, +5.9746093750,95,1311.3553466797,,, +5.9765625000,95,1312.8205566406,,, +5.9785156250,95,1313.5531005859,,, +5.9804687500,95,1312.8205566406,,, +5.9824218750,95,1312.8205566406,,, +5.9843750000,95,1313.5531005859,,, +5.9863281250,95,1314.2857666016,,, +5.9882812500,95,1315.0183105469,,, +5.9902343750,95,1315.0183105469,,, +5.9921875000,95,1314.2857666016,,, +5.9941406250,95,1314.2857666016,,, +5.9960937500,95,1313.5531005859,,, +5.9980468750,95,1312.8205566406,,, +6.0000000000,96,1311.3553466797,,, +6.0019531250,96,1312.0878906250,,, +6.0039062500,96,1312.8205566406,,, +6.0058593750,96,1313.5531005859,,, +6.0078125000,96,1312.8205566406,,, +6.0097656250,96,1312.0878906250,,, +6.0117187500,96,1311.3553466797,,, +6.0136718750,96,1311.3553466797,,, +6.0156250000,96,1311.3553466797,,, +6.0175781250,96,1312.0878906250,,, +6.0195312500,96,1312.8205566406,,, +6.0214843750,96,1312.0878906250,,, +6.0234375000,96,1311.3553466797,,, +6.0253906250,96,1310.6226806641,,, +6.0273437500,96,1309.8901367188,,, +6.0292968750,96,1311.3553466797,,, +6.0312500000,96,1312.0878906250,,, +6.0332031250,96,1312.8205566406,,, +6.0351562500,96,1312.8205566406,,, +6.0371093750,96,1311.3553466797,,, +6.0390625000,96,1310.6226806641,,, +6.0410156250,96,1309.8901367188,,, +6.0429687500,96,1309.1574707031,,, +6.0449218750,96,1311.3553466797,,, +6.0468750000,96,1312.0878906250,,, +6.0488281250,96,1313.5531005859,,, +6.0507812500,96,1314.2857666016,,, +6.0527343750,96,1315.0183105469,,, +6.0546875000,96,1315.0183105469,,, +6.0566406250,96,1316.4835205078,,, +6.0585937500,96,1317.9487304688,,, +6.0605468750,96,1320.1464843750,,, +6.0625000000,97,1320.8791503906,,, +6.0644531250,97,1321.6116943359,,, +6.0664062500,97,1322.3443603516,,, +6.0683593750,97,1321.6116943359,,, +6.0703125000,97,1324.5421142578,,, +6.0722656250,97,1326.7398681641,,, +6.0742187500,97,1328.9377441406,,, +6.0761718750,97,1329.6702880859,,, +6.0781250000,97,1329.6702880859,,, +6.0800781250,97,1329.6702880859,,, +6.0820312500,97,1328.9377441406,,, +6.0839843750,97,1330.4029541016,,, +6.0859375000,97,1331.1354980469,,, +6.0878906250,97,1331.1354980469,,, +6.0898437500,97,1330.4029541016,,, +6.0917968750,97,1328.9377441406,,, +6.0937500000,97,1328.2050781250,,, +6.0957031250,97,1329.6702880859,,, +6.0976562500,97,1330.4029541016,,, +6.0996093750,97,1330.4029541016,,, +6.1015625000,97,1330.4029541016,,, +6.1035156250,97,1328.2050781250,,, +6.1054687500,97,1328.2050781250,,, +6.1074218750,97,1327.4725341797,,, +6.1093750000,97,1328.2050781250,,, +6.1113281250,97,1328.2050781250,,, +6.1132812500,97,1328.2050781250,,, +6.1152343750,97,1326.7398681641,,, +6.1171875000,97,1324.5421142578,,, +6.1191406250,97,1323.0769042969,,, +6.1210937500,97,1320.8791503906,,, +6.1230468750,97,1319.4139404297,,, +6.1250000000,98,1320.1464843750,,, +6.1269531250,98,1320.1464843750,,, +6.1289062500,98,1318.6812744141,,, +6.1308593750,98,1317.2160644531,,, +6.1328125000,98,1315.0183105469,,, +6.1347656250,98,1313.5531005859,,, +6.1367187500,98,1312.0878906250,,, +6.1386718750,98,1310.6226806641,,, +6.1406250000,98,1312.0878906250,,, +6.1425781250,98,1312.0878906250,,, +6.1445312500,98,1311.3553466797,,, +6.1464843750,98,1309.1574707031,,, +6.1484375000,98,1308.4249267578,,, +6.1503906250,98,1306.9597167969,,, +6.1523437500,98,1306.2270507812,,, +6.1542968750,98,1306.9597167969,,, +6.1562500000,98,1306.9597167969,,, +6.1582031250,98,1306.9597167969,,, +6.1601562500,98,1306.2270507812,,, +6.1621093750,98,1305.4945068359,,, +6.1640625000,98,1304.0292968750,,, +6.1660156250,98,1304.7619628906,,, +6.1679687500,98,1306.2270507812,,, +6.1699218750,98,1306.9597167969,,, +6.1718750000,98,1305.4945068359,,, +6.1738281250,98,1304.0292968750,,, +6.1757812500,98,1303.2967529297,,, +6.1777343750,98,1304.0292968750,,, +6.1796875000,98,1305.4945068359,,, +6.1816406250,98,1305.4945068359,,, +6.1835937500,98,1305.4945068359,,, +6.1855468750,98,1305.4945068359,,, +6.1875000000,99,1304.0292968750,,, +6.1894531250,99,1303.2967529297,,, +6.1914062500,99,1303.2967529297,,, +6.1933593750,99,1303.2967529297,,, +6.1953125000,99,1304.7619628906,,, +6.1972656250,99,1306.2270507812,,, +6.1992187500,99,1306.2270507812,,, +6.2011718750,99,1306.2270507812,,, +6.2031250000,99,1304.7619628906,,, +6.2050781250,99,1304.7619628906,,, +6.2070312500,99,1304.7619628906,,, +6.2089843750,99,1305.4945068359,,, +6.2109375000,99,1306.9597167969,,, +6.2128906250,99,1306.9597167969,,, +6.2148437500,99,1304.7619628906,,, +6.2167968750,99,1303.2967529297,,, +6.2187500000,99,1302.5640869141,,, +6.2207031250,99,1303.2967529297,,, +6.2226562500,99,1304.0292968750,,, +6.2246093750,99,1305.4945068359,,, +6.2265625000,99,1305.4945068359,,, +6.2285156250,99,1306.2270507812,,, +6.2304687500,99,1304.7619628906,,, +6.2324218750,99,1304.7619628906,,, +6.2343750000,99,1304.0292968750,,, +6.2363281250,99,1304.7619628906,,, +6.2382812500,99,1306.2270507812,,, +6.2402343750,99,1306.9597167969,,, +6.2421875000,99,1306.9597167969,,, +6.2441406250,99,1306.2270507812,,, +6.2460937500,99,1305.4945068359,,, +6.2480468750,99,1304.7619628906,,, +6.2500000000,100,1304.7619628906,,, +6.2519531250,100,1304.0292968750,,, +6.2539062500,100,1305.4945068359,,, +6.2558593750,100,1306.9597167969,,, +6.2578125000,100,1307.6922607422,,, +6.2597656250,100,1307.6922607422,,, +6.2617187500,100,1306.9597167969,,, +6.2636718750,100,1305.4945068359,,, +6.2656250000,100,1304.7619628906,,, +6.2675781250,100,1303.2967529297,,, +6.2695312500,100,1303.2967529297,,, +6.2714843750,100,1303.2967529297,,, +6.2734375000,100,1303.2967529297,,, +6.2753906250,100,1301.8315429688,,, +6.2773437500,100,1299.6336669922,,, +6.2792968750,100,1298.1684570312,,, +6.2812500000,100,1297.4359130859,,, +6.2832031250,100,1297.4359130859,,, +6.2851562500,100,1298.9011230469,,, +6.2871093750,100,1298.1684570312,,, +6.2890625000,100,1298.1684570312,,, +6.2910156250,100,1297.4359130859,,, +6.2929687500,100,1296.7032470703,,, +6.2949218750,100,1295.2380371094,,, +6.2968750000,100,1294.5054931641,,, +6.2988281250,100,1293.7729492188,,, +6.3007812500,100,1293.0402832031,,, +6.3027343750,100,1293.7729492188,,, +6.3046875000,100,1294.5054931641,,, +6.3066406250,100,1295.9707031250,,, +6.3085937500,100,1298.1684570312,,, +6.3105468750,100,1300.3663330078,,, +6.3125000000,101,1301.0988769531,,, +6.3144531250,101,1301.8315429688,,, +6.3164062500,101,1302.5640869141,,, +6.3183593750,101,1304.0292968750,,, +6.3203125000,101,1304.7619628906,,, +6.3222656250,101,1306.2270507812,,, +6.3242187500,101,1308.4249267578,,, +6.3261718750,101,1311.3553466797,,, +6.3281250000,101,1314.2857666016,,, +6.3300781250,101,1317.9487304688,,, +6.3320312500,101,1322.3443603516,,, +6.3339843750,101,1327.4725341797,,, +6.3359375000,101,1332.6007080078,,, +6.3378906250,101,1337.7288818359,,, +6.3398437500,101,1342.8571777344,,, +6.3417968750,101,1347.9853515625,,, +6.3437500000,101,1353.1135253906,,, +6.3457031250,101,1358.9743652344,,, +6.3476562500,101,1364.8352050781,,, +6.3496093750,101,1371.4285888672,,, +6.3515625000,101,1378.7546386719,,, +6.3535156250,101,1386.0805664062,,, +6.3554687500,101,1395.6043701172,,, +6.3574218750,101,1405.8608398438,,, +6.3593750000,101,1416.8498535156,,, +6.3613281250,101,1428.5714111328,,, +6.3632812500,101,1441.0256347656,,, +6.3652343750,101,1454.2124023438,,, +6.3671875000,101,1466.6666259766,,, +6.3691406250,101,1479.8535156250,,, +6.3710937500,101,1492.3077392578,,, +6.3730468750,101,1506.2270507812,,, +6.3750000000,102,1520.1464843750,,, +6.3769531250,102,1534.7985839844,,, +6.3789062500,102,1550.1831054688,,, +6.3808593750,102,1567.0329589844,,, +6.3828125000,102,1584.6153564453,,, +6.3847656250,102,1601.4652099609,,, +6.3867187500,102,1616.8498535156,,, +6.3886718750,102,1632.9670410156,,, +6.3906250000,102,1648.3516845703,,, +6.3925781250,102,1663.0036621094,,, +6.3945312500,102,1678.3883056641,,, +6.3964843750,102,1691.5750732422,,, +6.3984375000,102,1705.4945068359,,, +6.4003906250,102,1718.6812744141,,, +6.4023437500,102,1731.8681640625,,, +6.4042968750,102,1744.3223876953,,, +6.4062500000,102,1756.7766113281,,, +6.4082031250,102,1769.2307128906,,, +6.4101562500,102,1780.2197265625,,, +6.4121093750,102,1791.9414062500,,, +6.4140625000,102,1802.1977539062,,, +6.4160156250,102,1812.4542236328,,, +6.4179687500,102,1823.4432373047,,, +6.4199218750,102,1833.6995849609,,, +6.4218750000,102,1843.9560546875,,, +6.4238281250,102,1852.7471923828,,, +6.4257812500,102,1860.8059082031,,, +6.4277343750,102,1866.6666259766,,, +6.4296875000,102,1871.0622558594,,, +6.4316406250,102,1875.4578857422,,, +6.4335937500,102,1878.3883056641,,, +6.4355468750,102,1879.8535156250,,, +6.4375000000,103,1880.5860595703,,, +6.4394531250,103,1880.5860595703,,, +6.4414062500,103,1879.1208496094,,, +6.4433593750,103,1876.9230957031,,, +6.4453125000,103,1873.2601318359,,, +6.4472656250,103,1870.3297119141,,, +6.4492187500,103,1865.9340820312,,, +6.4511718750,103,1862.2711181641,,, +6.4531250000,103,1857.1428222656,,, +6.4550781250,103,1852.0146484375,,, +6.4570312500,103,1846.1538085938,,, +6.4589843750,103,1840.2930908203,,, +6.4609375000,103,1833.6995849609,,, +6.4628906250,103,1826.3736572266,,, +6.4648437500,103,1818.3150634766,,, +6.4667968750,103,1810.2564697266,,, +6.4687500000,103,1800.7325439453,,, +6.4707031250,103,1791.9414062500,,, +6.4726562500,103,1782.4176025391,,, +6.4746093750,103,1771.4285888672,,, +6.4765625000,103,1761.1721191406,,, +6.4785156250,103,1750.1831054688,,, +6.4804687500,103,1738.4615478516,,, +6.4824218750,103,1726.0073242188,,, +6.4843750000,103,1712.8205566406,,, +6.4863281250,103,1701.0988769531,,, +6.4882812500,103,1687.1794433594,,, +6.4902343750,103,1673.9926757812,,, +6.4921875000,103,1660.0732421875,,, +6.4941406250,103,1646.1538085938,,, +6.4960937500,103,1646.1538085938,,, +6.4980468750,103,1631.5018310547,,, +6.5000000000,104,1616.8498535156,,, +6.5019531250,104,1603.6629638672,,, +6.5039062500,104,1589.0109863281,,, +6.5058593750,104,1575.8242187500,,, +6.5078125000,104,1561.1721191406,,, +6.5097656250,104,1548.7178955078,,, +6.5117187500,104,1536.9963378906,,, +6.5136718750,104,1525.2747802734,,, +6.5156250000,104,1513.5531005859,,, +6.5175781250,104,1502.5640869141,,, +6.5195312500,104,1490.8425292969,,, +6.5214843750,104,1480.5860595703,,, +6.5234375000,104,1470.3297119141,,, +6.5253906250,104,1461.5384521484,,, +6.5273437500,104,1452.0146484375,,, +6.5292968750,104,1443.2233886719,,, +6.5312500000,104,1435.8974609375,,, +6.5332031250,104,1427.8388671875,,, +6.5351562500,104,1419.7802734375,,, +6.5371093750,104,1411.7215576172,,, +6.5390625000,104,1405.1281738281,,, +6.5410156250,104,1397.8022460938,,, +6.5429687500,104,1391.9414062500,,, +6.5449218750,104,1386.8132324219,,, +6.5468750000,104,1381.6849365234,,, +6.5488281250,104,1376.5567626953,,, +6.5507812500,104,1372.8937988281,,, +6.5527343750,104,1367.7656250000,,, +6.5546875000,104,1364.8352050781,,, +6.5566406250,104,1361.1721191406,,, +6.5585937500,104,1358.9743652344,,, +6.5605468750,104,1355.3114013672,,, +6.5625000000,105,1351.6483154297,,, +6.5644531250,105,1348.7178955078,,, +6.5664062500,105,1345.7875976562,,, +6.5683593750,105,1341.3919677734,,, +6.5703125000,105,1336.9963378906,,, +6.5722656250,105,1333.3333740234,,, +6.5742187500,105,1328.9377441406,,, +6.5761718750,105,1325.2747802734,,, +6.5781250000,105,1321.6116943359,,, +6.5800781250,105,1317.2160644531,,, +6.5820312500,105,1313.5531005859,,, +6.5839843750,105,1309.1574707031,,, +6.5859375000,105,1306.2270507812,,, +6.5878906250,105,1303.2967529297,,, +6.5898437500,105,1301.0988769531,,, +6.5917968750,105,1298.9011230469,,, +6.5937500000,105,1296.7032470703,,, +6.5957031250,105,1295.2380371094,,, +6.5976562500,105,1293.7729492188,,, +6.5996093750,105,1292.3077392578,,, +6.6015625000,105,1291.5750732422,,, +6.6035156250,105,1290.8425292969,,, +6.6054687500,105,1290.8425292969,,, +6.6074218750,105,1290.8425292969,,, +6.6093750000,105,1292.3077392578,,, +6.6113281250,105,1293.0402832031,,, +6.6132812500,105,1295.2380371094,,, +6.6152343750,105,1297.4359130859,,, +6.6171875000,105,1299.6336669922,,, +6.6191406250,105,1301.0988769531,,, +6.6210937500,105,1304.7619628906,,, +6.6230468750,105,1307.6922607422,,, +6.6250000000,106,1309.8901367188,,, +6.6269531250,106,1312.8205566406,,, +6.6289062500,106,1315.7509765625,,, +6.6308593750,106,1317.9487304688,,, +6.6328125000,106,1321.6116943359,,, +6.6347656250,106,1324.5421142578,,, +6.6367187500,106,1327.4725341797,,, +6.6386718750,106,1330.4029541016,,, +6.6406250000,106,1333.3333740234,,, +6.6425781250,106,1336.9963378906,,, +6.6445312500,106,1340.6593017578,,, +6.6464843750,106,1344.3223876953,,, +6.6484375000,106,1347.2528076172,,, +6.6503906250,106,1351.6483154297,,, +6.6523437500,106,1355.3114013672,,, +6.6542968750,106,1358.9743652344,,, +6.6562500000,106,1361.9047851562,,, +6.6582031250,106,1364.8352050781,,, +6.6601562500,106,1367.0329589844,,, +6.6621093750,106,1369.2307128906,,, +6.6640625000,106,1372.1611328125,,, +6.6660156250,106,1374.3590087891,,, +6.6679687500,106,1376.5567626953,,, +6.6699218750,106,1378.0219726562,,, +6.6718750000,106,1380.9523925781,,, +6.6738281250,106,1383.1501464844,,, +6.6757812500,106,1386.0805664062,,, +6.6777343750,106,1387.5457763672,,, +6.6796875000,106,1389.0109863281,,, +6.6816406250,106,1391.2087402344,,, +6.6835937500,106,1392.6739501953,,, +6.6855468750,106,1394.1391601562,,, +6.6875000000,107,1395.6043701172,,, +6.6894531250,107,1397.0695800781,,, +6.6914062500,107,1399.2674560547,,, +6.6933593750,107,1400.0000000000,,, +6.6953125000,107,1400.7325439453,,, +6.6972656250,107,1401.4652099609,,, +6.6992187500,107,1401.4652099609,,, +6.7011718750,107,1401.4652099609,,, +6.7031250000,107,1401.4652099609,,, +6.7050781250,107,1400.0000000000,,, +6.7070312500,107,1400.0000000000,,, +6.7089843750,107,1400.0000000000,,, +6.7109375000,107,1400.7325439453,,, +6.7128906250,107,1400.0000000000,,, +6.7148437500,107,1400.0000000000,,, +6.7167968750,107,1399.2674560547,,, +6.7187500000,107,1399.2674560547,,, +6.7207031250,107,1398.5347900391,,, +6.7226562500,107,1396.3370361328,,, +6.7246093750,107,1395.6043701172,,, +6.7265625000,107,1394.8718261719,,, +6.7285156250,107,1392.6739501953,,, +6.7304687500,107,1391.2087402344,,, +6.7324218750,107,1389.7435302734,,, +6.7343750000,107,1388.2784423828,,, +6.7363281250,107,1386.8132324219,,, +6.7382812500,107,1386.0805664062,,, +6.7402343750,107,1384.6153564453,,, +6.7421875000,107,1383.1501464844,,, +6.7441406250,107,1380.9523925781,,, +6.7460937500,107,1379.4871826172,,, +6.7480468750,107,1378.7546386719,,, +6.7500000000,108,1376.5567626953,,, +6.7519531250,108,1374.3590087891,,, +6.7539062500,108,1372.1611328125,,, +6.7558593750,108,1369.9633789062,,, +6.7578125000,108,1368.4981689453,,, +6.7597656250,108,1366.3004150391,,, +6.7617187500,108,1363.3699951172,,, +6.7636718750,108,1361.1721191406,,, +6.7656250000,108,1358.9743652344,,, +6.7675781250,108,1356.7766113281,,, +6.7695312500,108,1354.5787353516,,, +6.7714843750,108,1351.6483154297,,, +6.7734375000,108,1349.4505615234,,, +6.7753906250,108,1346.5201416016,,, +6.7773437500,108,1343.5897216797,,, +6.7792968750,108,1340.6593017578,,, +6.7812500000,108,1338.4615478516,,, +6.7832031250,108,1335.5311279297,,, +6.7851562500,108,1332.6007080078,,, +6.7871093750,108,1329.6702880859,,, +6.7890625000,108,1326.7398681641,,, +6.7910156250,108,1324.5421142578,,, +6.7929687500,108,1320.8791503906,,, +6.7949218750,108,1319.4139404297,,, +6.7968750000,108,1317.2160644531,,, +6.7988281250,108,1315.0183105469,,, +6.8007812500,108,1313.5531005859,,, +6.8027343750,108,1312.8205566406,,, +6.8046875000,108,1312.0878906250,,, +6.8066406250,108,1312.0878906250,,, +6.8085937500,108,1312.0878906250,,, +6.8105468750,108,1312.0878906250,,, +6.8125000000,109,1310.6226806641,,, +6.8144531250,109,1309.1574707031,,, +6.8164062500,109,1307.6922607422,,, +6.8183593750,109,1305.4945068359,,, +6.8203125000,109,1304.7619628906,,, +6.8222656250,109,1302.5640869141,,, +6.8242187500,109,1301.0988769531,,, +6.8261718750,109,1300.3663330078,,, +6.8281250000,109,1299.6336669922,,, +6.8300781250,109,1298.9011230469,,, +6.8320312500,109,1298.9011230469,,, +6.8339843750,109,1298.1684570312,,, +6.8359375000,109,1297.4359130859,,, +6.8378906250,109,1298.1684570312,,, +6.8398437500,109,1298.9011230469,,, +6.8417968750,109,1299.6336669922,,, +6.8437500000,109,1299.6336669922,,, +6.8457031250,109,1299.6336669922,,, +6.8476562500,109,1299.6336669922,,, +6.8496093750,109,1298.1684570312,,, +6.8515625000,109,1297.4359130859,,, +6.8535156250,109,1295.9707031250,,, +6.8554687500,109,1294.5054931641,,, +6.8574218750,109,1294.5054931641,,, +6.8593750000,109,1294.5054931641,,, +6.8613281250,109,1294.5054931641,,, +6.8632812500,109,1294.5054931641,,, +6.8652343750,109,1293.7729492188,,, +6.8671875000,109,1293.7729492188,,, +6.8691406250,109,1293.7729492188,,, +6.8710937500,109,1292.3077392578,,, +6.8730468750,109,1293.7729492188,,, +6.8750000000,110,1295.2380371094,,, +6.8769531250,110,1297.4359130859,,, +6.8789062500,110,1298.1684570312,,, +6.8808593750,110,1298.9011230469,,, +6.8828125000,110,1298.9011230469,,, +6.8847656250,110,1298.1684570312,,, +6.8867187500,110,1298.9011230469,,, +6.8886718750,110,1299.6336669922,,, +6.8906250000,110,1301.0988769531,,, +6.8925781250,110,1302.5640869141,,, +6.8945312500,110,1305.4945068359,,, +6.8964843750,110,1306.9597167969,,, +6.8984375000,110,1307.6922607422,,, +6.9003906250,110,1307.6922607422,,, +6.9023437500,110,1307.6922607422,,, +6.9042968750,110,1308.4249267578,,, +6.9062500000,110,1308.4249267578,,, +6.9082031250,110,1310.6226806641,,, +6.9101562500,110,1312.0878906250,,, +6.9121093750,110,1312.8205566406,,, +6.9140625000,110,1313.5531005859,,, +6.9160156250,110,1313.5531005859,,, +6.9179687500,110,1312.8205566406,,, +6.9199218750,110,1312.0878906250,,, +6.9218750000,110,1312.0878906250,,, +6.9238281250,110,1311.3553466797,,, +6.9257812500,110,1312.0878906250,,, +6.9277343750,110,1314.2857666016,,, +6.9296875000,110,1315.0183105469,,, +6.9316406250,110,1315.7509765625,,, +6.9335937500,110,1314.2857666016,,, +6.9355468750,110,1314.2857666016,,, +6.9375000000,111,1313.5531005859,,, +6.9394531250,111,1315.0183105469,,, +6.9414062500,111,1315.7509765625,,, +6.9433593750,111,1316.4835205078,,, +6.9453125000,111,1317.2160644531,,, +6.9472656250,111,1317.2160644531,,, +6.9492187500,111,1315.0183105469,,, +6.9511718750,111,1315.7509765625,,, +6.9531250000,111,1315.7509765625,,, +6.9550781250,111,1317.9487304688,,, +6.9570312500,111,1319.4139404297,,, +6.9589843750,111,1319.4139404297,,, +6.9609375000,111,1319.4139404297,,, +6.9628906250,111,1320.1464843750,,, +6.9648437500,111,1320.1464843750,,, +6.9667968750,111,1320.1464843750,,, +6.9687500000,111,1322.3443603516,,, +6.9707031250,111,1323.8095703125,,, +6.9726562500,111,1326.7398681641,,, +6.9746093750,111,1326.7398681641,,, +6.9765625000,111,1326.7398681641,,, +6.9785156250,111,1326.7398681641,,, +6.9804687500,111,1327.4725341797,,, +6.9824218750,111,1327.4725341797,,, +6.9843750000,111,1327.4725341797,,, +6.9863281250,111,1329.6702880859,,, +6.9882812500,111,1331.8681640625,,, +6.9902343750,111,1333.3333740234,,, +6.9921875000,111,1334.7985839844,,, +6.9941406250,111,1334.7985839844,,, +6.9960937500,111,1334.7985839844,,, +6.9980468750,111,1334.7985839844,,, +7.0000000000,112,1334.0659179688,,, +7.0019531250,112,1335.5311279297,,, +7.0039062500,112,1336.9963378906,,, +7.0058593750,112,1337.7288818359,,, +7.0078125000,112,1339.1940917969,,, +7.0097656250,112,1339.9267578125,,, +7.0117187500,112,1339.1940917969,,, +7.0136718750,112,1337.7288818359,,, +7.0156250000,112,1336.9963378906,,, +7.0175781250,112,1335.5311279297,,, +7.0195312500,112,1334.7985839844,,, +7.0214843750,112,1335.5311279297,,, +7.0234375000,112,1336.9963378906,,, +7.0253906250,112,1337.7288818359,,, +7.0273437500,112,1336.9963378906,,, +7.0292968750,112,1337.7288818359,,, +7.0312500000,112,1336.9963378906,,, +7.0332031250,112,1336.2637939453,,, +7.0351562500,112,1336.2637939453,,, +7.0371093750,112,1334.7985839844,,, +7.0390625000,112,1334.0659179688,,, +7.0410156250,112,1332.6007080078,,, +7.0429687500,112,1332.6007080078,,, +7.0449218750,112,1332.6007080078,,, +7.0468750000,112,1333.3333740234,,, +7.0488281250,112,1333.3333740234,,, +7.0507812500,112,1334.0659179688,,, +7.0527343750,112,1334.7985839844,,, +7.0546875000,112,1335.5311279297,,, +7.0566406250,112,1336.2637939453,,, +7.0585937500,112,1335.5311279297,,, +7.0605468750,112,1334.7985839844,,, +7.0625000000,113,1333.3333740234,,, +7.0644531250,113,1332.6007080078,,, +7.0664062500,113,1331.8681640625,,, +7.0683593750,113,1328.9377441406,,, +7.0703125000,113,1328.2050781250,,, +7.0722656250,113,1327.4725341797,,, +7.0742187500,113,1326.0073242188,,, +7.0761718750,113,1325.2747802734,,, +7.0781250000,113,1325.2747802734,,, +7.0800781250,113,1325.2747802734,,, +7.0820312500,113,1325.2747802734,,, +7.0839843750,113,1326.0073242188,,, +7.0859375000,113,1327.4725341797,,, +7.0878906250,113,1328.9377441406,,, +7.0898437500,113,1330.4029541016,,, +7.0917968750,113,1332.6007080078,,, +7.0937500000,113,1331.8681640625,,, +7.0957031250,113,1333.3333740234,,, +7.0976562500,113,1331.8681640625,,, +7.0996093750,113,1331.8681640625,,, +7.1015625000,113,1331.8681640625,,, +7.1035156250,113,1331.8681640625,,, +7.1054687500,113,1331.1354980469,,, +7.1074218750,113,1330.4029541016,,, +7.1093750000,113,1329.6702880859,,, +7.1113281250,113,1327.4725341797,,, +7.1132812500,113,1326.7398681641,,, +7.1152343750,113,1326.7398681641,,, +7.1171875000,113,1326.7398681641,,, +7.1191406250,113,1327.4725341797,,, +7.1210937500,113,1327.4725341797,,, +7.1230468750,113,1327.4725341797,,, +7.1250000000,114,1327.4725341797,,, +7.1269531250,114,1326.7398681641,,, +7.1289062500,114,1325.2747802734,,, +7.1308593750,114,1323.8095703125,,, +7.1328125000,114,1321.6116943359,,, +7.1347656250,114,1320.8791503906,,, +7.1367187500,114,1318.6812744141,,, +7.1386718750,114,1317.2160644531,,, +7.1406250000,114,1315.0183105469,,, +7.1425781250,114,1314.2857666016,,, +7.1445312500,114,1313.5531005859,,, +7.1464843750,114,1314.2857666016,,, +7.1484375000,114,1314.2857666016,,, +7.1503906250,114,1315.7509765625,,, +7.1523437500,114,1315.7509765625,,, +7.1542968750,114,1315.7509765625,,, +7.1562500000,114,1315.7509765625,,, +7.1582031250,114,1315.7509765625,,, +7.1601562500,114,1315.7509765625,,, +7.1621093750,114,1315.7509765625,,, +7.1640625000,114,1314.2857666016,,, +7.1660156250,114,1314.2857666016,,, +7.1679687500,114,1312.8205566406,,, +7.1699218750,114,1311.3553466797,,, +7.1718750000,114,1310.6226806641,,, +7.1738281250,114,1309.1574707031,,, +7.1757812500,114,1307.6922607422,,, +7.1777343750,114,1306.2270507812,,, +7.1796875000,114,1305.4945068359,,, +7.1816406250,114,1304.7619628906,,, +7.1835937500,114,1305.4945068359,,, +7.1855468750,114,1306.2270507812,,, +7.1875000000,115,1306.9597167969,,, +7.1894531250,115,1308.4249267578,,, +7.1914062500,115,1309.1574707031,,, +7.1933593750,115,1309.8901367188,,, +7.1953125000,115,1309.1574707031,,, +7.1972656250,115,1309.1574707031,,, +7.1992187500,115,1309.1574707031,,, +7.2011718750,115,1309.1574707031,,, +7.2031250000,115,1308.4249267578,,, +7.2050781250,115,1309.1574707031,,, +7.2070312500,115,1309.8901367188,,, +7.2089843750,115,1311.3553466797,,, +7.2109375000,115,1313.5531005859,,, +7.2128906250,115,1317.2160644531,,, +7.2148437500,115,1320.8791503906,,, +7.2167968750,115,1323.8095703125,,, +7.2187500000,115,1327.4725341797,,, +7.2207031250,115,1331.1354980469,,, +7.2226562500,115,1336.2637939453,,, +7.2246093750,115,1340.6593017578,,, +7.2265625000,115,1346.5201416016,,, +7.2285156250,115,1352.3809814453,,, +7.2304687500,115,1358.9743652344,,, +7.2324218750,115,1367.0329589844,,, +7.2343750000,115,1375.8242187500,,, +7.2363281250,115,1385.3480224609,,, +7.2382812500,115,1395.6043701172,,, +7.2402343750,115,1405.8608398438,,, +7.2421875000,115,1416.1171875000,,, +7.2441406250,115,1427.1062011719,,, +7.2460937500,115,1438.8278808594,,, +7.2480468750,115,1450.5494384766,,, +7.2500000000,116,1463.7362060547,,, +7.2519531250,116,1476.1904296875,,, +7.2539062500,116,1490.1098632812,,, +7.2558593750,116,1504.0292968750,,, +7.2578125000,116,1516.4835205078,,, +7.2597656250,116,1530.4029541016,,, +7.2617187500,116,1545.0549316406,,, +7.2636718750,116,1558.9743652344,,, +7.2656250000,116,1572.8937988281,,, +7.2675781250,116,1588.2784423828,,, +7.2695312500,116,1602.1977539062,,, +7.2714843750,116,1617.5823974609,,, +7.2734375000,116,1631.5018310547,,, +7.2753906250,116,1645.4212646484,,, +7.2773437500,116,1659.3406982422,,, +7.2792968750,116,1673.2601318359,,, +7.2812500000,116,1687.9121093750,,, +7.2832031250,116,1702.5640869141,,, +7.2851562500,116,1716.4835205078,,, +7.2871093750,116,1729.6702880859,,, +7.2890625000,116,1742.1245117188,,, +7.2910156250,116,1753.1135253906,,, +7.2929687500,116,1764.1025390625,,, +7.2949218750,116,1772.8937988281,,, +7.2968750000,116,1780.9523925781,,, +7.2988281250,116,1788.2784423828,,, +7.3007812500,116,1794.8718261719,,, +7.3027343750,116,1801.4652099609,,, +7.3046875000,116,1807.3260498047,,, +7.3066406250,116,1812.4542236328,,, +7.3085937500,116,1816.8498535156,,, +7.3105468750,116,1821.2453613281,,, +7.3125000000,117,1824.1757812500,,, +7.3144531250,117,1827.1062011719,,, +7.3164062500,117,1829.3040771484,,, +7.3183593750,117,1831.5018310547,,, +7.3203125000,117,1832.2343750000,,, +7.3222656250,117,1832.2343750000,,, +7.3242187500,117,1832.9670410156,,, +7.3261718750,117,1831.5018310547,,, +7.3281250000,117,1829.3040771484,,, +7.3300781250,117,1827.1062011719,,, +7.3320312500,117,1824.1757812500,,, +7.3339843750,117,1819.7802734375,,, +7.3359375000,117,1813.9194335938,,, +7.3378906250,117,1808.7912597656,,, +7.3398437500,117,1802.1977539062,,, +7.3417968750,117,1795.6043701172,,, +7.3437500000,117,1788.2784423828,,, +7.3457031250,117,1780.2197265625,,, +7.3476562500,117,1771.4285888672,,, +7.3496093750,117,1762.6373291016,,, +7.3515625000,117,1753.1135253906,,, +7.3535156250,117,1743.5897216797,,, +7.3554687500,117,1734.0659179688,,, +7.3574218750,117,1723.0769042969,,, +7.3593750000,117,1712.8205566406,,, +7.3613281250,117,1701.0988769531,,, +7.3632812500,117,1690.1098632812,,, +7.3652343750,117,1678.3883056641,,, +7.3671875000,117,1655.6776123047,,, +7.3691406250,117,1643.9560546875,,, +7.3710937500,117,1632.2343750000,,, +7.3730468750,117,1619.7802734375,,, +7.3750000000,118,1607.3260498047,,, +7.3769531250,118,1595.6043701172,,, +7.3789062500,118,1584.6153564453,,, +7.3808593750,118,1572.1611328125,,, +7.3828125000,118,1560.4395751953,,, +7.3847656250,118,1547.9853515625,,, +7.3867187500,118,1535.5311279297,,, +7.3886718750,118,1523.8095703125,,, +7.3906250000,118,1511.3553466797,,, +7.3925781250,118,1500.3663330078,,, +7.3945312500,118,1489.3773193359,,, +7.3964843750,118,1477.6556396484,,, +7.3984375000,118,1467.3992919922,,, +7.4003906250,118,1457.1428222656,,, +7.4023437500,118,1447.6190185547,,, +7.4042968750,118,1438.0952148438,,, +7.4062500000,118,1428.5714111328,,, +7.4082031250,118,1419.7802734375,,, +7.4101562500,118,1410.9890136719,,, +7.4121093750,118,1402.9304199219,,, +7.4140625000,118,1395.6043701172,,, +7.4160156250,118,1388.2784423828,,, +7.4179687500,118,1381.6849365234,,, +7.4199218750,118,1373.6263427734,,, +7.4218750000,118,1368.4981689453,,, +7.4238281250,118,1362.6373291016,,, +7.4257812500,118,1357.5091552734,,, +7.4277343750,118,1352.3809814453,,, +7.4296875000,118,1347.2528076172,,, +7.4316406250,118,1341.3919677734,,, +7.4335937500,118,1336.2637939453,,, +7.4355468750,118,1330.4029541016,,, +7.4375000000,119,1324.5421142578,,, +7.4394531250,119,1320.1464843750,,, +7.4414062500,119,1315.0183105469,,, +7.4433593750,119,1310.6226806641,,, +7.4453125000,119,1305.4945068359,,, +7.4472656250,119,1301.0988769531,,, +7.4492187500,119,1296.7032470703,,, +7.4511718750,119,1292.3077392578,,, +7.4531250000,119,1289.3773193359,,, +7.4550781250,119,1284.9816894531,,, +7.4570312500,119,1282.0512695312,,, +7.4589843750,119,1279.8535156250,,, +7.4609375000,119,1278.3883056641,,, +7.4628906250,119,1276.1904296875,,, +7.4648437500,119,1275.4578857422,,, +7.4667968750,119,1274.7252197266,,, +7.4687500000,119,1273.9926757812,,, +7.4707031250,119,1273.9926757812,,, +7.4726562500,119,1274.7252197266,,, +7.4746093750,119,1276.1904296875,,, +7.4765625000,119,1277.6556396484,,, +7.4785156250,119,1279.1208496094,,, +7.4804687500,119,1282.0512695312,,, +7.4824218750,119,1284.2490234375,,, +7.4843750000,119,1287.1794433594,,, +7.4863281250,119,1289.3773193359,,, +7.4882812500,119,1291.5750732422,,, +7.4902343750,119,1293.0402832031,,, +7.4921875000,119,1293.0402832031,,, +7.4941406250,119,1295.2380371094,,, +7.4960937500,119,1297.4359130859,,, +7.4980468750,119,1298.9011230469,,, +7.5000000000,120,1300.3663330078,,, +7.5019531250,120,1302.5640869141,,, +7.5039062500,120,1304.7619628906,,, +7.5058593750,120,1306.2270507812,,, +7.5078125000,120,1307.6922607422,,, +7.5097656250,120,1310.6226806641,,, +7.5117187500,120,1313.5531005859,,, +7.5136718750,120,1316.4835205078,,, +7.5156250000,120,1319.4139404297,,, +7.5175781250,120,1321.6116943359,,, +7.5195312500,120,1324.5421142578,,, +7.5214843750,120,1326.7398681641,,, +7.5234375000,120,1330.4029541016,,, +7.5253906250,120,1334.0659179688,,, +7.5273437500,120,1337.7288818359,,, +7.5292968750,120,1339.9267578125,,, +7.5312500000,120,1344.3223876953,,, +7.5332031250,120,1348.7178955078,,, +7.5351562500,120,1351.6483154297,,, +7.5371093750,120,1355.3114013672,,, +7.5390625000,120,1358.2416992188,,, +7.5410156250,120,1362.6373291016,,, +7.5429687500,120,1364.8352050781,,, +7.5449218750,120,1369.2307128906,,, +7.5468750000,120,1371.4285888672,,, +7.5488281250,120,1372.8937988281,,, +7.5507812500,120,1375.0915527344,,, +7.5527343750,120,1376.5567626953,,, +7.5546875000,120,1377.2894287109,,, +7.5566406250,120,1378.0219726562,,, +7.5585937500,120,1379.4871826172,,, +7.5605468750,120,1380.9523925781,,, +7.5625000000,121,1382.4176025391,,, +7.5644531250,121,1383.1501464844,,, +7.5664062500,121,1384.6153564453,,, +7.5683593750,121,1385.3480224609,,, +7.5703125000,121,1386.8132324219,,, +7.5722656250,121,1386.8132324219,,, +7.5742187500,121,1387.5457763672,,, +7.5761718750,121,1387.5457763672,,, +7.5781250000,121,1388.2784423828,,, +7.5800781250,121,1389.0109863281,,, +7.5820312500,121,1390.4761962891,,, +7.5839843750,121,1391.2087402344,,, +7.5859375000,121,1391.9414062500,,, +7.5878906250,121,1391.9414062500,,, +7.5898437500,121,1391.2087402344,,, +7.5917968750,121,1391.2087402344,,, +7.5937500000,121,1390.4761962891,,, +7.5957031250,121,1391.2087402344,,, +7.5976562500,121,1390.4761962891,,, +7.5996093750,121,1390.4761962891,,, +7.6015625000,121,1390.4761962891,,, +7.6035156250,121,1391.2087402344,,, +7.6054687500,121,1391.9414062500,,, +7.6074218750,121,1389.7435302734,,, +7.6093750000,121,1389.7435302734,,, +7.6113281250,121,1388.2784423828,,, +7.6132812500,121,1387.5457763672,,, +7.6152343750,121,1385.3480224609,,, +7.6171875000,121,1383.8828125000,,, +7.6191406250,121,1382.4176025391,,, +7.6210937500,121,1380.9523925781,,, +7.6230468750,121,1379.4871826172,,, +7.6250000000,122,1377.2894287109,,, +7.6269531250,122,1374.3590087891,,, +7.6289062500,122,1372.1611328125,,, +7.6308593750,122,1369.9633789062,,, +7.6328125000,122,1367.7656250000,,, +7.6347656250,122,1365.5677490234,,, +7.6367187500,122,1362.6373291016,,, +7.6386718750,122,1360.4395751953,,, +7.6406250000,122,1357.5091552734,,, +7.6425781250,122,1354.5787353516,,, +7.6445312500,122,1352.3809814453,,, +7.6464843750,122,1348.7178955078,,, +7.6484375000,122,1346.5201416016,,, +7.6503906250,122,1342.8571777344,,, +7.6523437500,122,1340.6593017578,,, +7.6542968750,122,1337.7288818359,,, +7.6562500000,122,1334.7985839844,,, +7.6582031250,122,1331.8681640625,,, +7.6601562500,122,1328.9377441406,,, +7.6621093750,122,1326.0073242188,,, +7.6640625000,122,1322.3443603516,,, +7.6660156250,122,1320.1464843750,,, +7.6679687500,122,1317.2160644531,,, +7.6699218750,122,1315.0183105469,,, +7.6718750000,122,1312.0878906250,,, +7.6738281250,122,1309.8901367188,,, +7.6757812500,122,1306.9597167969,,, +7.6777343750,122,1304.7619628906,,, +7.6796875000,122,1302.5640869141,,, +7.6816406250,122,1301.0988769531,,, +7.6835937500,122,1299.6336669922,,, +7.6855468750,122,1298.9011230469,,, +7.6875000000,123,1297.4359130859,,, +7.6894531250,123,1296.7032470703,,, +7.6914062500,123,1295.2380371094,,, +7.6933593750,123,1294.5054931641,,, +7.6953125000,123,1293.0402832031,,, +7.6972656250,123,1292.3077392578,,, +7.6992187500,123,1291.5750732422,,, +7.7011718750,123,1290.8425292969,,, +7.7031250000,123,1290.8425292969,,, +7.7050781250,123,1290.1098632812,,, +7.7070312500,123,1290.1098632812,,, +7.7089843750,123,1289.3773193359,,, +7.7109375000,123,1288.6446533203,,, +7.7128906250,123,1287.9121093750,,, +7.7148437500,123,1287.1794433594,,, +7.7167968750,123,1287.1794433594,,, +7.7187500000,123,1287.1794433594,,, +7.7207031250,123,1287.9121093750,,, +7.7226562500,123,1288.6446533203,,, +7.7246093750,123,1290.1098632812,,, +7.7265625000,123,1290.8425292969,,, +7.7285156250,123,1292.3077392578,,, +7.7304687500,123,1293.7729492188,,, +7.7324218750,123,1294.5054931641,,, +7.7343750000,123,1295.9707031250,,, +7.7363281250,123,1297.4359130859,,, +7.7382812500,123,1298.1684570312,,, +7.7402343750,123,1300.3663330078,,, +7.7421875000,123,1301.0988769531,,, +7.7441406250,123,1301.0988769531,,, +7.7460937500,123,1301.8315429688,,, +7.7480468750,123,1301.0988769531,,, +7.7500000000,124,1301.0988769531,,, +7.7519531250,124,1301.0988769531,,, +7.7539062500,124,1301.0988769531,,, +7.7558593750,124,1301.0988769531,,, +7.7578125000,124,1301.8315429688,,, +7.7597656250,124,1301.8315429688,,, +7.7617187500,124,1302.5640869141,,, +7.7636718750,124,1303.2967529297,,, +7.7656250000,124,1302.5640869141,,, +7.7675781250,124,1302.5640869141,,, +7.7695312500,124,1303.2967529297,,, +7.7714843750,124,1303.2967529297,,, +7.7734375000,124,1304.0292968750,,, +7.7753906250,124,1303.2967529297,,, +7.7773437500,124,1304.0292968750,,, +7.7792968750,124,1303.2967529297,,, +7.7812500000,124,1303.2967529297,,, +7.7832031250,124,1302.5640869141,,, +7.7851562500,124,1303.2967529297,,, +7.7871093750,124,1302.5640869141,,, +7.7890625000,124,1303.2967529297,,, +7.7910156250,124,1303.2967529297,,, +7.7929687500,124,1302.5640869141,,, +7.7949218750,124,1301.8315429688,,, +7.7968750000,124,1301.8315429688,,, +7.7988281250,124,1301.0988769531,,, +7.8007812500,124,1300.3663330078,,, +7.8027343750,124,1300.3663330078,,, +7.8046875000,124,1301.0988769531,,, +7.8066406250,124,1301.8315429688,,, +7.8085937500,124,1301.8315429688,,, +7.8105468750,124,1302.5640869141,,, +7.8125000000,125,1303.2967529297,,, +7.8144531250,125,1304.0292968750,,, +7.8164062500,125,1305.4945068359,,, +7.8183593750,125,1306.2270507812,,, +7.8203125000,125,1307.6922607422,,, +7.8222656250,125,1308.4249267578,,, +7.8242187500,125,1309.1574707031,,, +7.8261718750,125,1310.6226806641,,, +7.8281250000,125,1311.3553466797,,, +7.8300781250,125,1312.8205566406,,, +7.8320312500,125,1312.8205566406,,, +7.8339843750,125,1313.5531005859,,, +7.8359375000,125,1314.2857666016,,, +7.8378906250,125,1314.2857666016,,, +7.8398437500,125,1315.7509765625,,, +7.8417968750,125,1315.0183105469,,, +7.8437500000,125,1315.7509765625,,, +7.8457031250,125,1315.7509765625,,, +7.8476562500,125,1315.7509765625,,, +7.8496093750,125,1315.0183105469,,, +7.8515625000,125,1315.0183105469,,, +7.8535156250,125,1315.0183105469,,, +7.8554687500,125,1314.2857666016,,, +7.8574218750,125,1313.5531005859,,, +7.8593750000,125,1313.5531005859,,, +7.8613281250,125,1313.5531005859,,, +7.8632812500,125,1314.2857666016,,, +7.8652343750,125,1315.7509765625,,, +7.8671875000,125,1316.4835205078,,, +7.8691406250,125,1315.7509765625,,, +7.8710937500,125,1316.4835205078,,, +7.8730468750,125,1315.7509765625,,, +7.8750000000,126,1315.7509765625,,, +7.8769531250,126,1315.7509765625,,, +7.8789062500,126,1316.4835205078,,, +7.8808593750,126,1315.7509765625,,, +7.8828125000,126,1316.4835205078,,, +7.8847656250,126,1316.4835205078,,, +7.8867187500,126,1317.9487304688,,, +7.8886718750,126,1318.6812744141,,, +7.8906250000,126,1320.1464843750,,, +7.8925781250,126,1321.6116943359,,, +7.8945312500,126,1323.0769042969,,, +7.8964843750,126,1325.2747802734,,, +7.8984375000,126,1326.0073242188,,, +7.9003906250,126,1328.9377441406,,, +7.9023437500,126,1330.4029541016,,, +7.9042968750,126,1332.6007080078,,, +7.9062500000,126,1333.3333740234,,, +7.9082031250,126,1334.0659179688,,, +7.9101562500,126,1333.3333740234,,, +7.9121093750,126,1333.3333740234,,, +7.9140625000,126,1332.6007080078,,, +7.9160156250,126,1331.8681640625,,, +7.9179687500,126,1331.8681640625,,, +7.9199218750,126,1331.8681640625,,, +7.9218750000,126,1331.1354980469,,, +7.9238281250,126,1330.4029541016,,, +7.9257812500,126,1329.6702880859,,, +7.9277343750,126,1328.2050781250,,, +7.9296875000,126,1326.0073242188,,, +7.9316406250,126,1324.5421142578,,, +7.9335937500,126,1322.3443603516,,, +7.9355468750,126,1321.6116943359,,, +7.9375000000,127,1320.8791503906,,, +7.9394531250,127,1320.1464843750,,, +7.9414062500,127,1318.6812744141,,, +7.9433593750,127,1317.9487304688,,, +7.9453125000,127,1317.2160644531,,, +7.9472656250,127,1316.4835205078,,, +7.9492187500,127,1315.7509765625,,, +7.9511718750,127,1315.0183105469,,, +7.9531250000,127,1314.2857666016,,, +7.9550781250,127,1313.5531005859,,, +7.9570312500,127,1313.5531005859,,, +7.9589843750,127,1312.8205566406,,, +7.9609375000,127,1312.8205566406,,, +7.9628906250,127,1313.5531005859,,, +7.9648437500,127,1312.8205566406,,, +7.9667968750,127,1313.5531005859,,, +7.9687500000,127,1313.5531005859,,, +7.9707031250,127,1313.5531005859,,, +7.9726562500,127,1313.5531005859,,, +7.9746093750,127,1314.2857666016,,, +7.9765625000,127,1315.0183105469,,, +7.9785156250,127,1315.0183105469,,, +7.9804687500,127,1315.7509765625,,, +7.9824218750,127,1316.4835205078,,, +7.9843750000,127,1316.4835205078,,, +7.9863281250,127,1317.9487304688,,, +7.9882812500,127,1318.6812744141,,, +7.9902343750,127,1318.6812744141,,, +7.9921875000,127,1317.9487304688,,, +7.9941406250,127,1317.9487304688,,, +7.9960937500,127,1317.2160644531,,, +7.9980468750,127,1315.7509765625,,, +8.0000000000,128,1315.0183105469,,, +8.0019531250,128,1315.0183105469,,, +8.0039062500,128,1315.0183105469,,, +8.0058593750,128,1313.5531005859,,, +8.0078125000,128,1313.5531005859,,, +8.0097656250,128,1312.8205566406,,, +8.0117187500,128,1312.0878906250,,, +8.0136718750,128,1311.3553466797,,, +8.0156250000,128,1312.0878906250,,, +8.0175781250,128,1312.0878906250,,, +8.0195312500,128,1312.8205566406,,, +8.0214843750,128,1313.5531005859,,, +8.0234375000,128,1314.2857666016,,, +8.0253906250,128,1314.2857666016,,, +8.0273437500,128,1314.2857666016,,, +8.0292968750,128,1315.0183105469,,, +8.0312500000,128,1315.7509765625,,, +8.0332031250,128,1315.7509765625,,, +8.0351562500,128,1315.7509765625,,, +8.0371093750,128,1315.7509765625,,, +8.0390625000,128,1316.4835205078,,, +8.0410156250,128,1316.4835205078,,, +8.0429687500,128,1317.2160644531,,, +8.0449218750,128,1317.2160644531,,, +8.0468750000,128,1317.2160644531,,, +8.0488281250,128,1315.7509765625,,, +8.0507812500,128,1315.0183105469,,, +8.0527343750,128,1315.0183105469,,, +8.0546875000,128,1314.2857666016,,, +8.0566406250,128,1314.2857666016,,, +8.0585937500,128,1314.2857666016,,, +8.0605468750,128,1313.5531005859,,, +8.0625000000,129,1313.5531005859,,, +8.0644531250,129,1312.8205566406,,, +8.0664062500,129,1313.5531005859,,, +8.0683593750,129,1313.5531005859,,, +8.0703125000,129,1313.5531005859,,, +8.0722656250,129,1315.0183105469,,, +8.0742187500,129,1315.7509765625,,, +8.0761718750,129,1317.9487304688,,, +8.0781250000,129,1320.8791503906,,, +8.0800781250,129,1323.8095703125,,, +8.0820312500,129,1328.2050781250,,, +8.0839843750,129,1334.0659179688,,, +8.0859375000,129,1339.9267578125,,, +8.0878906250,129,1347.9853515625,,, +8.0898437500,129,1356.0439453125,,, +8.0917968750,129,1364.8352050781,,, +8.0937500000,129,1374.3590087891,,, +8.0957031250,129,1383.8828125000,,, +8.0976562500,129,1391.9414062500,,, +8.0996093750,129,1401.4652099609,,, +8.1015625000,129,1410.9890136719,,, +8.1035156250,129,1420.5128173828,,, +8.1054687500,129,1430.7692871094,,, +8.1074218750,129,1442.4908447266,,, +8.1093750000,129,1454.9450683594,,, +8.1113281250,129,1469.5970458984,,, +8.1132812500,129,1484.2490234375,,, +8.1152343750,129,1499.6336669922,,, +8.1171875000,129,1513.5531005859,,, +8.1191406250,129,1528.2050781250,,, +8.1210937500,129,1542.8571777344,,, +8.1230468750,129,1558.2416992188,,, +8.1250000000,130,1573.6263427734,,, +8.1269531250,130,1589.7435302734,,, +8.1289062500,130,1606.5933837891,,, +8.1308593750,130,1623.4432373047,,, +8.1328125000,130,1641.0256347656,,, +8.1347656250,130,1657.8754882812,,, +8.1367187500,130,1673.9926757812,,, +8.1386718750,130,1687.9121093750,,, +8.1406250000,130,1704.0292968750,,, +8.1425781250,130,1718.6812744141,,, +8.1445312500,130,1734.0659179688,,, +8.1464843750,130,1749.4505615234,,, +8.1484375000,130,1764.1025390625,,, +8.1503906250,130,1778.7546386719,,, +8.1523437500,130,1791.9414062500,,, +8.1542968750,130,1804.3956298828,,, +8.1562500000,130,1815.3846435547,,, +8.1582031250,130,1825.6409912109,,, +8.1601562500,130,1833.6995849609,,, +8.1621093750,130,1842.4908447266,,, +8.1640625000,130,1851.2821044922,,, +8.1660156250,130,1858.6080322266,,, +8.1679687500,130,1866.6666259766,,, +8.1699218750,130,1873.2601318359,,, +8.1718750000,130,1879.1208496094,,, +8.1738281250,130,1882.0512695312,,, +8.1757812500,130,1884.2490234375,,, +8.1777343750,130,1884.9816894531,,, +8.1796875000,130,1884.9816894531,,, +8.1816406250,130,1884.9816894531,,, +8.1835937500,130,1884.2490234375,,, +8.1855468750,130,1882.7839355469,,, +8.1875000000,131,1880.5860595703,,, +8.1894531250,131,1877.6556396484,,, +8.1914062500,131,1874.7252197266,,, +8.1933593750,131,1869.5970458984,,, +8.1953125000,131,1864.4688720703,,, +8.1972656250,131,1857.8754882812,,, +8.1992187500,131,1851.2821044922,,, +8.2011718750,131,1843.2233886719,,, +8.2031250000,131,1835.8974609375,,, +8.2050781250,131,1827.8388671875,,, +8.2070312500,131,1820.5128173828,,, +8.2089843750,131,1813.1867675781,,, +8.2109375000,131,1805.1281738281,,, +8.2128906250,131,1796.3370361328,,, +8.2148437500,131,1784.6153564453,,, +8.2167968750,131,1772.1611328125,,, +8.2187500000,131,1760.4395751953,,, +8.2207031250,131,1747.2528076172,,, +8.2226562500,131,1736.2637939453,,, +8.2246093750,131,1725.2747802734,,, +8.2265625000,131,1715.0183105469,,, +8.2285156250,131,1704.0292968750,,, +8.2304687500,131,1691.5750732422,,, +8.2324218750,131,1678.3883056641,,, +8.2343750000,131,1665.2014160156,,, +8.2363281250,131,1652.7471923828,,, +8.2382812500,131,1639.5604248047,,, +8.2402343750,131,1627.8388671875,,, +8.2421875000,131,1615.3846435547,,, +8.2441406250,131,1605.1281738281,,, +8.2460937500,131,1594.1391601562,,, +8.2480468750,131,1584.6153564453,,, +8.2500000000,132,1574.3590087891,,, +8.2519531250,132,1563.3699951172,,, +8.2539062500,132,1552.3809814453,,, +8.2558593750,132,1540.6593017578,,, +8.2578125000,132,1528.9377441406,,, +8.2597656250,132,1517.9487304688,,, +8.2617187500,132,1509.1574707031,,, +8.2636718750,132,1500.3663330078,,, +8.2656250000,132,1493.0402832031,,, +8.2675781250,132,1485.7142333984,,, +8.2695312500,132,1478.3883056641,,, +8.2714843750,132,1470.3297119141,,, +8.2734375000,132,1462.2711181641,,, +8.2753906250,132,1454.9450683594,,, +8.2773437500,132,1446.1538085938,,, +8.2792968750,132,1438.0952148438,,, +8.2812500000,132,1430.7692871094,,, +8.2832031250,132,1423.4432373047,,, +8.2851562500,132,1416.8498535156,,, +8.2871093750,132,1410.9890136719,,, +8.2890625000,132,1405.1281738281,,, +8.2910156250,132,1399.2674560547,,, +8.2929687500,132,1394.8718261719,,, +8.2949218750,132,1390.4761962891,,, +8.2968750000,132,1386.0805664062,,, +8.2988281250,132,1381.6849365234,,, +8.3007812500,132,1378.0219726562,,, +8.3027343750,132,1375.0915527344,,, +8.3046875000,132,1372.1611328125,,, +8.3066406250,132,1368.4981689453,,, +8.3085937500,132,1365.5677490234,,, +8.3105468750,132,1362.6373291016,,, +8.3125000000,133,1359.7069091797,,, +8.3144531250,133,1356.0439453125,,, +8.3164062500,133,1353.1135253906,,, +8.3183593750,133,1349.4505615234,,, +8.3203125000,133,1345.0549316406,,, +8.3222656250,133,1342.1245117188,,, +8.3242187500,133,1339.1940917969,,, +8.3261718750,133,1337.7288818359,,, +8.3281250000,133,1334.7985839844,,, +8.3300781250,133,1333.3333740234,,, +8.3320312500,133,1331.1354980469,,, +8.3339843750,133,1328.9377441406,,, +8.3359375000,133,1326.7398681641,,, +8.3378906250,133,1325.2747802734,,, +8.3398437500,133,1323.0769042969,,, +8.3417968750,133,1320.1464843750,,, +8.3437500000,133,1317.9487304688,,, +8.3457031250,133,1315.0183105469,,, +8.3476562500,133,1312.8205566406,,, +8.3496093750,133,1310.6226806641,,, +8.3515625000,133,1308.4249267578,,, +8.3535156250,133,1306.9597167969,,, +8.3554687500,133,1304.7619628906,,, +8.3574218750,133,1303.2967529297,,, +8.3593750000,133,1301.8315429688,,, +8.3613281250,133,1300.3663330078,,, +8.3632812500,133,1299.6336669922,,, +8.3652343750,133,1299.6336669922,,, +8.3671875000,133,1298.9011230469,,, +8.3691406250,133,1299.6336669922,,, +8.3710937500,133,1299.6336669922,,, +8.3730468750,133,1300.3663330078,,, +8.3750000000,134,1301.8315429688,,, +8.3769531250,134,1303.2967529297,,, +8.3789062500,134,1305.4945068359,,, +8.3808593750,134,1308.4249267578,,, +8.3828125000,134,1310.6226806641,,, +8.3847656250,134,1313.5531005859,,, +8.3867187500,134,1315.7509765625,,, +8.3886718750,134,1318.6812744141,,, +8.3906250000,134,1320.8791503906,,, +8.3925781250,134,1323.0769042969,,, +8.3945312500,134,1326.0073242188,,, +8.3964843750,134,1328.2050781250,,, +8.3984375000,134,1330.4029541016,,, +8.4003906250,134,1332.6007080078,,, +8.4023437500,134,1334.0659179688,,, +8.4042968750,134,1336.2637939453,,, +8.4062500000,134,1336.9963378906,,, +8.4082031250,134,1339.1940917969,,, +8.4101562500,134,1340.6593017578,,, +8.4121093750,134,1342.1245117188,,, +8.4140625000,134,1342.1245117188,,, +8.4160156250,134,1344.3223876953,,, +8.4179687500,134,1345.0549316406,,, +8.4199218750,134,1346.5201416016,,, +8.4218750000,134,1347.9853515625,,, +8.4238281250,134,1348.7178955078,,, +8.4257812500,134,1350.1831054688,,, +8.4277343750,134,1350.9157714844,,, +8.4296875000,134,1353.1135253906,,, +8.4316406250,134,1354.5787353516,,, +8.4335937500,134,1357.5091552734,,, +8.4355468750,134,1359.7069091797,,, +8.4375000000,135,1361.1721191406,,, +8.4394531250,135,1362.6373291016,,, +8.4414062500,135,1364.8352050781,,, +8.4433593750,135,1366.3004150391,,, +8.4453125000,135,1367.0329589844,,, +8.4472656250,135,1367.7656250000,,, +8.4492187500,135,1369.2307128906,,, +8.4511718750,135,1371.4285888672,,, +8.4531250000,135,1372.8937988281,,, +8.4550781250,135,1374.3590087891,,, +8.4570312500,135,1375.8242187500,,, +8.4589843750,135,1377.2894287109,,, +8.4609375000,135,1378.0219726562,,, +8.4628906250,135,1379.4871826172,,, +8.4648437500,135,1380.2197265625,,, +8.4667968750,135,1380.2197265625,,, +8.4687500000,135,1380.2197265625,,, +8.4707031250,135,1380.9523925781,,, +8.4726562500,135,1381.6849365234,,, +8.4746093750,135,1381.6849365234,,, +8.4765625000,135,1381.6849365234,,, +8.4785156250,135,1380.9523925781,,, +8.4804687500,135,1379.4871826172,,, +8.4824218750,135,1378.7546386719,,, +8.4843750000,135,1376.5567626953,,, +8.4863281250,135,1374.3590087891,,, +8.4882812500,135,1372.8937988281,,, +8.4902343750,135,1370.6959228516,,, +8.4921875000,135,1369.2307128906,,, +8.4941406250,135,1367.0329589844,,, +8.4960937500,135,1364.8352050781,,, +8.4980468750,135,1362.6373291016,,, +8.5000000000,136,1359.7069091797,,, +8.5019531250,136,1357.5091552734,,, +8.5039062500,136,1355.3114013672,,, +8.5058593750,136,1353.1135253906,,, +8.5078125000,136,1350.1831054688,,, +8.5097656250,136,1347.2528076172,,, +8.5117187500,136,1345.7875976562,,, +8.5136718750,136,1343.5897216797,,, +8.5156250000,136,1341.3919677734,,, +8.5175781250,136,1340.6593017578,,, +8.5195312500,136,1339.1940917969,,, +8.5214843750,136,1339.1940917969,,, +8.5234375000,136,1337.7288818359,,, +8.5253906250,136,1336.2637939453,,, +8.5273437500,136,1336.2637939453,,, +8.5292968750,136,1335.5311279297,,, +8.5312500000,136,1334.7985839844,,, +8.5332031250,136,1334.0659179688,,, +8.5351562500,136,1333.3333740234,,, +8.5371093750,136,1331.8681640625,,, +8.5390625000,136,1330.4029541016,,, +8.5410156250,136,1328.9377441406,,, +8.5429687500,136,1326.0073242188,,, +8.5449218750,136,1323.8095703125,,, +8.5468750000,136,1321.6116943359,,, +8.5488281250,136,1318.6812744141,,, +8.5507812500,136,1315.7509765625,,, +8.5527343750,136,1315.0183105469,,, +8.5546875000,136,1312.8205566406,,, +8.5566406250,136,1312.0878906250,,, +8.5585937500,136,1309.1574707031,,, +8.5605468750,136,1308.4249267578,,, +8.5625000000,137,1306.9597167969,,, +8.5644531250,137,1306.2270507812,,, +8.5664062500,137,1305.4945068359,,, +8.5683593750,137,1304.7619628906,,, +8.5703125000,137,1304.7619628906,,, +8.5722656250,137,1302.5640869141,,, +8.5742187500,137,1301.8315429688,,, +8.5761718750,137,1301.0988769531,,, +8.5781250000,137,1300.3663330078,,, +8.5800781250,137,1300.3663330078,,, +8.5820312500,137,1300.3663330078,,, +8.5839843750,137,1300.3663330078,,, +8.5859375000,137,1298.9011230469,,, +8.5878906250,137,1298.1684570312,,, +8.5898437500,137,1296.7032470703,,, +8.5917968750,137,1295.2380371094,,, +8.5937500000,137,1293.7729492188,,, +8.5957031250,137,1292.3077392578,,, +8.5976562500,137,1291.5750732422,,, +8.5996093750,137,1290.1098632812,,, +8.6015625000,137,1289.3773193359,,, +8.6035156250,137,1288.6446533203,,, +8.6054687500,137,1288.6446533203,,, +8.6074218750,137,1289.3773193359,,, +8.6093750000,137,1289.3773193359,,, +8.6113281250,137,1290.1098632812,,, +8.6132812500,137,1290.8425292969,,, +8.6152343750,137,1291.5750732422,,, +8.6171875000,137,1293.0402832031,,, +8.6191406250,137,1293.0402832031,,, +8.6210937500,137,1294.5054931641,,, +8.6230468750,137,1295.2380371094,,, +8.6250000000,138,1295.9707031250,,, +8.6269531250,138,1295.9707031250,,, +8.6289062500,138,1295.2380371094,,, +8.6308593750,138,1294.5054931641,,, +8.6328125000,138,1293.7729492188,,, +8.6347656250,138,1292.3077392578,,, +8.6367187500,138,1290.8425292969,,, +8.6386718750,138,1290.1098632812,,, +8.6406250000,138,1288.6446533203,,, +8.6425781250,138,1287.9121093750,,, +8.6445312500,138,1288.6446533203,,, +8.6464843750,138,1290.1098632812,,, +8.6484375000,138,1292.3077392578,,, +8.6503906250,138,1293.0402832031,,, +8.6523437500,138,1292.3077392578,,, +8.6542968750,138,1291.5750732422,,, +8.6562500000,138,1291.5750732422,,, +8.6582031250,138,1291.5750732422,,, +8.6601562500,138,1292.3077392578,,, +8.6621093750,138,1293.7729492188,,, +8.6640625000,138,1295.9707031250,,, +8.6660156250,138,1298.1684570312,,, +8.6679687500,138,1299.6336669922,,, +8.6699218750,138,1301.8315429688,,, +8.6718750000,138,1301.8315429688,,, +8.6738281250,138,1301.0988769531,,, +8.6757812500,138,1301.0988769531,,, +8.6777343750,138,1301.0988769531,,, +8.6796875000,138,1302.5640869141,,, +8.6816406250,138,1303.2967529297,,, +8.6835937500,138,1306.2270507812,,, +8.6855468750,138,1307.6922607422,,, +8.6875000000,139,1306.9597167969,,, +8.6894531250,139,1307.6922607422,,, +8.6914062500,139,1306.9597167969,,, +8.6933593750,139,1306.9597167969,,, +8.6953125000,139,1306.9597167969,,, +8.6972656250,139,1308.4249267578,,, +8.6992187500,139,1310.6226806641,,, +8.7011718750,139,1312.8205566406,,, +8.7031250000,139,1314.2857666016,,, +8.7050781250,139,1315.7509765625,,, +8.7070312500,139,1315.7509765625,,, +8.7089843750,139,1315.0183105469,,, +8.7109375000,139,1315.7509765625,,, +8.7128906250,139,1316.4835205078,,, +8.7148437500,139,1316.4835205078,,, +8.7167968750,139,1317.2160644531,,, +8.7187500000,139,1318.6812744141,,, +8.7207031250,139,1320.8791503906,,, +8.7226562500,139,1321.6116943359,,, +8.7246093750,139,1322.3443603516,,, +8.7265625000,139,1322.3443603516,,, +8.7285156250,139,1321.6116943359,,, +8.7304687500,139,1320.8791503906,,, +8.7324218750,139,1320.8791503906,,, +8.7343750000,139,1320.8791503906,,, +8.7363281250,139,1321.6116943359,,, +8.7382812500,139,1323.0769042969,,, +8.7402343750,139,1324.5421142578,,, +8.7421875000,139,1324.5421142578,,, +8.7441406250,139,1324.5421142578,,, +8.7460937500,139,1323.8095703125,,, +8.7480468750,139,1323.8095703125,,, +8.7500000000,140,1323.0769042969,,, +8.7519531250,140,1323.0769042969,,, +8.7539062500,140,1323.8095703125,,, +8.7558593750,140,1326.0073242188,,, +8.7578125000,140,1327.4725341797,,, +8.7597656250,140,1328.9377441406,,, +8.7617187500,140,1329.6702880859,,, +8.7636718750,140,1329.6702880859,,, +8.7656250000,140,1328.9377441406,,, +8.7675781250,140,1328.2050781250,,, +8.7695312500,140,1328.2050781250,,, +8.7714843750,140,1327.4725341797,,, +8.7734375000,140,1327.4725341797,,, +8.7753906250,140,1326.0073242188,,, +8.7773437500,140,1326.7398681641,,, +8.7792968750,140,1325.2747802734,,, +8.7812500000,140,1326.0073242188,,, +8.7832031250,140,1325.2747802734,,, +8.7851562500,140,1324.5421142578,,, +8.7871093750,140,1323.8095703125,,, +8.7890625000,140,1323.8095703125,,, +8.7910156250,140,1323.0769042969,,, +8.7929687500,140,1321.6116943359,,, +8.7949218750,140,1321.6116943359,,, +8.7968750000,140,1322.3443603516,,, +8.7988281250,140,1320.8791503906,,, +8.8007812500,140,1320.1464843750,,, +8.8027343750,140,1319.4139404297,,, +8.8046875000,140,1319.4139404297,,, +8.8066406250,140,1318.6812744141,,, +8.8085937500,140,1318.6812744141,,, +8.8105468750,140,1317.9487304688,,, +8.8125000000,141,1316.4835205078,,, +8.8144531250,141,1315.7509765625,,, +8.8164062500,141,1315.0183105469,,, +8.8183593750,141,1314.2857666016,,, +8.8203125000,141,1313.5531005859,,, +8.8222656250,141,1313.5531005859,,, +8.8242187500,141,1313.5531005859,,, +8.8261718750,141,1312.8205566406,,, +8.8281250000,141,1312.0878906250,,, +8.8300781250,141,1312.8205566406,,, +8.8320312500,141,1313.5531005859,,, +8.8339843750,141,1313.5531005859,,, +8.8359375000,141,1314.2857666016,,, +8.8378906250,141,1313.5531005859,,, +8.8398437500,141,1314.2857666016,,, +8.8417968750,141,1314.2857666016,,, +8.8437500000,141,1314.2857666016,,, +8.8457031250,141,1315.0183105469,,, +8.8476562500,141,1315.7509765625,,, +8.8496093750,141,1316.4835205078,,, +8.8515625000,141,1317.2160644531,,, +8.8535156250,141,1317.9487304688,,, +8.8554687500,141,1317.9487304688,,, +8.8574218750,141,1319.4139404297,,, +8.8593750000,141,1318.6812744141,,, +8.8613281250,141,1318.6812744141,,, +8.8632812500,141,1318.6812744141,,, +8.8652343750,141,1318.6812744141,,, +8.8671875000,141,1317.9487304688,,, +8.8691406250,141,1317.2160644531,,, +8.8710937500,141,1317.2160644531,,, +8.8730468750,141,1315.7509765625,,, +8.8750000000,142,1314.2857666016,,, +8.8769531250,142,1312.0878906250,,, +8.8789062500,142,1310.6226806641,,, +8.8808593750,142,1308.4249267578,,, +8.8828125000,142,1306.9597167969,,, +8.8847656250,142,1305.4945068359,,, +8.8867187500,142,1305.4945068359,,, +8.8886718750,142,1304.7619628906,,, +8.8906250000,142,1304.0292968750,,, +8.8925781250,142,1303.2967529297,,, +8.8945312500,142,1302.5640869141,,, +8.8964843750,142,1301.8315429688,,, +8.8984375000,142,1301.0988769531,,, +8.9003906250,142,1300.3663330078,,, +8.9023437500,142,1299.6336669922,,, +8.9042968750,142,1298.9011230469,,, +8.9062500000,142,1298.1684570312,,, +8.9082031250,142,1298.9011230469,,, +8.9101562500,142,1298.9011230469,,, +8.9121093750,142,1298.9011230469,,, +8.9140625000,142,1298.9011230469,,, +8.9160156250,142,1298.9011230469,,, +8.9179687500,142,1298.9011230469,,, +8.9199218750,142,1298.9011230469,,, +8.9218750000,142,1299.6336669922,,, +8.9238281250,142,1299.6336669922,,, +8.9257812500,142,1300.3663330078,,, +8.9277343750,142,1300.3663330078,,, +8.9296875000,142,1300.3663330078,,, +8.9316406250,142,1300.3663330078,,, +8.9335937500,142,1299.6336669922,,, +8.9355468750,142,1300.3663330078,,, +8.9375000000,143,1300.3663330078,,, +8.9394531250,143,1301.0988769531,,, +8.9414062500,143,1303.2967529297,,, +8.9433593750,143,1304.0292968750,,, +8.9453125000,143,1304.7619628906,,, +8.9472656250,143,1306.9597167969,,, +8.9492187500,143,1309.1574707031,,, +8.9511718750,143,1311.3553466797,,, +8.9531250000,143,1312.8205566406,,, +8.9550781250,143,1315.0183105469,,, +8.9570312500,143,1317.9487304688,,, +8.9589843750,143,1320.8791503906,,, +8.9609375000,143,1324.5421142578,,, +8.9628906250,143,1328.2050781250,,, +8.9648437500,143,1332.6007080078,,, +8.9667968750,143,1335.5311279297,,, +8.9687500000,143,1337.7288818359,,, +8.9707031250,143,1340.6593017578,,, +8.9726562500,143,1344.3223876953,,, +8.9746093750,143,1348.7178955078,,, +8.9765625000,143,1354.5787353516,,, +8.9785156250,143,1358.9743652344,,, +8.9804687500,143,1364.1025390625,,, +8.9824218750,143,1369.9633789062,,, +8.9843750000,143,1377.2894287109,,, +8.9863281250,143,1384.6153564453,,, +8.9882812500,143,1392.6739501953,,, +8.9902343750,143,1400.0000000000,,, +8.9921875000,143,1408.0585937500,,, +8.9941406250,143,1417.5823974609,,, +8.9960937500,143,1427.8388671875,,, +8.9980468750,143,1440.2930908203,,, +9.0000000000,144,1450.5494384766,,, +9.0019531250,144,1462.2711181641,,, +9.0039062500,144,1474.7252197266,,, +9.0058593750,144,1487.1794433594,,, +9.0078125000,144,1498.9011230469,,, +9.0097656250,144,1510.6226806641,,, +9.0117187500,144,1523.0769042969,,, +9.0136718750,144,1536.9963378906,,, +9.0156250000,144,1548.7178955078,,, +9.0175781250,144,1561.9047851562,,, +9.0195312500,144,1575.8242187500,,, +9.0214843750,144,1589.0109863281,,, +9.0234375000,144,1602.9304199219,,, +9.0253906250,144,1616.1171875000,,, +9.0273437500,144,1629.3040771484,,, +9.0292968750,144,1643.9560546875,,, +9.0312500000,144,1659.3406982422,,, +9.0332031250,144,1672.5274658203,,, +9.0351562500,144,1687.1794433594,,, +9.0371093750,144,1700.3663330078,,, +9.0390625000,144,1714.2857666016,,, +9.0410156250,144,1727.4725341797,,, +9.0429687500,144,1740.6593017578,,, +9.0449218750,144,1753.8461914062,,, +9.0468750000,144,1765.5677490234,,, +9.0488281250,144,1776.5567626953,,, +9.0507812500,144,1785.3480224609,,, +9.0527343750,144,1794.8718261719,,, +9.0546875000,144,1802.1977539062,,, +9.0566406250,144,1808.7912597656,,, +9.0585937500,144,1814.6519775391,,, +9.0605468750,144,1820.5128173828,,, +9.0625000000,145,1824.1757812500,,, +9.0644531250,145,1827.8388671875,,, +9.0664062500,145,1831.5018310547,,, +9.0683593750,145,1834.4322509766,,, +9.0703125000,145,1836.6300048828,,, +9.0722656250,145,1838.8278808594,,, +9.0742187500,145,1840.2930908203,,, +9.0761718750,145,1841.0256347656,,, +9.0781250000,145,1839.5604248047,,, +9.0800781250,145,1838.0952148438,,, +9.0820312500,145,1835.8974609375,,, +9.0839843750,145,1831.5018310547,,, +9.0859375000,145,1827.1062011719,,, +9.0878906250,145,1821.2453613281,,, +9.0898437500,145,1814.6519775391,,, +9.0917968750,145,1807.3260498047,,, +9.0937500000,145,1800.0000000000,,, +9.0957031250,145,1792.6739501953,,, +9.0976562500,145,1784.6153564453,,, +9.0996093750,145,1775.8242187500,,, +9.1015625000,145,1767.7656250000,,, +9.1035156250,145,1758.2416992188,,, +9.1054687500,145,1748.7178955078,,, +9.1074218750,145,1739.9267578125,,, +9.1093750000,145,1729.6702880859,,, +9.1113281250,145,1720.1464843750,,, +9.1132812500,145,1709.8901367188,,, +9.1152343750,145,1698.9011230469,,, +9.1171875000,145,1688.6446533203,,, +9.1191406250,145,1677.6556396484,,, +9.1210937500,145,1668.1318359375,,, +9.1230468750,145,1657.1428222656,,, +9.1250000000,146,1646.8864746094,,, +9.1269531250,146,1635.1647949219,,, +9.1289062500,146,1624.9084472656,,, +9.1308593750,146,1614.6519775391,,, +9.1328125000,146,1603.6629638672,,, +9.1347656250,146,1592.6739501953,,, +9.1367187500,146,1582.4176025391,,, +9.1386718750,146,1569.9633789062,,, +9.1406250000,146,1558.2416992188,,, +9.1425781250,146,1546.5201416016,,, +9.1445312500,146,1535.5311279297,,, +9.1464843750,146,1524.5421142578,,, +9.1484375000,146,1514.2857666016,,, +9.1503906250,146,1504.0292968750,,, +9.1523437500,146,1494.5054931641,,, +9.1542968750,146,1484.9816894531,,, +9.1562500000,146,1476.9230957031,,, +9.1582031250,146,1467.3992919922,,, +9.1601562500,146,1459.3406982422,,, +9.1621093750,146,1452.0146484375,,, +9.1640625000,146,1443.9560546875,,, +9.1660156250,146,1437.3626708984,,, +9.1679687500,146,1430.7692871094,,, +9.1699218750,146,1424.1757812500,,, +9.1718750000,146,1418.3150634766,,, +9.1738281250,146,1412.4542236328,,, +9.1757812500,146,1406.5933837891,,, +9.1777343750,146,1401.4652099609,,, +9.1796875000,146,1397.0695800781,,, +9.1816406250,146,1388.2784423828,,, +9.1835937500,146,1384.6153564453,,, +9.1855468750,146,1380.2197265625,,, +9.1875000000,147,1375.0915527344,,, +9.1894531250,147,1370.6959228516,,, +9.1914062500,147,1366.3004150391,,, +9.1933593750,147,1362.6373291016,,, +9.1953125000,147,1357.5091552734,,, +9.1972656250,147,1353.1135253906,,, +9.1992187500,147,1349.4505615234,,, +9.2011718750,147,1346.5201416016,,, +9.2031250000,147,1342.8571777344,,, +9.2050781250,147,1339.1940917969,,, +9.2070312500,147,1336.9963378906,,, +9.2089843750,147,1333.3333740234,,, +9.2109375000,147,1331.1354980469,,, +9.2128906250,147,1328.9377441406,,, +9.2148437500,147,1326.7398681641,,, +9.2167968750,147,1324.5421142578,,, +9.2187500000,147,1323.0769042969,,, +9.2207031250,147,1323.0769042969,,, +9.2226562500,147,1322.3443603516,,, +9.2246093750,147,1323.0769042969,,, +9.2265625000,147,1321.6116943359,,, +9.2285156250,147,1320.8791503906,,, +9.2304687500,147,1320.1464843750,,, +9.2324218750,147,1319.4139404297,,, +9.2343750000,147,1317.9487304688,,, +9.2363281250,147,1315.7509765625,,, +9.2382812500,147,1314.2857666016,,, +9.2402343750,147,1312.8205566406,,, +9.2421875000,147,1311.3553466797,,, +9.2441406250,147,1310.6226806641,,, +9.2460937500,147,1309.8901367188,,, +9.2480468750,147,1310.6226806641,,, +9.2500000000,148,1309.8901367188,,, +9.2519531250,148,1311.3553466797,,, +9.2539062500,148,1312.0878906250,,, +9.2558593750,148,1312.8205566406,,, +9.2578125000,148,1313.5531005859,,, +9.2597656250,148,1315.0183105469,,, +9.2617187500,148,1316.4835205078,,, +9.2636718750,148,1317.9487304688,,, +9.2656250000,148,1320.8791503906,,, +9.2675781250,148,1323.8095703125,,, +9.2695312500,148,1326.0073242188,,, +9.2714843750,148,1328.2050781250,,, +9.2734375000,148,1328.9377441406,,, +9.2753906250,148,1329.6702880859,,, +9.2773437500,148,1329.6702880859,,, +9.2792968750,148,1330.4029541016,,, +9.2812500000,148,1333.3333740234,,, +9.2832031250,148,1334.7985839844,,, +9.2851562500,148,1336.9963378906,,, +9.2871093750,148,1340.6593017578,,, +9.2890625000,148,1343.5897216797,,, +9.2910156250,148,1344.3223876953,,, +9.2929687500,148,1345.0549316406,,, +9.2949218750,148,1346.5201416016,,, +9.2968750000,148,1347.9853515625,,, +9.2988281250,148,1348.7178955078,,, +9.3007812500,148,1350.1831054688,,, +9.3027343750,148,1351.6483154297,,, +9.3046875000,148,1353.8461914062,,, +9.3066406250,148,1355.3114013672,,, +9.3085937500,148,1357.5091552734,,, +9.3105468750,148,1360.4395751953,,, +9.3125000000,149,1363.3699951172,,, +9.3144531250,149,1366.3004150391,,, +9.3164062500,149,1368.4981689453,,, +9.3183593750,149,1371.4285888672,,, +9.3203125000,149,1373.6263427734,,, +9.3222656250,149,1375.8242187500,,, +9.3242187500,149,1376.5567626953,,, +9.3261718750,149,1375.8242187500,,, +9.3281250000,149,1375.8242187500,,, +9.3300781250,149,1374.3590087891,,, +9.3320312500,149,1373.6263427734,,, +9.3339843750,149,1373.6263427734,,, +9.3359375000,149,1374.3590087891,,, +9.3378906250,149,1375.8242187500,,, +9.3398437500,149,1375.0915527344,,, +9.3417968750,149,1372.8937988281,,, +9.3437500000,149,1372.1611328125,,, +9.3457031250,149,1371.4285888672,,, +9.3476562500,149,1370.6959228516,,, +9.3496093750,149,1372.1611328125,,, +9.3515625000,149,1372.8937988281,,, +9.3535156250,149,1372.8937988281,,, +9.3554687500,149,1371.4285888672,,, +9.3574218750,149,1370.6959228516,,, +9.3593750000,149,1369.9633789062,,, +9.3613281250,149,1369.2307128906,,, +9.3632812500,149,1369.9633789062,,, +9.3652343750,149,1370.6959228516,,, +9.3671875000,149,1371.4285888672,,, +9.3691406250,149,1369.2307128906,,, +9.3710937500,149,1367.7656250000,,, +9.3730468750,149,1365.5677490234,,, +9.3750000000,150,1363.3699951172,,, +9.3769531250,150,1362.6373291016,,, +9.3789062500,150,1361.9047851562,,, +9.3808593750,150,1361.1721191406,,, +9.3828125000,150,1358.9743652344,,, +9.3847656250,150,1356.0439453125,,, +9.3867187500,150,1353.1135253906,,, +9.3886718750,150,1350.9157714844,,, +9.3906250000,150,1348.7178955078,,, +9.3925781250,150,1347.9853515625,,, +9.3945312500,150,1347.2528076172,,, +9.3964843750,150,1346.5201416016,,, +9.3984375000,150,1345.0549316406,,, +9.4003906250,150,1342.1245117188,,, +9.4023437500,150,1339.9267578125,,, +9.4042968750,150,1336.9963378906,,, +9.4062500000,150,1335.5311279297,,, +9.4082031250,150,1334.7985839844,,, +9.4101562500,150,1334.0659179688,,, +9.4121093750,150,1333.3333740234,,, +9.4140625000,150,1331.1354980469,,, +9.4160156250,150,1328.9377441406,,, +9.4179687500,150,1326.7398681641,,, +9.4199218750,150,1323.8095703125,,, +9.4218750000,150,1322.3443603516,,, +9.4238281250,150,1320.1464843750,,, +9.4257812500,150,1319.4139404297,,, +9.4277343750,150,1318.6812744141,,, +9.4296875000,150,1316.4835205078,,, +9.4316406250,150,1314.2857666016,,, +9.4335937500,150,1310.6226806641,,, +9.4355468750,150,1309.1574707031,,, +9.4375000000,151,1308.4249267578,,, +9.4394531250,151,1306.9597167969,,, +9.4414062500,151,1306.2270507812,,, +9.4433593750,151,1303.2967529297,,, +9.4453125000,151,1301.0988769531,,, +9.4472656250,151,1296.7032470703,,, +9.4492187500,151,1295.2380371094,,, +9.4511718750,151,1292.3077392578,,, +9.4531250000,151,1291.5750732422,,, +9.4550781250,151,1290.8425292969,,, +9.4570312500,151,1289.3773193359,,, +9.4589843750,151,1287.1794433594,,, +9.4609375000,151,1283.5164794922,,, +9.4628906250,151,1282.7839355469,,, +9.4648437500,151,1279.8535156250,,, +9.4667968750,151,1278.3883056641,,, +9.4687500000,151,1276.1904296875,,, +9.4707031250,151,1275.4578857422,,, +9.4726562500,151,1276.1904296875,,, +9.4746093750,151,1274.7252197266,,, +9.4765625000,151,1273.9926757812,,, +9.4785156250,151,1271.7949218750,,, +9.4804687500,151,1270.3297119141,,, +9.4824218750,151,1268.1318359375,,, +9.4843750000,151,1267.3992919922,,, +9.4863281250,151,1266.6666259766,,, +9.4882812500,151,1268.8645019531,,, +9.4902343750,151,1269.5970458984,,, +9.4921875000,151,1269.5970458984,,, +9.4941406250,151,1269.5970458984,,, +9.4960937500,151,1268.8645019531,,, +9.4980468750,151,1268.8645019531,,, +9.5000000000,152,1270.3297119141,,, +9.5019531250,152,1271.7949218750,,, +9.5039062500,152,1274.7252197266,,, +9.5058593750,152,1276.1904296875,,, +9.5078125000,152,1276.9230957031,,, +9.5097656250,152,1276.1904296875,,, +9.5117187500,152,1277.6556396484,,, +9.5136718750,152,1278.3883056641,,, +9.5156250000,152,1278.3883056641,,, +9.5175781250,152,1279.8535156250,,, +9.5195312500,152,1280.5860595703,,, +9.5214843750,152,1283.5164794922,,, +9.5234375000,152,1284.9816894531,,, +9.5253906250,152,1287.9121093750,,, +9.5273437500,152,1290.1098632812,,, +9.5292968750,152,1292.3077392578,,, +9.5312500000,152,1294.5054931641,,, +9.5332031250,152,1298.1684570312,,, +9.5351562500,152,1300.3663330078,,, +9.5371093750,152,1301.8315429688,,, +9.5390625000,152,1302.5640869141,,, +9.5410156250,152,1303.2967529297,,, +9.5429687500,152,1304.7619628906,,, +9.5449218750,152,1304.0292968750,,, +9.5468750000,152,1304.7619628906,,, +9.5488281250,152,1304.7619628906,,, +9.5507812500,152,1304.0292968750,,, +9.5527343750,152,1304.0292968750,,, +9.5546875000,152,1304.7619628906,,, +9.5566406250,152,1305.4945068359,,, +9.5585937500,152,1306.9597167969,,, +9.5605468750,152,1306.9597167969,,, +9.5625000000,153,1307.6922607422,,, +9.5644531250,153,1308.4249267578,,, +9.5664062500,153,1311.3553466797,,, +9.5683593750,153,1312.8205566406,,, +9.5703125000,153,1314.2857666016,,, +9.5722656250,153,1315.7509765625,,, +9.5742187500,153,1315.7509765625,,, +9.5761718750,153,1315.0183105469,,, +9.5781250000,153,1314.2857666016,,, +9.5800781250,153,1314.2857666016,,, +9.5820312500,153,1313.5531005859,,, +9.5839843750,153,1312.8205566406,,, +9.5859375000,153,1313.5531005859,,, +9.5878906250,153,1314.2857666016,,, +9.5898437500,153,1315.7509765625,,, +9.5917968750,153,1316.4835205078,,, +9.5937500000,153,1317.2160644531,,, +9.5957031250,153,1316.4835205078,,, +9.5976562500,153,1314.2857666016,,, +9.5996093750,153,1312.0878906250,,, +9.6015625000,153,1309.8901367188,,, +9.6035156250,153,1308.4249267578,,, +9.6054687500,153,1306.2270507812,,, +9.6074218750,153,1304.7619628906,,, +9.6093750000,153,1304.0292968750,,, +9.6113281250,153,1302.5640869141,,, +9.6132812500,153,1301.0988769531,,, +9.6152343750,153,1299.6336669922,,, +9.6171875000,153,1299.6336669922,,, +9.6191406250,153,1300.3663330078,,, +9.6210937500,153,1301.0988769531,,, +9.6230468750,153,1301.0988769531,,, +9.6250000000,154,1301.0988769531,,, +9.6269531250,154,1300.3663330078,,, +9.6289062500,154,1299.6336669922,,, +9.6308593750,154,1298.1684570312,,, +9.6328125000,154,1297.4359130859,,, +9.6347656250,154,1296.7032470703,,, +9.6367187500,154,1297.4359130859,,, +9.6386718750,154,1298.1684570312,,, +9.6406250000,154,1298.9011230469,,, +9.6425781250,154,1301.0988769531,,, +9.6445312500,154,1303.2967529297,,, +9.6464843750,154,1305.4945068359,,, +9.6484375000,154,1306.9597167969,,, +9.6503906250,154,1306.2270507812,,, +9.6523437500,154,1306.9597167969,,, +9.6542968750,154,1306.9597167969,,, +9.6562500000,154,1309.8901367188,,, +9.6582031250,154,1310.6226806641,,, +9.6601562500,154,1310.6226806641,,, +9.6621093750,154,1311.3553466797,,, +9.6640625000,154,1311.3553466797,,, +9.6660156250,154,1312.0878906250,,, +9.6679687500,154,1312.8205566406,,, +9.6699218750,154,1314.2857666016,,, +9.6718750000,154,1312.8205566406,,, +9.6738281250,154,1312.8205566406,,, +9.6757812500,154,1312.8205566406,,, +9.6777343750,154,1313.5531005859,,, +9.6796875000,154,1314.2857666016,,, +9.6816406250,154,1312.8205566406,,, +9.6835937500,154,1312.0878906250,,, +9.6855468750,154,1312.0878906250,,, +9.6875000000,155,1312.8205566406,,, +9.6894531250,155,1312.8205566406,,, +9.6914062500,155,1312.0878906250,,, +9.6933593750,155,1312.0878906250,,, +9.6953125000,155,1312.8205566406,,, +9.6972656250,155,1314.2857666016,,, +9.6992187500,155,1314.2857666016,,, +9.7011718750,155,1312.8205566406,,, +9.7031250000,155,1312.8205566406,,, +9.7050781250,155,1312.8205566406,,, +9.7070312500,155,1314.2857666016,,, +9.7089843750,155,1312.8205566406,,, +9.7109375000,155,1312.0878906250,,, +9.7128906250,155,1312.0878906250,,, +9.7148437500,155,1312.0878906250,,, +9.7167968750,155,1312.0878906250,,, +9.7187500000,155,1311.3553466797,,, +9.7207031250,155,1309.8901367188,,, +9.7226562500,155,1310.6226806641,,, +9.7246093750,155,1311.3553466797,,, +9.7265625000,155,1309.8901367188,,, +9.7285156250,155,1307.6922607422,,, +9.7304687500,155,1308.4249267578,,, +9.7324218750,155,1309.1574707031,,, +9.7343750000,155,1309.8901367188,,, +9.7363281250,155,1307.6922607422,,, +9.7382812500,155,1306.9597167969,,, +9.7402343750,155,1306.9597167969,,, +9.7421875000,155,1307.6922607422,,, +9.7441406250,155,1306.9597167969,,, +9.7460937500,155,1305.4945068359,,, +9.7480468750,155,1304.0292968750,,, +9.7500000000,156,1303.2967529297,,, +9.7519531250,156,1303.2967529297,,, +9.7539062500,156,1303.2967529297,,, +9.7558593750,156,1303.2967529297,,, +9.7578125000,156,1302.5640869141,,, +9.7597656250,156,1302.5640869141,,, +9.7617187500,156,1304.0292968750,,, +9.7636718750,156,1305.4945068359,,, +9.7656250000,156,1304.7619628906,,, +9.7675781250,156,1303.2967529297,,, +9.7695312500,156,1304.0292968750,,, +9.7714843750,156,1304.0292968750,,, +9.7734375000,156,1304.7619628906,,, +9.7753906250,156,1303.2967529297,,, +9.7773437500,156,1302.5640869141,,, +9.7792968750,156,1302.5640869141,,, +9.7812500000,156,1303.2967529297,,, +9.7832031250,156,1304.7619628906,,, +9.7851562500,156,1304.0292968750,,, +9.7871093750,156,1303.2967529297,,, +9.7890625000,156,1303.2967529297,,, +9.7910156250,156,1304.7619628906,,, +9.7929687500,156,1304.7619628906,,, +9.7949218750,156,1303.2967529297,,, +9.7968750000,156,1303.2967529297,,, +9.7988281250,156,1302.5640869141,,, +9.8007812500,156,1303.2967529297,,, +9.8027343750,156,1304.0292968750,,, +9.8046875000,156,1303.2967529297,,, +9.8066406250,156,1301.8315429688,,, +9.8085937500,156,1301.8315429688,,, +9.8105468750,156,1302.5640869141,,, +9.8125000000,157,1302.5640869141,,, +9.8144531250,157,1301.0988769531,,, +9.8164062500,157,1299.6336669922,,, +9.8183593750,157,1299.6336669922,,, +9.8203125000,157,1299.6336669922,,, +9.8222656250,157,1298.9011230469,,, +9.8242187500,157,1298.1684570312,,, +9.8261718750,157,1298.1684570312,,, +9.8281250000,157,1298.1684570312,,, +9.8300781250,157,1298.9011230469,,, +9.8320312500,157,1297.4359130859,,, +9.8339843750,157,1297.4359130859,,, +9.8359375000,157,1296.7032470703,,, +9.8378906250,157,1297.4359130859,,, +9.8398437500,157,1298.1684570312,,, +9.8417968750,157,1295.9707031250,,, +9.8437500000,157,1295.2380371094,,, +9.8457031250,157,1294.5054931641,,, +9.8476562500,157,1294.5054931641,,, +9.8496093750,157,1295.9707031250,,, +9.8515625000,157,1295.2380371094,,, +9.8535156250,157,1295.2380371094,,, +9.8554687500,157,1294.5054931641,,, +9.8574218750,157,1295.2380371094,,, +9.8593750000,157,1297.4359130859,,, +9.8613281250,157,1296.7032470703,,, +9.8632812500,157,1297.4359130859,,, +9.8652343750,157,1298.9011230469,,, +9.8671875000,157,1301.8315429688,,, +9.8691406250,157,1304.0292968750,,, +9.8710937500,157,1306.2270507812,,, +9.8730468750,157,1309.1574707031,,, +9.8750000000,158,1311.3553466797,,, +9.8769531250,158,1315.7509765625,,, +9.8789062500,158,1320.8791503906,,, +9.8808593750,158,1325.2747802734,,, +9.8828125000,158,1329.6702880859,,, +9.8847656250,158,1335.5311279297,,, +9.8867187500,158,1341.3919677734,,, +9.8886718750,158,1350.1831054688,,, +9.8906250000,158,1357.5091552734,,, +9.8925781250,158,1363.3699951172,,, +9.8945312500,158,1370.6959228516,,, +9.8964843750,158,1378.7546386719,,, +9.8984375000,158,1389.7435302734,,, +9.9003906250,158,1399.2674560547,,, +9.9023437500,158,1409.5238037109,,, +9.9042968750,158,1419.7802734375,,, +9.9062500000,158,1431.5018310547,,, +9.9082031250,158,1444.6885986328,,, +9.9101562500,158,1459.3406982422,,, +9.9121093750,158,1472.5274658203,,, +9.9140625000,158,1486.4468994141,,, +9.9160156250,158,1500.3663330078,,, +9.9179687500,158,1516.4835205078,,, +9.9199218750,158,1531.8681640625,,, +9.9218750000,158,1545.7875976562,,, +9.9238281250,158,1559.7069091797,,, +9.9257812500,158,1574.3590087891,,, +9.9277343750,158,1589.7435302734,,, +9.9296875000,158,1605.8608398438,,, +9.9316406250,158,1621.9780273438,,, +9.9335937500,158,1635.1647949219,,, +9.9355468750,158,1649.0842285156,,, +9.9375000000,159,1662.2711181641,,, +9.9394531250,159,1676.9230957031,,, +9.9414062500,159,1690.8425292969,,, +9.9433593750,159,1705.4945068359,,, +9.9453125000,159,1719.4139404297,,, +9.9472656250,159,1731.8681640625,,, +9.9492187500,159,1742.8571777344,,, +9.9511718750,159,1752.3809814453,,, +9.9531250000,159,1763.3699951172,,, +9.9550781250,159,1773.6263427734,,, +9.9570312500,159,1784.6153564453,,, +9.9589843750,159,1793.4066162109,,, +9.9609375000,159,1800.0000000000,,, +9.9628906250,159,1805.1281738281,,, +9.9648437500,159,1810.2564697266,,, +9.9667968750,159,1815.3846435547,,, +9.9687500000,159,1819.0476074219,,, +9.9707031250,159,1822.7105712891,,, +9.9726562500,159,1826.3736572266,,, +9.9746093750,159,1829.3040771484,,, +9.9765625000,159,1830.7692871094,,, +9.9785156250,159,1832.9670410156,,, +9.9804687500,159,1831.5018310547,,, +9.9824218750,159,1830.0366210938,,, +9.9843750000,159,1827.1062011719,,, +9.9863281250,159,1824.1757812500,,, +9.9882812500,159,1821.9780273438,,, +9.9902343750,159,1819.0476074219,,, +9.9921875000,159,1815.3846435547,,, +9.9941406250,159,1808.7912597656,,, +9.9960937500,159,1802.1977539062,,, +9.9980468750,159,1794.8718261719,,, +10.0000000000,160,1789.0109863281,,, +10.0019531250,160,1782.4176025391,,, +10.0039062500,160,1772.8937988281,,, +10.0058593750,160,1763.3699951172,,, +10.0078125000,160,1753.8461914062,,, +10.0097656250,160,1745.0549316406,,, +10.0117187500,160,1736.2637939453,,, +10.0136718750,160,1724.5421142578,,, +10.0156250000,160,1713.5531005859,,, +10.0175781250,160,1704.0292968750,,, +10.0195312500,160,1694.5054931641,,, +10.0214843750,160,1684.2490234375,,, +10.0234375000,160,1673.2601318359,,, +10.0253906250,160,1663.0036621094,,, +10.0273437500,160,1653.4798583984,,, +10.0292968750,160,1643.9560546875,,, +10.0312500000,160,1632.2343750000,,, +10.0332031250,160,1621.9780273438,,, +10.0351562500,160,1610.9890136719,,, +10.0371093750,160,1600.0000000000,,, +10.0390625000,160,1590.4761962891,,, +10.0410156250,160,1578.7546386719,,, +10.0429687500,160,1567.7656250000,,, +10.0449218750,160,1556.0439453125,,, +10.0468750000,160,1546.5201416016,,, +10.0488281250,160,1536.9963378906,,, +10.0507812500,160,1525.2747802734,,, +10.0527343750,160,1513.5531005859,,, +10.0546875000,160,1502.5640869141,,, +10.0566406250,160,1492.3077392578,,, +10.0585937500,160,1482.7839355469,,, +10.0605468750,160,1473.2601318359,,, +10.0625000000,161,1463.0036621094,,, +10.0644531250,161,1454.2124023438,,, +10.0664062500,161,1445.4212646484,,, +10.0683593750,161,1438.8278808594,,, +10.0703125000,161,1429.3040771484,,, +10.0722656250,161,1421.2453613281,,, +10.0742187500,161,1413.9194335938,,, +10.0761718750,161,1408.7912597656,,, +10.0781250000,161,1402.1977539062,,, +10.0800781250,161,1394.1391601562,,, +10.0820312500,161,1389.0109863281,,, +10.0839843750,161,1382.4176025391,,, +10.0859375000,161,1378.0219726562,,, +10.0878906250,161,1374.3590087891,,, +10.0898437500,161,1369.2307128906,,, +10.0917968750,161,1364.1025390625,,, +10.0937500000,161,1358.2416992188,,, +10.0957031250,161,1355.3114013672,,, +10.0976562500,161,1353.1135253906,,, +10.0996093750,161,1348.7178955078,,, +10.1015625000,161,1345.0549316406,,, +10.1035156250,161,1340.6593017578,,, +10.1054687500,161,1337.7288818359,,, +10.1074218750,161,1334.7985839844,,, +10.1093750000,161,1330.4029541016,,, +10.1113281250,161,1325.2747802734,,, +10.1132812500,161,1322.3443603516,,, +10.1152343750,161,1319.4139404297,,, +10.1171875000,161,1316.4835205078,,, +10.1191406250,161,1312.0878906250,,, +10.1210937500,161,1307.6922607422,,, +10.1230468750,161,1304.0292968750,,, +10.1250000000,162,1302.5640869141,,, +10.1269531250,162,1301.0988769531,,, +10.1289062500,162,1297.4359130859,,, +10.1308593750,162,1294.5054931641,,, +10.1328125000,162,1292.3077392578,,, +10.1347656250,162,1290.8425292969,,, +10.1367187500,162,1289.3773193359,,, +10.1386718750,162,1287.1794433594,,, +10.1406250000,162,1285.7142333984,,, +10.1425781250,162,1284.2490234375,,, +10.1445312500,162,1284.2490234375,,, +10.1464843750,162,1284.2490234375,,, +10.1484375000,162,1283.5164794922,,, +10.1503906250,162,1282.7839355469,,, +10.1523437500,162,1282.7839355469,,, +10.1542968750,162,1283.5164794922,,, +10.1562500000,162,1284.2490234375,,, +10.1582031250,162,1284.2490234375,,, +10.1601562500,162,1284.9816894531,,, +10.1621093750,162,1285.7142333984,,, +10.1640625000,162,1288.6446533203,,, +10.1660156250,162,1289.3773193359,,, +10.1679687500,162,1290.8425292969,,, +10.1699218750,162,1291.5750732422,,, +10.1718750000,162,1294.5054931641,,, +10.1738281250,162,1298.1684570312,,, +10.1757812500,162,1299.6336669922,,, +10.1777343750,162,1301.0988769531,,, +10.1796875000,162,1302.5640869141,,, +10.1816406250,162,1305.4945068359,,, +10.1835937500,162,1308.4249267578,,, +10.1855468750,162,1310.6226806641,,, +10.1875000000,163,1312.0878906250,,, +10.1894531250,163,1312.8205566406,,, +10.1914062500,163,1315.7509765625,,, +10.1933593750,163,1319.4139404297,,, +10.1953125000,163,1321.6116943359,,, +10.1972656250,163,1323.0769042969,,, +10.1992187500,163,1324.5421142578,,, +10.2011718750,163,1326.7398681641,,, +10.2031250000,163,1330.4029541016,,, +10.2050781250,163,1332.6007080078,,, +10.2070312500,163,1334.0659179688,,, +10.2089843750,163,1336.2637939453,,, +10.2109375000,163,1337.7288818359,,, +10.2128906250,163,1340.6593017578,,, +10.2148437500,163,1341.3919677734,,, +10.2167968750,163,1342.1245117188,,, +10.2187500000,163,1343.5897216797,,, +10.2207031250,163,1345.7875976562,,, +10.2226562500,163,1348.7178955078,,, +10.2246093750,163,1349.4505615234,,, +10.2265625000,163,1350.1831054688,,, +10.2285156250,163,1350.9157714844,,, +10.2304687500,163,1353.8461914062,,, +10.2324218750,163,1356.7766113281,,, +10.2343750000,163,1356.7766113281,,, +10.2363281250,163,1356.0439453125,,, +10.2382812500,163,1356.0439453125,,, +10.2402343750,163,1356.7766113281,,, +10.2421875000,163,1357.5091552734,,, +10.2441406250,163,1356.7766113281,,, +10.2460937500,163,1355.3114013672,,, +10.2480468750,163,1356.0439453125,,, +10.2500000000,164,1356.7766113281,,, +10.2519531250,164,1358.2416992188,,, +10.2539062500,164,1356.7766113281,,, +10.2558593750,164,1355.3114013672,,, +10.2578125000,164,1355.3114013672,,, +10.2597656250,164,1355.3114013672,,, +10.2617187500,164,1355.3114013672,,, +10.2636718750,164,1353.8461914062,,, +10.2656250000,164,1353.8461914062,,, +10.2675781250,164,1355.3114013672,,, +10.2695312500,164,1354.5787353516,,, +10.2714843750,164,1353.8461914062,,, +10.2734375000,164,1351.6483154297,,, +10.2753906250,164,1353.1135253906,,, +10.2773437500,164,1352.3809814453,,, +10.2792968750,164,1350.9157714844,,, +10.2812500000,164,1349.4505615234,,, +10.2832031250,164,1350.1831054688,,, +10.2851562500,164,1349.4505615234,,, +10.2871093750,164,1347.9853515625,,, +10.2890625000,164,1347.2528076172,,, +10.2910156250,164,1345.7875976562,,, +10.2929687500,164,1345.0549316406,,, +10.2949218750,164,1343.5897216797,,, +10.2968750000,164,1342.1245117188,,, +10.2988281250,164,1340.6593017578,,, +10.3007812500,164,1339.1940917969,,, +10.3027343750,164,1339.1940917969,,, +10.3046875000,164,1336.9963378906,,, +10.3066406250,164,1334.7985839844,,, +10.3085937500,164,1332.6007080078,,, +10.3105468750,164,1332.6007080078,,, +10.3125000000,165,1331.1354980469,,, +10.3144531250,165,1328.2050781250,,, +10.3164062500,165,1326.0073242188,,, +10.3183593750,165,1325.2747802734,,, +10.3203125000,165,1324.5421142578,,, +10.3222656250,165,1320.8791503906,,, +10.3242187500,165,1318.6812744141,,, +10.3261718750,165,1318.6812744141,,, +10.3281250000,165,1317.2160644531,,, +10.3300781250,165,1315.0183105469,,, +10.3320312500,165,1312.0878906250,,, +10.3339843750,165,1310.6226806641,,, +10.3359375000,165,1309.8901367188,,, +10.3378906250,165,1307.6922607422,,, +10.3398437500,165,1305.4945068359,,, +10.3417968750,165,1303.2967529297,,, +10.3437500000,165,1302.5640869141,,, +10.3457031250,165,1302.5640869141,,, +10.3476562500,165,1300.3663330078,,, +10.3496093750,165,1297.4359130859,,, +10.3515625000,165,1296.7032470703,,, +10.3535156250,165,1297.4359130859,,, +10.3554687500,165,1296.7032470703,,, +10.3574218750,165,1293.7729492188,,, +10.3593750000,165,1292.3077392578,,, +10.3613281250,165,1290.8425292969,,, +10.3632812500,165,1290.1098632812,,, +10.3652343750,165,1288.6446533203,,, +10.3671875000,165,1285.7142333984,,, +10.3691406250,165,1284.2490234375,,, +10.3710937500,165,1282.7839355469,,, +10.3730468750,165,1283.5164794922,,, +10.3750000000,166,1281.3187255859,,, +10.3769531250,166,1279.8535156250,,, +10.3789062500,166,1278.3883056641,,, +10.3808593750,166,1279.1208496094,,, +10.3828125000,166,1279.8535156250,,, +10.3847656250,166,1278.3883056641,,, +10.3867187500,166,1277.6556396484,,, +10.3886718750,166,1277.6556396484,,, +10.3906250000,166,1279.1208496094,,, +10.3925781250,166,1279.1208496094,,, +10.3945312500,166,1279.1208496094,,, +10.3964843750,166,1277.6556396484,,, +10.3984375000,166,1278.3883056641,,, +10.4003906250,166,1279.8535156250,,, +10.4023437500,166,1280.5860595703,,, +10.4042968750,166,1279.8535156250,,, +10.4062500000,166,1279.8535156250,,, +10.4082031250,166,1280.5860595703,,, +10.4101562500,166,1282.7839355469,,, +10.4121093750,166,1282.7839355469,,, +10.4140625000,166,1282.0512695312,,, +10.4160156250,166,1282.7839355469,,, +10.4179687500,166,1285.7142333984,,, +10.4199218750,166,1287.1794433594,,, +10.4218750000,166,1287.9121093750,,, +10.4238281250,166,1288.6446533203,,, +10.4257812500,166,1289.3773193359,,, +10.4277343750,166,1290.8425292969,,, +10.4296875000,166,1291.5750732422,,, +10.4316406250,166,1291.5750732422,,, +10.4335937500,166,1291.5750732422,,, +10.4355468750,166,1293.0402832031,,, +10.4375000000,167,1294.5054931641,,, +10.4394531250,167,1294.5054931641,,, +10.4414062500,167,1295.2380371094,,, +10.4433593750,167,1296.7032470703,,, +10.4453125000,167,1298.1684570312,,, +10.4472656250,167,1298.1684570312,,, +10.4492187500,167,1299.6336669922,,, +10.4511718750,167,1299.6336669922,,, +10.4531250000,167,1303.2967529297,,, +10.4550781250,167,1304.7619628906,,, +10.4570312500,167,1304.7619628906,,, +10.4589843750,167,1305.4945068359,,, +10.4609375000,167,1305.4945068359,,, +10.4628906250,167,1307.6922607422,,, +10.4648437500,167,1307.6922607422,,, +10.4667968750,167,1308.4249267578,,, +10.4687500000,167,1309.8901367188,,, +10.4707031250,167,1309.8901367188,,, +10.4726562500,167,1309.1574707031,,, +10.4746093750,167,1309.1574707031,,, +10.4765625000,167,1312.0878906250,,, +10.4785156250,167,1312.0878906250,,, +10.4804687500,167,1311.3553466797,,, +10.4824218750,167,1310.6226806641,,, +10.4843750000,167,1311.3553466797,,, +10.4863281250,167,1312.8205566406,,, +10.4882812500,167,1312.0878906250,,, +10.4902343750,167,1311.3553466797,,, +10.4921875000,167,1312.0878906250,,, +10.4941406250,167,1314.2857666016,,, +10.4960937500,167,1312.8205566406,,, +10.4980468750,167,1312.8205566406,,, +10.5000000000,168,1312.8205566406,,, +10.5019531250,168,1314.2857666016,,, +10.5039062500,168,1312.8205566406,,, +10.5058593750,168,1312.8205566406,,, +10.5078125000,168,1313.5531005859,,, +10.5097656250,168,1315.0183105469,,, +10.5117187500,168,1315.0183105469,,, +10.5136718750,168,1313.5531005859,,, +10.5156250000,168,1313.5531005859,,, +10.5175781250,168,1314.2857666016,,, +10.5195312500,168,1314.2857666016,,, +10.5214843750,168,1313.5531005859,,, +10.5234375000,168,1313.5531005859,,, +10.5253906250,168,1314.2857666016,,, +10.5273437500,168,1313.5531005859,,, +10.5292968750,168,1313.5531005859,,, +10.5312500000,168,1315.0183105469,,, +10.5332031250,168,1315.7509765625,,, +10.5351562500,168,1314.2857666016,,, +10.5371093750,168,1314.2857666016,,, +10.5390625000,168,1316.4835205078,,, +10.5410156250,168,1316.4835205078,,, +10.5429687500,168,1316.4835205078,,, +10.5449218750,168,1317.9487304688,,, +10.5468750000,168,1320.1464843750,,, +10.5488281250,168,1320.1464843750,,, +10.5507812500,168,1319.4139404297,,, +10.5527343750,168,1321.6116943359,,, +10.5546875000,168,1321.6116943359,,, +10.5566406250,168,1320.1464843750,,, +10.5585937500,168,1320.8791503906,,, +10.5605468750,168,1321.6116943359,,, +10.5625000000,169,1320.8791503906,,, +10.5644531250,169,1320.1464843750,,, +10.5664062500,169,1317.9487304688,,, +10.5683593750,169,1317.9487304688,,, +10.5703125000,169,1318.6812744141,,, +10.5722656250,169,1317.2160644531,,, +10.5742187500,169,1316.4835205078,,, +10.5761718750,169,1315.7509765625,,, +10.5781250000,169,1315.0183105469,,, +10.5800781250,169,1315.7509765625,,, +10.5820312500,169,1314.2857666016,,, +10.5839843750,169,1313.5531005859,,, +10.5859375000,169,1313.5531005859,,, +10.5878906250,169,1314.2857666016,,, +10.5898437500,169,1312.8205566406,,, +10.5917968750,169,1311.3553466797,,, +10.5937500000,169,1311.3553466797,,, +10.5957031250,169,1312.8205566406,,, +10.5976562500,169,1312.0878906250,,, +10.5996093750,169,1311.3553466797,,, +10.6015625000,169,1310.6226806641,,, +10.6035156250,169,1311.3553466797,,, +10.6054687500,169,1311.3553466797,,, +10.6074218750,169,1311.3553466797,,, +10.6093750000,169,1309.8901367188,,, +10.6113281250,169,1309.8901367188,,, +10.6132812500,169,1311.3553466797,,, +10.6152343750,169,1311.3553466797,,, +10.6171875000,169,1310.6226806641,,, +10.6191406250,169,1310.6226806641,,, +10.6210937500,169,1311.3553466797,,, +10.6230468750,169,1312.0878906250,,, +10.6250000000,170,1312.0878906250,,, +10.6269531250,170,1311.3553466797,,, +10.6289062500,170,1311.3553466797,,, +10.6308593750,170,1312.0878906250,,, +10.6328125000,170,1312.0878906250,,, +10.6347656250,170,1312.0878906250,,, +10.6367187500,170,1312.0878906250,,, +10.6386718750,170,1311.3553466797,,, +10.6406250000,170,1313.5531005859,,, +10.6425781250,170,1314.2857666016,,, +10.6445312500,170,1312.8205566406,,, +10.6464843750,170,1312.0878906250,,, +10.6484375000,170,1311.3553466797,,, +10.6503906250,170,1312.8205566406,,, +10.6523437500,170,1312.8205566406,,, +10.6542968750,170,1312.0878906250,,, +10.6562500000,170,1310.6226806641,,, +10.6582031250,170,1310.6226806641,,, +10.6601562500,170,1311.3553466797,,, +10.6621093750,170,1310.6226806641,,, +10.6640625000,170,1309.8901367188,,, +10.6660156250,170,1309.8901367188,,, +10.6679687500,170,1311.3553466797,,, +10.6699218750,170,1311.3553466797,,, +10.6718750000,170,1311.3553466797,,, +10.6738281250,170,1310.6226806641,,, +10.6757812500,170,1312.8205566406,,, +10.6777343750,170,1310.6226806641,,, +10.6796875000,170,1309.8901367188,,, +10.6816406250,170,1311.3553466797,,, +10.6835937500,170,1311.3553466797,,, +10.6855468750,170,1309.1574707031,,, +10.6875000000,171,1309.1574707031,,, +10.6894531250,171,1309.1574707031,,, +10.6914062500,171,1309.1574707031,,, +10.6933593750,171,1307.6922607422,,, +10.6953125000,171,1305.4945068359,,, +10.6972656250,171,1304.7619628906,,, +10.6992187500,171,1304.7619628906,,, +10.7011718750,171,1302.5640869141,,, +10.7031250000,171,1301.0988769531,,, +10.7050781250,171,1299.6336669922,,, +10.7070312500,171,1299.6336669922,,, +10.7089843750,171,1298.1684570312,,, +10.7109375000,171,1296.7032470703,,, +10.7128906250,171,1295.2380371094,,, +10.7148437500,171,1296.7032470703,,, +10.7167968750,171,1295.9707031250,,, +10.7187500000,171,1294.5054931641,,, +10.7207031250,171,1293.7729492188,,, +10.7226562500,171,1295.2380371094,,, +10.7246093750,171,1294.5054931641,,, +10.7265625000,171,1293.0402832031,,, +10.7285156250,171,1292.3077392578,,, +10.7304687500,171,1293.0402832031,,, +10.7324218750,171,1294.5054931641,,, +10.7343750000,171,1293.0402832031,,, +10.7363281250,171,1292.3077392578,,, +10.7382812500,171,1293.0402832031,,, +10.7402343750,171,1293.7729492188,,, +10.7421875000,171,1293.7729492188,,, +10.7441406250,171,1293.7729492188,,, +10.7460937500,171,1293.7729492188,,, +10.7480468750,171,1295.2380371094,,, +10.7500000000,172,1294.5054931641,,, +10.7519531250,172,1293.7729492188,,, +10.7539062500,172,1293.7729492188,,, +10.7558593750,172,1294.5054931641,,, +10.7578125000,172,1294.5054931641,,, +10.7597656250,172,1293.0402832031,,, +10.7617187500,172,1292.3077392578,,, +10.7636718750,172,1293.0402832031,,, +10.7656250000,172,1293.7729492188,,, +10.7675781250,172,1293.0402832031,,, +10.7695312500,172,1292.3077392578,,, +10.7714843750,172,1293.7729492188,,, +10.7734375000,172,1295.2380371094,,, +10.7753906250,172,1295.9707031250,,, +10.7773437500,172,1296.7032470703,,, +10.7792968750,172,1298.9011230469,,, +10.7812500000,172,1302.5640869141,,, +10.7832031250,172,1303.2967529297,,, +10.7851562500,172,1305.4945068359,,, +10.7871093750,172,1309.1574707031,,, +10.7890625000,172,1312.8205566406,,, +10.7910156250,172,1316.4835205078,,, +10.7929687500,172,1320.8791503906,,, +10.7949218750,172,1326.7398681641,,, +10.7968750000,172,1333.3333740234,,, +10.7988281250,172,1338.4615478516,,, +10.8007812500,172,1345.0549316406,,, +10.8027343750,172,1345.0549316406,,, +10.8046875000,172,1353.1135253906,,, +10.8066406250,172,1362.6373291016,,, +10.8085937500,172,1370.6959228516,,, +10.8105468750,172,1379.4871826172,,, +10.8125000000,173,1389.7435302734,,, +10.8144531250,173,1400.7325439453,,, +10.8164062500,173,1410.9890136719,,, +10.8183593750,173,1421.9780273438,,, +10.8203125000,173,1433.6995849609,,, +10.8222656250,173,1447.6190185547,,, +10.8242187500,173,1460.8059082031,,, +10.8261718750,173,1473.9926757812,,, +10.8281250000,173,1488.6446533203,,, +10.8300781250,173,1504.0292968750,,, +10.8320312500,173,1517.9487304688,,, +10.8339843750,173,1531.8681640625,,, +10.8359375000,173,1547.9853515625,,, +10.8378906250,173,1564.1025390625,,, +10.8398437500,173,1578.7546386719,,, +10.8417968750,173,1593.4066162109,,, +10.8437500000,173,1609.5238037109,,, +10.8457031250,173,1624.9084472656,,, +10.8476562500,173,1638.0952148438,,, +10.8496093750,173,1652.0146484375,,, +10.8515625000,173,1666.6666259766,,, +10.8535156250,173,1681.3187255859,,, +10.8554687500,173,1692.3077392578,,, +10.8574218750,173,1704.7619628906,,, +10.8593750000,173,1717.2160644531,,, +10.8613281250,173,1729.6702880859,,, +10.8632812500,173,1739.1940917969,,, +10.8652343750,173,1749.4505615234,,, +10.8671875000,173,1759.7069091797,,, +10.8691406250,173,1769.2307128906,,, +10.8710937500,173,1776.5567626953,,, +10.8730468750,173,1782.4176025391,,, +10.8750000000,174,1790.4761962891,,, +10.8769531250,174,1797.0695800781,,, +10.8789062500,174,1801.4652099609,,, +10.8808593750,174,1806.5933837891,,, +10.8828125000,174,1810.2564697266,,, +10.8847656250,174,1815.3846435547,,, +10.8867187500,174,1816.8498535156,,, +10.8886718750,174,1817.5823974609,,, +10.8906250000,174,1818.3150634766,,, +10.8925781250,174,1819.7802734375,,, +10.8945312500,174,1818.3150634766,,, +10.8964843750,174,1815.3846435547,,, +10.8984375000,174,1813.9194335938,,, +10.9003906250,174,1811.7215576172,,, +10.9023437500,174,1807.3260498047,,, +10.9042968750,174,1802.1977539062,,, +10.9062500000,174,1797.0695800781,,, +10.9082031250,174,1793.4066162109,,, +10.9101562500,174,1786.8132324219,,, +10.9121093750,174,1779.4871826172,,, +10.9140625000,174,1772.1611328125,,, +10.9160156250,174,1767.0329589844,,, +10.9179687500,174,1758.2416992188,,, +10.9199218750,174,1748.7178955078,,, +10.9218750000,174,1739.1940917969,,, +10.9238281250,174,1731.1354980469,,, +10.9257812500,174,1721.6116943359,,, +10.9277343750,174,1709.8901367188,,, +10.9296875000,174,1698.1684570312,,, +10.9316406250,174,1687.1794433594,,, +10.9335937500,174,1676.1904296875,,, +10.9355468750,174,1664.4688720703,,, +10.9375000000,175,1651.2821044922,,, +10.9394531250,175,1640.2930908203,,, +10.9414062500,175,1629.3040771484,,, +10.9433593750,175,1616.8498535156,,, +10.9453125000,175,1603.6629638672,,, +10.9472656250,175,1593.4066162109,,, +10.9492187500,175,1583.1501464844,,, +10.9511718750,175,1570.6959228516,,, +10.9531250000,175,1558.2416992188,,, +10.9550781250,175,1546.5201416016,,, +10.9570312500,175,1535.5311279297,,, +10.9589843750,175,1524.5421142578,,, +10.9609375000,175,1512.8205566406,,, +10.9628906250,175,1501.8315429688,,, +10.9648437500,175,1490.8425292969,,, +10.9667968750,175,1481.3187255859,,, +10.9687500000,175,1470.3297119141,,, +10.9707031250,175,1460.0732421875,,, +10.9726562500,175,1452.0146484375,,, +10.9746093750,175,1443.2233886719,,, +10.9765625000,175,1433.6995849609,,, +10.9785156250,175,1424.1757812500,,, +10.9804687500,175,1416.1171875000,,, +10.9824218750,175,1408.7912597656,,, +10.9843750000,175,1400.0000000000,,, +10.9863281250,175,1391.9414062500,,, +10.9882812500,175,1386.0805664062,,, +10.9902343750,175,1380.2197265625,,, +10.9921875000,175,1372.1611328125,,, +10.9941406250,175,1366.3004150391,,, +10.9960937500,175,1360.4395751953,,, +10.9980468750,175,1355.3114013672,,, +11.0000000000,176,1349.4505615234,,, +11.0019531250,176,1344.3223876953,,, +11.0039062500,176,1339.9267578125,,, +11.0058593750,176,1336.2637939453,,, +11.0078125000,176,1331.8681640625,,, +11.0097656250,176,1326.7398681641,,, +11.0117187500,176,1324.5421142578,,, +11.0136718750,176,1320.1464843750,,, +11.0156250000,176,1317.2160644531,,, +11.0175781250,176,1314.2857666016,,, +11.0195312500,176,1312.8205566406,,, +11.0214843750,176,1309.8901367188,,, +11.0234375000,176,1306.9597167969,,, +11.0253906250,176,1304.0292968750,,, +11.0273437500,176,1302.5640869141,,, +11.0292968750,176,1301.0988769531,,, +11.0312500000,176,1298.1684570312,,, +11.0332031250,176,1294.5054931641,,, +11.0351562500,176,1293.0402832031,,, +11.0371093750,176,1293.0402832031,,, +11.0390625000,176,1290.1098632812,,, +11.0410156250,176,1289.3773193359,,, +11.0429687500,176,1288.6446533203,,, +11.0449218750,176,1288.6446533203,,, +11.0468750000,176,1286.4468994141,,, +11.0488281250,176,1284.9816894531,,, +11.0507812500,176,1284.2490234375,,, +11.0527343750,176,1282.7839355469,,, +11.0546875000,176,1282.0512695312,,, +11.0566406250,176,1282.0512695312,,, +11.0585937500,176,1282.7839355469,,, +11.0605468750,176,1282.7839355469,,, +11.0625000000,177,1280.5860595703,,, +11.0644531250,177,1282.0512695312,,, +11.0664062500,177,1284.2490234375,,, +11.0683593750,177,1284.9816894531,,, +11.0703125000,177,1285.7142333984,,, +11.0722656250,177,1286.4468994141,,, +11.0742187500,177,1289.3773193359,,, +11.0761718750,177,1290.1098632812,,, +11.0781250000,177,1291.5750732422,,, +11.0800781250,177,1292.3077392578,,, +11.0820312500,177,1295.2380371094,,, +11.0839843750,177,1295.9707031250,,, +11.0859375000,177,1295.9707031250,,, +11.0878906250,177,1298.9011230469,,, +11.0898437500,177,1301.0988769531,,, +11.0917968750,177,1303.2967529297,,, +11.0937500000,177,1304.0292968750,,, +11.0957031250,177,1307.6922607422,,, +11.0976562500,177,1311.3553466797,,, +11.0996093750,177,1312.8205566406,,, +11.1015625000,177,1315.7509765625,,, +11.1035156250,177,1319.4139404297,,, +11.1054687500,177,1323.0769042969,,, +11.1074218750,177,1326.7398681641,,, +11.1093750000,177,1329.6702880859,,, +11.1113281250,177,1334.7985839844,,, +11.1132812500,177,1337.7288818359,,, +11.1152343750,177,1337.7288818359,,, +11.1171875000,177,1339.9267578125,,, +11.1191406250,177,1343.5897216797,,, +11.1210937500,177,1347.9853515625,,, +11.1230468750,177,1351.6483154297,,, +11.1250000000,178,1355.3114013672,,, +11.1269531250,178,1356.7766113281,,, +11.1289062500,178,1359.7069091797,,, +11.1308593750,178,1362.6373291016,,, +11.1328125000,178,1366.3004150391,,, +11.1347656250,178,1368.4981689453,,, +11.1367187500,178,1369.2307128906,,, +11.1386718750,178,1371.4285888672,,, +11.1406250000,178,1374.3590087891,,, +11.1425781250,178,1377.2894287109,,, +11.1445312500,178,1378.7546386719,,, +11.1464843750,178,1379.4871826172,,, +11.1484375000,178,1380.9523925781,,, +11.1503906250,178,1382.4176025391,,, +11.1523437500,178,1385.3480224609,,, +11.1542968750,178,1385.3480224609,,, +11.1562500000,178,1384.6153564453,,, +11.1582031250,178,1385.3480224609,,, +11.1601562500,178,1385.3480224609,,, +11.1621093750,178,1385.3480224609,,, +11.1640625000,178,1384.6153564453,,, +11.1660156250,178,1385.3480224609,,, +11.1679687500,178,1386.0805664062,,, +11.1699218750,178,1384.6153564453,,, +11.1718750000,178,1383.1501464844,,, +11.1738281250,178,1383.8828125000,,, +11.1757812500,178,1383.8828125000,,, +11.1777343750,178,1382.4176025391,,, +11.1796875000,178,1381.6849365234,,, +11.1816406250,178,1380.9523925781,,, +11.1835937500,178,1381.6849365234,,, +11.1855468750,178,1380.9523925781,,, +11.1875000000,179,1379.4871826172,,, +11.1894531250,179,1378.7546386719,,, +11.1914062500,179,1378.7546386719,,, +11.1933593750,179,1378.0219726562,,, +11.1953125000,179,1375.8242187500,,, +11.1972656250,179,1375.0915527344,,, +11.1992187500,179,1375.0915527344,,, +11.2011718750,179,1373.6263427734,,, +11.2031250000,179,1371.4285888672,,, +11.2050781250,179,1370.6959228516,,, +11.2070312500,179,1369.2307128906,,, +11.2089843750,179,1367.0329589844,,, +11.2109375000,179,1364.8352050781,,, +11.2128906250,179,1364.1025390625,,, +11.2148437500,179,1361.1721191406,,, +11.2167968750,179,1358.2416992188,,, +11.2187500000,179,1356.0439453125,,, +11.2207031250,179,1355.3114013672,,, +11.2226562500,179,1352.3809814453,,, +11.2246093750,179,1350.1831054688,,, +11.2265625000,179,1348.7178955078,,, +11.2285156250,179,1345.7875976562,,, +11.2304687500,179,1342.8571777344,,, +11.2324218750,179,1339.9267578125,,, +11.2343750000,179,1338.4615478516,,, +11.2363281250,179,1334.7985839844,,, +11.2382812500,179,1331.1354980469,,, +11.2402343750,179,1328.9377441406,,, +11.2421875000,179,1327.4725341797,,, +11.2441406250,179,1323.8095703125,,, +11.2460937500,179,1320.1464843750,,, +11.2480468750,179,1318.6812744141,,, +11.2500000000,180,1315.7509765625,,, +11.2519531250,180,1312.0878906250,,, +11.2539062500,180,1309.1574707031,,, +11.2558593750,180,1307.6922607422,,, +11.2578125000,180,1305.4945068359,,, +11.2597656250,180,1302.5640869141,,, +11.2617187500,180,1301.0988769531,,, +11.2636718750,180,1301.0988769531,,, +11.2656250000,180,1298.9011230469,,, +11.2675781250,180,1296.7032470703,,, +11.2695312500,180,1296.7032470703,,, +11.2714843750,180,1296.7032470703,,, +11.2734375000,180,1294.5054931641,,, +11.2753906250,180,1293.7729492188,,, +11.2773437500,180,1295.2380371094,,, +11.2792968750,180,1295.2380371094,,, +11.2812500000,180,1294.5054931641,,, +11.2832031250,180,1294.5054931641,,, +11.2851562500,180,1295.9707031250,,, +11.2871093750,180,1295.9707031250,,, +11.2890625000,180,1294.5054931641,,, +11.2910156250,180,1294.5054931641,,, +11.2929687500,180,1295.2380371094,,, +11.2949218750,180,1293.7729492188,,, +11.2968750000,180,1293.7729492188,,, +11.2988281250,180,1293.0402832031,,, +11.3007812500,180,1293.7729492188,,, +11.3027343750,180,1293.0402832031,,, +11.3046875000,180,1291.5750732422,,, +11.3066406250,180,1291.5750732422,,, +11.3085937500,180,1292.3077392578,,, +11.3105468750,180,1291.5750732422,,, +11.3125000000,181,1290.1098632812,,, +11.3144531250,181,1290.8425292969,,, +11.3164062500,181,1290.8425292969,,, +11.3183593750,181,1290.8425292969,,, +11.3203125000,181,1290.8425292969,,, +11.3222656250,181,1292.3077392578,,, +11.3242187500,181,1292.3077392578,,, +11.3261718750,181,1292.3077392578,,, +11.3281250000,181,1292.3077392578,,, +11.3300781250,181,1293.7729492188,,, +11.3320312500,181,1293.7729492188,,, +11.3339843750,181,1293.0402832031,,, +11.3359375000,181,1293.7729492188,,, +11.3378906250,181,1293.7729492188,,, +11.3398437500,181,1293.7729492188,,, +11.3417968750,181,1293.0402832031,,, +11.3437500000,181,1293.7729492188,,, +11.3457031250,181,1293.0402832031,,, +11.3476562500,181,1292.3077392578,,, +11.3496093750,181,1292.3077392578,,, +11.3515625000,181,1292.3077392578,,, +11.3535156250,181,1291.5750732422,,, +11.3554687500,181,1291.5750732422,,, +11.3574218750,181,1292.3077392578,,, +11.3593750000,181,1292.3077392578,,, +11.3613281250,181,1292.3077392578,,, +11.3632812500,181,1293.7729492188,,, +11.3652343750,181,1293.0402832031,,, +11.3671875000,181,1293.7729492188,,, +11.3691406250,181,1293.7729492188,,, +11.3710937500,181,1295.9707031250,,, +11.3730468750,181,1295.2380371094,,, +11.3750000000,182,1294.5054931641,,, +11.3769531250,182,1295.9707031250,,, +11.3789062500,182,1297.4359130859,,, +11.3808593750,182,1298.1684570312,,, +11.3828125000,182,1298.1684570312,,, +11.3847656250,182,1301.0988769531,,, +11.3867187500,182,1300.3663330078,,, +11.3886718750,182,1300.3663330078,,, +11.3906250000,182,1301.8315429688,,, +11.3925781250,182,1303.2967529297,,, +11.3945312500,182,1301.8315429688,,, +11.3964843750,182,1302.5640869141,,, +11.3984375000,182,1304.0292968750,,, +11.4003906250,182,1304.0292968750,,, +11.4023437500,182,1304.0292968750,,, +11.4042968750,182,1304.0292968750,,, +11.4062500000,182,1305.4945068359,,, +11.4082031250,182,1304.7619628906,,, +11.4101562500,182,1304.7619628906,,, +11.4121093750,182,1306.2270507812,,, +11.4140625000,182,1306.9597167969,,, +11.4160156250,182,1306.2270507812,,, +11.4179687500,182,1306.9597167969,,, +11.4199218750,182,1309.1574707031,,, +11.4218750000,182,1309.8901367188,,, +11.4238281250,182,1310.6226806641,,, +11.4257812500,182,1311.3553466797,,, +11.4277343750,182,1312.0878906250,,, +11.4296875000,182,1314.2857666016,,, +11.4316406250,182,1316.4835205078,,, +11.4335937500,182,1317.2160644531,,, +11.4355468750,182,1317.9487304688,,, +11.4375000000,183,1317.9487304688,,, +11.4394531250,183,1317.9487304688,,, +11.4414062500,183,1320.1464843750,,, +11.4433593750,183,1321.6116943359,,, +11.4453125000,183,1321.6116943359,,, +11.4472656250,183,1321.6116943359,,, +11.4492187500,183,1322.3443603516,,, +11.4511718750,183,1323.8095703125,,, +11.4531250000,183,1323.8095703125,,, +11.4550781250,183,1323.0769042969,,, +11.4570312500,183,1322.3443603516,,, +11.4589843750,183,1322.3443603516,,, +11.4609375000,183,1323.0769042969,,, +11.4628906250,183,1323.8095703125,,, +11.4648437500,183,1323.0769042969,,, +11.4667968750,183,1321.6116943359,,, +11.4687500000,183,1320.8791503906,,, +11.4707031250,183,1321.6116943359,,, +11.4726562500,183,1322.3443603516,,, +11.4746093750,183,1321.6116943359,,, +11.4765625000,183,1320.1464843750,,, +11.4785156250,183,1319.4139404297,,, +11.4804687500,183,1317.9487304688,,, +11.4824218750,183,1319.4139404297,,, +11.4843750000,183,1320.1464843750,,, +11.4863281250,183,1318.6812744141,,, +11.4882812500,183,1319.4139404297,,, +11.4902343750,183,1319.4139404297,,, +11.4921875000,183,1319.4139404297,,, +11.4941406250,183,1320.8791503906,,, +11.4960937500,183,1320.1464843750,,, +11.4980468750,183,1320.1464843750,,, +11.5000000000,184,1320.1464843750,,, +11.5019531250,184,1321.6116943359,,, +11.5039062500,184,1321.6116943359,,, +11.5058593750,184,1320.8791503906,,, +11.5078125000,184,1320.8791503906,,, +11.5097656250,184,1321.6116943359,,, +11.5117187500,184,1321.6116943359,,, +11.5136718750,184,1320.8791503906,,, +11.5156250000,184,1320.1464843750,,, +11.5175781250,184,1321.6116943359,,, +11.5195312500,184,1320.1464843750,,, +11.5214843750,184,1320.1464843750,,, +11.5234375000,184,1319.4139404297,,, +11.5253906250,184,1320.8791503906,,, +11.5273437500,184,1321.6116943359,,, +11.5292968750,184,1320.8791503906,,, +11.5312500000,184,1320.1464843750,,, +11.5332031250,184,1320.8791503906,,, +11.5351562500,184,1321.6116943359,,, +11.5371093750,184,1320.1464843750,,, +11.5390625000,184,1318.6812744141,,, +11.5410156250,184,1317.2160644531,,, +11.5429687500,184,1317.9487304688,,, +11.5449218750,184,1316.4835205078,,, +11.5468750000,184,1315.0183105469,,, +11.5488281250,184,1313.5531005859,,, +11.5507812500,184,1312.8205566406,,, +11.5527343750,184,1312.8205566406,,, +11.5546875000,184,1311.3553466797,,, +11.5566406250,184,1310.6226806641,,, +11.5585937500,184,1309.8901367188,,, +11.5605468750,184,1310.6226806641,,, +11.5625000000,185,1311.3553466797,,, +11.5644531250,185,1309.8901367188,,, +11.5664062500,185,1309.1574707031,,, +11.5683593750,185,1309.1574707031,,, +11.5703125000,185,1310.6226806641,,, +11.5722656250,185,1308.4249267578,,, +11.5742187500,185,1307.6922607422,,, +11.5761718750,185,1308.4249267578,,, +11.5781250000,185,1308.4249267578,,, +11.5800781250,185,1308.4249267578,,, +11.5820312500,185,1308.4249267578,,, +11.5839843750,185,1306.9597167969,,, +11.5859375000,185,1306.9597167969,,, +11.5878906250,185,1308.4249267578,,, +11.5898437500,185,1306.9597167969,,, +11.5917968750,185,1306.9597167969,,, +11.5937500000,185,1307.6922607422,,, +11.5957031250,185,1305.4945068359,,, +11.5976562500,185,1304.0292968750,,, +11.5996093750,185,1303.2967529297,,, +11.6015625000,185,1302.5640869141,,, +11.6035156250,185,1301.0988769531,,, +11.6054687500,185,1299.6336669922,,, +11.6074218750,185,1299.6336669922,,, +11.6093750000,185,1297.4359130859,,, +11.6113281250,185,1296.7032470703,,, +11.6132812500,185,1295.9707031250,,, +11.6152343750,185,1295.2380371094,,, +11.6171875000,185,1293.0402832031,,, +11.6191406250,185,1291.5750732422,,, +11.6210937500,185,1291.5750732422,,, +11.6230468750,185,1289.3773193359,,, +11.6250000000,186,1288.6446533203,,, +11.6269531250,186,1289.3773193359,,, +11.6289062500,186,1287.9121093750,,, +11.6308593750,186,1287.9121093750,,, +11.6328125000,186,1288.6446533203,,, +11.6347656250,186,1290.8425292969,,, +11.6367187500,186,1291.5750732422,,, +11.6386718750,186,1293.7729492188,,, +11.6406250000,186,1296.7032470703,,, +11.6425781250,186,1298.9011230469,,, +11.6445312500,186,1301.8315429688,,, +11.6464843750,186,1306.9597167969,,, +11.6484375000,186,1309.8901367188,,, +11.6503906250,186,1312.0878906250,,, +11.6523437500,186,1316.4835205078,,, +11.6542968750,186,1321.6116943359,,, +11.6562500000,186,1326.7398681641,,, +11.6582031250,186,1332.6007080078,,, +11.6601562500,186,1340.6593017578,,, +11.6621093750,186,1347.2528076172,,, +11.6640625000,186,1355.3114013672,,, +11.6660156250,186,1364.8352050781,,, +11.6679687500,186,1373.6263427734,,, +11.6699218750,186,1382.4176025391,,, +11.6718750000,186,1393.4066162109,,, +11.6738281250,186,1403.6629638672,,, +11.6757812500,186,1413.9194335938,,, +11.6777343750,186,1424.9084472656,,, +11.6796875000,186,1437.3626708984,,, +11.6816406250,186,1447.6190185547,,, +11.6835937500,186,1460.0732421875,,, +11.6855468750,186,1473.9926757812,,, +11.6875000000,187,1485.7142333984,,, +11.6894531250,187,1496.7032470703,,, +11.6914062500,187,1509.8901367188,,, +11.6933593750,187,1524.5421142578,,, +11.6953125000,187,1536.9963378906,,, +11.6972656250,187,1549.4505615234,,, +11.6992187500,187,1564.8352050781,,, +11.7011718750,187,1578.7546386719,,, +11.7031250000,187,1592.6739501953,,, +11.7050781250,187,1608.7912597656,,, +11.7070312500,187,1623.4432373047,,, +11.7089843750,187,1636.6300048828,,, +11.7109375000,187,1651.2821044922,,, +11.7128906250,187,1666.6666259766,,, +11.7148437500,187,1678.3883056641,,, +11.7167968750,187,1690.1098632812,,, +11.7187500000,187,1704.7619628906,,, +11.7207031250,187,1716.4835205078,,, +11.7226562500,187,1726.7398681641,,, +11.7246093750,187,1737.7288818359,,, +11.7265625000,187,1749.4505615234,,, +11.7285156250,187,1757.5091552734,,, +11.7304687500,187,1766.3004150391,,, +11.7324218750,187,1775.0915527344,,, +11.7343750000,187,1781.6849365234,,, +11.7363281250,187,1786.8132324219,,, +11.7382812500,187,1792.6739501953,,, +11.7402343750,187,1798.5347900391,,, +11.7421875000,187,1801.4652099609,,, +11.7441406250,187,1804.3956298828,,, +11.7460937500,187,1808.0585937500,,, +11.7480468750,187,1808.0585937500,,, +11.7500000000,188,1808.0585937500,,, +11.7519531250,188,1808.7912597656,,, +11.7539062500,188,1807.3260498047,,, +11.7558593750,188,1805.1281738281,,, +11.7578125000,188,1803.6629638672,,, +11.7597656250,188,1802.1977539062,,, +11.7617187500,188,1798.5347900391,,, +11.7636718750,188,1794.1391601562,,, +11.7656250000,188,1790.4761962891,,, +11.7675781250,188,1784.6153564453,,, +11.7695312500,188,1778.7546386719,,, +11.7714843750,188,1772.8937988281,,, +11.7734375000,188,1767.0329589844,,, +11.7753906250,188,1758.2416992188,,, +11.7773437500,188,1749.4505615234,,, +11.7792968750,188,1742.1245117188,,, +11.7812500000,188,1733.3333740234,,, +11.7832031250,188,1723.0769042969,,, +11.7851562500,188,1713.5531005859,,, +11.7871093750,188,1704.0292968750,,, +11.7890625000,188,1692.3077392578,,, +11.7910156250,188,1681.3187255859,,, +11.7929687500,188,1670.3297119141,,, +11.7949218750,188,1657.8754882812,,, +11.7968750000,188,1645.4212646484,,, +11.7988281250,188,1634.4322509766,,, +11.8007812500,188,1621.9780273438,,, +11.8027343750,188,1609.5238037109,,, +11.8046875000,188,1585.3480224609,,, +11.8066406250,188,1572.8937988281,,, +11.8085937500,188,1560.4395751953,,, +11.8105468750,188,1549.4505615234,,, +11.8125000000,189,1536.9963378906,,, +11.8144531250,189,1524.5421142578,,, +11.8164062500,189,1513.5531005859,,, +11.8183593750,189,1503.2967529297,,, +11.8203125000,189,1491.5750732422,,, +11.8222656250,189,1480.5860595703,,, +11.8242187500,189,1470.3297119141,,, +11.8261718750,189,1458.6080322266,,, +11.8281250000,189,1448.3516845703,,, +11.8300781250,189,1438.8278808594,,, +11.8320312500,189,1427.8388671875,,, +11.8339843750,189,1418.3150634766,,, +11.8359375000,189,1410.2564697266,,, +11.8378906250,189,1400.0000000000,,, +11.8398437500,189,1391.9414062500,,, +11.8417968750,189,1384.6153564453,,, +11.8437500000,189,1375.8242187500,,, +11.8457031250,189,1368.4981689453,,, +11.8476562500,189,1361.9047851562,,, +11.8496093750,189,1354.5787353516,,, +11.8515625000,189,1347.2528076172,,, +11.8535156250,189,1342.1245117188,,, +11.8554687500,189,1335.5311279297,,, +11.8574218750,189,1329.6702880859,,, +11.8593750000,189,1324.5421142578,,, +11.8613281250,189,1320.8791503906,,, +11.8632812500,189,1315.0183105469,,, +11.8652343750,189,1309.8901367188,,, +11.8671875000,189,1306.2270507812,,, +11.8691406250,189,1301.8315429688,,, +11.8710937500,189,1297.4359130859,,, +11.8730468750,189,1295.2380371094,,, +11.8750000000,190,1293.0402832031,,, +11.8769531250,190,1289.3773193359,,, +11.8789062500,190,1287.1794433594,,, +11.8808593750,190,1284.9816894531,,, +11.8828125000,190,1282.0512695312,,, +11.8847656250,190,1279.1208496094,,, +11.8867187500,190,1278.3883056641,,, +11.8886718750,190,1276.1904296875,,, +11.8906250000,190,1273.9926757812,,, +11.8925781250,190,1273.2601318359,,, +11.8945312500,190,1271.0622558594,,, +11.8964843750,190,1269.5970458984,,, +11.8984375000,190,1269.5970458984,,, +11.9003906250,190,1269.5970458984,,, +11.9023437500,190,1268.8645019531,,, +11.9042968750,190,1268.1318359375,,, +11.9062500000,190,1268.8645019531,,, +11.9082031250,190,1270.3297119141,,, +11.9101562500,190,1270.3297119141,,, +11.9121093750,190,1270.3297119141,,, +11.9140625000,190,1271.7949218750,,, +11.9160156250,190,1273.9926757812,,, +11.9179687500,190,1274.7252197266,,, +11.9199218750,190,1276.1904296875,,, +11.9218750000,190,1278.3883056641,,, +11.9238281250,190,1280.5860595703,,, +11.9257812500,190,1282.0512695312,,, +11.9277343750,190,1283.5164794922,,, +11.9296875000,190,1286.4468994141,,, +11.9316406250,190,1289.3773193359,,, +11.9335937500,190,1291.5750732422,,, +11.9355468750,190,1292.3077392578,,, +11.9375000000,191,1295.2380371094,,, +11.9394531250,191,1299.6336669922,,, +11.9414062500,191,1301.8315429688,,, +11.9433593750,191,1304.0292968750,,, +11.9453125000,191,1306.9597167969,,, +11.9472656250,191,1309.8901367188,,, +11.9492187500,191,1314.2857666016,,, +11.9511718750,191,1316.4835205078,,, +11.9531250000,191,1319.4139404297,,, +11.9550781250,191,1321.6116943359,,, +11.9570312500,191,1327.4725341797,,, +11.9589843750,191,1328.9377441406,,, +11.9609375000,191,1331.1354980469,,, +11.9628906250,191,1334.7985839844,,, +11.9648437500,191,1339.1940917969,,, +11.9667968750,191,1341.3919677734,,, +11.9687500000,191,1343.5897216797,,, +11.9707031250,191,1347.2528076172,,, +11.9726562500,191,1350.9157714844,,, +11.9746093750,191,1353.1135253906,,, +11.9765625000,191,1354.5787353516,,, +11.9785156250,191,1358.2416992188,,, +11.9804687500,191,1361.1721191406,,, +11.9824218750,191,1362.6373291016,,, +11.9843750000,191,1365.5677490234,,, +11.9863281250,191,1367.7656250000,,, +11.9882812500,191,1369.2307128906,,, +11.9902343750,191,1370.6959228516,,, +11.9921875000,191,1373.6263427734,,, +11.9941406250,191,1376.5567626953,,, +11.9960937500,191,1376.5567626953,,, +11.9980468750,191,1378.0219726562,,, +12.0000000000,192,1379.4871826172,,, +12.0019531250,192,1382.4176025391,,, +12.0039062500,192,1382.4176025391,,, +12.0058593750,192,1382.4176025391,,, +12.0078125000,192,1383.8828125000,,, +12.0097656250,192,1383.8828125000,,, +12.0117187500,192,1383.1501464844,,, +12.0136718750,192,1383.1501464844,,, +12.0156250000,192,1385.3480224609,,, +12.0175781250,192,1385.3480224609,,, +12.0195312500,192,1384.6153564453,,, +12.0214843750,192,1383.8828125000,,, +12.0234375000,192,1385.3480224609,,, +12.0253906250,192,1384.6153564453,,, +12.0273437500,192,1383.1501464844,,, +12.0292968750,192,1383.1501464844,,, +12.0312500000,192,1382.4176025391,,, +12.0332031250,192,1380.9523925781,,, +12.0351562500,192,1379.4871826172,,, +12.0371093750,192,1380.2197265625,,, +12.0390625000,192,1377.2894287109,,, +12.0410156250,192,1375.0915527344,,, +12.0429687500,192,1375.0915527344,,, +12.0449218750,192,1374.3590087891,,, +12.0468750000,192,1372.1611328125,,, +12.0488281250,192,1369.9633789062,,, +12.0507812500,192,1369.2307128906,,, +12.0527343750,192,1368.4981689453,,, +12.0546875000,192,1366.3004150391,,, +12.0566406250,192,1364.1025390625,,, +12.0585937500,192,1362.6373291016,,, +12.0605468750,192,1361.9047851562,,, +12.0625000000,193,1357.5091552734,,, +12.0644531250,193,1356.7766113281,,, +12.0664062500,193,1353.1135253906,,, +12.0683593750,193,1350.9157714844,,, +12.0703125000,193,1350.1831054688,,, +12.0722656250,193,1347.2528076172,,, +12.0742187500,193,1343.5897216797,,, +12.0761718750,193,1343.5897216797,,, +12.0781250000,193,1340.6593017578,,, +12.0800781250,193,1337.7288818359,,, +12.0820312500,193,1336.2637939453,,, +12.0839843750,193,1333.3333740234,,, +12.0859375000,193,1331.1354980469,,, +12.0878906250,193,1330.4029541016,,, +12.0898437500,193,1327.4725341797,,, +12.0917968750,193,1325.2747802734,,, +12.0937500000,193,1325.2747802734,,, +12.0957031250,193,1323.0769042969,,, +12.0976562500,193,1320.8791503906,,, +12.0996093750,193,1320.8791503906,,, +12.1015625000,193,1319.4139404297,,, +12.1035156250,193,1318.6812744141,,, +12.1054687500,193,1317.2160644531,,, +12.1074218750,193,1315.7509765625,,, +12.1093750000,193,1315.7509765625,,, +12.1113281250,193,1315.7509765625,,, +12.1132812500,193,1314.2857666016,,, +12.1152343750,193,1315.0183105469,,, +12.1171875000,193,1313.5531005859,,, +12.1191406250,193,1312.0878906250,,, +12.1210937500,193,1312.8205566406,,, +12.1230468750,193,1311.3553466797,,, +12.1250000000,194,1310.6226806641,,, +12.1269531250,194,1312.0878906250,,, +12.1289062500,194,1310.6226806641,,, +12.1308593750,194,1309.1574707031,,, +12.1328125000,194,1308.4249267578,,, +12.1347656250,194,1306.9597167969,,, +12.1367187500,194,1306.9597167969,,, +12.1386718750,194,1306.2270507812,,, +12.1406250000,194,1304.7619628906,,, +12.1425781250,194,1306.2270507812,,, +12.1445312500,194,1304.7619628906,,, +12.1464843750,194,1302.5640869141,,, +12.1484375000,194,1303.2967529297,,, +12.1503906250,194,1301.8315429688,,, +12.1523437500,194,1301.0988769531,,, +12.1542968750,194,1301.0988769531,,, +12.1562500000,194,1300.3663330078,,, +12.1582031250,194,1298.9011230469,,, +12.1601562500,194,1298.9011230469,,, +12.1621093750,194,1298.1684570312,,, +12.1640625000,194,1297.4359130859,,, +12.1660156250,194,1298.1684570312,,, +12.1679687500,194,1297.4359130859,,, +12.1699218750,194,1296.7032470703,,, +12.1718750000,194,1296.7032470703,,, +12.1738281250,194,1295.9707031250,,, +12.1757812500,194,1295.2380371094,,, +12.1777343750,194,1296.7032470703,,, +12.1796875000,194,1295.2380371094,,, +12.1816406250,194,1295.9707031250,,, +12.1835937500,194,1295.9707031250,,, +12.1855468750,194,1295.2380371094,,, +12.1875000000,195,1297.4359130859,,, +12.1894531250,195,1296.7032470703,,, +12.1914062500,195,1296.7032470703,,, +12.1933593750,195,1297.4359130859,,, +12.1953125000,195,1297.4359130859,,, +12.1972656250,195,1296.7032470703,,, +12.1992187500,195,1298.1684570312,,, +12.2011718750,195,1297.4359130859,,, +12.2031250000,195,1297.4359130859,,, +12.2050781250,195,1298.1684570312,,, +12.2070312500,195,1298.1684570312,,, +12.2089843750,195,1298.1684570312,,, +12.2109375000,195,1300.3663330078,,, +12.2128906250,195,1299.6336669922,,, +12.2148437500,195,1301.0988769531,,, +12.2167968750,195,1301.8315429688,,, +12.2187500000,195,1301.8315429688,,, +12.2207031250,195,1303.2967529297,,, +12.2226562500,195,1303.2967529297,,, +12.2246093750,195,1302.5640869141,,, +12.2265625000,195,1304.0292968750,,, +12.2285156250,195,1303.2967529297,,, +12.2304687500,195,1302.5640869141,,, +12.2324218750,195,1303.2967529297,,, +12.2343750000,195,1302.5640869141,,, +12.2363281250,195,1301.8315429688,,, +12.2382812500,195,1302.5640869141,,, +12.2402343750,195,1302.5640869141,,, +12.2421875000,195,1301.8315429688,,, +12.2441406250,195,1301.8315429688,,, +12.2460937500,195,1302.5640869141,,, +12.2480468750,195,1301.8315429688,,, +12.2500000000,196,1302.5640869141,,, +12.2519531250,196,1303.2967529297,,, +12.2539062500,196,1302.5640869141,,, +12.2558593750,196,1302.5640869141,,, +12.2578125000,196,1303.2967529297,,, +12.2597656250,196,1303.2967529297,,, +12.2617187500,196,1304.0292968750,,, +12.2636718750,196,1305.4945068359,,, +12.2656250000,196,1305.4945068359,,, +12.2675781250,196,1305.4945068359,,, +12.2695312500,196,1308.4249267578,,, +12.2714843750,196,1309.1574707031,,, +12.2734375000,196,1309.8901367188,,, +12.2753906250,196,1312.0878906250,,, +12.2773437500,196,1312.8205566406,,, +12.2792968750,196,1312.8205566406,,, +12.2812500000,196,1315.7509765625,,, +12.2832031250,196,1316.4835205078,,, +12.2851562500,196,1317.9487304688,,, +12.2871093750,196,1319.4139404297,,, +12.2890625000,196,1320.1464843750,,, +12.2910156250,196,1322.3443603516,,, +12.2929687500,196,1323.8095703125,,, +12.2949218750,196,1323.8095703125,,, +12.2968750000,196,1325.2747802734,,, +12.2988281250,196,1325.2747802734,,, +12.3007812500,196,1325.2747802734,,, +12.3027343750,196,1326.7398681641,,, +12.3046875000,196,1326.7398681641,,, +12.3066406250,196,1327.4725341797,,, +12.3085937500,196,1328.2050781250,,, +12.3105468750,196,1328.9377441406,,, +12.3125000000,197,1328.2050781250,,, +12.3144531250,197,1328.9377441406,,, +12.3164062500,197,1328.9377441406,,, +12.3183593750,197,1328.2050781250,,, +12.3203125000,197,1329.6702880859,,, +12.3222656250,197,1329.6702880859,,, +12.3242187500,197,1329.6702880859,,, +12.3261718750,197,1331.1354980469,,, +12.3281250000,197,1330.4029541016,,, +12.3300781250,197,1330.4029541016,,, +12.3320312500,197,1332.6007080078,,, +12.3339843750,197,1331.8681640625,,, +12.3359375000,197,1331.8681640625,,, +12.3378906250,197,1334.0659179688,,, +12.3398437500,197,1333.3333740234,,, +12.3417968750,197,1333.3333740234,,, +12.3437500000,197,1334.0659179688,,, +12.3457031250,197,1333.3333740234,,, +12.3476562500,197,1334.0659179688,,, +12.3496093750,197,1332.6007080078,,, +12.3515625000,197,1331.8681640625,,, +12.3535156250,197,1332.6007080078,,, +12.3554687500,197,1331.8681640625,,, +12.3574218750,197,1331.1354980469,,, +12.3593750000,197,1331.8681640625,,, +12.3613281250,197,1331.8681640625,,, +12.3632812500,197,1329.6702880859,,, +12.3652343750,197,1331.1354980469,,, +12.3671875000,197,1330.4029541016,,, +12.3691406250,197,1328.9377441406,,, +12.3710937500,197,1328.9377441406,,, +12.3730468750,197,1328.2050781250,,, +12.3750000000,198,1326.7398681641,,, +12.3769531250,198,1326.0073242188,,, +12.3789062500,198,1325.2747802734,,, +12.3808593750,198,1324.5421142578,,, +12.3828125000,198,1323.8095703125,,, +12.3847656250,198,1323.8095703125,,, +12.3867187500,198,1322.3443603516,,, +12.3886718750,198,1322.3443603516,,, +12.3906250000,198,1320.8791503906,,, +12.3925781250,198,1320.8791503906,,, +12.3945312500,198,1320.1464843750,,, +12.3964843750,198,1320.1464843750,,, +12.3984375000,198,1319.4139404297,,, +12.4003906250,198,1318.6812744141,,, +12.4023437500,198,1319.4139404297,,, +12.4042968750,198,1317.2160644531,,, +12.4062500000,198,1316.4835205078,,, +12.4082031250,198,1316.4835205078,,, +12.4101562500,198,1314.2857666016,,, +12.4121093750,198,1313.5531005859,,, +12.4140625000,198,1312.8205566406,,, +12.4160156250,198,1311.3553466797,,, +12.4179687500,198,1310.6226806641,,, +12.4199218750,198,1310.6226806641,,, +12.4218750000,198,1309.1574707031,,, +12.4238281250,198,1308.4249267578,,, +12.4257812500,198,1308.4249267578,,, +12.4277343750,198,1306.9597167969,,, +12.4296875000,198,1306.2270507812,,, +12.4316406250,198,1306.2270507812,,, +12.4335937500,198,1305.4945068359,,, +12.4355468750,198,1304.0292968750,,, +12.4375000000,199,1304.7619628906,,, +12.4394531250,199,1304.0292968750,,, +12.4414062500,199,1304.0292968750,,, +12.4433593750,199,1305.4945068359,,, +12.4453125000,199,1304.7619628906,,, +12.4472656250,199,1304.0292968750,,, +12.4492187500,199,1304.0292968750,,, +12.4511718750,199,1303.2967529297,,, +12.4531250000,199,1301.8315429688,,, +12.4550781250,199,1304.0292968750,,, +12.4570312500,199,1302.5640869141,,, +12.4589843750,199,1301.8315429688,,, +12.4609375000,199,1302.5640869141,,, +12.4628906250,199,1303.2967529297,,, +12.4648437500,199,1302.5640869141,,, +12.4667968750,199,1304.0292968750,,, +12.4687500000,199,1304.7619628906,,, +12.4707031250,199,1304.0292968750,,, +12.4726562500,199,1304.0292968750,,, +12.4746093750,199,1304.7619628906,,, +12.4765625000,199,1304.7619628906,,, +12.4785156250,199,1304.0292968750,,, +12.4804687500,199,1305.4945068359,,, +12.4824218750,199,1304.0292968750,,, +12.4843750000,199,1304.0292968750,,, +12.4863281250,199,1304.0292968750,,, +12.4882812500,199,1303.2967529297,,, +12.4902343750,199,1304.7619628906,,, +12.4921875000,199,1304.7619628906,,, +12.4941406250,199,1305.4945068359,,, +12.4960937500,199,1308.4249267578,,, +12.4980468750,199,1309.8901367188,,, +12.5000000000,200,1312.0878906250,,, +12.5019531250,200,1315.0183105469,,, +12.5039062500,200,1318.6812744141,,, +12.5058593750,200,1321.6116943359,,, +12.5078125000,200,1326.7398681641,,, +12.5097656250,200,1331.8681640625,,, +12.5117187500,200,1336.2637939453,,, +12.5136718750,200,1342.8571777344,,, +12.5156250000,200,1350.1831054688,,, +12.5175781250,200,1356.7766113281,,, +12.5195312500,200,1364.1025390625,,, +12.5214843750,200,1372.8937988281,,, +12.5234375000,200,1381.6849365234,,, +12.5253906250,200,1391.9414062500,,, +12.5273437500,200,1402.9304199219,,, +12.5292968750,200,1413.9194335938,,, +12.5312500000,200,1425.6409912109,,, +12.5332031250,200,1438.0952148438,,, +12.5351562500,200,1449.8168945312,,, +12.5371093750,200,1462.2711181641,,, +12.5390625000,200,1476.9230957031,,, +12.5410156250,200,1490.1098632812,,, +12.5429687500,200,1504.7619628906,,, +12.5449218750,200,1520.8791503906,,, +12.5468750000,200,1534.7985839844,,, +12.5488281250,200,1549.4505615234,,, +12.5507812500,200,1566.3004150391,,, +12.5527343750,200,1580.9523925781,,, +12.5546875000,200,1597.0695800781,,, +12.5566406250,200,1614.6519775391,,, +12.5585937500,200,1629.3040771484,,, +12.5605468750,200,1646.1538085938,,, +12.5625000000,201,1663.0036621094,,, +12.5644531250,201,1676.9230957031,,, +12.5664062500,201,1691.5750732422,,, +12.5683593750,201,1707.6922607422,,, +12.5703125000,201,1721.6116943359,,, +12.5722656250,201,1734.7985839844,,, +12.5742187500,201,1750.1831054688,,, +12.5761718750,201,1762.6373291016,,, +12.5781250000,201,1775.8242187500,,, +12.5800781250,201,1789.0109863281,,, +12.5820312500,201,1800.0000000000,,, +12.5839843750,201,1811.7215576172,,, +12.5859375000,201,1822.7105712891,,, +12.5878906250,201,1831.5018310547,,, +12.5898437500,201,1839.5604248047,,, +12.5917968750,201,1847.6190185547,,, +12.5937500000,201,1854.2124023438,,, +12.5957031250,201,1859.3406982422,,, +12.5976562500,201,1865.2014160156,,, +12.5996093750,201,1868.1318359375,,, +12.6015625000,201,1870.3297119141,,, +12.6035156250,201,1873.9926757812,,, +12.6054687500,201,1873.2601318359,,, +12.6074218750,201,1873.2601318359,,, +12.6093750000,201,1872.5274658203,,, +12.6113281250,201,1870.3297119141,,, +12.6132812500,201,1867.3992919922,,, +12.6152343750,201,1867.3992919922,,, +12.6171875000,201,1864.4688720703,,, +12.6191406250,201,1860.8059082031,,, +12.6210937500,201,1856.4102783203,,, +12.6230468750,201,1852.0146484375,,, +12.6250000000,202,1848.3516845703,,, +12.6269531250,202,1841.7583007812,,, +12.6289062500,202,1835.1647949219,,, +12.6308593750,202,1829.3040771484,,, +12.6328125000,202,1821.2453613281,,, +12.6347656250,202,1812.4542236328,,, +12.6367187500,202,1805.1281738281,,, +12.6386718750,202,1795.6043701172,,, +12.6406250000,202,1785.3480224609,,, +12.6425781250,202,1776.5567626953,,, +12.6445312500,202,1764.8352050781,,, +12.6464843750,202,1753.8461914062,,, +12.6484375000,202,1743.5897216797,,, +12.6503906250,202,1732.6007080078,,, +12.6523437500,202,1720.8791503906,,, +12.6542968750,202,1710.6226806641,,, +12.6562500000,202,1698.9011230469,,, +12.6582031250,202,1686.4468994141,,, +12.6601562500,202,1676.9230957031,,, +12.6621093750,202,1663.7362060547,,, +12.6640625000,202,1652.0146484375,,, +12.6660156250,202,1641.0256347656,,, +12.6679687500,202,1627.8388671875,,, +12.6699218750,202,1616.8498535156,,, +12.6718750000,202,1605.1281738281,,, +12.6738281250,202,1592.6739501953,,, +12.6757812500,202,1582.4176025391,,, +12.6777343750,202,1572.8937988281,,, +12.6796875000,202,1572.8937988281,,, +12.6816406250,202,1562.6373291016,,, +12.6835937500,202,1553.8461914062,,, +12.6855468750,202,1544.3223876953,,, +12.6875000000,203,1534.0659179688,,, +12.6894531250,203,1526.0073242188,,, +12.6914062500,203,1516.4835205078,,, +12.6933593750,203,1508.4249267578,,, +12.6953125000,203,1500.3663330078,,, +12.6972656250,203,1490.1098632812,,, +12.6992187500,203,1482.7839355469,,, +12.7011718750,203,1473.9926757812,,, +12.7031250000,203,1465.9340820312,,, +12.7050781250,203,1459.3406982422,,, +12.7070312500,203,1450.5494384766,,, +12.7089843750,203,1443.2233886719,,, +12.7109375000,203,1435.8974609375,,, +12.7128906250,203,1428.5714111328,,, +12.7148437500,203,1423.4432373047,,, +12.7167968750,203,1416.8498535156,,, +12.7187500000,203,1410.9890136719,,, +12.7207031250,203,1405.8608398438,,, +12.7226562500,203,1400.0000000000,,, +12.7246093750,203,1395.6043701172,,, +12.7265625000,203,1390.4761962891,,, +12.7285156250,203,1385.3480224609,,, +12.7304687500,203,1380.9523925781,,, +12.7324218750,203,1375.8242187500,,, +12.7343750000,203,1372.8937988281,,, +12.7363281250,203,1368.4981689453,,, +12.7382812500,203,1364.1025390625,,, +12.7402343750,203,1361.9047851562,,, +12.7421875000,203,1358.2416992188,,, +12.7441406250,203,1355.3114013672,,, +12.7460937500,203,1353.8461914062,,, +12.7480468750,203,1350.1831054688,,, +12.7500000000,204,1347.9853515625,,, +12.7519531250,204,1345.7875976562,,, +12.7539062500,204,1341.3919677734,,, +12.7558593750,204,1338.4615478516,,, +12.7578125000,204,1335.5311279297,,, +12.7597656250,204,1332.6007080078,,, +12.7617187500,204,1329.6702880859,,, +12.7636718750,204,1328.2050781250,,, +12.7656250000,204,1326.0073242188,,, +12.7675781250,204,1323.8095703125,,, +12.7695312500,204,1322.3443603516,,, +12.7714843750,204,1320.1464843750,,, +12.7734375000,204,1317.9487304688,,, +12.7753906250,204,1317.2160644531,,, +12.7773437500,204,1315.0183105469,,, +12.7792968750,204,1315.0183105469,,, +12.7812500000,204,1314.2857666016,,, +12.7832031250,204,1312.8205566406,,, +12.7851562500,204,1312.8205566406,,, +12.7871093750,204,1313.5531005859,,, +12.7890625000,204,1313.5531005859,,, +12.7910156250,204,1315.0183105469,,, +12.7929687500,204,1315.0183105469,,, +12.7949218750,204,1315.0183105469,,, +12.7968750000,204,1317.9487304688,,, +12.7988281250,204,1317.2160644531,,, +12.8007812500,204,1318.6812744141,,, +12.8027343750,204,1321.6116943359,,, +12.8046875000,204,1321.6116943359,,, +12.8066406250,204,1323.8095703125,,, +12.8085937500,204,1325.2747802734,,, +12.8105468750,204,1326.7398681641,,, +12.8125000000,205,1328.2050781250,,, +12.8144531250,205,1330.4029541016,,, +12.8164062500,205,1331.8681640625,,, +12.8183593750,205,1335.5311279297,,, +12.8203125000,205,1338.4615478516,,, +12.8222656250,205,1339.9267578125,,, +12.8242187500,205,1344.3223876953,,, +12.8261718750,205,1346.5201416016,,, +12.8281250000,205,1348.7178955078,,, +12.8300781250,205,1352.3809814453,,, +12.8320312500,205,1353.8461914062,,, +12.8339843750,205,1355.3114013672,,, +12.8359375000,205,1358.9743652344,,, +12.8378906250,205,1360.4395751953,,, +12.8398437500,205,1362.6373291016,,, +12.8417968750,205,1366.3004150391,,, +12.8437500000,205,1368.4981689453,,, +12.8457031250,205,1370.6959228516,,, +12.8476562500,205,1373.6263427734,,, +12.8496093750,205,1375.0915527344,,, +12.8515625000,205,1378.0219726562,,, +12.8535156250,205,1379.4871826172,,, +12.8554687500,205,1380.9523925781,,, +12.8574218750,205,1383.1501464844,,, +12.8593750000,205,1386.0805664062,,, +12.8613281250,205,1388.2784423828,,, +12.8632812500,205,1391.2087402344,,, +12.8652343750,205,1392.6739501953,,, +12.8671875000,205,1396.3370361328,,, +12.8691406250,205,1397.8022460938,,, +12.8710937500,205,1398.5347900391,,, +12.8730468750,205,1401.4652099609,,, +12.8750000000,206,1402.9304199219,,, +12.8769531250,206,1403.6629638672,,, +12.8789062500,206,1403.6629638672,,, +12.8808593750,206,1405.8608398438,,, +12.8828125000,206,1405.8608398438,,, +12.8847656250,206,1405.1281738281,,, +12.8867187500,206,1404.3956298828,,, +12.8886718750,206,1405.8608398438,,, +12.8906250000,206,1404.3956298828,,, +12.8925781250,206,1402.9304199219,,, +12.8945312500,206,1403.6629638672,,, +12.8964843750,206,1402.1977539062,,, +12.8984375000,206,1400.0000000000,,, +12.9003906250,206,1399.2674560547,,, +12.9023437500,206,1399.2674560547,,, +12.9042968750,206,1397.0695800781,,, +12.9062500000,206,1395.6043701172,,, +12.9082031250,206,1394.8718261719,,, +12.9101562500,206,1394.8718261719,,, +12.9121093750,206,1391.9414062500,,, +12.9140625000,206,1389.7435302734,,, +12.9160156250,206,1388.2784423828,,, +12.9179687500,206,1386.0805664062,,, +12.9199218750,206,1383.1501464844,,, +12.9218750000,206,1381.6849365234,,, +12.9238281250,206,1381.6849365234,,, +12.9257812500,206,1380.2197265625,,, +12.9277343750,206,1377.2894287109,,, +12.9296875000,206,1375.0915527344,,, +12.9316406250,206,1375.0915527344,,, +12.9335937500,206,1372.1611328125,,, +12.9355468750,206,1369.9633789062,,, +12.9375000000,207,1368.4981689453,,, +12.9394531250,207,1366.3004150391,,, +12.9414062500,207,1363.3699951172,,, +12.9433593750,207,1361.1721191406,,, +12.9453125000,207,1360.4395751953,,, +12.9472656250,207,1356.7766113281,,, +12.9492187500,207,1353.8461914062,,, +12.9511718750,207,1352.3809814453,,, +12.9531250000,207,1350.9157714844,,, +12.9550781250,207,1347.9853515625,,, +12.9570312500,207,1346.5201416016,,, +12.9589843750,207,1345.0549316406,,, +12.9609375000,207,1342.8571777344,,, +12.9628906250,207,1341.3919677734,,, +12.9648437500,207,1339.1940917969,,, +12.9667968750,207,1337.7288818359,,, +12.9687500000,207,1335.5311279297,,, +12.9707031250,207,1332.6007080078,,, +12.9726562500,207,1331.1354980469,,, +12.9746093750,207,1329.6702880859,,, +12.9765625000,207,1326.7398681641,,, +12.9785156250,207,1325.2747802734,,, +12.9804687500,207,1323.8095703125,,, +12.9824218750,207,1322.3443603516,,, +12.9843750000,207,1320.1464843750,,, +12.9863281250,207,1317.9487304688,,, +12.9882812500,207,1318.6812744141,,, +12.9902343750,207,1316.4835205078,,, +12.9921875000,207,1313.5531005859,,, +12.9941406250,207,1313.5531005859,,, +12.9960937500,207,1311.3553466797,,, +12.9980468750,207,1309.8901367188,,, +13.0000000000,208,1307.6922607422,,, +13.0019531250,208,1306.9597167969,,, +13.0039062500,208,1306.9597167969,,, +13.0058593750,208,1304.7619628906,,, +13.0078125000,208,1304.0292968750,,, +13.0097656250,208,1303.2967529297,,, +13.0117187500,208,1301.8315429688,,, +13.0136718750,208,1301.0988769531,,, +13.0156250000,208,1300.3663330078,,, +13.0175781250,208,1298.9011230469,,, +13.0195312500,208,1298.9011230469,,, +13.0214843750,208,1297.4359130859,,, +13.0234375000,208,1297.4359130859,,, +13.0253906250,208,1297.4359130859,,, +13.0273437500,208,1295.9707031250,,, +13.0292968750,208,1295.9707031250,,, +13.0312500000,208,1295.9707031250,,, +13.0332031250,208,1295.9707031250,,, +13.0351562500,208,1295.9707031250,,, +13.0371093750,208,1295.2380371094,,, +13.0390625000,208,1295.2380371094,,, +13.0410156250,208,1295.9707031250,,, +13.0429687500,208,1295.9707031250,,, +13.0449218750,208,1295.9707031250,,, +13.0468750000,208,1298.1684570312,,, +13.0488281250,208,1296.7032470703,,, +13.0507812500,208,1297.4359130859,,, +13.0527343750,208,1297.4359130859,,, +13.0546875000,208,1297.4359130859,,, +13.0566406250,208,1298.9011230469,,, +13.0585937500,208,1298.1684570312,,, +13.0605468750,208,1298.1684570312,,, +13.0625000000,209,1299.6336669922,,, +13.0644531250,209,1298.9011230469,,, +13.0664062500,209,1300.3663330078,,, +13.0683593750,209,1300.3663330078,,, +13.0703125000,209,1301.0988769531,,, +13.0722656250,209,1304.0292968750,,, +13.0742187500,209,1304.0292968750,,, +13.0761718750,209,1304.0292968750,,, +13.0781250000,209,1306.2270507812,,, +13.0800781250,209,1306.2270507812,,, +13.0820312500,209,1307.6922607422,,, +13.0839843750,209,1309.1574707031,,, +13.0859375000,209,1310.6226806641,,, +13.0878906250,209,1313.5531005859,,, +13.0898437500,209,1314.2857666016,,, +13.0917968750,209,1315.7509765625,,, +13.0937500000,209,1318.6812744141,,, +13.0957031250,209,1318.6812744141,,, +13.0976562500,209,1320.1464843750,,, +13.0996093750,209,1323.0769042969,,, +13.1015625000,209,1323.0769042969,,, +13.1035156250,209,1324.5421142578,,, +13.1054687500,209,1326.0073242188,,, +13.1074218750,209,1325.2747802734,,, +13.1093750000,209,1326.7398681641,,, +13.1113281250,209,1326.0073242188,,, +13.1132812500,209,1326.7398681641,,, +13.1152343750,209,1325.2747802734,,, +13.1171875000,209,1325.2747802734,,, +13.1191406250,209,1327.4725341797,,, +13.1210937500,209,1326.7398681641,,, +13.1230468750,209,1326.7398681641,,, +13.1250000000,210,1327.4725341797,,, +13.1269531250,210,1327.4725341797,,, +13.1289062500,210,1328.9377441406,,, +13.1308593750,210,1328.9377441406,,, +13.1328125000,210,1328.9377441406,,, +13.1347656250,210,1330.4029541016,,, +13.1367187500,210,1331.1354980469,,, +13.1386718750,210,1330.4029541016,,, +13.1406250000,210,1330.4029541016,,, +13.1425781250,210,1331.1354980469,,, +13.1445312500,210,1330.4029541016,,, +13.1464843750,210,1330.4029541016,,, +13.1484375000,210,1331.8681640625,,, +13.1503906250,210,1331.1354980469,,, +13.1523437500,210,1329.6702880859,,, +13.1542968750,210,1330.4029541016,,, +13.1562500000,210,1331.1354980469,,, +13.1582031250,210,1331.1354980469,,, +13.1601562500,210,1331.1354980469,,, +13.1621093750,210,1333.3333740234,,, +13.1640625000,210,1332.6007080078,,, +13.1660156250,210,1333.3333740234,,, +13.1679687500,210,1334.7985839844,,, +13.1699218750,210,1333.3333740234,,, +13.1718750000,210,1334.0659179688,,, +13.1738281250,210,1335.5311279297,,, +13.1757812500,210,1334.7985839844,,, +13.1777343750,210,1336.2637939453,,, +13.1796875000,210,1335.5311279297,,, +13.1816406250,210,1335.5311279297,,, +13.1835937500,210,1337.7288818359,,, +13.1855468750,210,1337.7288818359,,, +13.1875000000,211,1337.7288818359,,, +13.1894531250,211,1338.4615478516,,, +13.1914062500,211,1339.1940917969,,, +13.1933593750,211,1340.6593017578,,, +13.1953125000,211,1339.9267578125,,, +13.1972656250,211,1339.9267578125,,, +13.1992187500,211,1341.3919677734,,, +13.2011718750,211,1339.9267578125,,, +13.2031250000,211,1340.6593017578,,, +13.2050781250,211,1339.9267578125,,, +13.2070312500,211,1339.1940917969,,, +13.2089843750,211,1341.3919677734,,, +13.2109375000,211,1339.9267578125,,, +13.2128906250,211,1340.6593017578,,, +13.2148437500,211,1342.1245117188,,, +13.2167968750,211,1342.8571777344,,, +13.2187500000,211,1344.3223876953,,, +13.2207031250,211,1344.3223876953,,, +13.2226562500,211,1345.0549316406,,, +13.2246093750,211,1346.5201416016,,, +13.2265625000,211,1346.5201416016,,, +13.2285156250,211,1347.2528076172,,, +13.2304687500,211,1346.5201416016,,, +13.2324218750,211,1346.5201416016,,, +13.2343750000,211,1348.7178955078,,, +13.2363281250,211,1347.2528076172,,, +13.2382812500,211,1347.9853515625,,, +13.2402343750,211,1347.2528076172,,, +13.2421875000,211,1347.9853515625,,, +13.2441406250,211,1347.2528076172,,, +13.2460937500,211,1346.5201416016,,, +13.2480468750,211,1347.2528076172,,, +13.2500000000,212,1345.0549316406,,, +13.2519531250,212,1345.0549316406,,, +13.2539062500,212,1344.3223876953,,, +13.2558593750,212,1342.1245117188,,, +13.2578125000,212,1342.1245117188,,, +13.2597656250,212,1341.3919677734,,, +13.2617187500,212,1339.9267578125,,, +13.2636718750,212,1339.1940917969,,, +13.2656250000,212,1337.7288818359,,, +13.2675781250,212,1335.5311279297,,, +13.2695312500,212,1334.0659179688,,, +13.2714843750,212,1331.8681640625,,, +13.2734375000,212,1330.4029541016,,, +13.2753906250,212,1330.4029541016,,, +13.2773437500,212,1328.9377441406,,, +13.2792968750,212,1328.9377441406,,, +13.2812500000,212,1326.0073242188,,, +13.2832031250,212,1323.8095703125,,, +13.2851562500,212,1323.8095703125,,, +13.2871093750,212,1321.6116943359,,, +13.2890625000,212,1319.4139404297,,, +13.2910156250,212,1317.9487304688,,, +13.2929687500,212,1315.7509765625,,, +13.2949218750,212,1315.0183105469,,, +13.2968750000,212,1313.5531005859,,, +13.2988281250,212,1312.0878906250,,, +13.3007812500,212,1312.0878906250,,, +13.3027343750,212,1310.6226806641,,, +13.3046875000,212,1309.8901367188,,, +13.3066406250,212,1309.1574707031,,, +13.3085937500,212,1307.6922607422,,, +13.3105468750,212,1307.6922607422,,, +13.3125000000,213,1306.2270507812,,, +13.3144531250,213,1306.2270507812,,, +13.3164062500,213,1304.7619628906,,, +13.3183593750,213,1303.2967529297,,, +13.3203125000,213,1302.5640869141,,, +13.3222656250,213,1301.0988769531,,, +13.3242187500,213,1301.0988769531,,, +13.3261718750,213,1300.3663330078,,, +13.3281250000,213,1299.6336669922,,, +13.3300781250,213,1298.9011230469,,, +13.3320312500,213,1298.1684570312,,, +13.3339843750,213,1296.7032470703,,, +13.3359375000,213,1295.9707031250,,, +13.3378906250,213,1295.2380371094,,, +13.3398437500,213,1294.5054931641,,, +13.3417968750,213,1293.7729492188,,, +13.3437500000,213,1294.5054931641,,, +13.3457031250,213,1295.9707031250,,, +13.3476562500,213,1296.7032470703,,, +13.3496093750,213,1298.1684570312,,, +13.3515625000,213,1299.6336669922,,, +13.3535156250,213,1301.0988769531,,, +13.3554687500,213,1304.7619628906,,, +13.3574218750,213,1307.6922607422,,, +13.3593750000,213,1311.3553466797,,, +13.3613281250,213,1316.4835205078,,, +13.3632812500,213,1320.8791503906,,, +13.3652343750,213,1328.2050781250,,, +13.3671875000,213,1333.3333740234,,, +13.3691406250,213,1339.1940917969,,, +13.3710937500,213,1347.2528076172,,, +13.3730468750,213,1354.5787353516,,, +13.3750000000,214,1364.1025390625,,, +13.3769531250,214,1372.1611328125,,, +13.3789062500,214,1382.4176025391,,, +13.3808593750,214,1393.4066162109,,, +13.3828125000,214,1403.6629638672,,, +13.3847656250,214,1415.3846435547,,, +13.3867187500,214,1427.1062011719,,, +13.3886718750,214,1438.8278808594,,, +13.3906250000,214,1452.7471923828,,, +13.3925781250,214,1466.6666259766,,, +13.3945312500,214,1481.3187255859,,, +13.3964843750,214,1496.7032470703,,, +13.3984375000,214,1510.6226806641,,, +13.4003906250,214,1526.0073242188,,, +13.4023437500,214,1543.5897216797,,, +13.4042968750,214,1558.2416992188,,, +13.4062500000,214,1573.6263427734,,, +13.4082031250,214,1590.4761962891,,, +13.4101562500,214,1606.5933837891,,, +13.4121093750,214,1621.2453613281,,, +13.4140625000,214,1635.8974609375,,, +13.4160156250,214,1652.0146484375,,, +13.4179687500,214,1665.9340820312,,, +13.4199218750,214,1680.5860595703,,, +13.4218750000,214,1695.9707031250,,, +13.4238281250,214,1708.4249267578,,, +13.4257812500,214,1721.6116943359,,, +13.4277343750,214,1736.2637939453,,, +13.4296875000,214,1748.7178955078,,, +13.4316406250,214,1760.4395751953,,, +13.4335937500,214,1773.6263427734,,, +13.4355468750,214,1785.3480224609,,, +13.4375000000,215,1794.8718261719,,, +13.4394531250,215,1805.8608398438,,, +13.4414062500,215,1814.6519775391,,, +13.4433593750,215,1823.4432373047,,, +13.4453125000,215,1832.2343750000,,, +13.4472656250,215,1838.0952148438,,, +13.4492187500,215,1844.6885986328,,, +13.4511718750,215,1848.3516845703,,, +13.4531250000,215,1853.4798583984,,, +13.4550781250,215,1857.8754882812,,, +13.4570312500,215,1859.3406982422,,, +13.4589843750,215,1860.8059082031,,, +13.4609375000,215,1861.5384521484,,, +13.4628906250,215,1861.5384521484,,, +13.4648437500,215,1861.5384521484,,, +13.4667968750,215,1859.3406982422,,, +13.4687500000,215,1856.4102783203,,, +13.4707031250,215,1852.7471923828,,, +13.4726562500,215,1848.3516845703,,, +13.4746093750,215,1843.2233886719,,, +13.4765625000,215,1837.3626708984,,, +13.4785156250,215,1830.7692871094,,, +13.4804687500,215,1822.7105712891,,, +13.4824218750,215,1814.6519775391,,, +13.4843750000,215,1806.5933837891,,, +13.4863281250,215,1797.0695800781,,, +13.4882812500,215,1789.0109863281,,, +13.4902343750,215,1778.7546386719,,, +13.4921875000,215,1767.7656250000,,, +13.4941406250,215,1758.2416992188,,, +13.4960937500,215,1747.2528076172,,, +13.4980468750,215,1736.9963378906,,, +13.5000000000,216,1726.0073242188,,, +13.5019531250,216,1715.7509765625,,, +13.5039062500,216,1703.2967529297,,, +13.5058593750,216,1691.5750732422,,, +13.5078125000,216,1678.3883056641,,, +13.5097656250,216,1665.9340820312,,, +13.5117187500,216,1654.2124023438,,, +13.5136718750,216,1641.7583007812,,, +13.5156250000,216,1630.7692871094,,, +13.5175781250,216,1617.5823974609,,, +13.5195312500,216,1605.1281738281,,, +13.5214843750,216,1593.4066162109,,, +13.5234375000,216,1580.2197265625,,, +13.5253906250,216,1569.2307128906,,, +13.5273437500,216,1556.7766113281,,, +13.5292968750,216,1545.0549316406,,, +13.5312500000,216,1531.8681640625,,, +13.5332031250,216,1520.1464843750,,, +13.5351562500,216,1508.4249267578,,, +13.5371093750,216,1496.7032470703,,, +13.5390625000,216,1487.9121093750,,, +13.5410156250,216,1476.9230957031,,, +13.5429687500,216,1467.3992919922,,, +13.5449218750,216,1456.4102783203,,, +13.5468750000,216,1447.6190185547,,, +13.5488281250,216,1438.8278808594,,, +13.5507812500,216,1429.3040771484,,, +13.5527343750,216,1421.9780273438,,, +13.5546875000,216,1413.9194335938,,, +13.5566406250,216,1407.3260498047,,, +13.5585937500,216,1399.2674560547,,, +13.5605468750,216,1392.6739501953,,, +13.5625000000,217,1388.2784423828,,, +13.5644531250,217,1381.6849365234,,, +13.5664062500,217,1377.2894287109,,, +13.5683593750,217,1372.1611328125,,, +13.5703125000,217,1367.0329589844,,, +13.5722656250,217,1363.3699951172,,, +13.5742187500,217,1358.2416992188,,, +13.5761718750,217,1354.5787353516,,, +13.5781250000,217,1349.4505615234,,, +13.5800781250,217,1345.7875976562,,, +13.5820312500,217,1341.3919677734,,, +13.5839843750,217,1337.7288818359,,, +13.5859375000,217,1335.5311279297,,, +13.5878906250,217,1332.6007080078,,, +13.5898437500,217,1330.4029541016,,, +13.5917968750,217,1327.4725341797,,, +13.5937500000,217,1325.2747802734,,, +13.5957031250,217,1324.5421142578,,, +13.5976562500,217,1322.3443603516,,, +13.5996093750,217,1320.1464843750,,, +13.6015625000,217,1318.6812744141,,, +13.6035156250,217,1316.4835205078,,, +13.6054687500,217,1315.7509765625,,, +13.6074218750,217,1314.2857666016,,, +13.6093750000,217,1313.5531005859,,, +13.6113281250,217,1312.8205566406,,, +13.6132812500,217,1309.1574707031,,, +13.6152343750,217,1310.6226806641,,, +13.6171875000,217,1309.1574707031,,, +13.6191406250,217,1309.1574707031,,, +13.6210937500,217,1308.4249267578,,, +13.6230468750,217,1307.6922607422,,, +13.6250000000,218,1309.1574707031,,, +13.6269531250,218,1309.1574707031,,, +13.6289062500,218,1309.8901367188,,, +13.6308593750,218,1308.4249267578,,, +13.6328125000,218,1309.1574707031,,, +13.6347656250,218,1310.6226806641,,, +13.6367187500,218,1311.3553466797,,, +13.6386718750,218,1313.5531005859,,, +13.6406250000,218,1314.2857666016,,, +13.6425781250,218,1317.2160644531,,, +13.6445312500,218,1317.2160644531,,, +13.6464843750,218,1318.6812744141,,, +13.6484375000,218,1320.1464843750,,, +13.6503906250,218,1321.6116943359,,, +13.6523437500,218,1324.5421142578,,, +13.6542968750,218,1325.2747802734,,, +13.6562500000,218,1327.4725341797,,, +13.6582031250,218,1328.2050781250,,, +13.6601562500,218,1330.4029541016,,, +13.6621093750,218,1334.0659179688,,, +13.6640625000,218,1334.7985839844,,, +13.6660156250,218,1338.4615478516,,, +13.6679687500,218,1339.9267578125,,, +13.6699218750,218,1342.1245117188,,, +13.6718750000,218,1343.5897216797,,, +13.6738281250,218,1345.0549316406,,, +13.6757812500,218,1347.9853515625,,, +13.6777343750,218,1347.2528076172,,, +13.6796875000,218,1350.9157714844,,, +13.6816406250,218,1351.6483154297,,, +13.6835937500,218,1353.1135253906,,, +13.6855468750,218,1353.1135253906,,, +13.6875000000,219,1353.8461914062,,, +13.6894531250,219,1355.3114013672,,, +13.6914062500,219,1354.5787353516,,, +13.6933593750,219,1356.0439453125,,, +13.6953125000,219,1356.7766113281,,, +13.6972656250,219,1358.2416992188,,, +13.6992187500,219,1358.2416992188,,, +13.7011718750,219,1358.9743652344,,, +13.7031250000,219,1358.9743652344,,, +13.7050781250,219,1358.9743652344,,, +13.7070312500,219,1360.4395751953,,, +13.7089843750,219,1361.1721191406,,, +13.7109375000,219,1361.9047851562,,, +13.7128906250,219,1363.3699951172,,, +13.7148437500,219,1364.8352050781,,, +13.7167968750,219,1364.8352050781,,, +13.7187500000,219,1365.5677490234,,, +13.7207031250,219,1367.0329589844,,, +13.7226562500,219,1365.5677490234,,, +13.7246093750,219,1366.3004150391,,, +13.7265625000,219,1366.3004150391,,, +13.7285156250,219,1365.5677490234,,, +13.7304687500,219,1367.7656250000,,, +13.7324218750,219,1367.0329589844,,, +13.7343750000,219,1367.0329589844,,, +13.7363281250,219,1366.3004150391,,, +13.7382812500,219,1366.3004150391,,, +13.7402343750,219,1366.3004150391,,, +13.7421875000,219,1364.8352050781,,, +13.7441406250,219,1364.8352050781,,, +13.7460937500,219,1364.1025390625,,, +13.7480468750,219,1364.1025390625,,, +13.7500000000,220,1361.9047851562,,, +13.7519531250,220,1363.3699951172,,, +13.7539062500,220,1361.9047851562,,, +13.7558593750,220,1363.3699951172,,, +13.7578125000,220,1362.6373291016,,, +13.7597656250,220,1361.1721191406,,, +13.7617187500,220,1361.1721191406,,, +13.7636718750,220,1359.7069091797,,, +13.7656250000,220,1360.4395751953,,, +13.7675781250,220,1358.2416992188,,, +13.7695312500,220,1358.9743652344,,, +13.7714843750,220,1356.7766113281,,, +13.7734375000,220,1356.0439453125,,, +13.7753906250,220,1356.0439453125,,, +13.7773437500,220,1353.8461914062,,, +13.7792968750,220,1353.1135253906,,, +13.7812500000,220,1350.9157714844,,, +13.7832031250,220,1349.4505615234,,, +13.7851562500,220,1347.2528076172,,, +13.7871093750,220,1345.7875976562,,, +13.7890625000,220,1344.3223876953,,, +13.7910156250,220,1342.1245117188,,, +13.7929687500,220,1340.6593017578,,, +13.7949218750,220,1337.7288818359,,, +13.7968750000,220,1336.9963378906,,, +13.7988281250,220,1333.3333740234,,, +13.8007812500,220,1331.1354980469,,, +13.8027343750,220,1328.2050781250,,, +13.8046875000,220,1325.2747802734,,, +13.8066406250,220,1323.0769042969,,, +13.8085937500,220,1319.4139404297,,, +13.8105468750,220,1317.9487304688,,, +13.8125000000,221,1314.2857666016,,, +13.8144531250,221,1311.3553466797,,, +13.8164062500,221,1308.4249267578,,, +13.8183593750,221,1305.4945068359,,, +13.8203125000,221,1304.7619628906,,, +13.8222656250,221,1301.0988769531,,, +13.8242187500,221,1299.6336669922,,, +13.8261718750,221,1295.9707031250,,, +13.8281250000,221,1293.7729492188,,, +13.8300781250,221,1293.0402832031,,, +13.8320312500,221,1289.3773193359,,, +13.8339843750,221,1289.3773193359,,, +13.8359375000,221,1286.4468994141,,, +13.8378906250,221,1285.7142333984,,, +13.8398437500,221,1283.5164794922,,, +13.8417968750,221,1282.0512695312,,, +13.8437500000,221,1282.0512695312,,, +13.8457031250,221,1279.8535156250,,, +13.8476562500,221,1279.1208496094,,, +13.8496093750,221,1277.6556396484,,, +13.8515625000,221,1276.1904296875,,, +13.8535156250,221,1275.4578857422,,, +13.8554687500,221,1273.2601318359,,, +13.8574218750,221,1273.9926757812,,, +13.8593750000,221,1273.2601318359,,, +13.8613281250,221,1273.9926757812,,, +13.8632812500,221,1273.9926757812,,, +13.8652343750,221,1273.9926757812,,, +13.8671875000,221,1273.2601318359,,, +13.8691406250,221,1273.9926757812,,, +13.8710937500,221,1273.2601318359,,, +13.8730468750,221,1273.9926757812,,, +13.8750000000,222,1274.7252197266,,, +13.8769531250,222,1275.4578857422,,, +13.8789062500,222,1276.9230957031,,, +13.8808593750,222,1276.9230957031,,, +13.8828125000,222,1278.3883056641,,, +13.8847656250,222,1277.6556396484,,, +13.8867187500,222,1279.1208496094,,, +13.8886718750,222,1279.8535156250,,, +13.8906250000,222,1279.1208496094,,, +13.8925781250,222,1282.0512695312,,, +13.8945312500,222,1281.3187255859,,, +13.8964843750,222,1282.0512695312,,, +13.8984375000,222,1282.7839355469,,, +13.9003906250,222,1282.7839355469,,, +13.9023437500,222,1284.2490234375,,, +13.9042968750,222,1284.2490234375,,, +13.9062500000,222,1286.4468994141,,, +13.9082031250,222,1286.4468994141,,, +13.9101562500,222,1287.9121093750,,, +13.9121093750,222,1287.9121093750,,, +13.9140625000,222,1288.6446533203,,, +13.9160156250,222,1289.3773193359,,, +13.9179687500,222,1290.1098632812,,, +13.9199218750,222,1291.5750732422,,, +13.9218750000,222,1290.8425292969,,, +13.9238281250,222,1292.3077392578,,, +13.9257812500,222,1292.3077392578,,, +13.9277343750,222,1293.0402832031,,, +13.9296875000,222,1291.5750732422,,, +13.9316406250,222,1293.0402832031,,, +13.9335937500,222,1293.7729492188,,, +13.9355468750,222,1293.7729492188,,, +13.9375000000,223,1296.7032470703,,, +13.9394531250,223,1296.7032470703,,, +13.9414062500,223,1298.1684570312,,, +13.9433593750,223,1298.9011230469,,, +13.9453125000,223,1300.3663330078,,, +13.9472656250,223,1302.5640869141,,, +13.9492187500,223,1303.2967529297,,, +13.9511718750,223,1306.2270507812,,, +13.9531250000,223,1306.2270507812,,, +13.9550781250,223,1307.6922607422,,, +13.9570312500,223,1308.4249267578,,, +13.9589843750,223,1309.1574707031,,, +13.9609375000,223,1312.0878906250,,, +13.9628906250,223,1312.8205566406,,, +13.9648437500,223,1315.0183105469,,, +13.9667968750,223,1315.0183105469,,, +13.9687500000,223,1315.7509765625,,, +13.9707031250,223,1317.9487304688,,, +13.9726562500,223,1319.4139404297,,, +13.9746093750,223,1321.6116943359,,, +13.9765625000,223,1320.8791503906,,, +13.9785156250,223,1321.6116943359,,, +13.9804687500,223,1322.3443603516,,, +13.9824218750,223,1322.3443603516,,, +13.9843750000,223,1323.8095703125,,, +13.9863281250,223,1323.8095703125,,, +13.9882812500,223,1323.8095703125,,, +13.9902343750,223,1323.0769042969,,, +13.9921875000,223,1324.5421142578,,, +13.9941406250,223,1323.8095703125,,, +13.9960937500,223,1324.5421142578,,, +13.9980468750,223,1324.5421142578,,, +14.0000000000,224,1324.5421142578,,, +14.0019531250,224,1324.5421142578,,, +14.0039062500,224,1324.5421142578,,, +14.0058593750,224,1325.2747802734,,, +14.0078125000,224,1325.2747802734,,, +14.0097656250,224,1326.7398681641,,, +14.0117187500,224,1326.0073242188,,, +14.0136718750,224,1326.7398681641,,, +14.0156250000,224,1326.7398681641,,, +14.0175781250,224,1328.2050781250,,, +14.0195312500,224,1326.7398681641,,, +14.0214843750,224,1326.7398681641,,, +14.0234375000,224,1326.0073242188,,, +14.0253906250,224,1326.7398681641,,, +14.0273437500,224,1326.0073242188,,, +14.0292968750,224,1326.0073242188,,, +14.0312500000,224,1325.2747802734,,, +14.0332031250,224,1324.5421142578,,, +14.0351562500,224,1324.5421142578,,, +14.0371093750,224,1323.0769042969,,, +14.0390625000,224,1323.0769042969,,, +14.0410156250,224,1321.6116943359,,, +14.0429687500,224,1321.6116943359,,, +14.0449218750,224,1320.8791503906,,, +14.0468750000,224,1320.8791503906,,, +14.0488281250,224,1318.6812744141,,, +14.0507812500,224,1318.6812744141,,, +14.0527343750,224,1317.2160644531,,, +14.0546875000,224,1315.7509765625,,, +14.0566406250,224,1315.7509765625,,, +14.0585937500,224,1314.2857666016,,, +14.0605468750,224,1313.5531005859,,, +14.0625000000,225,1310.6226806641,,, +14.0644531250,225,1311.3553466797,,, +14.0664062500,225,1309.8901367188,,, +14.0683593750,225,1309.8901367188,,, +14.0703125000,225,1307.6922607422,,, +14.0722656250,225,1308.4249267578,,, +14.0742187500,225,1306.2270507812,,, +14.0761718750,225,1306.2270507812,,, +14.0781250000,225,1306.2270507812,,, +14.0800781250,225,1305.4945068359,,, +14.0820312500,225,1306.2270507812,,, +14.0839843750,225,1305.4945068359,,, +14.0859375000,225,1307.6922607422,,, +14.0878906250,225,1306.2270507812,,, +14.0898437500,225,1306.9597167969,,, +14.0917968750,225,1306.2270507812,,, +14.0937500000,225,1306.9597167969,,, +14.0957031250,225,1305.4945068359,,, +14.0976562500,225,1306.2270507812,,, +14.0996093750,225,1305.4945068359,,, +14.1015625000,225,1305.4945068359,,, +14.1035156250,225,1306.9597167969,,, +14.1054687500,225,1306.2270507812,,, +14.1074218750,225,1307.6922607422,,, +14.1093750000,225,1306.9597167969,,, +14.1113281250,225,1307.6922607422,,, +14.1132812500,225,1306.9597167969,,, +14.1152343750,225,1306.9597167969,,, +14.1171875000,225,1306.9597167969,,, +14.1191406250,225,1306.9597167969,,, +14.1210937500,225,1306.9597167969,,, +14.1230468750,225,1305.4945068359,,, +14.1250000000,226,1306.2270507812,,, +14.1269531250,226,1305.4945068359,,, +14.1289062500,226,1306.2270507812,,, +14.1308593750,226,1305.4945068359,,, +14.1328125000,226,1306.2270507812,,, +14.1347656250,226,1304.7619628906,,, +14.1367187500,226,1304.7619628906,,, +14.1386718750,226,1304.0292968750,,, +14.1406250000,226,1304.0292968750,,, +14.1425781250,226,1304.0292968750,,, +14.1445312500,226,1304.0292968750,,, +14.1464843750,226,1304.7619628906,,, +14.1484375000,226,1304.0292968750,,, +14.1503906250,226,1304.7619628906,,, +14.1523437500,226,1304.7619628906,,, +14.1542968750,226,1305.4945068359,,, +14.1562500000,226,1306.2270507812,,, +14.1582031250,226,1307.6922607422,,, +14.1601562500,226,1310.6226806641,,, +14.1621093750,226,1311.3553466797,,, +14.1640625000,226,1314.2857666016,,, +14.1660156250,226,1315.7509765625,,, +14.1679687500,226,1318.6812744141,,, +14.1699218750,226,1319.4139404297,,, +14.1718750000,226,1321.6116943359,,, +14.1738281250,226,1325.2747802734,,, +14.1757812500,226,1327.4725341797,,, +14.1777343750,226,1332.6007080078,,, +14.1796875000,226,1336.2637939453,,, +14.1816406250,226,1341.3919677734,,, +14.1835937500,226,1345.7875976562,,, +14.1855468750,226,1350.9157714844,,, +14.1875000000,227,1356.7766113281,,, +14.1894531250,227,1361.9047851562,,, +14.1914062500,227,1369.9633789062,,, +14.1933593750,227,1376.5567626953,,, +14.1953125000,227,1386.0805664062,,, +14.1972656250,227,1394.1391601562,,, +14.1992187500,227,1402.1977539062,,, +14.2011718750,227,1411.7215576172,,, +14.2031250000,227,1421.2453613281,,, +14.2050781250,227,1432.9670410156,,, +14.2070312500,227,1444.6885986328,,, +14.2089843750,227,1456.4102783203,,, +14.2109375000,227,1468.8645019531,,, +14.2128906250,227,1482.0512695312,,, +14.2148437500,227,1495.2380371094,,, +14.2167968750,227,1509.8901367188,,, +14.2187500000,227,1523.8095703125,,, +14.2207031250,227,1539.1940917969,,, +14.2226562500,227,1554.5787353516,,, +14.2246093750,227,1569.2307128906,,, +14.2265625000,227,1585.3480224609,,, +14.2285156250,227,1599.2674560547,,, +14.2304687500,227,1615.3846435547,,, +14.2324218750,227,1629.3040771484,,, +14.2343750000,227,1645.4212646484,,, +14.2363281250,227,1658.6080322266,,, +14.2382812500,227,1674.7252197266,,, +14.2402343750,227,1687.9121093750,,, +14.2421875000,227,1702.5640869141,,, +14.2441406250,227,1715.7509765625,,, +14.2460937500,227,1728.9377441406,,, +14.2480468750,227,1739.9267578125,,, +14.2500000000,228,1752.3809814453,,, +14.2519531250,228,1764.1025390625,,, +14.2539062500,228,1775.0915527344,,, +14.2558593750,228,1786.0805664062,,, +14.2578125000,228,1795.6043701172,,, +14.2597656250,228,1803.6629638672,,, +14.2617187500,228,1811.7215576172,,, +14.2636718750,228,1820.5128173828,,, +14.2656250000,228,1826.3736572266,,, +14.2675781250,228,1832.2343750000,,, +14.2695312500,228,1836.6300048828,,, +14.2714843750,228,1840.2930908203,,, +14.2734375000,228,1843.9560546875,,, +14.2753906250,228,1845.4212646484,,, +14.2773437500,228,1848.3516845703,,, +14.2792968750,228,1849.0842285156,,, +14.2812500000,228,1849.8168945312,,, +14.2832031250,228,1847.6190185547,,, +14.2851562500,228,1846.1538085938,,, +14.2871093750,228,1841.7583007812,,, +14.2890625000,228,1836.6300048828,,, +14.2910156250,228,1831.5018310547,,, +14.2929687500,228,1825.6409912109,,, +14.2949218750,228,1819.0476074219,,, +14.2968750000,228,1810.9890136719,,, +14.2988281250,228,1804.3956298828,,, +14.3007812500,228,1804.3956298828,,, +14.3027343750,228,1794.8718261719,,, +14.3046875000,228,1786.8132324219,,, +14.3066406250,228,1776.5567626953,,, +14.3085937500,228,1766.3004150391,,, +14.3105468750,228,1754.5787353516,,, +14.3125000000,229,1745.0549316406,,, +14.3144531250,229,1733.3333740234,,, +14.3164062500,229,1721.6116943359,,, +14.3183593750,229,1709.8901367188,,, +14.3203125000,229,1697.4359130859,,, +14.3222656250,229,1684.2490234375,,, +14.3242187500,229,1671.7949218750,,, +14.3261718750,229,1658.6080322266,,, +14.3281250000,229,1646.8864746094,,, +14.3300781250,229,1633.6995849609,,, +14.3320312500,229,1620.5128173828,,, +14.3339843750,229,1608.0585937500,,, +14.3359375000,229,1595.6043701172,,, +14.3378906250,229,1583.1501464844,,, +14.3398437500,229,1570.6959228516,,, +14.3417968750,229,1558.9743652344,,, +14.3437500000,229,1546.5201416016,,, +14.3457031250,229,1534.7985839844,,, +14.3476562500,229,1522.3443603516,,, +14.3496093750,229,1510.6226806641,,, +14.3515625000,229,1499.6336669922,,, +14.3535156250,229,1487.9121093750,,, +14.3554687500,229,1478.3883056641,,, +14.3574218750,229,1467.3992919922,,, +14.3593750000,229,1458.6080322266,,, +14.3613281250,229,1448.3516845703,,, +14.3632812500,229,1438.8278808594,,, +14.3652343750,229,1430.0366210938,,, +14.3671875000,229,1421.2453613281,,, +14.3691406250,229,1413.9194335938,,, +14.3710937500,229,1405.8608398438,,, +14.3730468750,229,1400.0000000000,,, +14.3750000000,230,1393.4066162109,,, +14.3769531250,230,1385.3480224609,,, +14.3789062500,230,1379.4871826172,,, +14.3808593750,230,1375.0915527344,,, +14.3828125000,230,1368.4981689453,,, +14.3847656250,230,1363.3699951172,,, +14.3867187500,230,1356.0439453125,,, +14.3886718750,230,1350.9157714844,,, +14.3906250000,230,1344.3223876953,,, +14.3925781250,230,1340.6593017578,,, +14.3945312500,230,1334.7985839844,,, +14.3964843750,230,1330.4029541016,,, +14.3984375000,230,1323.8095703125,,, +14.4003906250,230,1320.1464843750,,, +14.4023437500,230,1315.0183105469,,, +14.4042968750,230,1309.8901367188,,, +14.4062500000,230,1303.2967529297,,, +14.4082031250,230,1299.6336669922,,, +14.4101562500,230,1293.7729492188,,, +14.4121093750,230,1290.1098632812,,, +14.4140625000,230,1285.7142333984,,, +14.4160156250,230,1282.0512695312,,, +14.4179687500,230,1277.6556396484,,, +14.4199218750,230,1274.7252197266,,, +14.4218750000,230,1271.0622558594,,, +14.4238281250,230,1266.6666259766,,, +14.4257812500,230,1263.0036621094,,, +14.4277343750,230,1263.0036621094,,, +14.4296875000,230,1260.8059082031,,, +14.4316406250,230,1257.1428222656,,, +14.4335937500,230,1254.2124023438,,, +14.4355468750,230,1251.2821044922,,, +14.4375000000,231,1249.0842285156,,, +14.4394531250,231,1246.8864746094,,, +14.4414062500,231,1244.6885986328,,, +14.4433593750,231,1243.2233886719,,, +14.4453125000,231,1241.7583007812,,, +14.4472656250,231,1241.0256347656,,, +14.4492187500,231,1240.2930908203,,, +14.4511718750,231,1241.0256347656,,, +14.4531250000,231,1240.2930908203,,, +14.4550781250,231,1241.7583007812,,, +14.4570312500,231,1241.7583007812,,, +14.4589843750,231,1243.2233886719,,, +14.4609375000,231,1244.6885986328,,, +14.4628906250,231,1246.8864746094,,, +14.4648437500,231,1249.0842285156,,, +14.4667968750,231,1251.2821044922,,, +14.4687500000,231,1253.4798583984,,, +14.4707031250,231,1254.9450683594,,, +14.4726562500,231,1258.6080322266,,, +14.4746093750,231,1260.8059082031,,, +14.4765625000,231,1263.7362060547,,, +14.4785156250,231,1267.3992919922,,, +14.4804687500,231,1270.3297119141,,, +14.4824218750,231,1273.2601318359,,, +14.4843750000,231,1276.9230957031,,, +14.4863281250,231,1280.5860595703,,, +14.4882812500,231,1282.7839355469,,, +14.4902343750,231,1286.4468994141,,, +14.4921875000,231,1290.1098632812,,, +14.4941406250,231,1293.7729492188,,, +14.4960937500,231,1296.7032470703,,, +14.4980468750,231,1300.3663330078,,, +14.5000000000,232,1303.2967529297,,, +14.5019531250,232,1306.9597167969,,, +14.5039062500,232,1309.8901367188,,, +14.5058593750,232,1312.8205566406,,, +14.5078125000,232,1317.2160644531,,, +14.5097656250,232,1320.1464843750,,, +14.5117187500,232,1324.5421142578,,, +14.5136718750,232,1328.2050781250,,, +14.5156250000,232,1334.0659179688,,, +14.5175781250,232,1337.7288818359,,, +14.5195312500,232,1342.1245117188,,, +14.5214843750,232,1345.7875976562,,, +14.5234375000,232,1350.9157714844,,, +14.5253906250,232,1353.8461914062,,, +14.5273437500,232,1358.9743652344,,, +14.5292968750,232,1361.1721191406,,, +14.5312500000,232,1365.5677490234,,, +14.5332031250,232,1367.7656250000,,, +14.5351562500,232,1370.6959228516,,, +14.5371093750,232,1372.8937988281,,, +14.5390625000,232,1375.0915527344,,, +14.5410156250,232,1378.0219726562,,, +14.5429687500,232,1380.2197265625,,, +14.5449218750,232,1381.6849365234,,, +14.5468750000,232,1382.4176025391,,, +14.5488281250,232,1383.1501464844,,, +14.5507812500,232,1383.8828125000,,, +14.5527343750,232,1385.3480224609,,, +14.5546875000,232,1385.3480224609,,, +14.5566406250,232,1386.8132324219,,, +14.5585937500,232,1386.0805664062,,, +14.5605468750,232,1386.8132324219,,, +14.5625000000,233,1386.0805664062,,, +14.5644531250,233,1385.3480224609,,, +14.5664062500,233,1385.3480224609,,, +14.5683593750,233,1384.6153564453,,, +14.5703125000,233,1384.6153564453,,, +14.5722656250,233,1383.1501464844,,, +14.5742187500,233,1383.1501464844,,, +14.5761718750,233,1381.6849365234,,, +14.5781250000,233,1381.6849365234,,, +14.5800781250,233,1380.2197265625,,, +14.5820312500,233,1380.2197265625,,, +14.5839843750,233,1378.0219726562,,, +14.5859375000,233,1378.0219726562,,, +14.5878906250,233,1375.8242187500,,, +14.5898437500,233,1375.0915527344,,, +14.5917968750,233,1372.1611328125,,, +14.5937500000,233,1371.4285888672,,, +14.5957031250,233,1369.2307128906,,, +14.5976562500,233,1367.0329589844,,, +14.5996093750,233,1362.6373291016,,, +14.6015625000,233,1361.1721191406,,, +14.6035156250,233,1357.5091552734,,, +14.6054687500,233,1355.3114013672,,, +14.6074218750,233,1350.9157714844,,, +14.6093750000,233,1347.9853515625,,, +14.6113281250,233,1344.3223876953,,, +14.6132812500,233,1341.3919677734,,, +14.6152343750,233,1337.7288818359,,, +14.6171875000,233,1335.5311279297,,, +14.6191406250,233,1331.8681640625,,, +14.6210937500,233,1329.6702880859,,, +14.6230468750,233,1326.0073242188,,, +14.6250000000,234,1323.0769042969,,, +14.6269531250,234,1320.8791503906,,, +14.6289062500,234,1318.6812744141,,, +14.6308593750,234,1315.7509765625,,, +14.6328125000,234,1314.2857666016,,, +14.6347656250,234,1311.3553466797,,, +14.6367187500,234,1309.1574707031,,, +14.6386718750,234,1306.9597167969,,, +14.6406250000,234,1305.4945068359,,, +14.6425781250,234,1302.5640869141,,, +14.6445312500,234,1301.0988769531,,, +14.6464843750,234,1298.1684570312,,, +14.6484375000,234,1296.7032470703,,, +14.6503906250,234,1295.2380371094,,, +14.6523437500,234,1293.7729492188,,, +14.6542968750,234,1291.5750732422,,, +14.6562500000,234,1290.8425292969,,, +14.6582031250,234,1289.3773193359,,, +14.6601562500,234,1288.6446533203,,, +14.6621093750,234,1287.9121093750,,, +14.6640625000,234,1287.9121093750,,, +14.6660156250,234,1286.4468994141,,, +14.6679687500,234,1287.1794433594,,, +14.6699218750,234,1286.4468994141,,, +14.6718750000,234,1285.7142333984,,, +14.6738281250,234,1285.7142333984,,, +14.6757812500,234,1285.7142333984,,, +14.6777343750,234,1285.7142333984,,, +14.6796875000,234,1286.4468994141,,, +14.6816406250,234,1287.9121093750,,, +14.6835937500,234,1287.1794433594,,, +14.6855468750,234,1287.9121093750,,, +14.6875000000,235,1287.1794433594,,, +14.6894531250,235,1287.9121093750,,, +14.6914062500,235,1287.1794433594,,, +14.6933593750,235,1287.1794433594,,, +14.6953125000,235,1286.4468994141,,, +14.6972656250,235,1286.4468994141,,, +14.6992187500,235,1285.7142333984,,, +14.7011718750,235,1287.1794433594,,, +14.7031250000,235,1286.4468994141,,, +14.7050781250,235,1287.1794433594,,, +14.7070312500,235,1285.7142333984,,, +14.7089843750,235,1286.4468994141,,, +14.7109375000,235,1285.7142333984,,, +14.7128906250,235,1286.4468994141,,, +14.7148437500,235,1284.9816894531,,, +14.7167968750,235,1286.4468994141,,, +14.7187500000,235,1287.1794433594,,, +14.7207031250,235,1287.9121093750,,, +14.7226562500,235,1287.9121093750,,, +14.7246093750,235,1289.3773193359,,, +14.7265625000,235,1290.1098632812,,, +14.7285156250,235,1291.5750732422,,, +14.7304687500,235,1292.3077392578,,, +14.7324218750,235,1294.5054931641,,, +14.7343750000,235,1295.9707031250,,, +14.7363281250,235,1296.7032470703,,, +14.7382812500,235,1297.4359130859,,, +14.7402343750,235,1298.1684570312,,, +14.7421875000,235,1299.6336669922,,, +14.7441406250,235,1299.6336669922,,, +14.7460937500,235,1301.8315429688,,, +14.7480468750,235,1301.8315429688,,, +14.7500000000,236,1303.2967529297,,, +14.7519531250,236,1304.7619628906,,, +14.7539062500,236,1305.4945068359,,, +14.7558593750,236,1306.9597167969,,, +14.7578125000,236,1306.9597167969,,, +14.7597656250,236,1309.1574707031,,, +14.7617187500,236,1309.1574707031,,, +14.7636718750,236,1309.8901367188,,, +14.7656250000,236,1311.3553466797,,, +14.7675781250,236,1310.6226806641,,, +14.7695312500,236,1311.3553466797,,, +14.7714843750,236,1311.3553466797,,, +14.7734375000,236,1311.3553466797,,, +14.7753906250,236,1311.3553466797,,, +14.7773437500,236,1311.3553466797,,, +14.7792968750,236,1310.6226806641,,, +14.7812500000,236,1309.8901367188,,, +14.7832031250,236,1308.4249267578,,, +14.7851562500,236,1307.6922607422,,, +14.7871093750,236,1305.4945068359,,, +14.7890625000,236,1304.7619628906,,, +14.7910156250,236,1303.2967529297,,, +14.7929687500,236,1303.2967529297,,, +14.7949218750,236,1301.8315429688,,, +14.7968750000,236,1301.0988769531,,, +14.7988281250,236,1298.9011230469,,, +14.8007812500,236,1298.1684570312,,, +14.8027343750,236,1296.7032470703,,, +14.8046875000,236,1296.7032470703,,, +14.8066406250,236,1295.2380371094,,, +14.8085937500,236,1295.9707031250,,, +14.8105468750,236,1294.5054931641,,, +14.8125000000,237,1294.5054931641,,, +14.8144531250,237,1293.7729492188,,, +14.8164062500,237,1295.2380371094,,, +14.8183593750,237,1294.5054931641,,, +14.8203125000,237,1295.2380371094,,, +14.8222656250,237,1294.5054931641,,, +14.8242187500,237,1294.5054931641,,, +14.8261718750,237,1293.7729492188,,, +14.8281250000,237,1293.7729492188,,, +14.8300781250,237,1293.0402832031,,, +14.8320312500,237,1293.7729492188,,, +14.8339843750,237,1293.7729492188,,, +14.8359375000,237,1293.7729492188,,, +14.8378906250,237,1293.0402832031,,, +14.8398437500,237,1293.7729492188,,, +14.8417968750,237,1293.0402832031,,, +14.8437500000,237,1293.7729492188,,, +14.8457031250,237,1293.0402832031,,, +14.8476562500,237,1293.7729492188,,, +14.8496093750,237,1293.7729492188,,, +14.8515625000,237,1294.5054931641,,, +14.8535156250,237,1295.2380371094,,, +14.8554687500,237,1295.9707031250,,, +14.8574218750,237,1295.9707031250,,, +14.8593750000,237,1295.9707031250,,, +14.8613281250,237,1296.7032470703,,, +14.8632812500,237,1298.1684570312,,, +14.8652343750,237,1297.4359130859,,, +14.8671875000,237,1298.9011230469,,, +14.8691406250,237,1298.9011230469,,, +14.8710937500,237,1299.6336669922,,, +14.8730468750,237,1299.6336669922,,, +14.8750000000,238,1300.3663330078,,, +14.8769531250,238,1300.3663330078,,, +14.8789062500,238,1300.3663330078,,, +14.8808593750,238,1302.5640869141,,, +14.8828125000,238,1302.5640869141,,, +14.8847656250,238,1302.5640869141,,, +14.8867187500,238,1304.7619628906,,, +14.8886718750,238,1304.7619628906,,, +14.8906250000,238,1307.6922607422,,, +14.8925781250,238,1307.6922607422,,, +14.8945312500,238,1309.1574707031,,, +14.8964843750,238,1309.1574707031,,, +14.8984375000,238,1310.6226806641,,, +14.9003906250,238,1311.3553466797,,, +14.9023437500,238,1312.0878906250,,, +14.9042968750,238,1314.2857666016,,, +14.9062500000,238,1314.2857666016,,, +14.9082031250,238,1315.7509765625,,, +14.9101562500,238,1315.7509765625,,, +14.9121093750,238,1315.7509765625,,, +14.9140625000,238,1315.7509765625,,, +14.9160156250,238,1316.4835205078,,, +14.9179687500,238,1317.2160644531,,, +14.9199218750,238,1317.9487304688,,, +14.9218750000,238,1318.6812744141,,, +14.9238281250,238,1318.6812744141,,, +14.9257812500,238,1320.8791503906,,, +14.9277343750,238,1322.3443603516,,, +14.9296875000,238,1323.8095703125,,, +14.9316406250,238,1324.5421142578,,, +14.9335937500,238,1326.0073242188,,, +14.9355468750,238,1328.9377441406,,, +14.9375000000,239,1331.1354980469,,, +14.9394531250,239,1334.7985839844,,, +14.9414062500,239,1336.9963378906,,, +14.9433593750,239,1340.6593017578,,, +14.9453125000,239,1344.3223876953,,, +14.9472656250,239,1348.7178955078,,, +14.9492187500,239,1354.5787353516,,, +14.9511718750,239,1358.9743652344,,, +14.9531250000,239,1363.3699951172,,, +14.9550781250,239,1369.9633789062,,, +14.9570312500,239,1375.0915527344,,, +14.9589843750,239,1383.8828125000,,, +14.9609375000,239,1390.4761962891,,, +14.9628906250,239,1399.2674560547,,, +14.9648437500,239,1407.3260498047,,, +14.9667968750,239,1415.3846435547,,, +14.9687500000,239,1425.6409912109,,, +14.9707031250,239,1434.4322509766,,, +14.9726562500,239,1443.9560546875,,, +14.9746093750,239,1454.9450683594,,, +14.9765625000,239,1464.4688720703,,, +14.9785156250,239,1477.6556396484,,, +14.9804687500,239,1487.9121093750,,, +14.9824218750,239,1499.6336669922,,, +14.9843750000,239,1512.0878906250,,, +14.9863281250,239,1523.8095703125,,, +14.9882812500,239,1536.2637939453,,, +14.9902343750,239,1547.9853515625,,, +14.9921875000,239,1559.7069091797,,, +14.9941406250,239,1574.3590087891,,, +14.9960937500,239,1585.3480224609,,, +14.9980468750,239,1600.0000000000,,, +15.0000000000,240,1610.9890136719,,, +15.0019531250,240,1622.7105712891,,, +15.0039062500,240,1635.1647949219,,, +15.0058593750,240,1646.8864746094,,, +15.0078125000,240,1657.8754882812,,, +15.0097656250,240,1668.1318359375,,, +15.0117187500,240,1677.6556396484,,, +15.0136718750,240,1688.6446533203,,, +15.0156250000,240,1698.1684570312,,, +15.0175781250,240,1706.9597167969,,, +15.0195312500,240,1716.4835205078,,, +15.0214843750,240,1723.8095703125,,, +15.0234375000,240,1731.8681640625,,, +15.0253906250,240,1738.4615478516,,, +15.0273437500,240,1742.8571777344,,, +15.0292968750,240,1749.4505615234,,, +15.0312500000,240,1753.1135253906,,, +15.0332031250,240,1756.7766113281,,, +15.0351562500,240,1759.7069091797,,, +15.0371093750,240,1761.1721191406,,, +15.0390625000,240,1764.1025390625,,, +15.0410156250,240,1764.1025390625,,, +15.0429687500,240,1764.1025390625,,, +15.0449218750,240,1764.8352050781,,, +15.0468750000,240,1762.6373291016,,, +15.0488281250,240,1762.6373291016,,, +15.0507812500,240,1759.7069091797,,, +15.0527343750,240,1757.5091552734,,, +15.0546875000,240,1754.5787353516,,, +15.0566406250,240,1750.9157714844,,, +15.0585937500,240,1747.9853515625,,, +15.0605468750,240,1742.8571777344,,, +15.0625000000,241,1736.9963378906,,, +15.0644531250,241,1731.8681640625,,, +15.0664062500,241,1723.8095703125,,, +15.0683593750,241,1717.9487304688,,, +15.0703125000,241,1709.1574707031,,, +15.0722656250,241,1700.3663330078,,, +15.0742187500,241,1692.3077392578,,, +15.0761718750,241,1682.7839355469,,, +15.0781250000,241,1674.7252197266,,, +15.0800781250,241,1664.4688720703,,, +15.0820312500,241,1654.2124023438,,, +15.0839843750,241,1643.9560546875,,, +15.0859375000,241,1632.9670410156,,, +15.0878906250,241,1623.4432373047,,, +15.0898437500,241,1612.4542236328,,, +15.0917968750,241,1602.1977539062,,, +15.0937500000,241,1591.2087402344,,, +15.0957031250,241,1580.9523925781,,, +15.0976562500,241,1569.9633789062,,, +15.0996093750,241,1557.5091552734,,, +15.1015625000,241,1547.9853515625,,, +15.1035156250,241,1535.5311279297,,, +15.1054687500,241,1523.0769042969,,, +15.1074218750,241,1514.2857666016,,, +15.1093750000,241,1503.2967529297,,, +15.1113281250,241,1493.0402832031,,, +15.1132812500,241,1482.7839355469,,, +15.1152343750,241,1473.2601318359,,, +15.1171875000,241,1464.4688720703,,, +15.1191406250,241,1454.9450683594,,, +15.1210937500,241,1446.1538085938,,, +15.1230468750,241,1437.3626708984,,, +15.1250000000,242,1428.5714111328,,, +15.1269531250,242,1421.9780273438,,, +15.1289062500,242,1413.9194335938,,, +15.1308593750,242,1406.5933837891,,, +15.1328125000,242,1399.2674560547,,, +15.1347656250,242,1391.9414062500,,, +15.1367187500,242,1385.3480224609,,, +15.1386718750,242,1377.2894287109,,, +15.1406250000,242,1370.6959228516,,, +15.1425781250,242,1364.1025390625,,, +15.1445312500,242,1357.5091552734,,, +15.1464843750,242,1351.6483154297,,, +15.1484375000,242,1345.0549316406,,, +15.1503906250,242,1341.3919677734,,, +15.1523437500,242,1333.3333740234,,, +15.1542968750,242,1328.9377441406,,, +15.1562500000,242,1325.2747802734,,, +15.1582031250,242,1318.6812744141,,, +15.1601562500,242,1315.0183105469,,, +15.1621093750,242,1310.6226806641,,, +15.1640625000,242,1305.4945068359,,, +15.1660156250,242,1302.5640869141,,, +15.1679687500,242,1298.1684570312,,, +15.1699218750,242,1294.5054931641,,, +15.1718750000,242,1291.5750732422,,, +15.1738281250,242,1287.1794433594,,, +15.1757812500,242,1285.7142333984,,, +15.1777343750,242,1282.0512695312,,, +15.1796875000,242,1279.8535156250,,, +15.1816406250,242,1279.1208496094,,, +15.1835937500,242,1276.1904296875,,, +15.1855468750,242,1273.9926757812,,, +15.1875000000,243,1271.7949218750,,, +15.1894531250,243,1270.3297119141,,, +15.1914062500,243,1268.8645019531,,, +15.1933593750,243,1267.3992919922,,, +15.1953125000,243,1267.3992919922,,, +15.1972656250,243,1265.9340820312,,, +15.1992187500,243,1265.2014160156,,, +15.2011718750,243,1264.4688720703,,, +15.2031250000,243,1263.7362060547,,, +15.2050781250,243,1265.2014160156,,, +15.2070312500,243,1265.2014160156,,, +15.2089843750,243,1266.6666259766,,, +15.2109375000,243,1266.6666259766,,, +15.2128906250,243,1266.6666259766,,, +15.2148437500,243,1268.8645019531,,, +15.2167968750,243,1268.8645019531,,, +15.2187500000,243,1270.3297119141,,, +15.2207031250,243,1271.7949218750,,, +15.2226562500,243,1273.2601318359,,, +15.2246093750,243,1274.7252197266,,, +15.2265625000,243,1276.9230957031,,, +15.2285156250,243,1281.3187255859,,, +15.2304687500,243,1282.0512695312,,, +15.2324218750,243,1286.4468994141,,, +15.2343750000,243,1288.6446533203,,, +15.2363281250,243,1291.5750732422,,, +15.2382812500,243,1294.5054931641,,, +15.2402343750,243,1294.5054931641,,, +15.2421875000,243,1298.1684570312,,, +15.2441406250,243,1302.5640869141,,, +15.2460937500,243,1304.7619628906,,, +15.2480468750,243,1309.1574707031,,, +15.2500000000,244,1311.3553466797,,, +15.2519531250,244,1315.0183105469,,, +15.2539062500,244,1317.9487304688,,, +15.2558593750,244,1320.8791503906,,, +15.2578125000,244,1325.2747802734,,, +15.2597656250,244,1328.2050781250,,, +15.2617187500,244,1332.6007080078,,, +15.2636718750,244,1335.5311279297,,, +15.2656250000,244,1339.1940917969,,, +15.2675781250,244,1342.8571777344,,, +15.2695312500,244,1345.7875976562,,, +15.2714843750,244,1350.1831054688,,, +15.2734375000,244,1352.3809814453,,, +15.2753906250,244,1355.3114013672,,, +15.2773437500,244,1357.5091552734,,, +15.2792968750,244,1359.7069091797,,, +15.2812500000,244,1361.9047851562,,, +15.2832031250,244,1364.1025390625,,, +15.2851562500,244,1367.7656250000,,, +15.2871093750,244,1368.4981689453,,, +15.2890625000,244,1370.6959228516,,, +15.2910156250,244,1372.1611328125,,, +15.2929687500,244,1374.3590087891,,, +15.2949218750,244,1375.0915527344,,, +15.2968750000,244,1375.8242187500,,, +15.2988281250,244,1378.0219726562,,, +15.3007812500,244,1378.0219726562,,, +15.3027343750,244,1380.2197265625,,, +15.3046875000,244,1380.2197265625,,, +15.3066406250,244,1380.9523925781,,, +15.3085937500,244,1380.9523925781,,, +15.3105468750,244,1381.6849365234,,, +15.3125000000,245,1382.4176025391,,, +15.3144531250,245,1383.8828125000,,, +15.3164062500,245,1383.8828125000,,, +15.3183593750,245,1384.6153564453,,, +15.3203125000,245,1383.8828125000,,, +15.3222656250,245,1384.6153564453,,, +15.3242187500,245,1384.6153564453,,, +15.3261718750,245,1384.6153564453,,, +15.3281250000,245,1385.3480224609,,, +15.3300781250,245,1384.6153564453,,, +15.3320312500,245,1384.6153564453,,, +15.3339843750,245,1383.1501464844,,, +15.3359375000,245,1382.4176025391,,, +15.3378906250,245,1381.6849365234,,, +15.3398437500,245,1380.2197265625,,, +15.3417968750,245,1380.2197265625,,, +15.3437500000,245,1378.7546386719,,, +15.3457031250,245,1378.7546386719,,, +15.3476562500,245,1376.5567626953,,, +15.3496093750,245,1376.5567626953,,, +15.3515625000,245,1376.5567626953,,, +15.3535156250,245,1375.8242187500,,, +15.3554687500,245,1376.5567626953,,, +15.3574218750,245,1375.0915527344,,, +15.3593750000,245,1374.3590087891,,, +15.3613281250,245,1372.8937988281,,, +15.3632812500,245,1372.1611328125,,, +15.3652343750,245,1371.4285888672,,, +15.3671875000,245,1369.2307128906,,, +15.3691406250,245,1369.2307128906,,, +15.3710937500,245,1366.3004150391,,, +15.3730468750,245,1365.5677490234,,, +15.3750000000,246,1363.3699951172,,, +15.3769531250,246,1362.6373291016,,, +15.3789062500,246,1361.1721191406,,, +15.3808593750,246,1358.2416992188,,, +15.3828125000,246,1358.2416992188,,, +15.3847656250,246,1356.0439453125,,, +15.3867187500,246,1353.8461914062,,, +15.3886718750,246,1352.3809814453,,, +15.3906250000,246,1350.1831054688,,, +15.3925781250,246,1349.4505615234,,, +15.3945312500,246,1347.2528076172,,, +15.3964843750,246,1347.2528076172,,, +15.3984375000,246,1344.3223876953,,, +15.4003906250,246,1342.8571777344,,, +15.4023437500,246,1342.1245117188,,, +15.4042968750,246,1339.9267578125,,, +15.4062500000,246,1339.1940917969,,, +15.4082031250,246,1336.9963378906,,, +15.4101562500,246,1336.2637939453,,, +15.4121093750,246,1334.0659179688,,, +15.4140625000,246,1332.6007080078,,, +15.4160156250,246,1330.4029541016,,, +15.4179687500,246,1328.9377441406,,, +15.4199218750,246,1326.7398681641,,, +15.4218750000,246,1325.2747802734,,, +15.4238281250,246,1324.5421142578,,, +15.4257812500,246,1322.3443603516,,, +15.4277343750,246,1322.3443603516,,, +15.4296875000,246,1320.8791503906,,, +15.4316406250,246,1320.1464843750,,, +15.4335937500,246,1317.2160644531,,, +15.4355468750,246,1315.0183105469,,, +15.4375000000,247,1314.2857666016,,, +15.4394531250,247,1311.3553466797,,, +15.4414062500,247,1310.6226806641,,, +15.4433593750,247,1307.6922607422,,, +15.4453125000,247,1306.9597167969,,, +15.4472656250,247,1304.0292968750,,, +15.4492187500,247,1302.5640869141,,, +15.4511718750,247,1299.6336669922,,, +15.4531250000,247,1298.1684570312,,, +15.4550781250,247,1296.7032470703,,, +15.4570312500,247,1294.5054931641,,, +15.4589843750,247,1293.0402832031,,, +15.4609375000,247,1290.1098632812,,, +15.4628906250,247,1290.1098632812,,, +15.4648437500,247,1287.9121093750,,, +15.4667968750,247,1287.9121093750,,, +15.4687500000,247,1285.7142333984,,, +15.4707031250,247,1285.7142333984,,, +15.4726562500,247,1284.2490234375,,, +15.4746093750,247,1284.2490234375,,, +15.4765625000,247,1283.5164794922,,, +15.4785156250,247,1283.5164794922,,, +15.4804687500,247,1282.0512695312,,, +15.4824218750,247,1280.5860595703,,, +15.4843750000,247,1279.8535156250,,, +15.4863281250,247,1278.3883056641,,, +15.4882812500,247,1278.3883056641,,, +15.4902343750,247,1278.3883056641,,, +15.4921875000,247,1279.1208496094,,, +15.4941406250,247,1279.8535156250,,, +15.4960937500,247,1281.3187255859,,, +15.4980468750,247,1282.0512695312,,, +15.5000000000,248,1283.5164794922,,, +15.5019531250,248,1284.9816894531,,, +15.5039062500,248,1286.4468994141,,, +15.5058593750,248,1287.1794433594,,, +15.5078125000,248,1289.3773193359,,, +15.5097656250,248,1287.9121093750,,, +15.5117187500,248,1290.1098632812,,, +15.5136718750,248,1290.1098632812,,, +15.5156250000,248,1290.8425292969,,, +15.5175781250,248,1291.5750732422,,, +15.5195312500,248,1290.8425292969,,, +15.5214843750,248,1291.5750732422,,, +15.5234375000,248,1291.5750732422,,, +15.5253906250,248,1293.7729492188,,, +15.5273437500,248,1292.3077392578,,, +15.5292968750,248,1293.7729492188,,, +15.5312500000,248,1293.7729492188,,, +15.5332031250,248,1295.2380371094,,, +15.5351562500,248,1294.5054931641,,, +15.5371093750,248,1295.2380371094,,, +15.5390625000,248,1294.5054931641,,, +15.5410156250,248,1295.2380371094,,, +15.5429687500,248,1294.5054931641,,, +15.5449218750,248,1295.2380371094,,, +15.5468750000,248,1293.7729492188,,, +15.5488281250,248,1293.0402832031,,, +15.5507812500,248,1292.3077392578,,, +15.5527343750,248,1290.8425292969,,, +15.5546875000,248,1290.8425292969,,, +15.5566406250,248,1290.1098632812,,, +15.5585937500,248,1290.1098632812,,, +15.5605468750,248,1287.9121093750,,, +15.5625000000,249,1289.3773193359,,, +15.5644531250,249,1288.6446533203,,, +15.5664062500,249,1289.3773193359,,, +15.5683593750,249,1287.9121093750,,, +15.5703125000,249,1287.9121093750,,, +15.5722656250,249,1287.1794433594,,, +15.5742187500,249,1287.9121093750,,, +15.5761718750,249,1286.4468994141,,, +15.5781250000,249,1286.4468994141,,, +15.5800781250,249,1285.7142333984,,, +15.5820312500,249,1284.9816894531,,, +15.5839843750,249,1284.9816894531,,, +15.5859375000,249,1284.2490234375,,, +15.5878906250,249,1284.9816894531,,, +15.5898437500,249,1284.2490234375,,, +15.5917968750,249,1284.9816894531,,, +15.5937500000,249,1283.5164794922,,, +15.5957031250,249,1284.2490234375,,, +15.5976562500,249,1284.2490234375,,, +15.5996093750,249,1285.7142333984,,, +15.6015625000,249,1285.7142333984,,, +15.6035156250,249,1287.1794433594,,, +15.6054687500,249,1287.1794433594,,, +15.6074218750,249,1289.3773193359,,, +15.6093750000,249,1289.3773193359,,, +15.6113281250,249,1291.5750732422,,, +15.6132812500,249,1292.3077392578,,, +15.6152343750,249,1294.5054931641,,, +15.6171875000,249,1296.7032470703,,, +15.6191406250,249,1298.1684570312,,, +15.6210937500,249,1300.3663330078,,, +15.6230468750,249,1303.2967529297,,, +15.6250000000,250,1306.2270507812,,, +15.6269531250,250,1309.1574707031,,, +15.6289062500,250,1314.2857666016,,, +15.6308593750,250,1318.6812744141,,, +15.6328125000,250,1324.5421142578,,, +15.6347656250,250,1328.9377441406,,, +15.6367187500,250,1335.5311279297,,, +15.6386718750,250,1341.3919677734,,, +15.6406250000,250,1347.2528076172,,, +15.6425781250,250,1353.8461914062,,, +15.6445312500,250,1360.4395751953,,, +15.6464843750,250,1367.7656250000,,, +15.6484375000,250,1375.8242187500,,, +15.6503906250,250,1384.6153564453,,, +15.6523437500,250,1391.9414062500,,, +15.6542968750,250,1401.4652099609,,, +15.6562500000,250,1410.9890136719,,, +15.6582031250,250,1421.2453613281,,, +15.6601562500,250,1431.5018310547,,, +15.6621093750,250,1443.2233886719,,, +15.6640625000,250,1452.7471923828,,, +15.6660156250,250,1465.9340820312,,, +15.6679687500,250,1476.1904296875,,, +15.6699218750,250,1489.3773193359,,, +15.6718750000,250,1500.3663330078,,, +15.6738281250,250,1513.5531005859,,, +15.6757812500,250,1525.2747802734,,, +15.6777343750,250,1537.7288818359,,, +15.6796875000,250,1549.4505615234,,, +15.6816406250,250,1562.6373291016,,, +15.6835937500,250,1575.0915527344,,, +15.6855468750,250,1586.8132324219,,, +15.6875000000,251,1599.2674560547,,, +15.6894531250,251,1611.7215576172,,, +15.6914062500,251,1624.1757812500,,, +15.6933593750,251,1634.4322509766,,, +15.6953125000,251,1647.6190185547,,, +15.6972656250,251,1657.8754882812,,, +15.6992187500,251,1669.5970458984,,, +15.7011718750,251,1679.1208496094,,, +15.7031250000,251,1689.3773193359,,, +15.7050781250,251,1698.9011230469,,, +15.7070312500,251,1706.2270507812,,, +15.7089843750,251,1715.0183105469,,, +15.7109375000,251,1721.6116943359,,, +15.7128906250,251,1728.9377441406,,, +15.7148437500,251,1735.5311279297,,, +15.7167968750,251,1742.1245117188,,, +15.7187500000,251,1746.5201416016,,, +15.7207031250,251,1750.9157714844,,, +15.7226562500,251,1754.5787353516,,, +15.7246093750,251,1756.7766113281,,, +15.7265625000,251,1758.2416992188,,, +15.7285156250,251,1760.4395751953,,, +15.7304687500,251,1761.1721191406,,, +15.7324218750,251,1761.1721191406,,, +15.7343750000,251,1760.4395751953,,, +15.7363281250,251,1757.5091552734,,, +15.7382812500,251,1756.0439453125,,, +15.7402343750,251,1751.6483154297,,, +15.7421875000,251,1749.4505615234,,, +15.7441406250,251,1744.3223876953,,, +15.7460937500,251,1739.1940917969,,, +15.7480468750,251,1733.3333740234,,, +15.7500000000,252,1727.4725341797,,, +15.7519531250,252,1719.4139404297,,, +15.7539062500,252,1712.8205566406,,, +15.7558593750,252,1704.7619628906,,, +15.7578125000,252,1696.7032470703,,, +15.7597656250,252,1687.9121093750,,, +15.7617187500,252,1679.8535156250,,, +15.7636718750,252,1670.3297119141,,, +15.7656250000,252,1660.8059082031,,, +15.7675781250,252,1650.5494384766,,, +15.7695312500,252,1641.0256347656,,, +15.7714843750,252,1630.7692871094,,, +15.7734375000,252,1619.0476074219,,, +15.7753906250,252,1608.7912597656,,, +15.7773437500,252,1597.8022460938,,, +15.7792968750,252,1586.8132324219,,, +15.7812500000,252,1575.8242187500,,, +15.7832031250,252,1566.3004150391,,, +15.7851562500,252,1554.5787353516,,, +15.7871093750,252,1543.5897216797,,, +15.7890625000,252,1533.3333740234,,, +15.7910156250,252,1523.0769042969,,, +15.7929687500,252,1512.0878906250,,, +15.7949218750,252,1500.3663330078,,, +15.7968750000,252,1490.1098632812,,, +15.7988281250,252,1478.3883056641,,, +15.8007812500,252,1470.3297119141,,, +15.8027343750,252,1459.3406982422,,, +15.8046875000,252,1450.5494384766,,, +15.8066406250,252,1438.8278808594,,, +15.8085937500,252,1430.7692871094,,, +15.8105468750,252,1420.5128173828,,, +15.8125000000,253,1410.2564697266,,, +15.8144531250,253,1400.0000000000,,, +15.8164062500,253,1389.7435302734,,, +15.8183593750,253,1380.9523925781,,, +15.8203125000,253,1369.2307128906,,, +15.8222656250,253,1361.1721191406,,, +15.8242187500,253,1351.6483154297,,, +15.8261718750,253,1342.1245117188,,, +15.8281250000,253,1333.3333740234,,, +15.8300781250,253,1326.0073242188,,, +15.8320312500,253,1317.2160644531,,, +15.8339843750,253,1310.6226806641,,, +15.8359375000,253,1302.5640869141,,, +15.8378906250,253,1295.9707031250,,, +15.8398437500,253,1288.6446533203,,, +15.8417968750,253,1282.0512695312,,, +15.8437500000,253,1275.4578857422,,, +15.8457031250,253,1268.1318359375,,, +15.8476562500,253,1263.0036621094,,, +15.8496093750,253,1257.1428222656,,, +15.8515625000,253,1252.0146484375,,, +15.8535156250,253,1247.6190185547,,, +15.8554687500,253,1243.2233886719,,, +15.8574218750,253,1239.5604248047,,, +15.8593750000,253,1235.1647949219,,, +15.8613281250,253,1232.2343750000,,, +15.8632812500,253,1230.0366210938,,, +15.8652343750,253,1227.1062011719,,, +15.8671875000,253,1225.6409912109,,, +15.8691406250,253,1222.7105712891,,, +15.8710937500,253,1221.9780273438,,, +15.8730468750,253,1220.5128173828,,, +15.8750000000,254,1220.5128173828,,, +15.8769531250,254,1219.0476074219,,, +15.8789062500,254,1219.0476074219,,, +15.8808593750,254,1219.7802734375,,, +15.8828125000,254,1221.2453613281,,, +15.8847656250,254,1220.5128173828,,, +15.8867187500,254,1223.4432373047,,, +15.8886718750,254,1224.1757812500,,, +15.8906250000,254,1226.3736572266,,, +15.8925781250,254,1227.1062011719,,, +15.8945312500,254,1229.3040771484,,, +15.8964843750,254,1230.7692871094,,, +15.8984375000,254,1233.6995849609,,, +15.9003906250,254,1235.1647949219,,, +15.9023437500,254,1238.0952148438,,, +15.9042968750,254,1239.5604248047,,, +15.9062500000,254,1241.0256347656,,, +15.9082031250,254,1243.9560546875,,, +15.9101562500,254,1246.1538085938,,, +15.9121093750,254,1249.0842285156,,, +15.9140625000,254,1251.2821044922,,, +15.9160156250,254,1254.9450683594,,, +15.9179687500,254,1257.8754882812,,, +15.9199218750,254,1263.7362060547,,, +15.9218750000,254,1265.9340820312,,, +15.9238281250,254,1271.0622558594,,, +15.9257812500,254,1274.7252197266,,, +15.9277343750,254,1279.1208496094,,, +15.9296875000,254,1282.7839355469,,, +15.9316406250,254,1286.4468994141,,, +15.9335937500,254,1292.3077392578,,, +15.9355468750,254,1295.9707031250,,, +15.9375000000,255,1301.0988769531,,, +15.9394531250,255,1305.4945068359,,, +15.9414062500,255,1309.8901367188,,, +15.9433593750,255,1313.5531005859,,, +15.9453125000,255,1317.2160644531,,, +15.9472656250,255,1320.8791503906,,, +15.9492187500,255,1325.2747802734,,, +15.9511718750,255,1329.6702880859,,, +15.9531250000,255,1332.6007080078,,, +15.9550781250,255,1338.4615478516,,, +15.9570312500,255,1342.1245117188,,, +15.9589843750,255,1347.9853515625,,, +15.9609375000,255,1350.1831054688,,, +15.9628906250,255,1356.0439453125,,, +15.9648437500,255,1358.9743652344,,, +15.9667968750,255,1364.1025390625,,, +15.9687500000,255,1366.3004150391,,, +15.9707031250,255,1369.9633789062,,, +15.9726562500,255,1372.1611328125,,, +15.9746093750,255,1376.5567626953,,, +15.9765625000,255,1378.7546386719,,, +15.9785156250,255,1380.9523925781,,, +15.9804687500,255,1383.8828125000,,, +15.9824218750,255,1385.3480224609,,, +15.9843750000,255,1387.5457763672,,, +15.9863281250,255,1388.2784423828,,, +15.9882812500,255,1389.7435302734,,, +15.9902343750,255,1390.4761962891,,, +15.9921875000,255,1391.9414062500,,, +15.9941406250,255,1391.2087402344,,, +15.9960937500,255,1393.4066162109,,, +15.9980468750,255,1394.1391601562,,, +16.0000000000,256,1394.8718261719,,, +16.0019531250,256,1394.1391601562,,, +16.0039062500,256,1394.1391601562,,, +16.0058593750,256,1394.1391601562,,, +16.0078125000,256,1394.1391601562,,, +16.0097656250,256,1392.6739501953,,, +16.0117187500,256,1392.6739501953,,, +16.0136718750,256,1392.6739501953,,, +16.0156250000,256,1391.2087402344,,, +16.0175781250,256,1391.2087402344,,, +16.0195312500,256,1389.7435302734,,, +16.0214843750,256,1389.7435302734,,, +16.0234375000,256,1386.8132324219,,, +16.0253906250,256,1386.8132324219,,, +16.0273437500,256,1383.8828125000,,, +16.0292968750,256,1380.9523925781,,, +16.0312500000,256,1377.2894287109,,, +16.0332031250,256,1374.3590087891,,, +16.0351562500,256,1371.4285888672,,, +16.0371093750,256,1367.7656250000,,, +16.0390625000,256,1365.5677490234,,, +16.0410156250,256,1361.9047851562,,, +16.0429687500,256,1359.7069091797,,, +16.0449218750,256,1356.7766113281,,, +16.0468750000,256,1353.8461914062,,, +16.0488281250,256,1350.1831054688,,, +16.0507812500,256,1347.2528076172,,, +16.0527343750,256,1344.3223876953,,, +16.0546875000,256,1340.6593017578,,, +16.0566406250,256,1337.7288818359,,, +16.0585937500,256,1334.0659179688,,, +16.0605468750,256,1331.8681640625,,, +16.0625000000,257,1328.9377441406,,, +16.0644531250,257,1326.7398681641,,, +16.0664062500,257,1324.5421142578,,, +16.0683593750,257,1323.0769042969,,, +16.0703125000,257,1320.1464843750,,, +16.0722656250,257,1317.9487304688,,, +16.0742187500,257,1315.7509765625,,, +16.0761718750,257,1313.5531005859,,, +16.0781250000,257,1312.0878906250,,, +16.0800781250,257,1309.8901367188,,, +16.0820312500,257,1309.1574707031,,, +16.0839843750,257,1306.9597167969,,, +16.0859375000,257,1306.9597167969,,, +16.0878906250,257,1304.7619628906,,, +16.0898437500,257,1304.0292968750,,, +16.0917968750,257,1302.5640869141,,, +16.0937500000,257,1301.0988769531,,, +16.0957031250,257,1300.3663330078,,, +16.0976562500,257,1298.9011230469,,, +16.0996093750,257,1299.6336669922,,, +16.1015625000,257,1298.1684570312,,, +16.1035156250,257,1299.6336669922,,, +16.1054687500,257,1296.7032470703,,, +16.1074218750,257,1296.7032470703,,, +16.1093750000,257,1295.2380371094,,, +16.1113281250,257,1295.9707031250,,, +16.1132812500,257,1294.5054931641,,, +16.1152343750,257,1293.7729492188,,, +16.1171875000,257,1293.7729492188,,, +16.1191406250,257,1293.0402832031,,, +16.1210937500,257,1293.0402832031,,, +16.1230468750,257,1293.0402832031,,, +16.1250000000,258,1293.7729492188,,, +16.1269531250,258,1293.7729492188,,, +16.1289062500,258,1295.9707031250,,, +16.1308593750,258,1295.9707031250,,, +16.1328125000,258,1298.1684570312,,, +16.1347656250,258,1298.1684570312,,, +16.1367187500,258,1300.3663330078,,, +16.1386718750,258,1299.6336669922,,, +16.1406250000,258,1301.0988769531,,, +16.1425781250,258,1301.8315429688,,, +16.1445312500,258,1302.5640869141,,, +16.1464843750,258,1304.0292968750,,, +16.1484375000,258,1304.0292968750,,, +16.1503906250,258,1306.2270507812,,, +16.1523437500,258,1306.2270507812,,, +16.1542968750,258,1306.9597167969,,, +16.1562500000,258,1306.9597167969,,, +16.1582031250,258,1306.9597167969,,, +16.1601562500,258,1307.6922607422,,, +16.1621093750,258,1308.4249267578,,, +16.1640625000,258,1309.8901367188,,, +16.1660156250,258,1309.8901367188,,, +16.1679687500,258,1312.0878906250,,, +16.1699218750,258,1312.0878906250,,, +16.1718750000,258,1312.0878906250,,, +16.1738281250,258,1312.8205566406,,, +16.1757812500,258,1312.8205566406,,, +16.1777343750,258,1314.2857666016,,, +16.1796875000,258,1315.0183105469,,, +16.1816406250,258,1315.0183105469,,, +16.1835937500,258,1316.4835205078,,, +16.1855468750,258,1316.4835205078,,, +16.1875000000,259,1317.2160644531,,, +16.1894531250,259,1317.2160644531,,, +16.1914062500,259,1316.4835205078,,, +16.1933593750,259,1317.9487304688,,, +16.1953125000,259,1317.2160644531,,, +16.1972656250,259,1318.6812744141,,, +16.1992187500,259,1317.9487304688,,, +16.2011718750,259,1317.2160644531,,, +16.2031250000,259,1317.9487304688,,, +16.2050781250,259,1317.9487304688,,, +16.2070312500,259,1318.6812744141,,, +16.2089843750,259,1317.2160644531,,, +16.2109375000,259,1317.9487304688,,, +16.2128906250,259,1317.2160644531,,, +16.2148437500,259,1317.9487304688,,, +16.2167968750,259,1317.2160644531,,, +16.2187500000,259,1315.7509765625,,, +16.2207031250,259,1315.7509765625,,, +16.2226562500,259,1314.2857666016,,, +16.2246093750,259,1315.0183105469,,, +16.2265625000,259,1314.2857666016,,, +16.2285156250,259,1314.2857666016,,, +16.2304687500,259,1312.8205566406,,, +16.2324218750,259,1312.8205566406,,, +16.2343750000,259,1310.6226806641,,, +16.2363281250,259,1309.1574707031,,, +16.2382812500,259,1306.2270507812,,, +16.2402343750,259,1304.0292968750,,, +16.2421875000,259,1303.2967529297,,, +16.2441406250,259,1301.8315429688,,, +16.2460937500,259,1300.3663330078,,, +16.2480468750,259,1298.9011230469,,, +16.2500000000,260,1297.4359130859,,, +16.2519531250,260,1297.4359130859,,, +16.2539062500,260,1295.9707031250,,, +16.2558593750,260,1295.9707031250,,, +16.2578125000,260,1294.5054931641,,, +16.2597656250,260,1295.2380371094,,, +16.2617187500,260,1295.9707031250,,, +16.2636718750,260,1295.9707031250,,, +16.2656250000,260,1296.7032470703,,, +16.2675781250,260,1297.4359130859,,, +16.2695312500,260,1297.4359130859,,, +16.2714843750,260,1298.9011230469,,, +16.2734375000,260,1298.1684570312,,, +16.2753906250,260,1298.9011230469,,, +16.2773437500,260,1298.1684570312,,, +16.2792968750,260,1298.9011230469,,, +16.2812500000,260,1298.9011230469,,, +16.2832031250,260,1299.6336669922,,, +16.2851562500,260,1300.3663330078,,, +16.2871093750,260,1301.8315429688,,, +16.2890625000,260,1302.5640869141,,, +16.2910156250,260,1305.4945068359,,, +16.2929687500,260,1306.9597167969,,, +16.2949218750,260,1308.4249267578,,, +16.2968750000,260,1310.6226806641,,, +16.2988281250,260,1312.0878906250,,, +16.3007812500,260,1315.7509765625,,, +16.3027343750,260,1317.9487304688,,, +16.3046875000,260,1323.0769042969,,, +16.3066406250,260,1325.2747802734,,, +16.3085937500,260,1331.1354980469,,, +16.3105468750,260,1336.2637939453,,, +16.3125000000,261,1342.1245117188,,, +16.3144531250,261,1348.7178955078,,, +16.3164062500,261,1355.3114013672,,, +16.3183593750,261,1362.6373291016,,, +16.3203125000,261,1371.4285888672,,, +16.3222656250,261,1378.7546386719,,, +16.3242187500,261,1389.0109863281,,, +16.3261718750,261,1398.5347900391,,, +16.3281250000,261,1408.7912597656,,, +16.3300781250,261,1420.5128173828,,, +16.3320312500,261,1431.5018310547,,, +16.3339843750,261,1445.4212646484,,, +16.3359375000,261,1459.3406982422,,, +16.3378906250,261,1473.2601318359,,, +16.3398437500,261,1487.1794433594,,, +16.3417968750,261,1501.0988769531,,, +16.3437500000,261,1517.2160644531,,, +16.3457031250,261,1531.8681640625,,, +16.3476562500,261,1548.7178955078,,, +16.3496093750,261,1564.1025390625,,, +16.3515625000,261,1579.4871826172,,, +16.3535156250,261,1596.3370361328,,, +16.3554687500,261,1613.9194335938,,, +16.3574218750,261,1632.2343750000,,, +16.3593750000,261,1647.6190185547,,, +16.3613281250,261,1664.4688720703,,, +16.3632812500,261,1681.3187255859,,, +16.3652343750,261,1696.7032470703,,, +16.3671875000,261,1712.8205566406,,, +16.3691406250,261,1727.4725341797,,, +16.3710937500,261,1743.5897216797,,, +16.3730468750,261,1757.5091552734,,, +16.3750000000,262,1770.6959228516,,, +16.3769531250,262,1783.8828125000,,, +16.3789062500,262,1794.8718261719,,, +16.3808593750,262,1808.7912597656,,, +16.3828125000,262,1819.0476074219,,, +16.3847656250,262,1828.5714111328,,, +16.3867187500,262,1838.8278808594,,, +16.3886718750,262,1846.8864746094,,, +16.3906250000,262,1855.6776123047,,, +16.3925781250,262,1862.2711181641,,, +16.3945312500,262,1868.8645019531,,, +16.3964843750,262,1875.4578857422,,, +16.3984375000,262,1879.8535156250,,, +16.4003906250,262,1884.2490234375,,, +16.4023437500,262,1887.9121093750,,, +16.4042968750,262,1890.8425292969,,, +16.4062500000,262,1891.5750732422,,, +16.4082031250,262,1893.7729492188,,, +16.4101562500,262,1893.0402832031,,, +16.4121093750,262,1893.0402832031,,, +16.4140625000,262,1891.5750732422,,, +16.4160156250,262,1888.6446533203,,, +16.4179687500,262,1885.7142333984,,, +16.4199218750,262,1881.3187255859,,, +16.4218750000,262,1876.1904296875,,, +16.4238281250,262,1869.5970458984,,, +16.4257812500,262,1863.7362060547,,, +16.4277343750,262,1856.4102783203,,, +16.4296875000,262,1847.6190185547,,, +16.4316406250,262,1839.5604248047,,, +16.4335937500,262,1830.0366210938,,, +16.4355468750,262,1821.9780273438,,, +16.4375000000,263,1811.7215576172,,, +16.4394531250,263,1800.7325439453,,, +16.4414062500,263,1790.4761962891,,, +16.4433593750,263,1778.0219726562,,, +16.4453125000,263,1767.0329589844,,, +16.4472656250,263,1754.5787353516,,, +16.4492187500,263,1742.1245117188,,, +16.4511718750,263,1728.9377441406,,, +16.4531250000,263,1716.4835205078,,, +16.4550781250,263,1704.0292968750,,, +16.4570312500,263,1690.8425292969,,, +16.4589843750,263,1679.8535156250,,, +16.4609375000,263,1666.6666259766,,, +16.4628906250,263,1654.2124023438,,, +16.4648437500,263,1641.7583007812,,, +16.4667968750,263,1630.7692871094,,, +16.4687500000,263,1618.3150634766,,, +16.4707031250,263,1605.8608398438,,, +16.4726562500,263,1594.1391601562,,, +16.4746093750,263,1581.6849365234,,, +16.4765625000,263,1571.4285888672,,, +16.4785156250,263,1560.4395751953,,, +16.4804687500,263,1550.1831054688,,, +16.4824218750,263,1539.1940917969,,, +16.4843750000,263,1528.9377441406,,, +16.4863281250,263,1517.2160644531,,, +16.4882812500,263,1507.6922607422,,, +16.4902343750,263,1496.7032470703,,, +16.4921875000,263,1486.4468994141,,, +16.4941406250,263,1477.6556396484,,, +16.4960937500,263,1467.3992919922,,, +16.4980468750,263,1458.6080322266,,, +16.5000000000,264,1449.8168945312,,, +16.5019531250,264,1441.7583007812,,, +16.5039062500,264,1433.6995849609,,, +16.5058593750,264,1426.3736572266,,, +16.5078125000,264,1417.5823974609,,, +16.5097656250,264,1412.4542236328,,, +16.5117187500,264,1404.3956298828,,, +16.5136718750,264,1398.5347900391,,, +16.5156250000,264,1391.9414062500,,, +16.5175781250,264,1386.0805664062,,, +16.5195312500,264,1381.6849365234,,, +16.5214843750,264,1375.8242187500,,, +16.5234375000,264,1372.1611328125,,, +16.5253906250,264,1365.5677490234,,, +16.5273437500,264,1361.1721191406,,, +16.5292968750,264,1356.7766113281,,, +16.5312500000,264,1353.1135253906,,, +16.5332031250,264,1347.9853515625,,, +16.5351562500,264,1345.7875976562,,, +16.5371093750,264,1341.3919677734,,, +16.5390625000,264,1340.6593017578,,, +16.5410156250,264,1335.5311279297,,, +16.5429687500,264,1333.3333740234,,, +16.5449218750,264,1329.6702880859,,, +16.5468750000,264,1327.4725341797,,, +16.5488281250,264,1323.8095703125,,, +16.5507812500,264,1321.6116943359,,, +16.5527343750,264,1318.6812744141,,, +16.5546875000,264,1317.2160644531,,, +16.5566406250,264,1313.5531005859,,, +16.5585937500,264,1311.3553466797,,, +16.5605468750,264,1308.4249267578,,, +16.5625000000,265,1305.4945068359,,, +16.5644531250,265,1304.0292968750,,, +16.5664062500,265,1300.3663330078,,, +16.5683593750,265,1299.6336669922,,, +16.5703125000,265,1296.7032470703,,, +16.5722656250,265,1294.5054931641,,, +16.5742187500,265,1293.0402832031,,, +16.5761718750,265,1291.5750732422,,, +16.5781250000,265,1290.1098632812,,, +16.5800781250,265,1289.3773193359,,, +16.5820312500,265,1287.9121093750,,, +16.5839843750,265,1286.4468994141,,, +16.5859375000,265,1285.7142333984,,, +16.5878906250,265,1284.9816894531,,, +16.5898437500,265,1282.7839355469,,, +16.5917968750,265,1283.5164794922,,, +16.5937500000,265,1282.7839355469,,, +16.5957031250,265,1283.5164794922,,, +16.5976562500,265,1282.7839355469,,, +16.5996093750,265,1283.5164794922,,, +16.6015625000,265,1283.5164794922,,, +16.6035156250,265,1282.7839355469,,, +16.6054687500,265,1284.2490234375,,, +16.6074218750,265,1283.5164794922,,, +16.6093750000,265,1284.9816894531,,, +16.6113281250,265,1283.5164794922,,, +16.6132812500,265,1284.2490234375,,, +16.6152343750,265,1284.9816894531,,, +16.6171875000,265,1283.5164794922,,, +16.6191406250,265,1284.9816894531,,, +16.6210937500,265,1284.9816894531,,, +16.6230468750,265,1285.7142333984,,, +16.6250000000,266,1287.1794433594,,, +16.6269531250,266,1289.3773193359,,, +16.6289062500,266,1290.1098632812,,, +16.6308593750,266,1290.8425292969,,, +16.6328125000,266,1293.0402832031,,, +16.6347656250,266,1293.7729492188,,, +16.6367187500,266,1296.7032470703,,, +16.6386718750,266,1297.4359130859,,, +16.6406250000,266,1298.9011230469,,, +16.6425781250,266,1301.0988769531,,, +16.6445312500,266,1302.5640869141,,, +16.6464843750,266,1304.7619628906,,, +16.6484375000,266,1305.4945068359,,, +16.6503906250,266,1308.4249267578,,, +16.6523437500,266,1309.8901367188,,, +16.6542968750,266,1311.3553466797,,, +16.6562500000,266,1312.8205566406,,, +16.6582031250,266,1313.5531005859,,, +16.6601562500,266,1315.7509765625,,, +16.6621093750,266,1316.4835205078,,, +16.6640625000,266,1319.4139404297,,, +16.6660156250,266,1319.4139404297,,, +16.6679687500,266,1321.6116943359,,, +16.6699218750,266,1322.3443603516,,, +16.6718750000,266,1322.3443603516,,, +16.6738281250,266,1323.8095703125,,, +16.6757812500,266,1323.8095703125,,, +16.6777343750,266,1326.0073242188,,, +16.6796875000,266,1326.0073242188,,, +16.6816406250,266,1326.7398681641,,, +16.6835937500,266,1327.4725341797,,, +16.6855468750,266,1328.2050781250,,, +16.6875000000,267,1328.2050781250,,, +16.6894531250,267,1327.4725341797,,, +16.6914062500,267,1328.2050781250,,, +16.6933593750,267,1327.4725341797,,, +16.6953125000,267,1328.9377441406,,, +16.6972656250,267,1329.6702880859,,, +16.6992187500,267,1328.2050781250,,, +16.7011718750,267,1328.2050781250,,, +16.7031250000,267,1327.4725341797,,, +16.7050781250,267,1328.2050781250,,, +16.7070312500,267,1327.4725341797,,, +16.7089843750,267,1326.7398681641,,, +16.7109375000,267,1326.0073242188,,, +16.7128906250,267,1323.8095703125,,, +16.7148437500,267,1324.5421142578,,, +16.7167968750,267,1323.0769042969,,, +16.7187500000,267,1320.8791503906,,, +16.7207031250,267,1320.8791503906,,, +16.7226562500,267,1318.6812744141,,, +16.7246093750,267,1318.6812744141,,, +16.7265625000,267,1316.4835205078,,, +16.7285156250,267,1317.2160644531,,, +16.7304687500,267,1315.7509765625,,, +16.7324218750,267,1313.5531005859,,, +16.7343750000,267,1312.0878906250,,, +16.7363281250,267,1311.3553466797,,, +16.7382812500,267,1310.6226806641,,, +16.7402343750,267,1309.1574707031,,, +16.7421875000,267,1307.6922607422,,, +16.7441406250,267,1306.9597167969,,, +16.7460937500,267,1304.7619628906,,, +16.7480468750,267,1304.0292968750,,, +16.7500000000,268,1303.2967529297,,, +16.7519531250,268,1303.2967529297,,, +16.7539062500,268,1302.5640869141,,, +16.7558593750,268,1303.2967529297,,, +16.7578125000,268,1302.5640869141,,, +16.7597656250,268,1302.5640869141,,, +16.7617187500,268,1301.0988769531,,, +16.7636718750,268,1300.3663330078,,, +16.7656250000,268,1301.0988769531,,, +16.7675781250,268,1300.3663330078,,, +16.7695312500,268,1300.3663330078,,, +16.7714843750,268,1298.9011230469,,, +16.7734375000,268,1298.1684570312,,, +16.7753906250,268,1298.9011230469,,, +16.7773437500,268,1296.7032470703,,, +16.7792968750,268,1297.4359130859,,, +16.7812500000,268,1296.7032470703,,, +16.7832031250,268,1296.7032470703,,, +16.7851562500,268,1295.9707031250,,, +16.7871093750,268,1294.5054931641,,, +16.7890625000,268,1293.7729492188,,, +16.7910156250,268,1292.3077392578,,, +16.7929687500,268,1292.3077392578,,, +16.7949218750,268,1290.8425292969,,, +16.7968750000,268,1290.1098632812,,, +16.7988281250,268,1289.3773193359,,, +16.8007812500,268,1287.1794433594,,, +16.8027343750,268,1287.1794433594,,, +16.8046875000,268,1286.4468994141,,, +16.8066406250,268,1284.9816894531,,, +16.8085937500,268,1284.2490234375,,, +16.8105468750,268,1282.7839355469,,, +16.8125000000,269,1282.0512695312,,, +16.8144531250,269,1279.8535156250,,, +16.8164062500,269,1278.3883056641,,, +16.8183593750,269,1277.6556396484,,, +16.8203125000,269,1276.1904296875,,, +16.8222656250,269,1276.1904296875,,, +16.8242187500,269,1274.7252197266,,, +16.8261718750,269,1273.9926757812,,, +16.8281250000,269,1273.2601318359,,, +16.8300781250,269,1271.7949218750,,, +16.8320312500,269,1273.2601318359,,, +16.8339843750,269,1271.7949218750,,, +16.8359375000,269,1272.5274658203,,, +16.8378906250,269,1272.5274658203,,, +16.8398437500,269,1271.7949218750,,, +16.8417968750,269,1272.5274658203,,, +16.8437500000,269,1271.7949218750,,, +16.8457031250,269,1272.5274658203,,, +16.8476562500,269,1273.2601318359,,, +16.8496093750,269,1271.7949218750,,, +16.8515625000,269,1273.2601318359,,, +16.8535156250,269,1272.5274658203,,, +16.8554687500,269,1273.2601318359,,, +16.8574218750,269,1274.7252197266,,, +16.8593750000,269,1274.7252197266,,, +16.8613281250,269,1275.4578857422,,, +16.8632812500,269,1275.4578857422,,, +16.8652343750,269,1276.1904296875,,, +16.8671875000,269,1276.1904296875,,, +16.8691406250,269,1277.6556396484,,, +16.8710937500,269,1278.3883056641,,, +16.8730468750,269,1279.1208496094,,, +16.8750000000,270,1279.8535156250,,, +16.8769531250,270,1280.5860595703,,, +16.8789062500,270,1282.0512695312,,, +16.8808593750,270,1282.0512695312,,, +16.8828125000,270,1283.5164794922,,, +16.8847656250,270,1283.5164794922,,, +16.8867187500,270,1283.5164794922,,, +16.8886718750,270,1283.5164794922,,, +16.8906250000,270,1283.5164794922,,, +16.8925781250,270,1283.5164794922,,, +16.8945312500,270,1284.2490234375,,, +16.8964843750,270,1283.5164794922,,, +16.8984375000,270,1284.2490234375,,, +16.9003906250,270,1283.5164794922,,, +16.9023437500,270,1284.2490234375,,, +16.9042968750,270,1282.7839355469,,, +16.9062500000,270,1282.7839355469,,, +16.9082031250,270,1281.3187255859,,, +16.9101562500,270,1282.0512695312,,, +16.9121093750,270,1280.5860595703,,, +16.9140625000,270,1280.5860595703,,, +16.9160156250,270,1280.5860595703,,, +16.9179687500,270,1281.3187255859,,, +16.9199218750,270,1279.8535156250,,, +16.9218750000,270,1281.3187255859,,, +16.9238281250,270,1280.5860595703,,, +16.9257812500,270,1281.3187255859,,, +16.9277343750,270,1279.8535156250,,, +16.9296875000,270,1281.3187255859,,, +16.9316406250,270,1279.8535156250,,, +16.9335937500,270,1280.5860595703,,, +16.9355468750,270,1279.8535156250,,, +16.9375000000,271,1280.5860595703,,, +16.9394531250,271,1279.8535156250,,, +16.9414062500,271,1280.5860595703,,, +16.9433593750,271,1280.5860595703,,, +16.9453125000,271,1281.3187255859,,, +16.9472656250,271,1279.8535156250,,, +16.9492187500,271,1280.5860595703,,, +16.9511718750,271,1279.1208496094,,, +16.9531250000,271,1279.1208496094,,, +16.9550781250,271,1278.3883056641,,, +16.9570312500,271,1278.3883056641,,, +16.9589843750,271,1276.9230957031,,, +16.9609375000,271,1276.9230957031,,, +16.9628906250,271,1276.1904296875,,, +16.9648437500,271,1276.1904296875,,, +16.9667968750,271,1276.1904296875,,, +16.9687500000,271,1276.1904296875,,, +16.9707031250,271,1276.1904296875,,, +16.9726562500,271,1275.4578857422,,, +16.9746093750,271,1276.1904296875,,, +16.9765625000,271,1276.1904296875,,, +16.9785156250,271,1276.1904296875,,, +16.9804687500,271,1276.9230957031,,, +16.9824218750,271,1276.1904296875,,, +16.9843750000,271,1279.1208496094,,, +16.9863281250,271,1279.8535156250,,, +16.9882812500,271,1281.3187255859,,, +16.9902343750,271,1283.5164794922,,, +16.9921875000,271,1284.9816894531,,, +16.9941406250,271,1289.3773193359,,, +16.9960937500,271,1292.3077392578,,, +16.9980468750,271,1296.7032470703,,, +17.0000000000,272,1301.8315429688,,, +17.0019531250,272,1306.9597167969,,, +17.0039062500,272,1312.8205566406,,, +17.0058593750,272,1319.4139404297,,, +17.0078125000,272,1327.4725341797,,, +17.0097656250,272,1334.7985839844,,, +17.0117187500,272,1342.8571777344,,, +17.0136718750,272,1351.6483154297,,, +17.0156250000,272,1361.1721191406,,, +17.0175781250,272,1369.9633789062,,, +17.0195312500,272,1380.2197265625,,, +17.0214843750,272,1390.4761962891,,, +17.0234375000,272,1402.1977539062,,, +17.0253906250,272,1413.1867675781,,, +17.0273437500,272,1426.3736572266,,, +17.0292968750,272,1439.5604248047,,, +17.0312500000,272,1453.4798583984,,, +17.0332031250,272,1468.1318359375,,, +17.0351562500,272,1482.0512695312,,, +17.0371093750,272,1499.6336669922,,, +17.0390625000,272,1515.0183105469,,, +17.0410156250,272,1531.1354980469,,, +17.0429687500,272,1546.5201416016,,, +17.0449218750,272,1561.9047851562,,, +17.0468750000,272,1580.2197265625,,, +17.0488281250,272,1595.6043701172,,, +17.0507812500,272,1612.4542236328,,, +17.0527343750,272,1629.3040771484,,, +17.0546875000,272,1645.4212646484,,, +17.0566406250,272,1662.2711181641,,, +17.0585937500,272,1677.6556396484,,, +17.0605468750,272,1694.5054931641,,, +17.0625000000,273,1710.6226806641,,, +17.0644531250,273,1726.0073242188,,, +17.0664062500,273,1741.3919677734,,, +17.0683593750,273,1756.0439453125,,, +17.0703125000,273,1770.6959228516,,, +17.0722656250,273,1783.8828125000,,, +17.0742187500,273,1797.8022460938,,, +17.0761718750,273,1808.7912597656,,, +17.0781250000,273,1820.5128173828,,, +17.0800781250,273,1831.5018310547,,, +17.0820312500,273,1840.2930908203,,, +17.0839843750,273,1849.8168945312,,, +17.0859375000,273,1857.1428222656,,, +17.0878906250,273,1864.4688720703,,, +17.0898437500,273,1868.8645019531,,, +17.0917968750,273,1873.9926757812,,, +17.0937500000,273,1878.3883056641,,, +17.0957031250,273,1880.5860595703,,, +17.0976562500,273,1884.2490234375,,, +17.0996093750,273,1884.2490234375,,, +17.1015625000,273,1884.9816894531,,, +17.1035156250,273,1884.2490234375,,, +17.1054687500,273,1882.7839355469,,, +17.1074218750,273,1880.5860595703,,, +17.1093750000,273,1876.1904296875,,, +17.1113281250,273,1872.5274658203,,, +17.1132812500,273,1872.5274658203,,, +17.1152343750,273,1867.3992919922,,, +17.1171875000,273,1861.5384521484,,, +17.1191406250,273,1856.4102783203,,, +17.1210937500,273,1848.3516845703,,, +17.1230468750,273,1842.4908447266,,, +17.1250000000,274,1834.4322509766,,, +17.1269531250,274,1825.6409912109,,, +17.1289062500,274,1816.8498535156,,, +17.1308593750,274,1806.5933837891,,, +17.1328125000,274,1796.3370361328,,, +17.1347656250,274,1785.3480224609,,, +17.1367187500,274,1775.8242187500,,, +17.1386718750,274,1764.1025390625,,, +17.1406250000,274,1753.1135253906,,, +17.1425781250,274,1740.6593017578,,, +17.1445312500,274,1728.2050781250,,, +17.1464843750,274,1716.4835205078,,, +17.1484375000,274,1703.2967529297,,, +17.1503906250,274,1691.5750732422,,, +17.1523437500,274,1678.3883056641,,, +17.1542968750,274,1665.9340820312,,, +17.1562500000,274,1654.2124023438,,, +17.1582031250,274,1641.0256347656,,, +17.1601562500,274,1630.0366210938,,, +17.1621093750,274,1616.8498535156,,, +17.1640625000,274,1605.1281738281,,, +17.1660156250,274,1592.6739501953,,, +17.1679687500,274,1579.4871826172,,, +17.1699218750,274,1568.4981689453,,, +17.1718750000,274,1556.0439453125,,, +17.1738281250,274,1545.0549316406,,, +17.1757812500,274,1534.0659179688,,, +17.1777343750,274,1523.0769042969,,, +17.1796875000,274,1511.3553466797,,, +17.1816406250,274,1500.3663330078,,, +17.1835937500,274,1491.5750732422,,, +17.1855468750,274,1481.3187255859,,, +17.1875000000,275,1472.5274658203,,, +17.1894531250,275,1463.7362060547,,, +17.1914062500,275,1453.4798583984,,, +17.1933593750,275,1446.1538085938,,, +17.1953125000,275,1438.0952148438,,, +17.1972656250,275,1431.5018310547,,, +17.1992187500,275,1424.1757812500,,, +17.2011718750,275,1416.8498535156,,, +17.2031250000,275,1410.9890136719,,, +17.2050781250,275,1404.3956298828,,, +17.2070312500,275,1399.2674560547,,, +17.2089843750,275,1392.6739501953,,, +17.2109375000,275,1387.5457763672,,, +17.2128906250,275,1382.4176025391,,, +17.2148437500,275,1375.8242187500,,, +17.2167968750,275,1372.1611328125,,, +17.2187500000,275,1365.5677490234,,, +17.2207031250,275,1361.1721191406,,, +17.2226562500,275,1356.0439453125,,, +17.2246093750,275,1350.1831054688,,, +17.2265625000,275,1345.7875976562,,, +17.2285156250,275,1340.6593017578,,, +17.2304687500,275,1336.2637939453,,, +17.2324218750,275,1331.8681640625,,, +17.2343750000,275,1327.4725341797,,, +17.2363281250,275,1324.5421142578,,, +17.2382812500,275,1320.1464843750,,, +17.2402343750,275,1318.6812744141,,, +17.2421875000,275,1315.0183105469,,, +17.2441406250,275,1312.8205566406,,, +17.2460937500,275,1309.8901367188,,, +17.2480468750,275,1306.9597167969,,, +17.2500000000,276,1306.2270507812,,, +17.2519531250,276,1304.0292968750,,, +17.2539062500,276,1302.5640869141,,, +17.2558593750,276,1301.0988769531,,, +17.2578125000,276,1298.9011230469,,, +17.2597656250,276,1299.6336669922,,, +17.2617187500,276,1298.1684570312,,, +17.2636718750,276,1298.1684570312,,, +17.2656250000,276,1296.7032470703,,, +17.2675781250,276,1295.9707031250,,, +17.2695312500,276,1295.2380371094,,, +17.2714843750,276,1294.5054931641,,, +17.2734375000,276,1294.5054931641,,, +17.2753906250,276,1294.5054931641,,, +17.2773437500,276,1294.5054931641,,, +17.2792968750,276,1295.9707031250,,, +17.2812500000,276,1295.9707031250,,, +17.2832031250,276,1298.1684570312,,, +17.2851562500,276,1298.1684570312,,, +17.2871093750,276,1298.9011230469,,, +17.2890625000,276,1298.9011230469,,, +17.2910156250,276,1300.3663330078,,, +17.2929687500,276,1300.3663330078,,, +17.2949218750,276,1299.6336669922,,, +17.2968750000,276,1301.8315429688,,, +17.2988281250,276,1301.8315429688,,, +17.3007812500,276,1303.2967529297,,, +17.3027343750,276,1303.2967529297,,, +17.3046875000,276,1303.2967529297,,, +17.3066406250,276,1304.0292968750,,, +17.3085937500,276,1303.2967529297,,, +17.3105468750,276,1304.7619628906,,, +17.3125000000,277,1304.0292968750,,, +17.3144531250,277,1306.2270507812,,, +17.3164062500,277,1305.4945068359,,, +17.3183593750,277,1306.2270507812,,, +17.3203125000,277,1306.2270507812,,, +17.3222656250,277,1306.2270507812,,, +17.3242187500,277,1307.6922607422,,, +17.3261718750,277,1308.4249267578,,, +17.3281250000,277,1310.6226806641,,, +17.3300781250,277,1312.0878906250,,, +17.3320312500,277,1312.8205566406,,, +17.3339843750,277,1313.5531005859,,, +17.3359375000,277,1314.2857666016,,, +17.3378906250,277,1316.4835205078,,, +17.3398437500,277,1316.4835205078,,, +17.3417968750,277,1317.9487304688,,, +17.3437500000,277,1320.1464843750,,, +17.3457031250,277,1320.1464843750,,, +17.3476562500,277,1322.3443603516,,, +17.3496093750,277,1323.0769042969,,, +17.3515625000,277,1326.0073242188,,, +17.3535156250,277,1327.4725341797,,, +17.3554687500,277,1329.6702880859,,, +17.3574218750,277,1331.1354980469,,, +17.3593750000,277,1332.6007080078,,, +17.3613281250,277,1335.5311279297,,, +17.3632812500,277,1337.7288818359,,, +17.3652343750,277,1341.3919677734,,, +17.3671875000,277,1342.1245117188,,, +17.3691406250,277,1344.3223876953,,, +17.3710937500,277,1346.5201416016,,, +17.3730468750,277,1347.9853515625,,, +17.3750000000,278,1350.9157714844,,, +17.3769531250,278,1350.9157714844,,, +17.3789062500,278,1353.1135253906,,, +17.3808593750,278,1354.5787353516,,, +17.3828125000,278,1354.5787353516,,, +17.3847656250,278,1356.7766113281,,, +17.3867187500,278,1356.0439453125,,, +17.3886718750,278,1356.7766113281,,, +17.3906250000,278,1356.0439453125,,, +17.3925781250,278,1356.7766113281,,, +17.3945312500,278,1356.0439453125,,, +17.3964843750,278,1355.3114013672,,, +17.3984375000,278,1355.3114013672,,, +17.4003906250,278,1355.3114013672,,, +17.4023437500,278,1356.0439453125,,, +17.4042968750,278,1356.0439453125,,, +17.4062500000,278,1353.8461914062,,, +17.4082031250,278,1354.5787353516,,, +17.4101562500,278,1354.5787353516,,, +17.4121093750,278,1353.8461914062,,, +17.4140625000,278,1353.8461914062,,, +17.4160156250,278,1352.3809814453,,, +17.4179687500,278,1352.3809814453,,, +17.4199218750,278,1350.9157714844,,, +17.4218750000,278,1350.1831054688,,, +17.4238281250,278,1349.4505615234,,, +17.4257812500,278,1346.5201416016,,, +17.4277343750,278,1347.2528076172,,, +17.4296875000,278,1345.0549316406,,, +17.4316406250,278,1343.5897216797,,, +17.4335937500,278,1342.8571777344,,, +17.4355468750,278,1339.9267578125,,, +17.4375000000,279,1338.4615478516,,, +17.4394531250,279,1337.7288818359,,, +17.4414062500,279,1335.5311279297,,, +17.4433593750,279,1335.5311279297,,, +17.4453125000,279,1332.6007080078,,, +17.4472656250,279,1331.1354980469,,, +17.4492187500,279,1329.6702880859,,, +17.4511718750,279,1326.7398681641,,, +17.4531250000,279,1326.7398681641,,, +17.4550781250,279,1323.8095703125,,, +17.4570312500,279,1323.0769042969,,, +17.4589843750,279,1320.1464843750,,, +17.4609375000,279,1317.9487304688,,, +17.4628906250,279,1317.2160644531,,, +17.4648437500,279,1314.2857666016,,, +17.4667968750,279,1312.0878906250,,, +17.4687500000,279,1310.6226806641,,, +17.4707031250,279,1306.9597167969,,, +17.4726562500,279,1305.4945068359,,, +17.4746093750,279,1302.5640869141,,, +17.4765625000,279,1300.3663330078,,, +17.4785156250,279,1298.1684570312,,, +17.4804687500,279,1295.2380371094,,, +17.4824218750,279,1294.5054931641,,, +17.4843750000,279,1290.8425292969,,, +17.4863281250,279,1290.1098632812,,, +17.4882812500,279,1287.1794433594,,, +17.4902343750,279,1284.9816894531,,, +17.4921875000,279,1283.5164794922,,, +17.4941406250,279,1281.3187255859,,, +17.4960937500,279,1280.5860595703,,, +17.4980468750,279,1278.3883056641,,, +17.5000000000,280,1276.9230957031,,, +17.5019531250,280,1276.9230957031,,, +17.5039062500,280,1274.7252197266,,, +17.5058593750,280,1273.9926757812,,, +17.5078125000,280,1273.2601318359,,, +17.5097656250,280,1271.7949218750,,, +17.5117187500,280,1272.5274658203,,, +17.5136718750,280,1271.0622558594,,, +17.5156250000,280,1271.0622558594,,, +17.5175781250,280,1270.3297119141,,, +17.5195312500,280,1269.5970458984,,, +17.5214843750,280,1269.5970458984,,, +17.5234375000,280,1268.1318359375,,, +17.5253906250,280,1268.8645019531,,, +17.5273437500,280,1267.3992919922,,, +17.5292968750,280,1265.9340820312,,, +17.5312500000,280,1265.9340820312,,, +17.5332031250,280,1263.7362060547,,, +17.5351562500,280,1263.7362060547,,, +17.5371093750,280,1261.5384521484,,, +17.5390625000,280,1260.0732421875,,, +17.5410156250,280,1259.3406982422,,, +17.5429687500,280,1256.4102783203,,, +17.5449218750,280,1256.4102783203,,, +17.5468750000,280,1254.2124023438,,, +17.5488281250,280,1252.0146484375,,, +17.5507812500,280,1252.0146484375,,, +17.5527343750,280,1250.5494384766,,, +17.5546875000,280,1251.2821044922,,, +17.5566406250,280,1251.2821044922,,, +17.5585937500,280,1250.5494384766,,, +17.5605468750,280,1251.2821044922,,, +17.5625000000,281,1250.5494384766,,, +17.5644531250,281,1251.2821044922,,, +17.5664062500,281,1250.5494384766,,, +17.5683593750,281,1250.5494384766,,, +17.5703125000,281,1251.2821044922,,, +17.5722656250,281,1250.5494384766,,, +17.5742187500,281,1251.2821044922,,, +17.5761718750,281,1250.5494384766,,, +17.5781250000,281,1251.2821044922,,, +17.5800781250,281,1252.7471923828,,, +17.5820312500,281,1252.7471923828,,, +17.5839843750,281,1254.9450683594,,, +17.5859375000,281,1254.9450683594,,, +17.5878906250,281,1256.4102783203,,, +17.5898437500,281,1258.6080322266,,, +17.5917968750,281,1260.8059082031,,, +17.5937500000,281,1262.2711181641,,, +17.5957031250,281,1263.7362060547,,, +17.5976562500,281,1264.4688720703,,, +17.5996093750,281,1266.6666259766,,, +17.6015625000,281,1267.3992919922,,, +17.6035156250,281,1268.1318359375,,, +17.6054687500,281,1269.5970458984,,, +17.6074218750,281,1269.5970458984,,, +17.6093750000,281,1271.0622558594,,, +17.6113281250,281,1271.7949218750,,, +17.6132812500,281,1271.7949218750,,, +17.6152343750,281,1273.2601318359,,, +17.6171875000,281,1273.2601318359,,, +17.6191406250,281,1273.9926757812,,, +17.6210937500,281,1274.7252197266,,, +17.6230468750,281,1274.7252197266,,, +17.6250000000,282,1276.1904296875,,, +17.6269531250,282,1277.6556396484,,, +17.6289062500,282,1277.6556396484,,, +17.6308593750,282,1279.8535156250,,, +17.6328125000,282,1279.8535156250,,, +17.6347656250,282,1280.5860595703,,, +17.6367187500,282,1282.0512695312,,, +17.6386718750,282,1282.7839355469,,, +17.6406250000,282,1285.7142333984,,, +17.6425781250,282,1286.4468994141,,, +17.6445312500,282,1285.7142333984,,, +17.6464843750,282,1287.9121093750,,, +17.6484375000,282,1287.1794433594,,, +17.6503906250,282,1288.6446533203,,, +17.6523437500,282,1288.6446533203,,, +17.6542968750,282,1287.1794433594,,, +17.6562500000,282,1288.6446533203,,, +17.6582031250,282,1287.9121093750,,, +17.6601562500,282,1288.6446533203,,, +17.6621093750,282,1287.9121093750,,, +17.6640625000,282,1287.9121093750,,, +17.6660156250,282,1289.3773193359,,, +17.6679687500,282,1288.6446533203,,, +17.6699218750,282,1288.6446533203,,, +17.6718750000,282,1288.6446533203,,, +17.6738281250,282,1287.1794433594,,, +17.6757812500,282,1287.9121093750,,, +17.6777343750,282,1287.9121093750,,, +17.6796875000,282,1288.6446533203,,, +17.6816406250,282,1288.6446533203,,, +17.6835937500,282,1287.9121093750,,, +17.6855468750,282,1288.6446533203,,, +17.6875000000,283,1287.9121093750,,, +17.6894531250,283,1288.6446533203,,, +17.6914062500,283,1287.9121093750,,, +17.6933593750,283,1286.4468994141,,, +17.6953125000,283,1285.7142333984,,, +17.6972656250,283,1284.9816894531,,, +17.6992187500,283,1284.2490234375,,, +17.7011718750,283,1283.5164794922,,, +17.7031250000,283,1282.0512695312,,, +17.7050781250,283,1282.0512695312,,, +17.7070312500,283,1280.5860595703,,, +17.7089843750,283,1279.1208496094,,, +17.7109375000,283,1279.8535156250,,, +17.7128906250,283,1278.3883056641,,, +17.7148437500,283,1276.9230957031,,, +17.7167968750,283,1277.6556396484,,, +17.7187500000,283,1276.9230957031,,, +17.7207031250,283,1276.9230957031,,, +17.7226562500,283,1277.6556396484,,, +17.7246093750,283,1278.3883056641,,, +17.7265625000,283,1278.3883056641,,, +17.7285156250,283,1280.5860595703,,, +17.7304687500,283,1282.0512695312,,, +17.7324218750,283,1282.7839355469,,, +17.7343750000,283,1284.9816894531,,, +17.7363281250,283,1287.1794433594,,, +17.7382812500,283,1288.6446533203,,, +17.7402343750,283,1288.6446533203,,, +17.7421875000,283,1293.0402832031,,, +17.7441406250,283,1295.9707031250,,, +17.7460937500,283,1298.1684570312,,, +17.7480468750,283,1302.5640869141,,, +17.7500000000,284,1306.2270507812,,, +17.7519531250,284,1309.8901367188,,, +17.7539062500,284,1317.2160644531,,, +17.7558593750,284,1321.6116943359,,, +17.7578125000,284,1328.9377441406,,, +17.7597656250,284,1335.5311279297,,, +17.7617187500,284,1342.1245117188,,, +17.7636718750,284,1350.9157714844,,, +17.7656250000,284,1360.4395751953,,, +17.7675781250,284,1369.9633789062,,, +17.7695312500,284,1380.2197265625,,, +17.7714843750,284,1391.2087402344,,, +17.7734375000,284,1402.1977539062,,, +17.7753906250,284,1413.1867675781,,, +17.7773437500,284,1425.6409912109,,, +17.7792968750,284,1438.0952148438,,, +17.7812500000,284,1452.7471923828,,, +17.7832031250,284,1465.2014160156,,, +17.7851562500,284,1479.1208496094,,, +17.7871093750,284,1494.5054931641,,, +17.7890625000,284,1509.1574707031,,, +17.7910156250,284,1525.2747802734,,, +17.7929687500,284,1542.1245117188,,, +17.7949218750,284,1556.7766113281,,, +17.7968750000,284,1572.1611328125,,, +17.7988281250,284,1588.2784423828,,, +17.8007812500,284,1604.3956298828,,, +17.8027343750,284,1620.5128173828,,, +17.8046875000,284,1620.5128173828,,, +17.8066406250,284,1620.5128173828,,, +17.8085937500,284,1636.6300048828,,, +17.8105468750,284,1651.2821044922,,, +17.8125000000,285,1665.9340820312,,, +17.8144531250,285,1680.5860595703,,, +17.8164062500,285,1693.7729492188,,, +17.8183593750,285,1706.9597167969,,, +17.8203125000,285,1720.1464843750,,, +17.8222656250,285,1731.8681640625,,, +17.8242187500,285,1743.5897216797,,, +17.8261718750,285,1754.5787353516,,, +17.8281250000,285,1765.5677490234,,, +17.8300781250,285,1775.8242187500,,, +17.8320312500,285,1782.4176025391,,, +17.8339843750,285,1789.7435302734,,, +17.8359375000,285,1797.8022460938,,, +17.8378906250,285,1803.6629638672,,, +17.8398437500,285,1808.7912597656,,, +17.8417968750,285,1814.6519775391,,, +17.8437500000,285,1818.3150634766,,, +17.8457031250,285,1821.2453613281,,, +17.8476562500,285,1824.9084472656,,, +17.8496093750,285,1827.1062011719,,, +17.8515625000,285,1828.5714111328,,, +17.8535156250,285,1830.0366210938,,, +17.8554687500,285,1830.0366210938,,, +17.8574218750,285,1829.3040771484,,, +17.8593750000,285,1828.5714111328,,, +17.8613281250,285,1826.3736572266,,, +17.8632812500,285,1822.7105712891,,, +17.8652343750,285,1819.7802734375,,, +17.8671875000,285,1814.6519775391,,, +17.8691406250,285,1809.5238037109,,, +17.8710937500,285,1804.3956298828,,, +17.8730468750,285,1797.8022460938,,, +17.8750000000,286,1789.7435302734,,, +17.8769531250,286,1783.1501464844,,, +17.8789062500,286,1773.6263427734,,, +17.8808593750,286,1765.5677490234,,, +17.8828125000,286,1757.5091552734,,, +17.8847656250,286,1747.2528076172,,, +17.8867187500,286,1736.9963378906,,, +17.8886718750,286,1727.4725341797,,, +17.8906250000,286,1716.4835205078,,, +17.8925781250,286,1705.4945068359,,, +17.8945312500,286,1696.7032470703,,, +17.8964843750,286,1685.7142333984,,, +17.8984375000,286,1674.7252197266,,, +17.9003906250,286,1665.9340820312,,, +17.9023437500,286,1654.9450683594,,, +17.9042968750,286,1643.9560546875,,, +17.9062500000,286,1634.4322509766,,, +17.9082031250,286,1623.4432373047,,, +17.9101562500,286,1611.7215576172,,, +17.9121093750,286,1602.1977539062,,, +17.9140625000,286,1591.2087402344,,, +17.9160156250,286,1580.2197265625,,, +17.9179687500,286,1569.9633789062,,, +17.9199218750,286,1558.9743652344,,, +17.9218750000,286,1547.9853515625,,, +17.9238281250,286,1539.1940917969,,, +17.9257812500,286,1528.2050781250,,, +17.9277343750,286,1518.6812744141,,, +17.9296875000,286,1509.1574707031,,, +17.9316406250,286,1498.9011230469,,, +17.9335937500,286,1490.1098632812,,, +17.9355468750,286,1480.5860595703,,, +17.9375000000,287,1472.5274658203,,, +17.9394531250,287,1463.7362060547,,, +17.9414062500,287,1456.4102783203,,, +17.9433593750,287,1447.6190185547,,, +17.9453125000,287,1439.5604248047,,, +17.9472656250,287,1433.6995849609,,, +17.9492187500,287,1426.3736572266,,, +17.9511718750,287,1419.7802734375,,, +17.9531250000,287,1414.6519775391,,, +17.9550781250,287,1406.5933837891,,, +17.9570312500,287,1400.0000000000,,, +17.9589843750,287,1396.3370361328,,, +17.9609375000,287,1390.4761962891,,, +17.9628906250,287,1386.0805664062,,, +17.9648437500,287,1381.6849365234,,, +17.9667968750,287,1375.8242187500,,, +17.9687500000,287,1372.1611328125,,, +17.9707031250,287,1367.0329589844,,, +17.9726562500,287,1361.9047851562,,, +17.9746093750,287,1358.2416992188,,, +17.9765625000,287,1354.5787353516,,, +17.9785156250,287,1349.4505615234,,, +17.9804687500,287,1345.7875976562,,, +17.9824218750,287,1342.1245117188,,, +17.9843750000,287,1338.4615478516,,, +17.9863281250,287,1335.5311279297,,, +17.9882812500,287,1331.8681640625,,, +17.9902343750,287,1327.4725341797,,, +17.9921875000,287,1323.8095703125,,, +17.9941406250,287,1319.4139404297,,, +17.9960937500,287,1314.2857666016,,, +17.9980468750,287,1312.8205566406,,, +18.0000000000,288,1307.6922607422,,, +18.0019531250,288,1304.0292968750,,, +18.0039062500,288,1301.0988769531,,, +18.0058593750,288,1296.7032470703,,, +18.0078125000,288,1294.5054931641,,, +18.0097656250,288,1292.3077392578,,, +18.0117187500,288,1288.6446533203,,, +18.0136718750,288,1287.9121093750,,, +18.0156250000,288,1285.7142333984,,, +18.0175781250,288,1283.5164794922,,, +18.0195312500,288,1282.7839355469,,, +18.0214843750,288,1281.3187255859,,, +18.0234375000,288,1280.5860595703,,, +18.0253906250,288,1280.5860595703,,, +18.0273437500,288,1279.8535156250,,, +18.0292968750,288,1279.1208496094,,, +18.0312500000,288,1279.8535156250,,, +18.0332031250,288,1279.1208496094,,, +18.0351562500,288,1276.9230957031,,, +18.0371093750,288,1277.6556396484,,, +18.0390625000,288,1276.9230957031,,, +18.0410156250,288,1276.9230957031,,, +18.0429687500,288,1278.3883056641,,, +18.0449218750,288,1277.6556396484,,, +18.0468750000,288,1279.1208496094,,, +18.0488281250,288,1280.5860595703,,, +18.0507812500,288,1282.0512695312,,, +18.0527343750,288,1284.9816894531,,, +18.0546875000,288,1286.4468994141,,, +18.0566406250,288,1287.9121093750,,, +18.0585937500,288,1291.5750732422,,, +18.0605468750,288,1292.3077392578,,, +18.0625000000,289,1293.7729492188,,, +18.0644531250,289,1297.4359130859,,, +18.0664062500,289,1298.1684570312,,, +18.0683593750,289,1300.3663330078,,, +18.0703125000,289,1303.2967529297,,, +18.0722656250,289,1305.4945068359,,, +18.0742187500,289,1306.9597167969,,, +18.0761718750,289,1309.1574707031,,, +18.0781250000,289,1310.6226806641,,, +18.0800781250,289,1312.8205566406,,, +18.0820312500,289,1316.4835205078,,, +18.0839843750,289,1319.4139404297,,, +18.0859375000,289,1321.6116943359,,, +18.0878906250,289,1324.5421142578,,, +18.0898437500,289,1326.7398681641,,, +18.0917968750,289,1329.6702880859,,, +18.0937500000,289,1333.3333740234,,, +18.0957031250,289,1335.5311279297,,, +18.0976562500,289,1338.4615478516,,, +18.0996093750,289,1340.6593017578,,, +18.1015625000,289,1342.1245117188,,, +18.1035156250,289,1345.7875976562,,, +18.1054687500,289,1347.2528076172,,, +18.1074218750,289,1348.7178955078,,, +18.1093750000,289,1350.9157714844,,, +18.1113281250,289,1352.3809814453,,, +18.1132812500,289,1354.5787353516,,, +18.1152343750,289,1356.7766113281,,, +18.1171875000,289,1357.5091552734,,, +18.1191406250,289,1358.9743652344,,, +18.1210937500,289,1361.9047851562,,, +18.1230468750,289,1361.9047851562,,, +18.1250000000,290,1361.9047851562,,, +18.1269531250,290,1364.1025390625,,, +18.1289062500,290,1364.1025390625,,, +18.1308593750,290,1362.6373291016,,, +18.1328125000,290,1362.6373291016,,, +18.1347656250,290,1361.9047851562,,, +18.1367187500,290,1360.4395751953,,, +18.1386718750,290,1360.4395751953,,, +18.1406250000,290,1358.2416992188,,, +18.1425781250,290,1356.0439453125,,, +18.1445312500,290,1356.7766113281,,, +18.1464843750,290,1354.5787353516,,, +18.1484375000,290,1352.3809814453,,, +18.1503906250,290,1351.6483154297,,, +18.1523437500,290,1349.4505615234,,, +18.1542968750,290,1348.7178955078,,, +18.1562500000,290,1347.2528076172,,, +18.1582031250,290,1344.3223876953,,, +18.1601562500,290,1342.1245117188,,, +18.1621093750,290,1339.9267578125,,, +18.1640625000,290,1337.7288818359,,, +18.1660156250,290,1335.5311279297,,, +18.1679687500,290,1333.3333740234,,, +18.1699218750,290,1329.6702880859,,, +18.1718750000,290,1327.4725341797,,, +18.1738281250,290,1325.2747802734,,, +18.1757812500,290,1321.6116943359,,, +18.1777343750,290,1320.8791503906,,, +18.1796875000,290,1317.2160644531,,, +18.1816406250,290,1314.2857666016,,, +18.1835937500,290,1312.8205566406,,, +18.1855468750,290,1309.1574707031,,, +18.1875000000,291,1306.9597167969,,, +18.1894531250,291,1304.7619628906,,, +18.1914062500,291,1301.0988769531,,, +18.1933593750,291,1298.1684570312,,, +18.1953125000,291,1296.7032470703,,, +18.1972656250,291,1293.7729492188,,, +18.1992187500,291,1290.8425292969,,, +18.2011718750,291,1289.3773193359,,, +18.2031250000,291,1287.9121093750,,, +18.2050781250,291,1285.7142333984,,, +18.2070312500,291,1286.4468994141,,, +18.2089843750,291,1284.9816894531,,, +18.2109375000,291,1283.5164794922,,, +18.2128906250,291,1283.5164794922,,, +18.2148437500,291,1282.0512695312,,, +18.2167968750,291,1282.0512695312,,, +18.2187500000,291,1282.0512695312,,, +18.2207031250,291,1281.3187255859,,, +18.2226562500,291,1282.7839355469,,, +18.2246093750,291,1283.5164794922,,, +18.2265625000,291,1282.7839355469,,, +18.2285156250,291,1284.9816894531,,, +18.2304687500,291,1284.9816894531,,, +18.2324218750,291,1284.9816894531,,, +18.2343750000,291,1286.4468994141,,, +18.2363281250,291,1285.7142333984,,, +18.2382812500,291,1284.9816894531,,, +18.2402343750,291,1286.4468994141,,, +18.2421875000,291,1286.4468994141,,, +18.2441406250,291,1284.9816894531,,, +18.2460937500,291,1284.9816894531,,, +18.2480468750,291,1284.2490234375,,, +18.2500000000,292,1282.7839355469,,, +18.2519531250,292,1283.5164794922,,, +18.2539062500,292,1282.0512695312,,, +18.2558593750,292,1280.5860595703,,, +18.2578125000,292,1282.0512695312,,, +18.2597656250,292,1282.0512695312,,, +18.2617187500,292,1280.5860595703,,, +18.2636718750,292,1281.3187255859,,, +18.2656250000,292,1280.5860595703,,, +18.2675781250,292,1280.5860595703,,, +18.2695312500,292,1280.5860595703,,, +18.2714843750,292,1282.0512695312,,, +18.2734375000,292,1281.3187255859,,, +18.2753906250,292,1279.8535156250,,, +18.2773437500,292,1282.0512695312,,, +18.2792968750,292,1281.3187255859,,, +18.2812500000,292,1279.8535156250,,, +18.2832031250,292,1281.3187255859,,, +18.2851562500,292,1280.5860595703,,, +18.2871093750,292,1279.8535156250,,, +18.2890625000,292,1281.3187255859,,, +18.2910156250,292,1279.8535156250,,, +18.2929687500,292,1279.1208496094,,, +18.2949218750,292,1280.5860595703,,, +18.2968750000,292,1279.1208496094,,, +18.2988281250,292,1278.3883056641,,, +18.3007812500,292,1279.1208496094,,, +18.3027343750,292,1278.3883056641,,, +18.3046875000,292,1276.9230957031,,, +18.3066406250,292,1277.6556396484,,, +18.3085937500,292,1278.3883056641,,, +18.3105468750,292,1277.6556396484,,, +18.3125000000,293,1277.6556396484,,, +18.3144531250,293,1278.3883056641,,, +18.3164062500,293,1277.6556396484,,, +18.3183593750,293,1277.6556396484,,, +18.3203125000,293,1279.1208496094,,, +18.3222656250,293,1279.8535156250,,, +18.3242187500,293,1279.8535156250,,, +18.3261718750,293,1281.3187255859,,, +18.3281250000,293,1281.3187255859,,, +18.3300781250,293,1282.0512695312,,, +18.3320312500,293,1283.5164794922,,, +18.3339843750,293,1284.2490234375,,, +18.3359375000,293,1283.5164794922,,, +18.3378906250,293,1284.9816894531,,, +18.3398437500,293,1284.9816894531,,, +18.3417968750,293,1284.9816894531,,, +18.3437500000,293,1287.1794433594,,, +18.3457031250,293,1288.6446533203,,, +18.3476562500,293,1287.9121093750,,, +18.3496093750,293,1289.3773193359,,, +18.3515625000,293,1292.3077392578,,, +18.3535156250,293,1293.0402832031,,, +18.3554687500,293,1293.7729492188,,, +18.3574218750,293,1297.4359130859,,, +18.3593750000,293,1298.9011230469,,, +18.3613281250,293,1299.6336669922,,, +18.3632812500,293,1303.2967529297,,, +18.3652343750,293,1304.0292968750,,, +18.3671875000,293,1305.4945068359,,, +18.3691406250,293,1307.6922607422,,, +18.3710937500,293,1308.4249267578,,, +18.3730468750,293,1308.4249267578,,, +18.3750000000,294,1309.1574707031,,, +18.3769531250,294,1310.6226806641,,, +18.3789062500,294,1310.6226806641,,, +18.3808593750,294,1309.8901367188,,, +18.3828125000,294,1310.6226806641,,, +18.3847656250,294,1309.8901367188,,, +18.3867187500,294,1308.4249267578,,, +18.3886718750,294,1309.8901367188,,, +18.3906250000,294,1309.1574707031,,, +18.3925781250,294,1308.4249267578,,, +18.3945312500,294,1309.8901367188,,, +18.3964843750,294,1309.8901367188,,, +18.3984375000,294,1309.1574707031,,, +18.4003906250,294,1309.1574707031,,, +18.4023437500,294,1309.1574707031,,, +18.4042968750,294,1308.4249267578,,, +18.4062500000,294,1307.6922607422,,, +18.4082031250,294,1309.1574707031,,, +18.4101562500,294,1309.1574707031,,, +18.4121093750,294,1308.4249267578,,, +18.4140625000,294,1309.8901367188,,, +18.4160156250,294,1309.1574707031,,, +18.4179687500,294,1308.4249267578,,, +18.4199218750,294,1308.4249267578,,, +18.4218750000,294,1309.1574707031,,, +18.4238281250,294,1308.4249267578,,, +18.4257812500,294,1307.6922607422,,, +18.4277343750,294,1308.4249267578,,, +18.4296875000,294,1308.4249267578,,, +18.4316406250,294,1306.9597167969,,, +18.4335937500,294,1308.4249267578,,, +18.4355468750,294,1308.4249267578,,, +18.4375000000,295,1306.2270507812,,, +18.4394531250,295,1306.9597167969,,, +18.4414062500,295,1306.9597167969,,, +18.4433593750,295,1305.4945068359,,, +18.4453125000,295,1304.7619628906,,, +18.4472656250,295,1304.7619628906,,, +18.4492187500,295,1304.0292968750,,, +18.4511718750,295,1302.5640869141,,, +18.4531250000,295,1303.2967529297,,, +18.4550781250,295,1301.8315429688,,, +18.4570312500,295,1301.0988769531,,, +18.4589843750,295,1301.8315429688,,, +18.4609375000,295,1300.3663330078,,, +18.4628906250,295,1298.1684570312,,, +18.4648437500,295,1298.9011230469,,, +18.4667968750,295,1298.9011230469,,, +18.4687500000,295,1297.4359130859,,, +18.4707031250,295,1298.1684570312,,, +18.4726562500,295,1297.4359130859,,, +18.4746093750,295,1297.4359130859,,, +18.4765625000,295,1298.1684570312,,, +18.4785156250,295,1298.9011230469,,, +18.4804687500,295,1298.9011230469,,, +18.4824218750,295,1299.6336669922,,, +18.4843750000,295,1301.0988769531,,, +18.4863281250,295,1301.0988769531,,, +18.4882812500,295,1303.2967529297,,, +18.4902343750,295,1304.7619628906,,, +18.4921875000,295,1306.9597167969,,, +18.4941406250,295,1309.1574707031,,, +18.4960937500,295,1312.8205566406,,, +18.4980468750,295,1315.7509765625,,, +18.5000000000,296,1317.9487304688,,, +18.5019531250,296,1323.0769042969,,, +18.5039062500,296,1326.7398681641,,, +18.5058593750,296,1329.6702880859,,, +18.5078125000,296,1335.5311279297,,, +18.5097656250,296,1339.1940917969,,, +18.5117187500,296,1343.5897216797,,, +18.5136718750,296,1348.7178955078,,, +18.5156250000,296,1354.5787353516,,, +18.5175781250,296,1360.4395751953,,, +18.5195312500,296,1366.3004150391,,, +18.5214843750,296,1375.0915527344,,, +18.5234375000,296,1382.4176025391,,, +18.5253906250,296,1390.4761962891,,, +18.5273437500,296,1399.2674560547,,, +18.5292968750,296,1408.0585937500,,, +18.5312500000,296,1417.5823974609,,, +18.5332031250,296,1427.1062011719,,, +18.5351562500,296,1438.0952148438,,, +18.5371093750,296,1447.6190185547,,, +18.5390625000,296,1459.3406982422,,, +18.5410156250,296,1471.0622558594,,, +18.5429687500,296,1482.0512695312,,, +18.5449218750,296,1494.5054931641,,, +18.5468750000,296,1507.6922607422,,, +18.5488281250,296,1519.4139404297,,, +18.5507812500,296,1531.1354980469,,, +18.5527343750,296,1545.0549316406,,, +18.5546875000,296,1557.5091552734,,, +18.5566406250,296,1569.2307128906,,, +18.5585937500,296,1583.1501464844,,, +18.5605468750,296,1594.8718261719,,, +18.5625000000,297,1606.5933837891,,, +18.5644531250,297,1618.3150634766,,, +18.5664062500,297,1629.3040771484,,, +18.5683593750,297,1639.5604248047,,, +18.5703125000,297,1649.8168945312,,, +18.5722656250,297,1660.0732421875,,, +18.5742187500,297,1668.8645019531,,, +18.5761718750,297,1677.6556396484,,, +18.5781250000,297,1687.1794433594,,, +18.5800781250,297,1694.5054931641,,, +18.5820312500,297,1701.8315429688,,, +18.5839843750,297,1709.1574707031,,, +18.5859375000,297,1715.0183105469,,, +18.5878906250,297,1720.1464843750,,, +18.5898437500,297,1724.5421142578,,, +18.5917968750,297,1728.9377441406,,, +18.5937500000,297,1731.8681640625,,, +18.5957031250,297,1734.7985839844,,, +18.5976562500,297,1736.9963378906,,, +18.5996093750,297,1738.4615478516,,, +18.6015625000,297,1739.1940917969,,, +18.6035156250,297,1737.7288818359,,, +18.6054687500,297,1737.7288818359,,, +18.6074218750,297,1735.5311279297,,, +18.6093750000,297,1733.3333740234,,, +18.6113281250,297,1730.4029541016,,, +18.6132812500,297,1726.7398681641,,, +18.6152343750,297,1722.3443603516,,, +18.6171875000,297,1717.2160644531,,, +18.6191406250,297,1714.2857666016,,, +18.6210937500,297,1708.4249267578,,, +18.6230468750,297,1702.5640869141,,, +18.6250000000,298,1696.7032470703,,, +18.6269531250,298,1690.8425292969,,, +18.6289062500,298,1683.5164794922,,, +18.6308593750,298,1676.1904296875,,, +18.6328125000,298,1669.5970458984,,, +18.6347656250,298,1661.5384521484,,, +18.6367187500,298,1653.4798583984,,, +18.6386718750,298,1646.1538085938,,, +18.6406250000,298,1637.3626708984,,, +18.6425781250,298,1627.1062011719,,, +18.6445312500,298,1619.0476074219,,, +18.6464843750,298,1609.5238037109,,, +18.6484375000,298,1599.2674560547,,, +18.6503906250,298,1589.0109863281,,, +18.6523437500,298,1580.2197265625,,, +18.6542968750,298,1570.6959228516,,, +18.6562500000,298,1560.4395751953,,, +18.6582031250,298,1550.9157714844,,, +18.6601562500,298,1541.3919677734,,, +18.6621093750,298,1531.1354980469,,, +18.6640625000,298,1521.6116943359,,, +18.6660156250,298,1513.5531005859,,, +18.6679687500,298,1504.0292968750,,, +18.6699218750,298,1494.5054931641,,, +18.6718750000,298,1486.4468994141,,, +18.6738281250,298,1477.6556396484,,, +18.6757812500,298,1469.5970458984,,, +18.6777343750,298,1461.5384521484,,, +18.6796875000,298,1454.2124023438,,, +18.6816406250,298,1446.1538085938,,, +18.6835937500,298,1436.6300048828,,, +18.6855468750,298,1430.7692871094,,, +18.6875000000,299,1422.7105712891,,, +18.6894531250,299,1416.1171875000,,, +18.6914062500,299,1410.2564697266,,, +18.6933593750,299,1403.6629638672,,, +18.6953125000,299,1396.3370361328,,, +18.6972656250,299,1388.2784423828,,, +18.6992187500,299,1383.1501464844,,, +18.7011718750,299,1375.8242187500,,, +18.7031250000,299,1369.2307128906,,, +18.7050781250,299,1364.1025390625,,, +18.7070312500,299,1358.2416992188,,, +18.7089843750,299,1350.9157714844,,, +18.7109375000,299,1345.0549316406,,, +18.7128906250,299,1339.1940917969,,, +18.7148437500,299,1334.0659179688,,, +18.7167968750,299,1328.2050781250,,, +18.7187500000,299,1324.5421142578,,, +18.7207031250,299,1320.1464843750,,, +18.7226562500,299,1315.0183105469,,, +18.7246093750,299,1312.0878906250,,, +18.7265625000,299,1309.1574707031,,, +18.7285156250,299,1306.2270507812,,, +18.7304687500,299,1302.5640869141,,, +18.7324218750,299,1300.3663330078,,, +18.7343750000,299,1298.9011230469,,, +18.7363281250,299,1295.9707031250,,, +18.7382812500,299,1293.0402832031,,, +18.7402343750,299,1292.3077392578,,, +18.7421875000,299,1290.8425292969,,, +18.7441406250,299,1288.6446533203,,, +18.7460937500,299,1287.9121093750,,, +18.7480468750,299,1285.7142333984,,, +18.7500000000,300,1284.9816894531,,, +18.7519531250,300,1284.9816894531,,, +18.7539062500,300,1284.2490234375,,, +18.7558593750,300,1283.5164794922,,, +18.7578125000,300,1282.7839355469,,, +18.7597656250,300,1283.5164794922,,, +18.7617187500,300,1283.5164794922,,, +18.7636718750,300,1282.7839355469,,, +18.7656250000,300,1284.2490234375,,, +18.7675781250,300,1284.2490234375,,, +18.7695312500,300,1284.9816894531,,, +18.7714843750,300,1285.7142333984,,, +18.7734375000,300,1287.1794433594,,, +18.7753906250,300,1289.3773193359,,, +18.7773437500,300,1290.8425292969,,, +18.7792968750,300,1291.5750732422,,, +18.7812500000,300,1295.2380371094,,, +18.7832031250,300,1297.4359130859,,, +18.7851562500,300,1299.6336669922,,, +18.7871093750,300,1301.0988769531,,, +18.7890625000,300,1304.7619628906,,, +18.7910156250,300,1306.2270507812,,, +18.7929687500,300,1307.6922607422,,, +18.7949218750,300,1311.3553466797,,, +18.7968750000,300,1313.5531005859,,, +18.7988281250,300,1315.0183105469,,, +18.8007812500,300,1317.9487304688,,, +18.8027343750,300,1319.4139404297,,, +18.8046875000,300,1322.3443603516,,, +18.8066406250,300,1326.0073242188,,, +18.8085937500,300,1327.4725341797,,, +18.8105468750,300,1328.2050781250,,, +18.8125000000,301,1330.4029541016,,, +18.8144531250,301,1332.6007080078,,, +18.8164062500,301,1333.3333740234,,, +18.8183593750,301,1334.7985839844,,, +18.8203125000,301,1338.4615478516,,, +18.8222656250,301,1340.6593017578,,, +18.8242187500,301,1342.1245117188,,, +18.8261718750,301,1344.3223876953,,, +18.8281250000,301,1347.2528076172,,, +18.8300781250,301,1350.1831054688,,, +18.8320312500,301,1352.3809814453,,, +18.8339843750,301,1356.7766113281,,, +18.8359375000,301,1358.9743652344,,, +18.8378906250,301,1361.1721191406,,, +18.8398437500,301,1364.8352050781,,, +18.8417968750,301,1367.0329589844,,, +18.8437500000,301,1368.4981689453,,, +18.8457031250,301,1371.4285888672,,, +18.8476562500,301,1372.8937988281,,, +18.8496093750,301,1375.0915527344,,, +18.8515625000,301,1375.8242187500,,, +18.8535156250,301,1378.7546386719,,, +18.8554687500,301,1379.4871826172,,, +18.8574218750,301,1380.2197265625,,, +18.8593750000,301,1383.1501464844,,, +18.8613281250,301,1383.8828125000,,, +18.8632812500,301,1384.6153564453,,, +18.8652343750,301,1386.8132324219,,, +18.8671875000,301,1387.5457763672,,, +18.8691406250,301,1388.2784423828,,, +18.8710937500,301,1388.2784423828,,, +18.8730468750,301,1390.4761962891,,, +18.8750000000,302,1390.4761962891,,, +18.8769531250,302,1390.4761962891,,, +18.8789062500,302,1391.9414062500,,, +18.8808593750,302,1391.2087402344,,, +18.8828125000,302,1391.2087402344,,, +18.8847656250,302,1391.9414062500,,, +18.8867187500,302,1391.9414062500,,, +18.8886718750,302,1391.2087402344,,, +18.8906250000,302,1391.2087402344,,, +18.8925781250,302,1391.2087402344,,, +18.8945312500,302,1390.4761962891,,, +18.8964843750,302,1389.0109863281,,, +18.8984375000,302,1389.0109863281,,, +18.9003906250,302,1387.5457763672,,, +18.9023437500,302,1385.3480224609,,, +18.9042968750,302,1384.6153564453,,, +18.9062500000,302,1381.6849365234,,, +18.9082031250,302,1380.9523925781,,, +18.9101562500,302,1379.4871826172,,, +18.9121093750,302,1376.5567626953,,, +18.9140625000,302,1377.2894287109,,, +18.9160156250,302,1374.3590087891,,, +18.9179687500,302,1372.1611328125,,, +18.9199218750,302,1372.1611328125,,, +18.9218750000,302,1370.6959228516,,, +18.9238281250,302,1369.9633789062,,, +18.9257812500,302,1368.4981689453,,, +18.9277343750,302,1366.3004150391,,, +18.9296875000,302,1365.5677490234,,, +18.9316406250,302,1364.1025390625,,, +18.9335937500,302,1361.1721191406,,, +18.9355468750,302,1361.1721191406,,, +18.9375000000,303,1358.9743652344,,, +18.9394531250,303,1356.7766113281,,, +18.9414062500,303,1356.7766113281,,, +18.9433593750,303,1353.8461914062,,, +18.9453125000,303,1352.3809814453,,, +18.9472656250,303,1351.6483154297,,, +18.9492187500,303,1348.7178955078,,, +18.9511718750,303,1348.7178955078,,, +18.9531250000,303,1346.5201416016,,, +18.9550781250,303,1344.3223876953,,, +18.9570312500,303,1342.8571777344,,, +18.9589843750,303,1340.6593017578,,, +18.9609375000,303,1339.1940917969,,, +18.9628906250,303,1336.9963378906,,, +18.9648437500,303,1335.5311279297,,, +18.9667968750,303,1334.7985839844,,, +18.9687500000,303,1332.6007080078,,, +18.9707031250,303,1331.1354980469,,, +18.9726562500,303,1331.1354980469,,, +18.9746093750,303,1328.9377441406,,, +18.9765625000,303,1327.4725341797,,, +18.9785156250,303,1326.0073242188,,, +18.9804687500,303,1323.8095703125,,, +18.9824218750,303,1323.8095703125,,, +18.9843750000,303,1321.6116943359,,, +18.9863281250,303,1319.4139404297,,, +18.9882812500,303,1317.9487304688,,, +18.9902343750,303,1314.2857666016,,, +18.9921875000,303,1313.5531005859,,, +18.9941406250,303,1311.3553466797,,, +18.9960937500,303,1309.1574707031,,, +18.9980468750,303,1308.4249267578,,, +19.0000000000,304,1306.2270507812,,, +19.0019531250,304,1305.4945068359,,, +19.0039062500,304,1304.7619628906,,, +19.0058593750,304,1303.2967529297,,, +19.0078125000,304,1304.0292968750,,, +19.0097656250,304,1301.8315429688,,, +19.0117187500,304,1301.0988769531,,, +19.0136718750,304,1299.6336669922,,, +19.0156250000,304,1298.9011230469,,, +19.0175781250,304,1298.1684570312,,, +19.0195312500,304,1296.7032470703,,, +19.0214843750,304,1295.9707031250,,, +19.0234375000,304,1295.9707031250,,, +19.0253906250,304,1294.5054931641,,, +19.0273437500,304,1293.7729492188,,, +19.0292968750,304,1293.7729492188,,, +19.0312500000,304,1292.3077392578,,, +19.0332031250,304,1293.7729492188,,, +19.0351562500,304,1292.3077392578,,, +19.0371093750,304,1291.5750732422,,, +19.0390625000,304,1291.5750732422,,, +19.0410156250,304,1290.8425292969,,, +19.0429687500,304,1291.5750732422,,, +19.0449218750,304,1290.8425292969,,, +19.0468750000,304,1290.1098632812,,, +19.0488281250,304,1291.5750732422,,, +19.0507812500,304,1290.1098632812,,, +19.0527343750,304,1290.8425292969,,, +19.0546875000,304,1290.1098632812,,, +19.0566406250,304,1289.3773193359,,, +19.0585937500,304,1290.8425292969,,, +19.0605468750,304,1290.8425292969,,, +19.0625000000,305,1292.3077392578,,, +19.0644531250,305,1291.5750732422,,, +19.0664062500,305,1291.5750732422,,, +19.0683593750,305,1292.3077392578,,, +19.0703125000,305,1290.8425292969,,, +19.0722656250,305,1290.8425292969,,, +19.0742187500,305,1291.5750732422,,, +19.0761718750,305,1290.1098632812,,, +19.0781250000,305,1290.1098632812,,, +19.0800781250,305,1289.3773193359,,, +19.0820312500,305,1289.3773193359,,, +19.0839843750,305,1290.1098632812,,, +19.0859375000,305,1289.3773193359,,, +19.0878906250,305,1289.3773193359,,, +19.0898437500,305,1290.1098632812,,, +19.0917968750,305,1288.6446533203,,, +19.0937500000,305,1290.1098632812,,, +19.0957031250,305,1290.1098632812,,, +19.0976562500,305,1290.1098632812,,, +19.0996093750,305,1290.8425292969,,, +19.1015625000,305,1291.5750732422,,, +19.1035156250,305,1290.8425292969,,, +19.1054687500,305,1292.3077392578,,, +19.1074218750,305,1293.0402832031,,, +19.1093750000,305,1292.3077392578,,, +19.1113281250,305,1293.7729492188,,, +19.1132812500,305,1293.7729492188,,, +19.1152343750,305,1293.0402832031,,, +19.1171875000,305,1293.0402832031,,, +19.1191406250,305,1293.0402832031,,, +19.1210937500,305,1292.3077392578,,, +19.1230468750,305,1293.7729492188,,, +19.1250000000,306,1293.0402832031,,, +19.1269531250,306,1292.3077392578,,, +19.1289062500,306,1293.7729492188,,, +19.1308593750,306,1293.0402832031,,, +19.1328125000,306,1293.7729492188,,, +19.1347656250,306,1294.5054931641,,, +19.1367187500,306,1294.5054931641,,, +19.1386718750,306,1293.7729492188,,, +19.1406250000,306,1293.0402832031,,, +19.1425781250,306,1293.7729492188,,, +19.1445312500,306,1294.5054931641,,, +19.1464843750,306,1294.5054931641,,, +19.1484375000,306,1294.5054931641,,, +19.1503906250,306,1294.5054931641,,, +19.1523437500,306,1294.5054931641,,, +19.1542968750,306,1294.5054931641,,, +19.1562500000,306,1295.9707031250,,, +19.1582031250,306,1295.2380371094,,, +19.1601562500,306,1295.2380371094,,, +19.1621093750,306,1295.2380371094,,, +19.1640625000,306,1295.2380371094,,, +19.1660156250,306,1294.5054931641,,, +19.1679687500,306,1295.2380371094,,, +19.1699218750,306,1295.9707031250,,, +19.1718750000,306,1296.7032470703,,, +19.1738281250,306,1295.9707031250,,, +19.1757812500,306,1297.4359130859,,, +19.1777343750,306,1298.1684570312,,, +19.1796875000,306,1297.4359130859,,, +19.1816406250,306,1296.7032470703,,, +19.1835937500,306,1298.9011230469,,, +19.1855468750,306,1299.6336669922,,, +19.1875000000,307,1297.4359130859,,, +19.1894531250,307,1296.7032470703,,, +19.1914062500,307,1298.9011230469,,, +19.1933593750,307,1298.1684570312,,, +19.1953125000,307,1295.9707031250,,, +19.1972656250,307,1295.9707031250,,, +19.1992187500,307,1296.7032470703,,, +19.2011718750,307,1295.9707031250,,, +19.2031250000,307,1295.2380371094,,, +19.2050781250,307,1295.2380371094,,, +19.2070312500,307,1295.9707031250,,, +19.2089843750,307,1295.2380371094,,, +19.2109375000,307,1295.2380371094,,, +19.2128906250,307,1296.7032470703,,, +19.2148437500,307,1298.1684570312,,, +19.2167968750,307,1299.6336669922,,, +19.2187500000,307,1301.0988769531,,, +19.2207031250,307,1304.7619628906,,, +19.2226562500,307,1306.9597167969,,, +19.2246093750,307,1309.1574707031,,, +19.2265625000,307,1312.8205566406,,, +19.2285156250,307,1317.2160644531,,, +19.2304687500,307,1320.8791503906,,, +19.2324218750,307,1324.5421142578,,, +19.2343750000,307,1331.1354980469,,, +19.2363281250,307,1336.9963378906,,, +19.2382812500,307,1342.1245117188,,, +19.2402343750,307,1347.9853515625,,, +19.2421875000,307,1354.5787353516,,, +19.2441406250,307,1361.1721191406,,, +19.2460937500,307,1367.7656250000,,, +19.2480468750,307,1373.6263427734,,, +19.2500000000,308,1382.4176025391,,, +19.2519531250,308,1390.4761962891,,, +19.2539062500,308,1397.0695800781,,, +19.2558593750,308,1405.8608398438,,, +19.2578125000,308,1415.3846435547,,, +19.2597656250,308,1423.4432373047,,, +19.2617187500,308,1432.2343750000,,, +19.2636718750,308,1441.0256347656,,, +19.2656250000,308,1450.5494384766,,, +19.2675781250,308,1458.6080322266,,, +19.2695312500,308,1467.3992919922,,, +19.2714843750,308,1477.6556396484,,, +19.2734375000,308,1487.1794433594,,, +19.2753906250,308,1496.7032470703,,, +19.2773437500,308,1505.4945068359,,, +19.2792968750,308,1515.7509765625,,, +19.2812500000,308,1524.5421142578,,, +19.2832031250,308,1533.3333740234,,, +19.2851562500,308,1542.8571777344,,, +19.2871093750,308,1553.1135253906,,, +19.2890625000,308,1561.9047851562,,, +19.2910156250,308,1570.6959228516,,, +19.2929687500,308,1578.7546386719,,, +19.2949218750,308,1588.2784423828,,, +19.2968750000,308,1595.6043701172,,, +19.2988281250,308,1604.3956298828,,, +19.3007812500,308,1613.1867675781,,, +19.3027343750,308,1620.5128173828,,, +19.3046875000,308,1627.8388671875,,, +19.3066406250,308,1635.1647949219,,, +19.3085937500,308,1643.2233886719,,, +19.3105468750,308,1650.5494384766,,, +19.3125000000,309,1654.9450683594,,, +19.3144531250,309,1659.3406982422,,, +19.3164062500,309,1665.2014160156,,, +19.3183593750,309,1668.8645019531,,, +19.3203125000,309,1671.7949218750,,, +19.3222656250,309,1673.9926757812,,, +19.3242187500,309,1676.9230957031,,, +19.3261718750,309,1678.3883056641,,, +19.3281250000,309,1678.3883056641,,, +19.3300781250,309,1678.3883056641,,, +19.3320312500,309,1678.3883056641,,, +19.3339843750,309,1676.9230957031,,, +19.3359375000,309,1675.4578857422,,, +19.3378906250,309,1672.5274658203,,, +19.3398437500,309,1671.7949218750,,, +19.3417968750,309,1668.8645019531,,, +19.3437500000,309,1664.4688720703,,, +19.3457031250,309,1660.8059082031,,, +19.3476562500,309,1657.1428222656,,, +19.3496093750,309,1652.0146484375,,, +19.3515625000,309,1646.1538085938,,, +19.3535156250,309,1641.7583007812,,, +19.3554687500,309,1635.8974609375,,, +19.3574218750,309,1628.5714111328,,, +19.3593750000,309,1622.7105712891,,, +19.3613281250,309,1617.5823974609,,, +19.3632812500,309,1610.2564697266,,, +19.3652343750,309,1602.9304199219,,, +19.3671875000,309,1596.3370361328,,, +19.3691406250,309,1588.2784423828,,, +19.3710937500,309,1580.9523925781,,, +19.3730468750,309,1572.8937988281,,, +19.3750000000,310,1567.0329589844,,, +19.3769531250,310,1559.7069091797,,, +19.3789062500,310,1552.3809814453,,, +19.3808593750,310,1544.3223876953,,, +19.3828125000,310,1538.4615478516,,, +19.3847656250,310,1531.1354980469,,, +19.3867187500,310,1523.8095703125,,, +19.3886718750,310,1516.4835205078,,, +19.3906250000,310,1510.6226806641,,, +19.3925781250,310,1503.2967529297,,, +19.3945312500,310,1496.7032470703,,, +19.3964843750,310,1489.3773193359,,, +19.3984375000,310,1483.5164794922,,, +19.4003906250,310,1476.9230957031,,, +19.4023437500,310,1470.3297119141,,, +19.4042968750,310,1463.7362060547,,, +19.4062500000,310,1457.8754882812,,, +19.4082031250,310,1451.2821044922,,, +19.4101562500,310,1444.6885986328,,, +19.4121093750,310,1439.5604248047,,, +19.4140625000,310,1433.6995849609,,, +19.4160156250,310,1427.8388671875,,, +19.4179687500,310,1421.2453613281,,, +19.4199218750,310,1416.1171875000,,, +19.4218750000,310,1410.9890136719,,, +19.4238281250,310,1405.8608398438,,, +19.4257812500,310,1400.0000000000,,, +19.4277343750,310,1395.6043701172,,, +19.4296875000,310,1390.4761962891,,, +19.4316406250,310,1385.3480224609,,, +19.4335937500,310,1379.4871826172,,, +19.4355468750,310,1375.8242187500,,, +19.4375000000,311,1372.1611328125,,, +19.4394531250,311,1366.3004150391,,, +19.4414062500,311,1361.1721191406,,, +19.4433593750,311,1357.5091552734,,, +19.4453125000,311,1353.8461914062,,, +19.4472656250,311,1349.4505615234,,, +19.4492187500,311,1343.5897216797,,, +19.4511718750,311,1341.3919677734,,, +19.4531250000,311,1336.9963378906,,, +19.4550781250,311,1332.6007080078,,, +19.4570312500,311,1329.6702880859,,, +19.4589843750,311,1327.4725341797,,, +19.4609375000,311,1323.0769042969,,, +19.4628906250,311,1319.4139404297,,, +19.4648437500,311,1315.7509765625,,, +19.4667968750,311,1314.2857666016,,, +19.4687500000,311,1311.3553466797,,, +19.4707031250,311,1309.1574707031,,, +19.4726562500,311,1306.9597167969,,, +19.4746093750,311,1306.2270507812,,, +19.4765625000,311,1304.7619628906,,, +19.4785156250,311,1303.2967529297,,, +19.4804687500,311,1302.5640869141,,, +19.4824218750,311,1302.5640869141,,, +19.4843750000,311,1301.8315429688,,, +19.4863281250,311,1300.3663330078,,, +19.4882812500,311,1300.3663330078,,, +19.4902343750,311,1298.9011230469,,, +19.4921875000,311,1297.4359130859,,, +19.4941406250,311,1298.9011230469,,, +19.4960937500,311,1298.9011230469,,, +19.4980468750,311,1298.9011230469,,, +19.5000000000,312,1298.1684570312,,, +19.5019531250,312,1298.9011230469,,, +19.5039062500,312,1299.6336669922,,, +19.5058593750,312,1299.6336669922,,, +19.5078125000,312,1298.9011230469,,, +19.5097656250,312,1300.3663330078,,, +19.5117187500,312,1301.8315429688,,, +19.5136718750,312,1301.8315429688,,, +19.5156250000,312,1302.5640869141,,, +19.5175781250,312,1304.0292968750,,, +19.5195312500,312,1305.4945068359,,, +19.5214843750,312,1306.2270507812,,, +19.5234375000,312,1306.9597167969,,, +19.5253906250,312,1310.6226806641,,, +19.5273437500,312,1312.0878906250,,, +19.5292968750,312,1314.2857666016,,, +19.5312500000,312,1315.0183105469,,, +19.5332031250,312,1317.2160644531,,, +19.5351562500,312,1318.6812744141,,, +19.5371093750,312,1320.1464843750,,, +19.5390625000,312,1321.6116943359,,, +19.5410156250,312,1324.5421142578,,, +19.5429687500,312,1326.0073242188,,, +19.5449218750,312,1327.4725341797,,, +19.5468750000,312,1328.2050781250,,, +19.5488281250,312,1331.8681640625,,, +19.5507812500,312,1333.3333740234,,, +19.5527343750,312,1334.7985839844,,, +19.5546875000,312,1335.5311279297,,, +19.5566406250,312,1337.7288818359,,, +19.5585937500,312,1340.6593017578,,, +19.5605468750,312,1342.1245117188,,, +19.5625000000,313,1343.5897216797,,, +19.5644531250,313,1345.0549316406,,, +19.5664062500,313,1346.5201416016,,, +19.5683593750,313,1348.7178955078,,, +19.5703125000,313,1349.4505615234,,, +19.5722656250,313,1350.9157714844,,, +19.5742187500,313,1351.6483154297,,, +19.5761718750,313,1353.8461914062,,, +19.5781250000,313,1355.3114013672,,, +19.5800781250,313,1356.0439453125,,, +19.5820312500,313,1355.3114013672,,, +19.5839843750,313,1357.5091552734,,, +19.5859375000,313,1358.2416992188,,, +19.5878906250,313,1356.7766113281,,, +19.5898437500,313,1357.5091552734,,, +19.5917968750,313,1358.2416992188,,, +19.5937500000,313,1358.9743652344,,, +19.5957031250,313,1358.9743652344,,, +19.5976562500,313,1358.2416992188,,, +19.5996093750,313,1359.7069091797,,, +19.6015625000,313,1358.9743652344,,, +19.6035156250,313,1357.5091552734,,, +19.6054687500,313,1358.2416992188,,, +19.6074218750,313,1357.5091552734,,, +19.6093750000,313,1356.7766113281,,, +19.6113281250,313,1356.7766113281,,, +19.6132812500,313,1356.7766113281,,, +19.6152343750,313,1354.5787353516,,, +19.6171875000,313,1353.1135253906,,, +19.6191406250,313,1353.1135253906,,, +19.6210937500,313,1350.9157714844,,, +19.6230468750,313,1351.6483154297,,, +19.6250000000,314,1350.1831054688,,, +19.6269531250,314,1348.7178955078,,, +19.6289062500,314,1347.9853515625,,, +19.6308593750,314,1346.5201416016,,, +19.6328125000,314,1345.7875976562,,, +19.6347656250,314,1345.7875976562,,, +19.6367187500,314,1345.0549316406,,, +19.6386718750,314,1343.5897216797,,, +19.6406250000,314,1342.8571777344,,, +19.6425781250,314,1342.1245117188,,, +19.6445312500,314,1342.1245117188,,, +19.6464843750,314,1340.6593017578,,, +19.6484375000,314,1341.3919677734,,, +19.6503906250,314,1339.1940917969,,, +19.6523437500,314,1337.7288818359,,, +19.6542968750,314,1337.7288818359,,, +19.6562500000,314,1336.9963378906,,, +19.6582031250,314,1335.5311279297,,, +19.6601562500,314,1335.5311279297,,, +19.6621093750,314,1333.3333740234,,, +19.6640625000,314,1331.8681640625,,, +19.6660156250,314,1331.1354980469,,, +19.6679687500,314,1328.9377441406,,, +19.6699218750,314,1327.4725341797,,, +19.6718750000,314,1326.0073242188,,, +19.6738281250,314,1325.2747802734,,, +19.6757812500,314,1322.3443603516,,, +19.6777343750,314,1321.6116943359,,, +19.6796875000,314,1320.8791503906,,, +19.6816406250,314,1318.6812744141,,, +19.6835937500,314,1317.9487304688,,, +19.6855468750,314,1316.4835205078,,, +19.6875000000,315,1314.2857666016,,, +19.6894531250,315,1314.2857666016,,, +19.6914062500,315,1313.5531005859,,, +19.6933593750,315,1312.0878906250,,, +19.6953125000,315,1310.6226806641,,, +19.6972656250,315,1309.8901367188,,, +19.6992187500,315,1307.6922607422,,, +19.7011718750,315,1306.9597167969,,, +19.7031250000,315,1306.2270507812,,, +19.7050781250,315,1304.0292968750,,, +19.7070312500,315,1302.5640869141,,, +19.7089843750,315,1301.8315429688,,, +19.7109375000,315,1299.6336669922,,, +19.7128906250,315,1298.1684570312,,, +19.7148437500,315,1298.9011230469,,, +19.7167968750,315,1295.9707031250,,, +19.7187500000,315,1294.5054931641,,, +19.7207031250,315,1294.5054931641,,, +19.7226562500,315,1293.0402832031,,, +19.7246093750,315,1291.5750732422,,, +19.7265625000,315,1290.1098632812,,, +19.7285156250,315,1289.3773193359,,, +19.7304687500,315,1287.9121093750,,, +19.7324218750,315,1284.9816894531,,, +19.7343750000,315,1283.5164794922,,, +19.7363281250,315,1282.7839355469,,, +19.7382812500,315,1282.0512695312,,, +19.7402343750,315,1280.5860595703,,, +19.7421875000,315,1278.3883056641,,, +19.7441406250,315,1276.9230957031,,, +19.7460937500,315,1276.9230957031,,, +19.7480468750,315,1276.1904296875,,, +19.7500000000,316,1274.7252197266,,, +19.7519531250,316,1273.9926757812,,, +19.7539062500,316,1273.9926757812,,, +19.7558593750,316,1273.2601318359,,, +19.7578125000,316,1271.7949218750,,, +19.7597656250,316,1271.0622558594,,, +19.7617187500,316,1271.7949218750,,, +19.7636718750,316,1271.0622558594,,, +19.7656250000,316,1270.3297119141,,, +19.7675781250,316,1270.3297119141,,, +19.7695312500,316,1271.0622558594,,, +19.7714843750,316,1270.3297119141,,, +19.7734375000,316,1268.8645019531,,, +19.7753906250,316,1268.1318359375,,, +19.7773437500,316,1269.5970458984,,, +19.7792968750,316,1269.5970458984,,, +19.7812500000,316,1269.5970458984,,, +19.7832031250,316,1268.8645019531,,, +19.7851562500,316,1268.8645019531,,, +19.7871093750,316,1270.3297119141,,, +19.7890625000,316,1270.3297119141,,, +19.7910156250,316,1269.5970458984,,, +19.7929687500,316,1268.8645019531,,, +19.7949218750,316,1268.8645019531,,, +19.7968750000,316,1268.1318359375,,, +19.7988281250,316,1267.3992919922,,, +19.8007812500,316,1265.9340820312,,, +19.8027343750,316,1265.9340820312,,, +19.8046875000,316,1265.9340820312,,, +19.8066406250,316,1264.4688720703,,, +19.8085937500,316,1262.2711181641,,, +19.8105468750,316,1263.0036621094,,, +19.8125000000,317,1263.7362060547,,, +19.8144531250,317,1263.7362060547,,, +19.8164062500,317,1263.7362060547,,, +19.8183593750,317,1264.4688720703,,, +19.8203125000,317,1265.9340820312,,, +19.8222656250,317,1265.9340820312,,, +19.8242187500,317,1265.9340820312,,, +19.8261718750,317,1266.6666259766,,, +19.8281250000,317,1267.3992919922,,, +19.8300781250,317,1267.3992919922,,, +19.8320312500,317,1267.3992919922,,, +19.8339843750,317,1268.1318359375,,, +19.8359375000,317,1268.8645019531,,, +19.8378906250,317,1268.8645019531,,, +19.8398437500,317,1269.5970458984,,, +19.8417968750,317,1270.3297119141,,, +19.8437500000,317,1272.5274658203,,, +19.8457031250,317,1272.5274658203,,, +19.8476562500,317,1273.2601318359,,, +19.8496093750,317,1273.9926757812,,, +19.8515625000,317,1276.1904296875,,, +19.8535156250,317,1276.1904296875,,, +19.8554687500,317,1276.1904296875,,, +19.8574218750,317,1276.9230957031,,, +19.8593750000,317,1277.6556396484,,, +19.8613281250,317,1279.1208496094,,, +19.8632812500,317,1279.1208496094,,, +19.8652343750,317,1279.1208496094,,, +19.8671875000,317,1279.1208496094,,, +19.8691406250,317,1281.3187255859,,, +19.8710937500,317,1282.0512695312,,, +19.8730468750,317,1280.5860595703,,, +19.8750000000,318,1280.5860595703,,, +19.8769531250,318,1282.0512695312,,, +19.8789062500,318,1282.7839355469,,, +19.8808593750,318,1283.5164794922,,, +19.8828125000,318,1282.0512695312,,, +19.8847656250,318,1281.3187255859,,, +19.8867187500,318,1282.0512695312,,, +19.8886718750,318,1282.0512695312,,, +19.8906250000,318,1281.3187255859,,, +19.8925781250,318,1280.5860595703,,, +19.8945312500,318,1282.0512695312,,, +19.8964843750,318,1282.7839355469,,, +19.8984375000,318,1282.0512695312,,, +19.9003906250,318,1281.3187255859,,, +19.9023437500,318,1281.3187255859,,, +19.9042968750,318,1282.0512695312,,, +19.9062500000,318,1282.0512695312,,, +19.9082031250,318,1279.8535156250,,, +19.9101562500,318,1279.1208496094,,, +19.9121093750,318,1280.5860595703,,, +19.9140625000,318,1280.5860595703,,, +19.9160156250,318,1280.5860595703,,, +19.9179687500,318,1279.1208496094,,, +19.9199218750,318,1279.8535156250,,, +19.9218750000,318,1279.8535156250,,, +19.9238281250,318,1277.6556396484,,, +19.9257812500,318,1276.1904296875,,, +19.9277343750,318,1276.9230957031,,, +19.9296875000,318,1277.6556396484,,, +19.9316406250,318,1277.6556396484,,, +19.9335937500,318,1276.1904296875,,, +19.9355468750,318,1276.9230957031,,, +19.9375000000,319,1276.9230957031,,, +19.9394531250,319,1276.1904296875,,, +19.9414062500,319,1274.7252197266,,, +19.9433593750,319,1275.4578857422,,, +19.9453125000,319,1275.4578857422,,, +19.9472656250,319,1274.7252197266,,, +19.9492187500,319,1273.9926757812,,, +19.9511718750,319,1275.4578857422,,, +19.9531250000,319,1273.9926757812,,, +19.9550781250,319,1273.9926757812,,, +19.9570312500,319,1273.2601318359,,, +19.9589843750,319,1273.9926757812,,, +19.9609375000,319,1273.9926757812,,, +19.9628906250,319,1273.2601318359,,, +19.9648437500,319,1273.2601318359,,, +19.9667968750,319,1274.7252197266,,, +19.9687500000,319,1274.7252197266,,, +19.9707031250,319,1273.2601318359,,, +19.9726562500,319,1274.7252197266,,, +19.9746093750,319,1274.7252197266,,, +19.9765625000,319,1273.9926757812,,, +19.9785156250,319,1273.9926757812,,, +19.9804687500,319,1274.7252197266,,, +19.9824218750,319,1274.7252197266,,, +19.9843750000,319,1273.9926757812,,, +19.9863281250,319,1272.5274658203,,, +19.9882812500,319,1273.2601318359,,, +19.9902343750,319,1273.2601318359,,, +19.9921875000,319,1272.5274658203,,, +19.9941406250,319,1271.7949218750,,, +19.9960937500,319,1271.7949218750,,, +19.9980468750,319,1271.7949218750,,, +20.0000000000,320,1271.0622558594,,, +20.0019531250,320,1269.5970458984,,, +20.0039062500,320,1269.5970458984,,, +20.0058593750,320,1269.5970458984,,, +20.0078125000,320,1268.1318359375,,, +20.0097656250,320,1267.3992919922,,, +20.0117187500,320,1268.1318359375,,, +20.0136718750,320,1267.3992919922,,, +20.0156250000,320,1265.2014160156,,, +20.0175781250,320,1264.4688720703,,, +20.0195312500,320,1265.2014160156,,, +20.0214843750,320,1264.4688720703,,, +20.0234375000,320,1263.0036621094,,, +20.0253906250,320,1263.7362060547,,, +20.0273437500,320,1263.7362060547,,, +20.0292968750,320,1263.0036621094,,, +20.0312500000,320,1261.5384521484,,, +20.0332031250,320,1262.2711181641,,, +20.0351562500,320,1263.0036621094,,, +20.0371093750,320,1262.2711181641,,, +20.0390625000,320,1262.2711181641,,, +20.0410156250,320,1263.7362060547,,, +20.0429687500,320,1264.4688720703,,, +20.0449218750,320,1264.4688720703,,, +20.0468750000,320,1263.7362060547,,, +20.0488281250,320,1264.4688720703,,, +20.0507812500,320,1265.9340820312,,, +20.0527343750,320,1265.2014160156,,, +20.0546875000,320,1265.9340820312,,, +20.0566406250,320,1265.2014160156,,, +20.0585937500,320,1265.9340820312,,, +20.0605468750,320,1266.6666259766,,, +20.0625000000,321,1266.6666259766,,, +20.0644531250,321,1265.9340820312,,, +20.0664062500,321,1266.6666259766,,, +20.0683593750,321,1267.3992919922,,, +20.0703125000,321,1266.6666259766,,, +20.0722656250,321,1265.9340820312,,, +20.0742187500,321,1265.9340820312,,, +20.0761718750,321,1266.6666259766,,, +20.0781250000,321,1265.2014160156,,, +20.0800781250,321,1265.2014160156,,, +20.0820312500,321,1265.2014160156,,, +20.0839843750,321,1265.9340820312,,, +20.0859375000,321,1265.2014160156,,, +20.0878906250,321,1264.4688720703,,, +20.0898437500,321,1264.4688720703,,, +20.0917968750,321,1265.2014160156,,, +20.0937500000,321,1265.9340820312,,, +20.0957031250,321,1264.4688720703,,, +20.0976562500,321,1263.7362060547,,, +20.0996093750,321,1264.4688720703,,, +20.1015625000,321,1263.7362060547,,, +20.1035156250,321,1262.2711181641,,, +20.1054687500,321,1261.5384521484,,, +20.1074218750,321,1263.0036621094,,, +20.1093750000,321,1262.2711181641,,, +20.1113281250,321,1260.8059082031,,, +20.1132812500,321,1259.3406982422,,, +20.1152343750,321,1260.0732421875,,, +20.1171875000,321,1260.0732421875,,, +20.1191406250,321,1260.0732421875,,, +20.1210937500,321,1260.0732421875,,, +20.1230468750,321,1260.0732421875,,, +20.1250000000,322,1260.8059082031,,, +20.1269531250,322,1260.0732421875,,, +20.1289062500,322,1259.3406982422,,, +20.1308593750,322,1259.3406982422,,, +20.1328125000,322,1260.8059082031,,, +20.1347656250,322,1261.5384521484,,, +20.1367187500,322,1261.5384521484,,, +20.1386718750,322,1263.0036621094,,, +20.1406250000,322,1263.7362060547,,, +20.1425781250,322,1262.2711181641,,, +20.1445312500,322,1262.2711181641,,, +20.1464843750,322,1263.0036621094,,, +20.1484375000,322,1262.2711181641,,, +20.1503906250,322,1263.0036621094,,, +20.1523437500,322,1263.0036621094,,, +20.1542968750,322,1262.2711181641,,, +20.1562500000,322,1263.0036621094,,, +20.1582031250,322,1262.2711181641,,, +20.1601562500,322,1261.5384521484,,, +20.1621093750,322,1260.0732421875,,, +20.1640625000,322,1261.5384521484,,, +20.1660156250,322,1260.8059082031,,, +20.1679687500,322,1259.3406982422,,, +20.1699218750,322,1258.6080322266,,, +20.1718750000,322,1260.0732421875,,, +20.1738281250,322,1259.3406982422,,, +20.1757812500,322,1260.0732421875,,, +20.1777343750,322,1260.0732421875,,, +20.1796875000,322,1262.2711181641,,, +20.1816406250,322,1263.7362060547,,, +20.1835937500,322,1263.7362060547,,, +20.1855468750,322,1265.2014160156,,, +20.1875000000,323,1266.6666259766,,, +20.1894531250,323,1269.5970458984,,, +20.1914062500,323,1272.5274658203,,, +20.1933593750,323,1273.2601318359,,, +20.1953125000,323,1276.1904296875,,, +20.1972656250,323,1279.1208496094,,, +20.1992187500,323,1281.3187255859,,, +20.2011718750,323,1282.7839355469,,, +20.2031250000,323,1284.9816894531,,, +20.2050781250,323,1289.3773193359,,, +20.2070312500,323,1293.0402832031,,, +20.2089843750,323,1295.2380371094,,, +20.2109375000,323,1299.6336669922,,, +20.2128906250,323,1304.0292968750,,, +20.2148437500,323,1309.1574707031,,, +20.2167968750,323,1312.0878906250,,, +20.2187500000,323,1316.4835205078,,, +20.2207031250,323,1323.0769042969,,, +20.2226562500,323,1328.9377441406,,, +20.2246093750,323,1334.7985839844,,, +20.2265625000,323,1339.9267578125,,, +20.2285156250,323,1346.5201416016,,, +20.2304687500,323,1354.5787353516,,, +20.2324218750,323,1361.1721191406,,, +20.2343750000,323,1367.7656250000,,, +20.2363281250,323,1375.0915527344,,, +20.2382812500,323,1384.6153564453,,, +20.2402343750,323,1392.6739501953,,, +20.2421875000,323,1400.7325439453,,, +20.2441406250,323,1408.7912597656,,, +20.2460937500,323,1419.0476074219,,, +20.2480468750,323,1427.8388671875,,, +20.2500000000,324,1435.8974609375,,, +20.2519531250,324,1443.9560546875,,, +20.2539062500,324,1454.2124023438,,, +20.2558593750,324,1463.0036621094,,, +20.2578125000,324,1472.5274658203,,, +20.2597656250,324,1480.5860595703,,, +20.2617187500,324,1492.3077392578,,, +20.2636718750,324,1500.3663330078,,, +20.2656250000,324,1509.8901367188,,, +20.2675781250,324,1517.9487304688,,, +20.2695312500,324,1529.6702880859,,, +20.2714843750,324,1538.4615478516,,, +20.2734375000,324,1547.2528076172,,, +20.2753906250,324,1556.0439453125,,, +20.2773437500,324,1564.8352050781,,, +20.2792968750,324,1574.3590087891,,, +20.2812500000,324,1583.1501464844,,, +20.2832031250,324,1590.4761962891,,, +20.2851562500,324,1596.3370361328,,, +20.2871093750,324,1602.1977539062,,, +20.2890625000,324,1609.5238037109,,, +20.2910156250,324,1616.1171875000,,, +20.2929687500,324,1621.2453613281,,, +20.2949218750,324,1625.6409912109,,, +20.2968750000,324,1629.3040771484,,, +20.2988281250,324,1634.4322509766,,, +20.3007812500,324,1634.4322509766,,, +20.3027343750,324,1638.8278808594,,, +20.3046875000,324,1641.7583007812,,, +20.3066406250,324,1643.9560546875,,, +20.3085937500,324,1645.4212646484,,, +20.3105468750,324,1648.3516845703,,, +20.3125000000,325,1651.2821044922,,, +20.3144531250,325,1652.0146484375,,, +20.3164062500,325,1652.7471923828,,, +20.3183593750,325,1654.2124023438,,, +20.3203125000,325,1654.9450683594,,, +20.3222656250,325,1656.4102783203,,, +20.3242187500,325,1656.4102783203,,, +20.3261718750,325,1654.9450683594,,, +20.3281250000,325,1654.2124023438,,, +20.3300781250,325,1654.2124023438,,, +20.3320312500,325,1654.2124023438,,, +20.3339843750,325,1652.0146484375,,, +20.3359375000,325,1649.8168945312,,, +20.3378906250,325,1648.3516845703,,, +20.3398437500,325,1647.6190185547,,, +20.3417968750,325,1646.1538085938,,, +20.3437500000,325,1643.2233886719,,, +20.3457031250,325,1638.8278808594,,, +20.3476562500,325,1635.8974609375,,, +20.3496093750,325,1633.6995849609,,, +20.3515625000,325,1630.0366210938,,, +20.3535156250,325,1624.9084472656,,, +20.3554687500,325,1619.7802734375,,, +20.3574218750,325,1614.6519775391,,, +20.3593750000,325,1610.2564697266,,, +20.3613281250,325,1605.8608398438,,, +20.3632812500,325,1600.0000000000,,, +20.3652343750,325,1592.6739501953,,, +20.3671875000,325,1586.0805664062,,, +20.3691406250,325,1580.9523925781,,, +20.3710937500,325,1575.8242187500,,, +20.3730468750,325,1569.9633789062,,, +20.3750000000,326,1563.3699951172,,, +20.3769531250,326,1556.7766113281,,, +20.3789062500,326,1550.1831054688,,, +20.3808593750,326,1545.0549316406,,, +20.3828125000,326,1539.1940917969,,, +20.3847656250,326,1531.8681640625,,, +20.3867187500,326,1526.0073242188,,, +20.3886718750,326,1519.4139404297,,, +20.3906250000,326,1515.7509765625,,, +20.3925781250,326,1509.8901367188,,, +20.3945312500,326,1504.7619628906,,, +20.3964843750,326,1499.6336669922,,, +20.3984375000,326,1495.2380371094,,, +20.4003906250,326,1490.8425292969,,, +20.4023437500,326,1484.9816894531,,, +20.4042968750,326,1479.1208496094,,, +20.4062500000,326,1473.2601318359,,, +20.4082031250,326,1468.1318359375,,, +20.4101562500,326,1464.4688720703,,, +20.4121093750,326,1460.8059082031,,, +20.4140625000,326,1455.6776123047,,, +20.4160156250,326,1451.2821044922,,, +20.4179687500,326,1446.8864746094,,, +20.4199218750,326,1443.9560546875,,, +20.4218750000,326,1440.2930908203,,, +20.4238281250,326,1435.8974609375,,, +20.4257812500,326,1432.9670410156,,, +20.4277343750,326,1431.5018310547,,, +20.4296875000,326,1428.5714111328,,, +20.4316406250,326,1424.9084472656,,, +20.4335937500,326,1421.9780273438,,, +20.4355468750,326,1420.5128173828,,, +20.4375000000,327,1416.8498535156,,, +20.4394531250,327,1413.9194335938,,, +20.4414062500,327,1411.7215576172,,, +20.4433593750,327,1408.7912597656,,, +20.4453125000,327,1405.8608398438,,, +20.4472656250,327,1402.9304199219,,, +20.4492187500,327,1401.4652099609,,, +20.4511718750,327,1398.5347900391,,, +20.4531250000,327,1394.8718261719,,, +20.4550781250,327,1391.9414062500,,, +20.4570312500,327,1390.4761962891,,, +20.4589843750,327,1387.5457763672,,, +20.4609375000,327,1384.6153564453,,, +20.4628906250,327,1380.9523925781,,, +20.4648437500,327,1378.7546386719,,, +20.4667968750,327,1377.2894287109,,, +20.4687500000,327,1374.3590087891,,, +20.4707031250,327,1371.4285888672,,, +20.4726562500,327,1367.7656250000,,, +20.4746093750,327,1364.1025390625,,, +20.4765625000,327,1363.3699951172,,, +20.4785156250,327,1360.4395751953,,, +20.4804687500,327,1357.5091552734,,, +20.4824218750,327,1353.8461914062,,, +20.4843750000,327,1351.6483154297,,, +20.4863281250,327,1350.1831054688,,, +20.4882812500,327,1348.7178955078,,, +20.4902343750,327,1347.2528076172,,, +20.4921875000,327,1345.0549316406,,, +20.4941406250,327,1342.1245117188,,, +20.4960937500,327,1339.9267578125,,, +20.4980468750,327,1338.4615478516,,, +20.5000000000,328,1338.4615478516,,, +20.5019531250,328,1336.2637939453,,, +20.5039062500,328,1335.5311279297,,, +20.5058593750,328,1333.3333740234,,, +20.5078125000,328,1333.3333740234,,, +20.5097656250,328,1334.0659179688,,, +20.5117187500,328,1333.3333740234,,, +20.5136718750,328,1332.6007080078,,, +20.5156250000,328,1331.1354980469,,, +20.5175781250,328,1330.4029541016,,, +20.5195312500,328,1331.1354980469,,, +20.5214843750,328,1331.8681640625,,, +20.5234375000,328,1333.3333740234,,, +20.5253906250,328,1333.3333740234,,, +20.5273437500,328,1334.0659179688,,, +20.5292968750,328,1336.2637939453,,, +20.5312500000,328,1338.4615478516,,, +20.5332031250,328,1339.1940917969,,, +20.5351562500,328,1339.1940917969,,, +20.5371093750,328,1339.9267578125,,, +20.5390625000,328,1341.3919677734,,, +20.5410156250,328,1343.5897216797,,, +20.5429687500,328,1345.7875976562,,, +20.5449218750,328,1346.5201416016,,, +20.5468750000,328,1346.5201416016,,, +20.5488281250,328,1347.9853515625,,, +20.5507812500,328,1350.1831054688,,, +20.5527343750,328,1351.6483154297,,, +20.5546875000,328,1352.3809814453,,, +20.5566406250,328,1351.6483154297,,, +20.5585937500,328,1353.1135253906,,, +20.5605468750,328,1355.3114013672,,, +20.5625000000,329,1356.7766113281,,, +20.5644531250,329,1358.2416992188,,, +20.5664062500,329,1358.9743652344,,, +20.5683593750,329,1358.9743652344,,, +20.5703125000,329,1361.1721191406,,, +20.5722656250,329,1361.1721191406,,, +20.5742187500,329,1361.1721191406,,, +20.5761718750,329,1360.4395751953,,, +20.5781250000,329,1360.4395751953,,, +20.5800781250,329,1361.9047851562,,, +20.5820312500,329,1362.6373291016,,, +20.5839843750,329,1362.6373291016,,, +20.5859375000,329,1363.3699951172,,, +20.5878906250,329,1363.3699951172,,, +20.5898437500,329,1365.5677490234,,, +20.5917968750,329,1367.7656250000,,, +20.5937500000,329,1368.4981689453,,, +20.5957031250,329,1369.2307128906,,, +20.5976562500,329,1369.2307128906,,, +20.5996093750,329,1369.9633789062,,, +20.6015625000,329,1372.8937988281,,, +20.6035156250,329,1372.8937988281,,, +20.6054687500,329,1373.6263427734,,, +20.6074218750,329,1374.3590087891,,, +20.6093750000,329,1375.8242187500,,, +20.6113281250,329,1375.8242187500,,, +20.6132812500,329,1375.0915527344,,, +20.6152343750,329,1374.3590087891,,, +20.6171875000,329,1376.5567626953,,, +20.6191406250,329,1375.0915527344,,, +20.6210937500,329,1374.3590087891,,, +20.6230468750,329,1372.8937988281,,, +20.6250000000,330,1372.8937988281,,, +20.6269531250,330,1372.1611328125,,, +20.6289062500,330,1369.2307128906,,, +20.6308593750,330,1367.7656250000,,, +20.6328125000,330,1367.7656250000,,, +20.6347656250,330,1366.3004150391,,, +20.6367187500,330,1364.8352050781,,, +20.6386718750,330,1363.3699951172,,, +20.6406250000,330,1363.3699951172,,, +20.6425781250,330,1362.6373291016,,, +20.6445312500,330,1361.1721191406,,, +20.6464843750,330,1360.4395751953,,, +20.6484375000,330,1358.9743652344,,, +20.6503906250,330,1358.2416992188,,, +20.6523437500,330,1358.2416992188,,, +20.6542968750,330,1356.7766113281,,, +20.6562500000,330,1356.0439453125,,, +20.6582031250,330,1353.8461914062,,, +20.6601562500,330,1352.3809814453,,, +20.6621093750,330,1351.6483154297,,, +20.6640625000,330,1350.9157714844,,, +20.6660156250,330,1350.1831054688,,, +20.6679687500,330,1347.9853515625,,, +20.6699218750,330,1346.5201416016,,, +20.6718750000,330,1347.2528076172,,, +20.6738281250,330,1345.7875976562,,, +20.6757812500,330,1345.0549316406,,, +20.6777343750,330,1345.0549316406,,, +20.6796875000,330,1343.5897216797,,, +20.6816406250,330,1340.6593017578,,, +20.6835937500,330,1340.6593017578,,, +20.6855468750,330,1339.9267578125,,, +20.6875000000,331,1337.7288818359,,, +20.6894531250,331,1335.5311279297,,, +20.6914062500,331,1332.6007080078,,, +20.6933593750,331,1331.8681640625,,, +20.6953125000,331,1330.4029541016,,, +20.6972656250,331,1328.2050781250,,, +20.6992187500,331,1326.7398681641,,, +20.7011718750,331,1326.0073242188,,, +20.7031250000,331,1326.0073242188,,, +20.7050781250,331,1324.5421142578,,, +20.7070312500,331,1321.6116943359,,, +20.7089843750,331,1320.1464843750,,, +20.7109375000,331,1320.1464843750,,, +20.7128906250,331,1319.4139404297,,, +20.7148437500,331,1318.6812744141,,, +20.7167968750,331,1317.2160644531,,, +20.7187500000,331,1317.2160644531,,, +20.7207031250,331,1317.9487304688,,, +20.7226562500,331,1318.6812744141,,, +20.7246093750,331,1316.4835205078,,, +20.7265625000,331,1315.0183105469,,, +20.7285156250,331,1315.0183105469,,, +20.7304687500,331,1314.2857666016,,, +20.7324218750,331,1312.0878906250,,, +20.7343750000,331,1311.3553466797,,, +20.7363281250,331,1309.1574707031,,, +20.7382812500,331,1309.1574707031,,, +20.7402343750,331,1308.4249267578,,, +20.7421875000,331,1307.6922607422,,, +20.7441406250,331,1306.2270507812,,, +20.7460937500,331,1304.7619628906,,, +20.7480468750,331,1304.7619628906,,, +20.7500000000,332,1304.0292968750,,, +20.7519531250,332,1301.8315429688,,, +20.7539062500,332,1301.0988769531,,, +20.7558593750,332,1301.0988769531,,, +20.7578125000,332,1302.5640869141,,, +20.7597656250,332,1302.5640869141,,, +20.7617187500,332,1301.8315429688,,, +20.7636718750,332,1301.8315429688,,, +20.7656250000,332,1302.5640869141,,, +20.7675781250,332,1304.0292968750,,, +20.7695312500,332,1302.5640869141,,, +20.7714843750,332,1302.5640869141,,, +20.7734375000,332,1303.2967529297,,, +20.7753906250,332,1304.7619628906,,, +20.7773437500,332,1306.2270507812,,, +20.7792968750,332,1305.4945068359,,, +20.7812500000,332,1305.4945068359,,, +20.7832031250,332,1304.7619628906,,, +20.7851562500,332,1306.2270507812,,, +20.7871093750,332,1306.2270507812,,, +20.7890625000,332,1305.4945068359,,, +20.7910156250,332,1305.4945068359,,, +20.7929687500,332,1304.7619628906,,, +20.7949218750,332,1304.7619628906,,, +20.7968750000,332,1304.0292968750,,, +20.7988281250,332,1303.2967529297,,, +20.8007812500,332,1301.0988769531,,, +20.8027343750,332,1299.6336669922,,, +20.8046875000,332,1299.6336669922,,, +20.8066406250,332,1299.6336669922,,, +20.8085937500,332,1298.9011230469,,, +20.8105468750,332,1297.4359130859,,, +20.8125000000,333,1295.9707031250,,, +20.8144531250,333,1296.7032470703,,, +20.8164062500,333,1295.9707031250,,, +20.8183593750,333,1295.9707031250,,, +20.8203125000,333,1294.5054931641,,, +20.8222656250,333,1294.5054931641,,, +20.8242187500,333,1295.2380371094,,, +20.8261718750,333,1294.5054931641,,, +20.8281250000,333,1293.7729492188,,, +20.8300781250,333,1293.7729492188,,, +20.8320312500,333,1293.7729492188,,, +20.8339843750,333,1294.5054931641,,, +20.8359375000,333,1293.7729492188,,, +20.8378906250,333,1293.0402832031,,, +20.8398437500,333,1293.7729492188,,, +20.8417968750,333,1293.7729492188,,, +20.8437500000,333,1293.0402832031,,, +20.8457031250,333,1293.0402832031,,, +20.8476562500,333,1293.0402832031,,, +20.8496093750,333,1294.5054931641,,, +20.8515625000,333,1293.7729492188,,, +20.8535156250,333,1293.0402832031,,, +20.8554687500,333,1293.0402832031,,, +20.8574218750,333,1294.5054931641,,, +20.8593750000,333,1295.2380371094,,, +20.8613281250,333,1295.2380371094,,, +20.8632812500,333,1295.2380371094,,, +20.8652343750,333,1295.2380371094,,, +20.8671875000,333,1297.4359130859,,, +20.8691406250,333,1296.7032470703,,, +20.8710937500,333,1295.9707031250,,, +20.8730468750,333,1295.2380371094,,, +20.8750000000,334,1296.7032470703,,, +20.8769531250,334,1296.7032470703,,, +20.8789062500,334,1295.9707031250,,, +20.8808593750,334,1295.2380371094,,, +20.8828125000,334,1295.9707031250,,, +20.8847656250,334,1295.2380371094,,, +20.8867187500,334,1295.2380371094,,, +20.8886718750,334,1294.5054931641,,, +20.8906250000,334,1293.7729492188,,, +20.8925781250,334,1294.5054931641,,, +20.8945312500,334,1295.2380371094,,, +20.8964843750,334,1295.2380371094,,, +20.8984375000,334,1295.9707031250,,, +20.9003906250,334,1296.7032470703,,, +20.9023437500,334,1298.1684570312,,, +20.9042968750,334,1298.9011230469,,, +20.9062500000,334,1298.9011230469,,, +20.9082031250,334,1298.9011230469,,, +20.9101562500,334,1298.9011230469,,, +20.9121093750,334,1300.3663330078,,, +20.9140625000,334,1300.3663330078,,, +20.9160156250,334,1299.6336669922,,, +20.9179687500,334,1298.9011230469,,, +20.9199218750,334,1299.6336669922,,, +20.9218750000,334,1300.3663330078,,, +20.9238281250,334,1300.3663330078,,, +20.9257812500,334,1298.9011230469,,, +20.9277343750,334,1298.1684570312,,, +20.9296875000,334,1297.4359130859,,, +20.9316406250,334,1297.4359130859,,, +20.9335937500,334,1297.4359130859,,, +20.9355468750,334,1295.9707031250,,, +20.9375000000,335,1295.2380371094,,, +20.9394531250,335,1293.7729492188,,, +20.9414062500,335,1293.0402832031,,, +20.9433593750,335,1293.0402832031,,, +20.9453125000,335,1291.5750732422,,, +20.9472656250,335,1289.3773193359,,, +20.9492187500,335,1287.9121093750,,, +20.9511718750,335,1287.1794433594,,, +20.9531250000,335,1287.1794433594,,, +20.9550781250,335,1286.4468994141,,, +20.9570312500,335,1284.9816894531,,, +20.9589843750,335,1284.2490234375,,, +20.9609375000,335,1284.9816894531,,, +20.9628906250,335,1284.9816894531,,, +20.9648437500,335,1284.9816894531,,, +20.9667968750,335,1283.5164794922,,, +20.9687500000,335,1283.5164794922,,, +20.9707031250,335,1284.2490234375,,, +20.9726562500,335,1284.2490234375,,, +20.9746093750,335,1284.2490234375,,, +20.9765625000,335,1283.5164794922,,, +20.9785156250,335,1282.7839355469,,, +20.9804687500,335,1283.5164794922,,, +20.9824218750,335,1284.9816894531,,, +20.9843750000,335,1286.4468994141,,, +20.9863281250,335,1284.9816894531,,, +20.9882812500,335,1285.7142333984,,, +20.9902343750,335,1285.7142333984,,, +20.9921875000,335,1285.7142333984,,, +20.9941406250,335,1287.9121093750,,, +20.9960937500,335,1287.9121093750,,, +20.9980468750,335,1287.9121093750,,, +21.0000000000,336,1287.9121093750,,, +21.0019531250,336,1287.1794433594,,, +21.0039062500,336,1288.6446533203,,, +21.0058593750,336,1288.6446533203,,, +21.0078125000,336,1287.9121093750,,, +21.0097656250,336,1287.1794433594,,, +21.0117187500,336,1288.6446533203,,, +21.0136718750,336,1288.6446533203,,, +21.0156250000,336,1288.6446533203,,, +21.0175781250,336,1287.9121093750,,, +21.0195312500,336,1287.1794433594,,, +21.0214843750,336,1288.6446533203,,, +21.0234375000,336,1288.6446533203,,, +21.0253906250,336,1287.9121093750,,, +21.0273437500,336,1287.9121093750,,, +21.0292968750,336,1289.3773193359,,, +21.0312500000,336,1288.6446533203,,, +21.0332031250,336,1288.6446533203,,, +21.0351562500,336,1290.1098632812,,, +21.0371093750,336,1290.8425292969,,, +21.0390625000,336,1291.5750732422,,, +21.0410156250,336,1292.3077392578,,, +21.0429687500,336,1291.5750732422,,, +21.0449218750,336,1293.0402832031,,, +21.0468750000,336,1295.2380371094,,, +21.0488281250,336,1294.5054931641,,, +21.0507812500,336,1295.2380371094,,, +21.0527343750,336,1294.5054931641,,, +21.0546875000,336,1295.2380371094,,, +21.0566406250,336,1296.7032470703,,, +21.0585937500,336,1298.1684570312,,, +21.0605468750,336,1298.9011230469,,, +21.0625000000,337,1298.1684570312,,, +21.0644531250,337,1298.1684570312,,, +21.0664062500,337,1297.4359130859,,, +21.0683593750,337,1298.9011230469,,, +21.0703125000,337,1301.8315429688,,, +21.0722656250,337,1301.8315429688,,, +21.0742187500,337,1302.5640869141,,, +21.0761718750,337,1302.5640869141,,, +21.0781250000,337,1302.5640869141,,, +21.0800781250,337,1304.0292968750,,, +21.0820312500,337,1305.4945068359,,, +21.0839843750,337,1306.2270507812,,, +21.0859375000,337,1306.9597167969,,, +21.0878906250,337,1306.2270507812,,, +21.0898437500,337,1308.4249267578,,, +21.0917968750,337,1309.8901367188,,, +21.0937500000,337,1311.3553466797,,, +21.0957031250,337,1312.0878906250,,, +21.0976562500,337,1312.0878906250,,, +21.0996093750,337,1312.0878906250,,, +21.1015625000,337,1312.8205566406,,, +21.1035156250,337,1314.2857666016,,, +21.1054687500,337,1314.2857666016,,, +21.1074218750,337,1312.8205566406,,, +21.1093750000,337,1312.0878906250,,, +21.1113281250,337,1310.6226806641,,, +21.1132812500,337,1310.6226806641,,, +21.1152343750,337,1310.6226806641,,, +21.1171875000,337,1309.1574707031,,, +21.1191406250,337,1307.6922607422,,, +21.1210937500,337,1306.2270507812,,, +21.1230468750,337,1304.7619628906,,, +21.1250000000,338,1304.0292968750,,, +21.1269531250,338,1302.5640869141,,, +21.1289062500,338,1301.8315429688,,, +21.1308593750,338,1300.3663330078,,, +21.1328125000,338,1298.1684570312,,, +21.1347656250,338,1296.7032470703,,, +21.1367187500,338,1296.7032470703,,, +21.1386718750,338,1295.9707031250,,, +21.1406250000,338,1295.2380371094,,, +21.1425781250,338,1293.7729492188,,, +21.1445312500,338,1292.3077392578,,, +21.1464843750,338,1293.0402832031,,, +21.1484375000,338,1293.0402832031,,, +21.1503906250,338,1292.3077392578,,, +21.1523437500,338,1290.8425292969,,, +21.1542968750,338,1290.1098632812,,, +21.1562500000,338,1289.3773193359,,, +21.1582031250,338,1289.3773193359,,, +21.1601562500,338,1289.3773193359,,, +21.1621093750,338,1289.3773193359,,, +21.1640625000,338,1287.9121093750,,, +21.1660156250,338,1286.4468994141,,, +21.1679687500,338,1285.7142333984,,, +21.1699218750,338,1285.7142333984,,, +21.1718750000,338,1285.7142333984,,, +21.1738281250,338,1284.9816894531,,, +21.1757812500,338,1283.5164794922,,, +21.1777343750,338,1282.0512695312,,, +21.1796875000,338,1282.0512695312,,, +21.1816406250,338,1283.5164794922,,, +21.1835937500,338,1282.0512695312,,, +21.1855468750,338,1281.3187255859,,, +21.1875000000,339,1280.5860595703,,, +21.1894531250,339,1279.8535156250,,, +21.1914062500,339,1279.8535156250,,, +21.1933593750,339,1280.5860595703,,, +21.1953125000,339,1279.8535156250,,, +21.1972656250,339,1279.1208496094,,, +21.1992187500,339,1278.3883056641,,, +21.2011718750,339,1278.3883056641,,, +21.2031250000,339,1279.1208496094,,, +21.2050781250,339,1279.8535156250,,, +21.2070312500,339,1278.3883056641,,, +21.2089843750,339,1277.6556396484,,, +21.2109375000,339,1277.6556396484,,, +21.2128906250,339,1278.3883056641,,, +21.2148437500,339,1279.8535156250,,, +21.2167968750,339,1279.1208496094,,, +21.2187500000,339,1279.1208496094,,, +21.2207031250,339,1277.6556396484,,, +21.2226562500,339,1276.1904296875,,, +21.2246093750,339,1276.1904296875,,, +21.2265625000,339,1276.9230957031,,, +21.2285156250,339,1276.9230957031,,, +21.2304687500,339,1277.6556396484,,, +21.2324218750,339,1276.9230957031,,, +21.2343750000,339,1276.1904296875,,, +21.2363281250,339,1275.4578857422,,, +21.2382812500,339,1276.1904296875,,, +21.2402343750,339,1276.9230957031,,, +21.2421875000,339,1276.9230957031,,, +21.2441406250,339,1276.1904296875,,, +21.2460937500,339,1276.1904296875,,, +21.2480468750,339,1276.1904296875,,, +21.2500000000,340,1279.1208496094,,, +21.2519531250,340,1279.8535156250,,, +21.2539062500,340,1279.8535156250,,, +21.2558593750,340,1279.8535156250,,, +21.2578125000,340,1279.8535156250,,, +21.2597656250,340,1281.3187255859,,, +21.2617187500,340,1282.7839355469,,, +21.2636718750,340,1284.2490234375,,, +21.2656250000,340,1283.5164794922,,, +21.2675781250,340,1284.2490234375,,, +21.2695312500,340,1284.9816894531,,, +21.2714843750,340,1287.1794433594,,, +21.2734375000,340,1289.3773193359,,, +21.2753906250,340,1290.1098632812,,, +21.2773437500,340,1290.1098632812,,, +21.2792968750,340,1289.3773193359,,, +21.2812500000,340,1289.3773193359,,, +21.2832031250,340,1289.3773193359,,, +21.2851562500,340,1290.1098632812,,, +21.2871093750,340,1289.3773193359,,, +21.2890625000,340,1288.6446533203,,, +21.2910156250,340,1288.6446533203,,, +21.2929687500,340,1290.1098632812,,, +21.2949218750,340,1290.1098632812,,, +21.2968750000,340,1290.1098632812,,, +21.2988281250,340,1289.3773193359,,, +21.3007812500,340,1289.3773193359,,, +21.3027343750,340,1290.8425292969,,, +21.3046875000,340,1291.5750732422,,, +21.3066406250,340,1292.3077392578,,, +21.3085937500,340,1290.8425292969,,, +21.3105468750,340,1290.1098632812,,, +21.3125000000,341,1290.8425292969,,, +21.3144531250,341,1291.5750732422,,, +21.3164062500,341,1290.8425292969,,, +21.3183593750,341,1289.3773193359,,, +21.3203125000,341,1288.6446533203,,, +21.3222656250,341,1289.3773193359,,, +21.3242187500,341,1290.8425292969,,, +21.3261718750,341,1291.5750732422,,, +21.3281250000,341,1290.8425292969,,, +21.3300781250,341,1290.1098632812,,, +21.3320312500,341,1292.3077392578,,, +21.3339843750,341,1293.7729492188,,, +21.3359375000,341,1294.5054931641,,, +21.3378906250,341,1295.9707031250,,, +21.3398437500,341,1297.4359130859,,, +21.3417968750,341,1298.9011230469,,, +21.3437500000,341,1300.3663330078,,, +21.3457031250,341,1301.8315429688,,, +21.3476562500,341,1301.8315429688,,, +21.3496093750,341,1301.8315429688,,, +21.3515625000,341,1302.5640869141,,, +21.3535156250,341,1303.2967529297,,, +21.3554687500,341,1304.7619628906,,, +21.3574218750,341,1304.7619628906,,, +21.3593750000,341,1304.7619628906,,, +21.3613281250,341,1304.7619628906,,, +21.3632812500,341,1304.7619628906,,, +21.3652343750,341,1306.9597167969,,, +21.3671875000,341,1308.4249267578,,, +21.3691406250,341,1308.4249267578,,, +21.3710937500,341,1309.1574707031,,, +21.3730468750,341,1309.8901367188,,, +21.3750000000,342,1310.6226806641,,, +21.3769531250,342,1314.2857666016,,, +21.3789062500,342,1317.2160644531,,, +21.3808593750,342,1319.4139404297,,, +21.3828125000,342,1320.8791503906,,, +21.3847656250,342,1323.0769042969,,, +21.3867187500,342,1325.2747802734,,, +21.3886718750,342,1328.2050781250,,, +21.3906250000,342,1332.6007080078,,, +21.3925781250,342,1336.9963378906,,, +21.3945312500,342,1340.6593017578,,, +21.3964843750,342,1344.3223876953,,, +21.3984375000,342,1347.2528076172,,, +21.4003906250,342,1350.9157714844,,, +21.4023437500,342,1355.3114013672,,, +21.4042968750,342,1361.1721191406,,, +21.4062500000,342,1366.3004150391,,, +21.4082031250,342,1370.6959228516,,, +21.4101562500,342,1375.8242187500,,, +21.4121093750,342,1379.4871826172,,, +21.4140625000,342,1385.3480224609,,, +21.4160156250,342,1391.9414062500,,, +21.4179687500,342,1397.8022460938,,, +21.4199218750,342,1402.1977539062,,, +21.4218750000,342,1408.0585937500,,, +21.4238281250,342,1413.9194335938,,, +21.4257812500,342,1421.9780273438,,, +21.4277343750,342,1427.8388671875,,, +21.4296875000,342,1434.4322509766,,, +21.4316406250,342,1441.0256347656,,, +21.4335937500,342,1447.6190185547,,, +21.4355468750,342,1454.9450683594,,, +21.4375000000,343,1462.2711181641,,, +21.4394531250,343,1468.1318359375,,, +21.4414062500,343,1475.4578857422,,, +21.4433593750,343,1482.7839355469,,, +21.4453125000,343,1490.1098632812,,, +21.4472656250,343,1496.7032470703,,, +21.4492187500,343,1503.2967529297,,, +21.4511718750,343,1510.6226806641,,, +21.4531250000,343,1518.6812744141,,, +21.4550781250,343,1526.7398681641,,, +21.4570312500,343,1534.0659179688,,, +21.4589843750,343,1540.6593017578,,, +21.4609375000,343,1547.2528076172,,, +21.4628906250,343,1555.3114013672,,, +21.4648437500,343,1561.9047851562,,, +21.4667968750,343,1567.7656250000,,, +21.4687500000,343,1574.3590087891,,, +21.4707031250,343,1581.6849365234,,, +21.4726562500,343,1587.5457763672,,, +21.4746093750,343,1592.6739501953,,, +21.4765625000,343,1597.8022460938,,, +21.4785156250,343,1603.6629638672,,, +21.4804687500,343,1608.0585937500,,, +21.4824218750,343,1612.4542236328,,, +21.4843750000,343,1616.1171875000,,, +21.4863281250,343,1621.9780273438,,, +21.4882812500,343,1624.9084472656,,, +21.4902343750,343,1627.1062011719,,, +21.4921875000,343,1629.3040771484,,, +21.4941406250,343,1633.6995849609,,, +21.4960937500,343,1635.1647949219,,, +21.4980468750,343,1636.6300048828,,, +21.5000000000,344,1637.3626708984,,, +21.5019531250,344,1638.8278808594,,, +21.5039062500,344,1639.5604248047,,, +21.5058593750,344,1638.8278808594,,, +21.5078125000,344,1638.0952148438,,, +21.5097656250,344,1638.0952148438,,, +21.5117187500,344,1637.3626708984,,, +21.5136718750,344,1635.8974609375,,, +21.5156250000,344,1634.4322509766,,, +21.5175781250,344,1633.6995849609,,, +21.5195312500,344,1633.6995849609,,, +21.5214843750,344,1630.0366210938,,, +21.5234375000,344,1627.8388671875,,, +21.5253906250,344,1624.9084472656,,, +21.5273437500,344,1621.9780273438,,, +21.5292968750,344,1619.7802734375,,, +21.5312500000,344,1616.8498535156,,, +21.5332031250,344,1613.1867675781,,, +21.5351562500,344,1608.7912597656,,, +21.5371093750,344,1605.1281738281,,, +21.5390625000,344,1602.1977539062,,, +21.5410156250,344,1599.2674560547,,, +21.5429687500,344,1595.6043701172,,, +21.5449218750,344,1591.2087402344,,, +21.5468750000,344,1587.5457763672,,, +21.5488281250,344,1584.6153564453,,, +21.5507812500,344,1583.1501464844,,, +21.5527343750,344,1579.4871826172,,, +21.5546875000,344,1576.5567626953,,, +21.5566406250,344,1572.1611328125,,, +21.5585937500,344,1569.9633789062,,, +21.5605468750,344,1567.7656250000,,, +21.5625000000,345,1564.1025390625,,, +21.5644531250,345,1559.7069091797,,, +21.5664062500,345,1554.5787353516,,, +21.5683593750,345,1550.9157714844,,, +21.5703125000,345,1547.2528076172,,, +21.5722656250,345,1544.3223876953,,, +21.5742187500,345,1539.9267578125,,, +21.5761718750,345,1536.2637939453,,, +21.5781250000,345,1531.8681640625,,, +21.5800781250,345,1527.4725341797,,, +21.5820312500,345,1524.5421142578,,, +21.5839843750,345,1520.8791503906,,, +21.5859375000,345,1516.4835205078,,, +21.5878906250,345,1511.3553466797,,, +21.5898437500,345,1506.9597167969,,, +21.5917968750,345,1504.0292968750,,, +21.5937500000,345,1501.8315429688,,, +21.5957031250,345,1498.9011230469,,, +21.5976562500,345,1494.5054931641,,, +21.5996093750,345,1491.5750732422,,, +21.6015625000,345,1488.6446533203,,, +21.6035156250,345,1485.7142333984,,, +21.6054687500,345,1483.5164794922,,, +21.6074218750,345,1480.5860595703,,, +21.6093750000,345,1476.1904296875,,, +21.6113281250,345,1472.5274658203,,, +21.6132812500,345,1470.3297119141,,, +21.6152343750,345,1468.1318359375,,, +21.6171875000,345,1465.9340820312,,, +21.6191406250,345,1462.2711181641,,, +21.6210937500,345,1460.0732421875,,, +21.6230468750,345,1458.6080322266,,, +21.6250000000,346,1456.4102783203,,, +21.6269531250,346,1453.4798583984,,, +21.6289062500,346,1450.5494384766,,, +21.6308593750,346,1446.8864746094,,, +21.6328125000,346,1443.9560546875,,, +21.6347656250,346,1441.7583007812,,, +21.6367187500,346,1440.2930908203,,, +21.6386718750,346,1436.6300048828,,, +21.6406250000,346,1433.6995849609,,, +21.6425781250,346,1431.5018310547,,, +21.6445312500,346,1428.5714111328,,, +21.6464843750,346,1426.3736572266,,, +21.6484375000,346,1424.9084472656,,, +21.6503906250,346,1421.9780273438,,, +21.6523437500,346,1419.7802734375,,, +21.6542968750,346,1416.8498535156,,, +21.6562500000,346,1415.3846435547,,, +21.6582031250,346,1414.6519775391,,, +21.6601562500,346,1413.1867675781,,, +21.6621093750,346,1411.7215576172,,, +21.6640625000,346,1409.5238037109,,, +21.6660156250,346,1408.0585937500,,, +21.6679687500,346,1407.3260498047,,, +21.6699218750,346,1407.3260498047,,, +21.6718750000,346,1406.5933837891,,, +21.6738281250,346,1404.3956298828,,, +21.6757812500,346,1402.9304199219,,, +21.6777343750,346,1402.9304199219,,, +21.6796875000,346,1402.9304199219,,, +21.6816406250,346,1402.9304199219,,, +21.6835937500,346,1402.1977539062,,, +21.6855468750,346,1400.7325439453,,, +21.6875000000,347,1400.0000000000,,, +21.6894531250,347,1400.0000000000,,, +21.6914062500,347,1400.0000000000,,, +21.6933593750,347,1398.5347900391,,, +21.6953125000,347,1397.0695800781,,, +21.6972656250,347,1395.6043701172,,, +21.6992187500,347,1396.3370361328,,, +21.7011718750,347,1396.3370361328,,, +21.7031250000,347,1396.3370361328,,, +21.7050781250,347,1396.3370361328,,, +21.7070312500,347,1395.6043701172,,, +21.7089843750,347,1395.6043701172,,, +21.7109375000,347,1397.0695800781,,, +21.7128906250,347,1397.8022460938,,, +21.7148437500,347,1397.8022460938,,, +21.7167968750,347,1397.0695800781,,, +21.7187500000,347,1397.0695800781,,, +21.7207031250,347,1398.5347900391,,, +21.7226562500,347,1400.7325439453,,, +21.7246093750,347,1402.1977539062,,, +21.7265625000,347,1402.9304199219,,, +21.7285156250,347,1404.3956298828,,, +21.7304687500,347,1405.8608398438,,, +21.7324218750,347,1408.0585937500,,, +21.7343750000,347,1410.2564697266,,, +21.7363281250,347,1411.7215576172,,, +21.7382812500,347,1413.1867675781,,, +21.7402343750,347,1415.3846435547,,, +21.7421875000,347,1418.3150634766,,, +21.7441406250,347,1420.5128173828,,, +21.7460937500,347,1421.2453613281,,, +21.7480468750,347,1422.7105712891,,, +21.7500000000,348,1424.1757812500,,, +21.7519531250,348,1426.3736572266,,, +21.7539062500,348,1427.1062011719,,, +21.7558593750,348,1427.1062011719,,, +21.7578125000,348,1427.8388671875,,, +21.7597656250,348,1427.8388671875,,, +21.7617187500,348,1429.3040771484,,, +21.7636718750,348,1429.3040771484,,, +21.7656250000,348,1428.5714111328,,, +21.7675781250,348,1428.5714111328,,, +21.7695312500,348,1429.3040771484,,, +21.7714843750,348,1429.3040771484,,, +21.7734375000,348,1427.8388671875,,, +21.7753906250,348,1428.5714111328,,, +21.7773437500,348,1427.8388671875,,, +21.7792968750,348,1427.8388671875,,, +21.7812500000,348,1427.1062011719,,, +21.7832031250,348,1427.1062011719,,, +21.7851562500,348,1427.8388671875,,, +21.7871093750,348,1426.3736572266,,, +21.7890625000,348,1425.6409912109,,, +21.7910156250,348,1426.3736572266,,, +21.7929687500,348,1425.6409912109,,, +21.7949218750,348,1423.4432373047,,, +21.7968750000,348,1423.4432373047,,, +21.7988281250,348,1424.1757812500,,, +21.8007812500,348,1423.4432373047,,, +21.8027343750,348,1421.9780273438,,, +21.8046875000,348,1421.2453613281,,, +21.8066406250,348,1421.2453613281,,, +21.8085937500,348,1421.9780273438,,, +21.8105468750,348,1420.5128173828,,, +21.8125000000,349,1419.0476074219,,, +21.8144531250,349,1418.3150634766,,, +21.8164062500,349,1419.0476074219,,, +21.8183593750,349,1418.3150634766,,, +21.8203125000,349,1416.8498535156,,, +21.8222656250,349,1416.1171875000,,, +21.8242187500,349,1416.1171875000,,, +21.8261718750,349,1415.3846435547,,, +21.8281250000,349,1413.9194335938,,, +21.8300781250,349,1413.1867675781,,, +21.8320312500,349,1413.1867675781,,, +21.8339843750,349,1412.4542236328,,, +21.8359375000,349,1410.9890136719,,, +21.8378906250,349,1410.9890136719,,, +21.8398437500,349,1409.5238037109,,, +21.8417968750,349,1410.2564697266,,, +21.8437500000,349,1408.7912597656,,, +21.8457031250,349,1408.0585937500,,, +21.8476562500,349,1407.3260498047,,, +21.8496093750,349,1405.8608398438,,, +21.8515625000,349,1404.3956298828,,, +21.8535156250,349,1402.9304199219,,, +21.8554687500,349,1402.9304199219,,, +21.8574218750,349,1403.6629638672,,, +21.8593750000,349,1402.1977539062,,, +21.8613281250,349,1400.7325439453,,, +21.8632812500,349,1399.2674560547,,, +21.8652343750,349,1397.8022460938,,, +21.8671875000,349,1397.0695800781,,, +21.8691406250,349,1396.3370361328,,, +21.8710937500,349,1395.6043701172,,, +21.8730468750,349,1394.8718261719,,, +21.8750000000,350,1392.6739501953,,, +21.8769531250,350,1390.4761962891,,, +21.8789062500,350,1388.2784423828,,, +21.8808593750,350,1385.3480224609,,, +21.8828125000,350,1383.8828125000,,, +21.8847656250,350,1382.4176025391,,, +21.8867187500,350,1380.9523925781,,, +21.8886718750,350,1379.4871826172,,, +21.8906250000,350,1376.5567626953,,, +21.8925781250,350,1373.6263427734,,, +21.8945312500,350,1371.4285888672,,, +21.8964843750,350,1369.9633789062,,, +21.8984375000,350,1369.2307128906,,, +21.9003906250,350,1367.0329589844,,, +21.9023437500,350,1365.5677490234,,, +21.9042968750,350,1362.6373291016,,, +21.9062500000,350,1360.4395751953,,, +21.9082031250,350,1359.7069091797,,, +21.9101562500,350,1358.9743652344,,, +21.9121093750,350,1358.2416992188,,, +21.9140625000,350,1357.5091552734,,, +21.9160156250,350,1354.5787353516,,, +21.9179687500,350,1353.1135253906,,, +21.9199218750,350,1353.1135253906,,, +21.9218750000,350,1352.3809814453,,, +21.9238281250,350,1353.1135253906,,, +21.9257812500,350,1353.8461914062,,, +21.9277343750,350,1353.8461914062,,, +21.9296875000,350,1353.1135253906,,, +21.9316406250,350,1352.3809814453,,, +21.9335937500,350,1351.6483154297,,, +21.9355468750,350,1352.3809814453,,, +21.9375000000,351,1353.8461914062,,, +21.9394531250,351,1353.8461914062,,, +21.9414062500,351,1353.1135253906,,, +21.9433593750,351,1352.3809814453,,, +21.9453125000,351,1351.6483154297,,, +21.9472656250,351,1350.1831054688,,, +21.9492187500,351,1349.4505615234,,, +21.9511718750,351,1347.9853515625,,, +21.9531250000,351,1348.7178955078,,, +21.9550781250,351,1347.2528076172,,, +21.9570312500,351,1345.7875976562,,, +21.9589843750,351,1343.5897216797,,, +21.9609375000,351,1342.1245117188,,, +21.9628906250,351,1341.3919677734,,, +21.9648437500,351,1341.3919677734,,, +21.9667968750,351,1339.9267578125,,, +21.9687500000,351,1339.1940917969,,, +21.9707031250,351,1337.7288818359,,, +21.9726562500,351,1335.5311279297,,, +21.9746093750,351,1334.7985839844,,, +21.9765625000,351,1333.3333740234,,, +21.9785156250,351,1332.6007080078,,, +21.9804687500,351,1333.3333740234,,, +21.9824218750,351,1332.6007080078,,, +21.9843750000,351,1331.1354980469,,, +21.9863281250,351,1330.4029541016,,, +21.9882812500,351,1329.6702880859,,, +21.9902343750,351,1329.6702880859,,, +21.9921875000,351,1330.4029541016,,, +21.9941406250,351,1330.4029541016,,, +21.9960937500,351,1329.6702880859,,, +21.9980468750,351,1328.9377441406,,, +22.0000000000,352,1328.9377441406,,, +22.0019531250,352,1327.4725341797,,, +22.0039062500,352,1328.2050781250,,, +22.0058593750,352,1328.2050781250,,, +22.0078125000,352,1328.9377441406,,, +22.0097656250,352,1330.4029541016,,, +22.0117187500,352,1330.4029541016,,, +22.0136718750,352,1330.4029541016,,, +22.0156250000,352,1331.1354980469,,, +22.0175781250,352,1330.4029541016,,, +22.0195312500,352,1330.4029541016,,, +22.0214843750,352,1331.1354980469,,, +22.0234375000,352,1333.3333740234,,, +22.0253906250,352,1333.3333740234,,, +22.0273437500,352,1334.0659179688,,, +22.0292968750,352,1333.3333740234,,, +22.0312500000,352,1332.6007080078,,, +22.0332031250,352,1333.3333740234,,, +22.0351562500,352,1334.0659179688,,, +22.0371093750,352,1335.5311279297,,, +22.0390625000,352,1335.5311279297,,, +22.0410156250,352,1335.5311279297,,, +22.0429687500,352,1335.5311279297,,, +22.0449218750,352,1335.5311279297,,, +22.0468750000,352,1336.2637939453,,, +22.0488281250,352,1337.7288818359,,, +22.0507812500,352,1335.5311279297,,, +22.0527343750,352,1335.5311279297,,, +22.0546875000,352,1336.2637939453,,, +22.0566406250,352,1336.2637939453,,, +22.0585937500,352,1336.2637939453,,, +22.0605468750,352,1335.5311279297,,, +22.0625000000,353,1335.5311279297,,, +22.0644531250,353,1335.5311279297,,, +22.0664062500,353,1334.7985839844,,, +22.0683593750,353,1333.3333740234,,, +22.0703125000,353,1332.6007080078,,, +22.0722656250,353,1333.3333740234,,, +22.0742187500,353,1334.0659179688,,, +22.0761718750,353,1332.6007080078,,, +22.0781250000,353,1333.3333740234,,, +22.0800781250,353,1331.8681640625,,, +22.0820312500,353,1332.6007080078,,, +22.0839843750,353,1334.0659179688,,, +22.0859375000,353,1333.3333740234,,, +22.0878906250,353,1332.6007080078,,, +22.0898437500,353,1333.3333740234,,, +22.0917968750,353,1334.7985839844,,, +22.0937500000,353,1335.5311279297,,, +22.0957031250,353,1336.2637939453,,, +22.0976562500,353,1336.2637939453,,, +22.0996093750,353,1336.9963378906,,, +22.1015625000,353,1338.4615478516,,, +22.1035156250,353,1338.4615478516,,, +22.1054687500,353,1338.4615478516,,, +22.1074218750,353,1338.4615478516,,, +22.1093750000,353,1339.9267578125,,, +22.1113281250,353,1340.6593017578,,, +22.1132812500,353,1339.9267578125,,, +22.1152343750,353,1339.9267578125,,, +22.1171875000,353,1340.6593017578,,, +22.1191406250,353,1341.3919677734,,, +22.1210937500,353,1341.3919677734,,, +22.1230468750,353,1340.6593017578,,, +22.1250000000,354,1339.9267578125,,, +22.1269531250,354,1340.6593017578,,, +22.1289062500,354,1341.3919677734,,, +22.1308593750,354,1341.3919677734,,, +22.1328125000,354,1342.1245117188,,, +22.1347656250,354,1341.3919677734,,, +22.1367187500,354,1342.8571777344,,, +22.1386718750,354,1343.5897216797,,, +22.1406250000,354,1344.3223876953,,, +22.1425781250,354,1343.5897216797,,, +22.1445312500,354,1343.5897216797,,, +22.1464843750,354,1344.3223876953,,, +22.1484375000,354,1343.5897216797,,, +22.1503906250,354,1342.1245117188,,, +22.1523437500,354,1341.3919677734,,, +22.1542968750,354,1341.3919677734,,, +22.1562500000,354,1342.8571777344,,, +22.1582031250,354,1342.8571777344,,, +22.1601562500,354,1340.6593017578,,, +22.1621093750,354,1339.1940917969,,, +22.1640625000,354,1338.4615478516,,, +22.1660156250,354,1338.4615478516,,, +22.1679687500,354,1337.7288818359,,, +22.1699218750,354,1335.5311279297,,, +22.1718750000,354,1334.7985839844,,, +22.1738281250,354,1334.7985839844,,, +22.1757812500,354,1333.3333740234,,, +22.1777343750,354,1332.6007080078,,, +22.1796875000,354,1331.1354980469,,, +22.1816406250,354,1331.8681640625,,, +22.1835937500,354,1331.8681640625,,, +22.1855468750,354,1331.8681640625,,, +22.1875000000,355,1331.8681640625,,, +22.1894531250,355,1330.4029541016,,, +22.1914062500,355,1331.8681640625,,, +22.1933593750,355,1331.8681640625,,, +22.1953125000,355,1331.8681640625,,, +22.1972656250,355,1331.1354980469,,, +22.1992187500,355,1331.8681640625,,, +22.2011718750,355,1332.6007080078,,, +22.2031250000,355,1332.6007080078,,, +22.2050781250,355,1332.6007080078,,, +22.2070312500,355,1333.3333740234,,, +22.2089843750,355,1334.7985839844,,, +22.2109375000,355,1334.7985839844,,, +22.2128906250,355,1334.7985839844,,, +22.2148437500,355,1337.7288818359,,, +22.2167968750,355,1338.4615478516,,, +22.2187500000,355,1339.1940917969,,, +22.2207031250,355,1339.9267578125,,, +22.2226562500,355,1341.3919677734,,, +22.2246093750,355,1343.5897216797,,, +22.2265625000,355,1343.5897216797,,, +22.2285156250,355,1343.5897216797,,, +22.2304687500,355,1345.7875976562,,, +22.2324218750,355,1347.9853515625,,, +22.2343750000,355,1348.7178955078,,, +22.2363281250,355,1348.7178955078,,, +22.2382812500,355,1350.9157714844,,, +22.2402343750,355,1353.1135253906,,, +22.2421875000,355,1353.8461914062,,, +22.2441406250,355,1353.8461914062,,, +22.2460937500,355,1354.5787353516,,, +22.2480468750,355,1356.0439453125,,, +22.2500000000,356,1356.7766113281,,, +22.2519531250,356,1356.7766113281,,, +22.2539062500,356,1356.0439453125,,, +22.2558593750,356,1356.0439453125,,, +22.2578125000,356,1355.3114013672,,, +22.2597656250,356,1354.5787353516,,, +22.2617187500,356,1352.3809814453,,, +22.2636718750,356,1352.3809814453,,, +22.2656250000,356,1352.3809814453,,, +22.2675781250,356,1350.9157714844,,, +22.2695312500,356,1348.7178955078,,, +22.2714843750,356,1347.2528076172,,, +22.2734375000,356,1345.0549316406,,, +22.2753906250,356,1343.5897216797,,, +22.2773437500,356,1342.8571777344,,, +22.2792968750,356,1342.1245117188,,, +22.2812500000,356,1341.3919677734,,, +22.2832031250,356,1339.9267578125,,, +22.2851562500,356,1336.9963378906,,, +22.2871093750,356,1334.7985839844,,, +22.2890625000,356,1332.6007080078,,, +22.2910156250,356,1331.1354980469,,, +22.2929687500,356,1329.6702880859,,, +22.2949218750,356,1330.4029541016,,, +22.2968750000,356,1328.9377441406,,, +22.2988281250,356,1326.7398681641,,, +22.3007812500,356,1326.0073242188,,, +22.3027343750,356,1324.5421142578,,, +22.3046875000,356,1323.0769042969,,, +22.3066406250,356,1322.3443603516,,, +22.3085937500,356,1323.0769042969,,, +22.3105468750,356,1321.6116943359,,, +22.3125000000,357,1319.4139404297,,, +22.3144531250,357,1318.6812744141,,, +22.3164062500,357,1317.2160644531,,, +22.3183593750,357,1317.9487304688,,, +22.3203125000,357,1317.9487304688,,, +22.3222656250,357,1317.9487304688,,, +22.3242187500,357,1317.2160644531,,, +22.3261718750,357,1317.2160644531,,, +22.3281250000,357,1316.4835205078,,, +22.3300781250,357,1316.4835205078,,, +22.3320312500,357,1318.6812744141,,, +22.3339843750,357,1319.4139404297,,, +22.3359375000,357,1320.1464843750,,, +22.3378906250,357,1320.1464843750,,, +22.3398437500,357,1320.8791503906,,, +22.3417968750,357,1322.3443603516,,, +22.3437500000,357,1324.5421142578,,, +22.3457031250,357,1327.4725341797,,, +22.3476562500,357,1328.9377441406,,, +22.3496093750,357,1329.6702880859,,, +22.3515625000,357,1331.1354980469,,, +22.3535156250,357,1331.8681640625,,, +22.3554687500,357,1333.3333740234,,, +22.3574218750,357,1336.2637939453,,, +22.3593750000,357,1339.1940917969,,, +22.3613281250,357,1339.9267578125,,, +22.3632812500,357,1339.9267578125,,, +22.3652343750,357,1339.9267578125,,, +22.3671875000,357,1339.1940917969,,, +22.3691406250,357,1339.1940917969,,, +22.3710937500,357,1340.6593017578,,, +22.3730468750,357,1341.3919677734,,, +22.3750000000,358,1341.3919677734,,, +22.3769531250,358,1340.6593017578,,, +22.3789062500,358,1340.6593017578,,, +22.3808593750,358,1339.9267578125,,, +22.3828125000,358,1339.9267578125,,, +22.3847656250,358,1340.6593017578,,, +22.3867187500,358,1339.9267578125,,, +22.3886718750,358,1337.7288818359,,, +22.3906250000,358,1336.9963378906,,, +22.3925781250,358,1336.9963378906,,, +22.3945312500,358,1337.7288818359,,, +22.3964843750,358,1337.7288818359,,, +22.3984375000,358,1336.2637939453,,, +22.4003906250,358,1334.7985839844,,, +22.4023437500,358,1334.0659179688,,, +22.4042968750,358,1332.6007080078,,, +22.4062500000,358,1333.3333740234,,, +22.4082031250,358,1332.6007080078,,, +22.4101562500,358,1331.8681640625,,, +22.4121093750,358,1331.1354980469,,, +22.4140625000,358,1330.4029541016,,, +22.4160156250,358,1328.9377441406,,, +22.4179687500,358,1329.6702880859,,, +22.4199218750,358,1330.4029541016,,, +22.4218750000,358,1328.9377441406,,, +22.4238281250,358,1328.2050781250,,, +22.4257812500,358,1326.7398681641,,, +22.4277343750,358,1326.0073242188,,, +22.4296875000,358,1326.7398681641,,, +22.4316406250,358,1326.7398681641,,, +22.4335937500,358,1326.7398681641,,, +22.4355468750,358,1326.7398681641,,, +22.4375000000,359,1326.0073242188,,, +22.4394531250,359,1326.0073242188,,, +22.4414062500,359,1327.4725341797,,, +22.4433593750,359,1326.7398681641,,, +22.4453125000,359,1326.7398681641,,, +22.4472656250,359,1326.0073242188,,, +22.4492187500,359,1326.7398681641,,, +22.4511718750,359,1327.4725341797,,, +22.4531250000,359,1328.9377441406,,, +22.4550781250,359,1328.2050781250,,, +22.4570312500,359,1327.4725341797,,, +22.4589843750,359,1327.4725341797,,, +22.4609375000,359,1328.2050781250,,, +22.4628906250,359,1329.6702880859,,, +22.4648437500,359,1329.6702880859,,, +22.4667968750,359,1330.4029541016,,, +22.4687500000,359,1330.4029541016,,, +22.4707031250,359,1330.4029541016,,, +22.4726562500,359,1331.1354980469,,, +22.4746093750,359,1332.6007080078,,, +22.4765625000,359,1334.0659179688,,, +22.4785156250,359,1334.7985839844,,, +22.4804687500,359,1333.3333740234,,, +22.4824218750,359,1333.3333740234,,, +22.4843750000,359,1334.0659179688,,, +22.4863281250,359,1335.5311279297,,, +22.4882812500,359,1336.9963378906,,, +22.4902343750,359,1338.4615478516,,, +22.4921875000,359,1339.1940917969,,, +22.4941406250,359,1340.6593017578,,, +22.4960937500,359,1342.1245117188,,, +22.4980468750,359,1345.0549316406,,, +22.5000000000,360,1347.9853515625,,, +22.5019531250,360,1350.9157714844,,, +22.5039062500,360,1352.3809814453,,, +22.5058593750,360,1356.0439453125,,, +22.5078125000,360,1361.1721191406,,, +22.5097656250,360,1365.5677490234,,, +22.5117187500,360,1369.9633789062,,, +22.5136718750,360,1374.3590087891,,, +22.5156250000,360,1379.4871826172,,, +22.5175781250,360,1385.3480224609,,, +22.5195312500,360,1389.7435302734,,, +22.5214843750,360,1394.1391601562,,, +22.5234375000,360,1399.2674560547,,, +22.5253906250,360,1405.8608398438,,, +22.5273437500,360,1411.7215576172,,, +22.5292968750,360,1418.3150634766,,, +22.5312500000,360,1424.9084472656,,, +22.5332031250,360,1432.9670410156,,, +22.5351562500,360,1440.2930908203,,, +22.5371093750,360,1448.3516845703,,, +22.5390625000,360,1455.6776123047,,, +22.5410156250,360,1462.2711181641,,, +22.5429687500,360,1471.0622558594,,, +22.5449218750,360,1479.1208496094,,, +22.5468750000,360,1486.4468994141,,, +22.5488281250,360,1493.7729492188,,, +22.5507812500,360,1502.5640869141,,, +22.5527343750,360,1512.8205566406,,, +22.5546875000,360,1521.6116943359,,, +22.5566406250,360,1529.6702880859,,, +22.5585937500,360,1538.4615478516,,, +22.5605468750,360,1548.7178955078,,, +22.5625000000,361,1557.5091552734,,, +22.5644531250,361,1566.3004150391,,, +22.5664062500,361,1575.0915527344,,, +22.5683593750,361,1584.6153564453,,, +22.5703125000,361,1591.9414062500,,, +22.5722656250,361,1598.5347900391,,, +22.5742187500,361,1606.5933837891,,, +22.5761718750,361,1613.9194335938,,, +22.5781250000,361,1621.2453613281,,, +22.5800781250,361,1630.0366210938,,, +22.5820312500,361,1638.8278808594,,, +22.5839843750,361,1645.4212646484,,, +22.5859375000,361,1651.2821044922,,, +22.5878906250,361,1656.4102783203,,, +22.5898437500,361,1663.0036621094,,, +22.5917968750,361,1670.3297119141,,, +22.5937500000,361,1676.9230957031,,, +22.5957031250,361,1681.3187255859,,, +22.5976562500,361,1686.4468994141,,, +22.5996093750,361,1688.6446533203,,, +22.6015625000,361,1692.3077392578,,, +22.6035156250,361,1695.2380371094,,, +22.6054687500,361,1698.1684570312,,, +22.6074218750,361,1701.8315429688,,, +22.6093750000,361,1705.4945068359,,, +22.6113281250,361,1707.6922607422,,, +22.6132812500,361,1709.8901367188,,, +22.6152343750,361,1710.6226806641,,, +22.6171875000,361,1711.3553466797,,, +22.6191406250,361,1712.8205566406,,, +22.6210937500,361,1714.2857666016,,, +22.6230468750,361,1714.2857666016,,, +22.6250000000,362,1713.5531005859,,, +22.6269531250,362,1711.3553466797,,, +22.6289062500,362,1709.8901367188,,, +22.6308593750,362,1707.6922607422,,, +22.6328125000,362,1704.7619628906,,, +22.6347656250,362,1704.7619628906,,, +22.6367187500,362,1703.2967529297,,, +22.6386718750,362,1701.0988769531,,, +22.6406250000,362,1698.1684570312,,, +22.6425781250,362,1695.9707031250,,, +22.6445312500,362,1692.3077392578,,, +22.6464843750,362,1690.1098632812,,, +22.6484375000,362,1687.9121093750,,, +22.6503906250,362,1686.4468994141,,, +22.6523437500,362,1684.9816894531,,, +22.6542968750,362,1682.0512695312,,, +22.6562500000,362,1679.1208496094,,, +22.6582031250,362,1675.4578857422,,, +22.6601562500,362,1673.9926757812,,, +22.6621093750,362,1670.3297119141,,, +22.6640625000,362,1666.6666259766,,, +22.6660156250,362,1663.0036621094,,, +22.6679687500,362,1660.0732421875,,, +22.6699218750,362,1656.4102783203,,, +22.6718750000,362,1652.7471923828,,, +22.6738281250,362,1649.0842285156,,, +22.6757812500,362,1643.9560546875,,, +22.6777343750,362,1639.5604248047,,, +22.6796875000,362,1636.6300048828,,, +22.6816406250,362,1630.7692871094,,, +22.6835937500,362,1627.1062011719,,, +22.6855468750,362,1621.9780273438,,, +22.6875000000,363,1616.8498535156,,, +22.6894531250,363,1613.1867675781,,, +22.6914062500,363,1609.5238037109,,, +22.6933593750,363,1604.3956298828,,, +22.6953125000,363,1599.2674560547,,, +22.6972656250,363,1593.4066162109,,, +22.6992187500,363,1588.2784423828,,, +22.7011718750,363,1583.1501464844,,, +22.7031250000,363,1578.7546386719,,, +22.7050781250,363,1575.0915527344,,, +22.7070312500,363,1569.2307128906,,, +22.7089843750,363,1564.1025390625,,, +22.7109375000,363,1559.7069091797,,, +22.7128906250,363,1554.5787353516,,, +22.7148437500,363,1551.6483154297,,, +22.7167968750,363,1549.4505615234,,, +22.7187500000,363,1544.3223876953,,, +22.7207031250,363,1539.1940917969,,, +22.7226562500,363,1534.0659179688,,, +22.7246093750,363,1529.6702880859,,, +22.7265625000,363,1527.4725341797,,, +22.7285156250,363,1525.2747802734,,, +22.7304687500,363,1521.6116943359,,, +22.7324218750,363,1518.6812744141,,, +22.7343750000,363,1515.7509765625,,, +22.7363281250,363,1512.0878906250,,, +22.7382812500,363,1509.1574707031,,, +22.7402343750,363,1507.6922607422,,, +22.7421875000,363,1504.7619628906,,, +22.7441406250,363,1503.2967529297,,, +22.7460937500,363,1500.3663330078,,, +22.7480468750,363,1496.7032470703,,, +22.7500000000,364,1493.0402832031,,, +22.7519531250,364,1490.1098632812,,, +22.7539062500,364,1486.4468994141,,, +22.7558593750,364,1482.0512695312,,, +22.7578125000,364,1479.8535156250,,, +22.7597656250,364,1478.3883056641,,, +22.7617187500,364,1475.4578857422,,, +22.7636718750,364,1474.7252197266,,, +22.7656250000,364,1473.9926757812,,, +22.7675781250,364,1473.9926757812,,, +22.7695312500,364,1473.9926757812,,, +22.7714843750,364,1473.2601318359,,, +22.7734375000,364,1471.7949218750,,, +22.7753906250,364,1471.7949218750,,, +22.7773437500,364,1471.7949218750,,, +22.7792968750,364,1471.7949218750,,, +22.7812500000,364,1471.7949218750,,, +22.7832031250,364,1471.7949218750,,, +22.7851562500,364,1472.5274658203,,, +22.7871093750,364,1473.9926757812,,, +22.7890625000,364,1475.4578857422,,, +22.7910156250,364,1474.7252197266,,, +22.7929687500,364,1474.7252197266,,, +22.7949218750,364,1474.7252197266,,, +22.7968750000,364,1474.7252197266,,, +22.7988281250,364,1473.9926757812,,, +22.8007812500,364,1473.2601318359,,, +22.8027343750,364,1473.2601318359,,, +22.8046875000,364,1473.9926757812,,, +22.8066406250,364,1474.7252197266,,, +22.8085937500,364,1474.7252197266,,, +22.8105468750,364,1473.9926757812,,, +22.8125000000,365,1473.2601318359,,, +22.8144531250,365,1473.2601318359,,, +22.8164062500,365,1472.5274658203,,, +22.8183593750,365,1472.5274658203,,, +22.8203125000,365,1472.5274658203,,, +22.8222656250,365,1471.7949218750,,, +22.8242187500,365,1473.2601318359,,, +22.8261718750,365,1473.9926757812,,, +22.8281250000,365,1475.4578857422,,, +22.8300781250,365,1476.9230957031,,, +22.8320312500,365,1476.9230957031,,, +22.8339843750,365,1476.9230957031,,, +22.8359375000,365,1477.6556396484,,, +22.8378906250,365,1477.6556396484,,, +22.8398437500,365,1477.6556396484,,, +22.8417968750,365,1477.6556396484,,, +22.8437500000,365,1478.3883056641,,, +22.8457031250,365,1478.3883056641,,, +22.8476562500,365,1479.1208496094,,, +22.8496093750,365,1480.5860595703,,, +22.8515625000,365,1482.0512695312,,, +22.8535156250,365,1483.5164794922,,, +22.8554687500,365,1483.5164794922,,, +22.8574218750,365,1483.5164794922,,, +22.8593750000,365,1482.7839355469,,, +22.8613281250,365,1482.0512695312,,, +22.8632812500,365,1482.0512695312,,, +22.8652343750,365,1482.0512695312,,, +22.8671875000,365,1482.0512695312,,, +22.8691406250,365,1481.3187255859,,, +22.8710937500,365,1482.0512695312,,, +22.8730468750,365,1481.3187255859,,, +22.8750000000,366,1479.8535156250,,, +22.8769531250,366,1478.3883056641,,, +22.8789062500,366,1475.4578857422,,, +22.8808593750,366,1473.9926757812,,, +22.8828125000,366,1471.0622558594,,, +22.8847656250,366,1469.5970458984,,, +22.8867187500,366,1468.1318359375,,, +22.8886718750,366,1467.3992919922,,, +22.8906250000,366,1467.3992919922,,, +22.8925781250,366,1468.1318359375,,, +22.8945312500,366,1468.1318359375,,, +22.8964843750,366,1468.1318359375,,, +22.8984375000,366,1468.1318359375,,, +22.9003906250,366,1466.6666259766,,, +22.9023437500,366,1466.6666259766,,, +22.9042968750,366,1465.2014160156,,, +22.9062500000,366,1465.2014160156,,, +22.9082031250,366,1464.4688720703,,, +22.9101562500,366,1463.7362060547,,, +22.9121093750,366,1463.0036621094,,, +22.9140625000,366,1464.4688720703,,, +22.9160156250,366,1465.2014160156,,, +22.9179687500,366,1466.6666259766,,, +22.9199218750,366,1466.6666259766,,, +22.9218750000,366,1465.2014160156,,, +22.9238281250,366,1465.2014160156,,, +22.9257812500,366,1463.7362060547,,, +22.9277343750,366,1462.2711181641,,, +22.9296875000,366,1461.5384521484,,, +22.9316406250,366,1462.2711181641,,, +22.9335937500,366,1462.2711181641,,, +22.9355468750,366,1462.2711181641,,, +22.9375000000,367,1462.2711181641,,, +22.9394531250,367,1460.8059082031,,, +22.9414062500,367,1459.3406982422,,, +22.9433593750,367,1457.8754882812,,, +22.9453125000,367,1456.4102783203,,, +22.9472656250,367,1456.4102783203,,, +22.9492187500,367,1457.1428222656,,, +22.9511718750,367,1457.8754882812,,, +22.9531250000,367,1457.1428222656,,, +22.9550781250,367,1456.4102783203,,, +22.9570312500,367,1455.6776123047,,, +22.9589843750,367,1454.2124023438,,, +22.9609375000,367,1453.4798583984,,, +22.9628906250,367,1452.0146484375,,, +22.9648437500,367,1451.2821044922,,, +22.9667968750,367,1450.5494384766,,, +22.9687500000,367,1451.2821044922,,, +22.9707031250,367,1451.2821044922,,, +22.9726562500,367,1452.0146484375,,, +22.9746093750,367,1451.2821044922,,, +22.9765625000,367,1449.8168945312,,, +22.9785156250,367,1448.3516845703,,, +22.9804687500,367,1448.3516845703,,, +22.9824218750,367,1446.8864746094,,, +22.9843750000,367,1445.4212646484,,, +22.9863281250,367,1445.4212646484,,, +22.9882812500,367,1445.4212646484,,, +22.9902343750,367,1444.6885986328,,, +22.9921875000,367,1443.9560546875,,, +22.9941406250,367,1442.4908447266,,, +22.9960937500,367,1439.5604248047,,, +22.9980468750,367,1438.8278808594,,, +23.0000000000,368,1436.6300048828,,, +23.0019531250,368,1434.4322509766,,, +23.0039062500,368,1432.9670410156,,, +23.0058593750,368,1432.2343750000,,, +23.0078125000,368,1431.5018310547,,, +23.0097656250,368,1431.5018310547,,, +23.0117187500,368,1430.0366210938,,, +23.0136718750,368,1429.3040771484,,, +23.0156250000,368,1427.8388671875,,, +23.0175781250,368,1425.6409912109,,, +23.0195312500,368,1423.4432373047,,, +23.0214843750,368,1421.2453613281,,, +23.0234375000,368,1419.7802734375,,, +23.0253906250,368,1417.5823974609,,, +23.0273437500,368,1416.8498535156,,, +23.0292968750,368,1416.8498535156,,, +23.0312500000,368,1415.3846435547,,, +23.0332031250,368,1413.1867675781,,, +23.0351562500,368,1411.7215576172,,, +23.0371093750,368,1409.5238037109,,, +23.0390625000,368,1406.5933837891,,, +23.0410156250,368,1405.1281738281,,, +23.0429687500,368,1403.6629638672,,, +23.0449218750,368,1403.6629638672,,, +23.0468750000,368,1403.6629638672,,, +23.0488281250,368,1402.1977539062,,, +23.0507812500,368,1400.7325439453,,, +23.0527343750,368,1397.8022460938,,, +23.0546875000,368,1396.3370361328,,, +23.0566406250,368,1394.1391601562,,, +23.0585937500,368,1392.6739501953,,, +23.0605468750,368,1391.9414062500,,, +23.0625000000,369,1391.2087402344,,, +23.0644531250,369,1389.7435302734,,, +23.0664062500,369,1388.2784423828,,, +23.0683593750,369,1386.8132324219,,, +23.0703125000,369,1384.6153564453,,, +23.0722656250,369,1383.1501464844,,, +23.0742187500,369,1381.6849365234,,, +23.0761718750,369,1380.2197265625,,, +23.0781250000,369,1380.9523925781,,, +23.0800781250,369,1382.4176025391,,, +23.0820312500,369,1382.4176025391,,, +23.0839843750,369,1382.4176025391,,, +23.0859375000,369,1382.4176025391,,, +23.0878906250,369,1381.6849365234,,, +23.0898437500,369,1380.9523925781,,, +23.0917968750,369,1380.2197265625,,, +23.0937500000,369,1380.2197265625,,, +23.0957031250,369,1379.4871826172,,, +23.0976562500,369,1380.2197265625,,, +23.0996093750,369,1380.2197265625,,, +23.1015625000,369,1380.2197265625,,, +23.1035156250,369,1380.9523925781,,, +23.1054687500,369,1380.2197265625,,, +23.1074218750,369,1378.7546386719,,, +23.1093750000,369,1376.5567626953,,, +23.1113281250,369,1375.0915527344,,, +23.1132812500,369,1373.6263427734,,, +23.1152343750,369,1372.8937988281,,, +23.1171875000,369,1372.8937988281,,, +23.1191406250,369,1372.8937988281,,, +23.1210937500,369,1373.6263427734,,, +23.1230468750,369,1372.8937988281,,, +23.1250000000,370,1372.8937988281,,, +23.1269531250,370,1370.6959228516,,, +23.1289062500,370,1370.6959228516,,, +23.1308593750,370,1369.9633789062,,, +23.1328125000,370,1368.4981689453,,, +23.1347656250,370,1367.7656250000,,, +23.1367187500,370,1368.4981689453,,, +23.1386718750,370,1369.2307128906,,, +23.1406250000,370,1370.6959228516,,, +23.1425781250,370,1372.1611328125,,, +23.1445312500,370,1372.1611328125,,, +23.1464843750,370,1372.8937988281,,, +23.1484375000,370,1372.8937988281,,, +23.1503906250,370,1372.1611328125,,, +23.1523437500,370,1371.4285888672,,, +23.1542968750,370,1370.6959228516,,, +23.1562500000,370,1369.9633789062,,, +23.1582031250,370,1369.2307128906,,, +23.1601562500,370,1369.2307128906,,, +23.1621093750,370,1370.6959228516,,, +23.1640625000,370,1372.1611328125,,, +23.1660156250,370,1373.6263427734,,, +23.1679687500,370,1373.6263427734,,, +23.1699218750,370,1373.6263427734,,, +23.1718750000,370,1373.6263427734,,, +23.1738281250,370,1373.6263427734,,, +23.1757812500,370,1372.8937988281,,, +23.1777343750,370,1374.3590087891,,, +23.1796875000,370,1375.8242187500,,, +23.1816406250,370,1376.5567626953,,, +23.1835937500,370,1375.8242187500,,, +23.1855468750,370,1375.0915527344,,, +23.1875000000,371,1374.3590087891,,, +23.1894531250,371,1373.6263427734,,, +23.1914062500,371,1374.3590087891,,, +23.1933593750,371,1375.8242187500,,, +23.1953125000,371,1377.2894287109,,, +23.1972656250,371,1377.2894287109,,, +23.1992187500,371,1377.2894287109,,, +23.2011718750,371,1377.2894287109,,, +23.2031250000,371,1377.2894287109,,, +23.2050781250,371,1375.8242187500,,, +23.2070312500,371,1377.2894287109,,, +23.2089843750,371,1378.0219726562,,, +23.2109375000,371,1378.0219726562,,, +23.2128906250,371,1377.2894287109,,, +23.2148437500,371,1376.5567626953,,, +23.2167968750,371,1375.8242187500,,, +23.2187500000,371,1376.5567626953,,, +23.2207031250,371,1377.2894287109,,, +23.2226562500,371,1377.2894287109,,, +23.2246093750,371,1375.8242187500,,, +23.2265625000,371,1375.0915527344,,, +23.2285156250,371,1375.8242187500,,, +23.2304687500,371,1375.0915527344,,, +23.2324218750,371,1375.0915527344,,, +23.2343750000,371,1373.6263427734,,, +23.2363281250,371,1371.4285888672,,, +23.2382812500,371,1372.1611328125,,, +23.2402343750,371,1371.4285888672,,, +23.2421875000,371,1369.9633789062,,, +23.2441406250,371,1368.4981689453,,, +23.2460937500,371,1367.7656250000,,, +23.2480468750,371,1368.4981689453,,, +23.2500000000,372,1369.2307128906,,, +23.2519531250,372,1368.4981689453,,, +23.2539062500,372,1367.0329589844,,, +23.2558593750,372,1366.3004150391,,, +23.2578125000,372,1365.5677490234,,, +23.2597656250,372,1366.3004150391,,, +23.2617187500,372,1365.5677490234,,, +23.2636718750,372,1364.8352050781,,, +23.2656250000,372,1364.8352050781,,, +23.2675781250,372,1364.1025390625,,, +23.2695312500,372,1365.5677490234,,, +23.2714843750,372,1365.5677490234,,, +23.2734375000,372,1365.5677490234,,, +23.2753906250,372,1364.8352050781,,, +23.2773437500,372,1365.5677490234,,, +23.2792968750,372,1365.5677490234,,, +23.2812500000,372,1367.0329589844,,, +23.2832031250,372,1369.9633789062,,, +23.2851562500,372,1370.6959228516,,, +23.2871093750,372,1371.4285888672,,, +23.2890625000,372,1371.4285888672,,, +23.2910156250,372,1371.4285888672,,, +23.2929687500,372,1371.4285888672,,, +23.2949218750,372,1372.1611328125,,, +23.2968750000,372,1372.8937988281,,, +23.2988281250,372,1374.3590087891,,, +23.3007812500,372,1375.8242187500,,, +23.3027343750,372,1376.5567626953,,, +23.3046875000,372,1375.8242187500,,, +23.3066406250,372,1375.8242187500,,, +23.3085937500,372,1374.3590087891,,, +23.3105468750,372,1373.6263427734,,, +23.3125000000,373,1372.8937988281,,, +23.3144531250,373,1372.8937988281,,, +23.3164062500,373,1371.4285888672,,, +23.3183593750,373,1372.8937988281,,, +23.3203125000,373,1374.3590087891,,, +23.3222656250,373,1375.0915527344,,, +23.3242187500,373,1374.3590087891,,, +23.3261718750,373,1373.6263427734,,, +23.3281250000,373,1372.8937988281,,, +23.3300781250,373,1372.1611328125,,, +23.3320312500,373,1371.4285888672,,, +23.3339843750,373,1372.1611328125,,, +23.3359375000,373,1372.1611328125,,, +23.3378906250,373,1372.8937988281,,, +23.3398437500,373,1371.4285888672,,, +23.3417968750,373,1369.9633789062,,, +23.3437500000,373,1369.9633789062,,, +23.3457031250,373,1368.4981689453,,, +23.3476562500,373,1369.2307128906,,, +23.3496093750,373,1369.9633789062,,, +23.3515625000,373,1369.9633789062,,, +23.3535156250,373,1369.2307128906,,, +23.3554687500,373,1369.2307128906,,, +23.3574218750,373,1368.4981689453,,, +23.3593750000,373,1367.7656250000,,, +23.3613281250,373,1367.7656250000,,, +23.3632812500,373,1367.0329589844,,, +23.3652343750,373,1367.0329589844,,, +23.3671875000,373,1367.7656250000,,, +23.3691406250,373,1369.2307128906,,, +23.3710937500,373,1369.2307128906,,, +23.3730468750,373,1369.9633789062,,, +23.3750000000,374,1369.9633789062,,, +23.3769531250,374,1368.4981689453,,, +23.3789062500,374,1367.7656250000,,, +23.3808593750,374,1367.0329589844,,, +23.3828125000,374,1365.5677490234,,, +23.3847656250,374,1367.7656250000,,, +23.3867187500,374,1367.7656250000,,, +23.3886718750,374,1366.3004150391,,, +23.3906250000,374,1364.8352050781,,, +23.3925781250,374,1364.1025390625,,, +23.3945312500,374,1363.3699951172,,, +23.3964843750,374,1361.1721191406,,, +23.3984375000,374,1360.4395751953,,, +23.4003906250,374,1360.4395751953,,, +23.4023437500,374,1359.7069091797,,, +23.4042968750,374,1358.9743652344,,, +23.4062500000,374,1358.2416992188,,, +23.4082031250,374,1355.3114013672,,, +23.4101562500,374,1353.8461914062,,, +23.4121093750,374,1352.3809814453,,, +23.4140625000,374,1352.3809814453,,, +23.4160156250,374,1353.1135253906,,, +23.4179687500,374,1352.3809814453,,, +23.4199218750,374,1351.6483154297,,, +23.4218750000,374,1350.9157714844,,, +23.4238281250,374,1350.9157714844,,, +23.4257812500,374,1349.4505615234,,, +23.4277343750,374,1350.1831054688,,, +23.4296875000,374,1350.9157714844,,, +23.4316406250,374,1350.1831054688,,, +23.4335937500,374,1349.4505615234,,, +23.4355468750,374,1347.9853515625,,, +23.4375000000,375,1347.2528076172,,, +23.4394531250,375,1347.2528076172,,, +23.4414062500,375,1347.2528076172,,, +23.4433593750,375,1347.9853515625,,, +23.4453125000,375,1350.9157714844,,, +23.4472656250,375,1351.6483154297,,, +23.4492187500,375,1352.3809814453,,, +23.4511718750,375,1352.3809814453,,, +23.4531250000,375,1353.1135253906,,, +23.4550781250,375,1354.5787353516,,, +23.4570312500,375,1356.0439453125,,, +23.4589843750,375,1356.0439453125,,, +23.4609375000,375,1356.0439453125,,, +23.4628906250,375,1355.3114013672,,, +23.4648437500,375,1355.3114013672,,, +23.4667968750,375,1356.7766113281,,, +23.4687500000,375,1357.5091552734,,, +23.4707031250,375,1357.5091552734,,, +23.4726562500,375,1357.5091552734,,, +23.4746093750,375,1356.7766113281,,, +23.4765625000,375,1356.7766113281,,, +23.4785156250,375,1357.5091552734,,, +23.4804687500,375,1357.5091552734,,, +23.4824218750,375,1357.5091552734,,, +23.4843750000,375,1356.7766113281,,, +23.4863281250,375,1356.0439453125,,, +23.4882812500,375,1355.3114013672,,, +23.4902343750,375,1355.3114013672,,, +23.4921875000,375,1356.7766113281,,, +23.4941406250,375,1357.5091552734,,, +23.4960937500,375,1356.7766113281,,, +23.4980468750,375,1356.0439453125,,, +23.5000000000,376,1356.0439453125,,, +23.5019531250,376,1355.3114013672,,, +23.5039062500,376,1355.3114013672,,, +23.5058593750,376,1356.7766113281,,, +23.5078125000,376,1356.0439453125,,, +23.5097656250,376,1355.3114013672,,, +23.5117187500,376,1354.5787353516,,, +23.5136718750,376,1353.8461914062,,, +23.5156250000,376,1354.5787353516,,, +23.5175781250,376,1355.3114013672,,, +23.5195312500,376,1356.0439453125,,, +23.5214843750,376,1355.3114013672,,, +23.5234375000,376,1353.8461914062,,, +23.5253906250,376,1352.3809814453,,, +23.5273437500,376,1353.1135253906,,, +23.5292968750,376,1352.3809814453,,, +23.5312500000,376,1351.6483154297,,, +23.5332031250,376,1350.9157714844,,, +23.5351562500,376,1350.1831054688,,, +23.5371093750,376,1350.1831054688,,, +23.5390625000,376,1350.1831054688,,, +23.5410156250,376,1351.6483154297,,, +23.5429687500,376,1351.6483154297,,, +23.5449218750,376,1350.9157714844,,, +23.5468750000,376,1350.1831054688,,, +23.5488281250,376,1349.4505615234,,, +23.5507812500,376,1350.1831054688,,, +23.5527343750,376,1350.9157714844,,, +23.5546875000,376,1351.6483154297,,, +23.5566406250,376,1351.6483154297,,, +23.5585937500,376,1351.6483154297,,, +23.5605468750,376,1350.9157714844,,, +23.5625000000,377,1350.1831054688,,, +23.5644531250,377,1350.1831054688,,, +23.5664062500,377,1350.9157714844,,, +23.5683593750,377,1351.6483154297,,, +23.5703125000,377,1350.9157714844,,, +23.5722656250,377,1350.9157714844,,, +23.5742187500,377,1351.6483154297,,, +23.5761718750,377,1352.3809814453,,, +23.5781250000,377,1353.8461914062,,, +23.5800781250,377,1356.7766113281,,, +23.5820312500,377,1358.2416992188,,, +23.5839843750,377,1360.4395751953,,, +23.5859375000,377,1362.6373291016,,, +23.5878906250,377,1365.5677490234,,, +23.5898437500,377,1370.6959228516,,, +23.5917968750,377,1376.5567626953,,, +23.5937500000,377,1381.6849365234,,, +23.5957031250,377,1388.2784423828,,, +23.5976562500,377,1393.4066162109,,, +23.5996093750,377,1400.7325439453,,, +23.6015625000,377,1408.0585937500,,, +23.6035156250,377,1416.8498535156,,, +23.6054687500,377,1424.9084472656,,, +23.6074218750,377,1432.9670410156,,, +23.6093750000,377,1441.0256347656,,, +23.6113281250,377,1441.0256347656,,, +23.6132812500,377,1449.8168945312,,, +23.6152343750,377,1458.6080322266,,, +23.6171875000,377,1467.3992919922,,, +23.6191406250,377,1476.1904296875,,, +23.6210937500,377,1485.7142333984,,, +23.6230468750,377,1495.9707031250,,, +23.6250000000,378,1506.2270507812,,, +23.6269531250,378,1517.2160644531,,, +23.6289062500,378,1526.7398681641,,, +23.6308593750,378,1538.4615478516,,, +23.6328125000,378,1550.9157714844,,, +23.6347656250,378,1563.3699951172,,, +23.6367187500,378,1575.8242187500,,, +23.6386718750,378,1586.8132324219,,, +23.6406250000,378,1597.8022460938,,, +23.6425781250,378,1608.0585937500,,, +23.6445312500,378,1619.0476074219,,, +23.6464843750,378,1629.3040771484,,, +23.6484375000,378,1641.0256347656,,, +23.6503906250,378,1652.0146484375,,, +23.6523437500,378,1663.7362060547,,, +23.6542968750,378,1673.9926757812,,, +23.6562500000,378,1683.5164794922,,, +23.6582031250,378,1692.3077392578,,, +23.6601562500,378,1701.0988769531,,, +23.6621093750,378,1709.8901367188,,, +23.6640625000,378,1718.6812744141,,, +23.6660156250,378,1728.2050781250,,, +23.6679687500,378,1737.7288818359,,, +23.6699218750,378,1747.2528076172,,, +23.6718750000,378,1754.5787353516,,, +23.6738281250,378,1761.9047851562,,, +23.6757812500,378,1767.7656250000,,, +23.6777343750,378,1772.8937988281,,, +23.6796875000,378,1778.7546386719,,, +23.6816406250,378,1783.8828125000,,, +23.6835937500,378,1787.5457763672,,, +23.6855468750,378,1793.4066162109,,, +23.6875000000,379,1798.5347900391,,, +23.6894531250,379,1802.1977539062,,, +23.6914062500,379,1805.1281738281,,, +23.6933593750,379,1808.0585937500,,, +23.6953125000,379,1809.5238037109,,, +23.6972656250,379,1810.2564697266,,, +23.6992187500,379,1810.9890136719,,, +23.7011718750,379,1812.4542236328,,, +23.7031250000,379,1812.4542236328,,, +23.7050781250,379,1812.4542236328,,, +23.7070312500,379,1812.4542236328,,, +23.7089843750,379,1813.1867675781,,, +23.7109375000,379,1813.1867675781,,, +23.7128906250,379,1812.4542236328,,, +23.7148437500,379,1810.9890136719,,, +23.7167968750,379,1807.3260498047,,, +23.7187500000,379,1802.9304199219,,, +23.7207031250,379,1799.2674560547,,, +23.7226562500,379,1794.8718261719,,, +23.7246093750,379,1790.4761962891,,, +23.7265625000,379,1785.3480224609,,, +23.7285156250,379,1780.9523925781,,, +23.7304687500,379,1776.5567626953,,, +23.7324218750,379,1772.8937988281,,, +23.7343750000,379,1768.4981689453,,, +23.7363281250,379,1763.3699951172,,, +23.7382812500,379,1756.0439453125,,, +23.7402343750,379,1750.1831054688,,, +23.7421875000,379,1744.3223876953,,, +23.7441406250,379,1737.7288818359,,, +23.7460937500,379,1731.8681640625,,, +23.7480468750,379,1724.5421142578,,, +23.7500000000,380,1717.9487304688,,, +23.7519531250,380,1712.0878906250,,, +23.7539062500,380,1706.2270507812,,, +23.7558593750,380,1699.6336669922,,, +23.7578125000,380,1694.5054931641,,, +23.7597656250,380,1689.3773193359,,, +23.7617187500,380,1684.9816894531,,, +23.7636718750,380,1679.1208496094,,, +23.7656250000,380,1672.5274658203,,, +23.7675781250,380,1665.9340820312,,, +23.7695312500,380,1659.3406982422,,, +23.7714843750,380,1653.4798583984,,, +23.7734375000,380,1646.1538085938,,, +23.7753906250,380,1641.7583007812,,, +23.7773437500,380,1637.3626708984,,, +23.7792968750,380,1631.5018310547,,, +23.7812500000,380,1625.6409912109,,, +23.7832031250,380,1619.0476074219,,, +23.7851562500,380,1612.4542236328,,, +23.7871093750,380,1607.3260498047,,, +23.7890625000,380,1601.4652099609,,, +23.7910156250,380,1596.3370361328,,, +23.7929687500,380,1591.2087402344,,, +23.7949218750,380,1588.2784423828,,, +23.7968750000,380,1583.8828125000,,, +23.7988281250,380,1578.0219726562,,, +23.8007812500,380,1572.8937988281,,, +23.8027343750,380,1567.7656250000,,, +23.8046875000,380,1562.6373291016,,, +23.8066406250,380,1558.2416992188,,, +23.8085937500,380,1555.3114013672,,, +23.8105468750,380,1552.3809814453,,, +23.8125000000,381,1549.4505615234,,, +23.8144531250,381,1547.2528076172,,, +23.8164062500,381,1544.3223876953,,, +23.8183593750,381,1540.6593017578,,, +23.8203125000,381,1536.9963378906,,, +23.8222656250,381,1532.6007080078,,, +23.8242187500,381,1528.9377441406,,, +23.8261718750,381,1526.0073242188,,, +23.8281250000,381,1523.0769042969,,, +23.8300781250,381,1520.1464843750,,, +23.8320312500,381,1518.6812744141,,, +23.8339843750,381,1517.2160644531,,, +23.8359375000,381,1515.7509765625,,, +23.8378906250,381,1514.2857666016,,, +23.8398437500,381,1511.3553466797,,, +23.8417968750,381,1508.4249267578,,, +23.8437500000,381,1505.4945068359,,, +23.8457031250,381,1503.2967529297,,, +23.8476562500,381,1500.3663330078,,, +23.8496093750,381,1497.4359130859,,, +23.8515625000,381,1495.2380371094,,, +23.8535156250,381,1492.3077392578,,, +23.8554687500,381,1490.8425292969,,, +23.8574218750,381,1490.1098632812,,, +23.8593750000,381,1488.6446533203,,, +23.8613281250,381,1485.7142333984,,, +23.8632812500,381,1484.2490234375,,, +23.8652343750,381,1481.3187255859,,, +23.8671875000,381,1479.1208496094,,, +23.8691406250,381,1476.9230957031,,, +23.8710937500,381,1475.4578857422,,, +23.8730468750,381,1473.9926757812,,, +23.8750000000,382,1473.9926757812,,, +23.8769531250,382,1473.9926757812,,, +23.8789062500,382,1473.9926757812,,, +23.8808593750,382,1471.7949218750,,, +23.8828125000,382,1470.3297119141,,, +23.8847656250,382,1468.8645019531,,, +23.8867187500,382,1466.6666259766,,, +23.8886718750,382,1464.4688720703,,, +23.8906250000,382,1463.7362060547,,, +23.8925781250,382,1462.2711181641,,, +23.8945312500,382,1462.2711181641,,, +23.8964843750,382,1461.5384521484,,, +23.8984375000,382,1462.2711181641,,, +23.9003906250,382,1463.7362060547,,, +23.9023437500,382,1463.7362060547,,, +23.9042968750,382,1463.7362060547,,, +23.9062500000,382,1463.7362060547,,, +23.9082031250,382,1462.2711181641,,, +23.9101562500,382,1461.5384521484,,, +23.9121093750,382,1461.5384521484,,, +23.9140625000,382,1461.5384521484,,, +23.9160156250,382,1460.8059082031,,, +23.9179687500,382,1462.2711181641,,, +23.9199218750,382,1464.4688720703,,, +23.9218750000,382,1465.9340820312,,, +23.9238281250,382,1468.1318359375,,, +23.9257812500,382,1468.8645019531,,, +23.9277343750,382,1469.5970458984,,, +23.9296875000,382,1469.5970458984,,, +23.9316406250,382,1469.5970458984,,, +23.9335937500,382,1469.5970458984,,, +23.9355468750,382,1471.0622558594,,, +23.9375000000,383,1471.7949218750,,, +23.9394531250,383,1472.5274658203,,, +23.9414062500,383,1473.2601318359,,, +23.9433593750,383,1475.4578857422,,, +23.9453125000,383,1477.6556396484,,, +23.9472656250,383,1479.8535156250,,, +23.9492187500,383,1481.3187255859,,, +23.9511718750,383,1480.5860595703,,, +23.9531250000,383,1481.3187255859,,, +23.9550781250,383,1481.3187255859,,, +23.9570312500,383,1480.5860595703,,, +23.9589843750,383,1479.1208496094,,, +23.9609375000,383,1478.3883056641,,, +23.9628906250,383,1478.3883056641,,, +23.9648437500,383,1476.9230957031,,, +23.9667968750,383,1476.9230957031,,, +23.9687500000,383,1477.6556396484,,, +23.9707031250,383,1477.6556396484,,, +23.9726562500,383,1479.1208496094,,, +23.9746093750,383,1478.3883056641,,, +23.9765625000,383,1478.3883056641,,, +23.9785156250,383,1477.6556396484,,, +23.9804687500,383,1476.9230957031,,, +23.9824218750,383,1475.4578857422,,, +23.9843750000,383,1475.4578857422,,, +23.9863281250,383,1473.2601318359,,, +23.9882812500,383,1471.7949218750,,, +23.9902343750,383,1471.0622558594,,, +23.9921875000,383,1470.3297119141,,, +23.9941406250,383,1470.3297119141,,, +23.9960937500,383,1469.5970458984,,, +23.9980468750,383,1468.8645019531,,, +24.0000000000,384,1469.5970458984,,, +24.0019531250,384,1468.1318359375,,, +24.0039062500,384,1466.6666259766,,, +24.0058593750,384,1464.4688720703,,, +24.0078125000,384,1461.5384521484,,, +24.0097656250,384,1459.3406982422,,, +24.0117187500,384,1456.4102783203,,, +24.0136718750,384,1453.4798583984,,, +24.0156250000,384,1451.2821044922,,, +24.0175781250,384,1449.8168945312,,, +24.0195312500,384,1449.0842285156,,, +24.0214843750,384,1449.0842285156,,, +24.0234375000,384,1448.3516845703,,, +24.0253906250,384,1446.1538085938,,, +24.0273437500,384,1443.9560546875,,, +24.0292968750,384,1442.4908447266,,, +24.0312500000,384,1440.2930908203,,, +24.0332031250,384,1438.0952148438,,, +24.0351562500,384,1437.3626708984,,, +24.0371093750,384,1437.3626708984,,, +24.0390625000,384,1437.3626708984,,, +24.0410156250,384,1436.6300048828,,, +24.0429687500,384,1435.8974609375,,, +24.0449218750,384,1434.4322509766,,, +24.0468750000,384,1432.2343750000,,, +24.0488281250,384,1430.7692871094,,, +24.0507812500,384,1429.3040771484,,, +24.0527343750,384,1428.5714111328,,, +24.0546875000,384,1428.5714111328,,, +24.0566406250,384,1429.3040771484,,, +24.0585937500,384,1430.0366210938,,, +24.0605468750,384,1429.3040771484,,, +24.0625000000,385,1427.8388671875,,, +24.0644531250,385,1427.8388671875,,, +24.0664062500,385,1426.3736572266,,, +24.0683593750,385,1424.9084472656,,, +24.0703125000,385,1423.4432373047,,, +24.0722656250,385,1421.9780273438,,, +24.0742187500,385,1420.5128173828,,, +24.0761718750,385,1419.7802734375,,, +24.0781250000,385,1419.0476074219,,, +24.0800781250,385,1419.0476074219,,, +24.0820312500,385,1419.0476074219,,, +24.0839843750,385,1419.0476074219,,, +24.0859375000,385,1418.3150634766,,, +24.0878906250,385,1416.8498535156,,, +24.0898437500,385,1414.6519775391,,, +24.0917968750,385,1412.4542236328,,, +24.0937500000,385,1410.2564697266,,, +24.0957031250,385,1408.7912597656,,, +24.0976562500,385,1408.0585937500,,, +24.0996093750,385,1406.5933837891,,, +24.1015625000,385,1405.8608398438,,, +24.1035156250,385,1405.1281738281,,, +24.1054687500,385,1405.1281738281,,, +24.1074218750,385,1405.1281738281,,, +24.1093750000,385,1403.6629638672,,, +24.1113281250,385,1401.4652099609,,, +24.1132812500,385,1401.4652099609,,, +24.1152343750,385,1400.0000000000,,, +24.1171875000,385,1399.2674560547,,, +24.1191406250,385,1398.5347900391,,, +24.1210937500,385,1397.8022460938,,, +24.1230468750,385,1397.0695800781,,, +24.1250000000,386,1397.8022460938,,, +24.1269531250,386,1397.8022460938,,, +24.1289062500,386,1398.5347900391,,, +24.1308593750,386,1397.0695800781,,, +24.1328125000,386,1396.3370361328,,, +24.1347656250,386,1394.8718261719,,, +24.1367187500,386,1391.9414062500,,, +24.1386718750,386,1388.2784423828,,, +24.1406250000,386,1386.0805664062,,, +24.1425781250,386,1383.8828125000,,, +24.1445312500,386,1382.4176025391,,, +24.1464843750,386,1381.6849365234,,, +24.1484375000,386,1381.6849365234,,, +24.1503906250,386,1381.6849365234,,, +24.1523437500,386,1382.4176025391,,, +24.1542968750,386,1381.6849365234,,, +24.1562500000,386,1381.6849365234,,, +24.1582031250,386,1380.2197265625,,, +24.1601562500,386,1379.4871826172,,, +24.1621093750,386,1378.0219726562,,, +24.1640625000,386,1376.5567626953,,, +24.1660156250,386,1374.3590087891,,, +24.1679687500,386,1372.1611328125,,, +24.1699218750,386,1371.4285888672,,, +24.1718750000,386,1369.9633789062,,, +24.1738281250,386,1370.6959228516,,, +24.1757812500,386,1369.2307128906,,, +24.1777343750,386,1369.2307128906,,, +24.1796875000,386,1369.9633789062,,, +24.1816406250,386,1369.9633789062,,, +24.1835937500,386,1369.9633789062,,, +24.1855468750,386,1368.4981689453,,, +24.1875000000,387,1367.7656250000,,, +24.1894531250,387,1366.3004150391,,, +24.1914062500,387,1365.5677490234,,, +24.1933593750,387,1365.5677490234,,, +24.1953125000,387,1364.8352050781,,, +24.1972656250,387,1364.1025390625,,, +24.1992187500,387,1364.1025390625,,, +24.2011718750,387,1364.8352050781,,, +24.2031250000,387,1365.5677490234,,, +24.2050781250,387,1365.5677490234,,, +24.2070312500,387,1365.5677490234,,, +24.2089843750,387,1364.1025390625,,, +24.2109375000,387,1364.1025390625,,, +24.2128906250,387,1363.3699951172,,, +24.2148437500,387,1364.1025390625,,, +24.2167968750,387,1364.8352050781,,, +24.2187500000,387,1365.5677490234,,, +24.2207031250,387,1366.3004150391,,, +24.2226562500,387,1367.7656250000,,, +24.2246093750,387,1367.7656250000,,, +24.2265625000,387,1367.7656250000,,, +24.2285156250,387,1367.7656250000,,, +24.2304687500,387,1367.7656250000,,, +24.2324218750,387,1368.4981689453,,, +24.2343750000,387,1367.7656250000,,, +24.2363281250,387,1367.7656250000,,, +24.2382812500,387,1367.0329589844,,, +24.2402343750,387,1367.0329589844,,, +24.2421875000,387,1367.7656250000,,, +24.2441406250,387,1369.2307128906,,, +24.2460937500,387,1371.4285888672,,, +24.2480468750,387,1372.8937988281,,, +24.2500000000,388,1373.6263427734,,, +24.2519531250,388,1374.3590087891,,, +24.2539062500,388,1375.0915527344,,, +24.2558593750,388,1375.0915527344,,, +24.2578125000,388,1375.0915527344,,, +24.2597656250,388,1375.8242187500,,, +24.2617187500,388,1375.0915527344,,, +24.2636718750,388,1374.3590087891,,, +24.2656250000,388,1374.3590087891,,, +24.2675781250,388,1374.3590087891,,, +24.2695312500,388,1374.3590087891,,, +24.2714843750,388,1375.8242187500,,, +24.2734375000,388,1377.2894287109,,, +24.2753906250,388,1376.5567626953,,, +24.2773437500,388,1375.8242187500,,, +24.2792968750,388,1375.8242187500,,, +24.2812500000,388,1374.3590087891,,, +24.2832031250,388,1372.8937988281,,, +24.2851562500,388,1372.1611328125,,, +24.2871093750,388,1371.4285888672,,, +24.2890625000,388,1370.6959228516,,, +24.2910156250,388,1370.6959228516,,, +24.2929687500,388,1369.2307128906,,, +24.2949218750,388,1370.6959228516,,, +24.2968750000,388,1372.1611328125,,, +24.2988281250,388,1371.4285888672,,, +24.3007812500,388,1371.4285888672,,, +24.3027343750,388,1371.4285888672,,, +24.3046875000,388,1371.4285888672,,, +24.3066406250,388,1370.6959228516,,, +24.3085937500,388,1370.6959228516,,, +24.3105468750,388,1369.2307128906,,, +24.3125000000,389,1368.4981689453,,, +24.3144531250,389,1368.4981689453,,, +24.3164062500,389,1367.7656250000,,, +24.3183593750,389,1367.0329589844,,, +24.3203125000,389,1367.7656250000,,, +24.3222656250,389,1368.4981689453,,, +24.3242187500,389,1369.2307128906,,, +24.3261718750,389,1368.4981689453,,, +24.3281250000,389,1368.4981689453,,, +24.3300781250,389,1367.0329589844,,, +24.3320312500,389,1366.3004150391,,, +24.3339843750,389,1364.8352050781,,, +24.3359375000,389,1362.6373291016,,, +24.3378906250,389,1361.1721191406,,, +24.3398437500,389,1359.7069091797,,, +24.3417968750,389,1359.7069091797,,, +24.3437500000,389,1358.2416992188,,, +24.3457031250,389,1356.7766113281,,, +24.3476562500,389,1356.7766113281,,, +24.3496093750,389,1356.7766113281,,, +24.3515625000,389,1356.7766113281,,, +24.3535156250,389,1356.7766113281,,, +24.3554687500,389,1356.0439453125,,, +24.3574218750,389,1355.3114013672,,, +24.3593750000,389,1354.5787353516,,, +24.3613281250,389,1353.1135253906,,, +24.3632812500,389,1352.3809814453,,, +24.3652343750,389,1351.6483154297,,, +24.3671875000,389,1350.9157714844,,, +24.3691406250,389,1350.1831054688,,, +24.3710937500,389,1350.1831054688,,, +24.3730468750,389,1350.1831054688,,, +24.3750000000,390,1350.9157714844,,, +24.3769531250,390,1350.9157714844,,, +24.3789062500,390,1350.9157714844,,, +24.3808593750,390,1351.6483154297,,, +24.3828125000,390,1352.3809814453,,, +24.3847656250,390,1353.8461914062,,, +24.3867187500,390,1354.5787353516,,, +24.3886718750,390,1356.0439453125,,, +24.3906250000,390,1357.5091552734,,, +24.3925781250,390,1358.9743652344,,, +24.3945312500,390,1359.7069091797,,, +24.3964843750,390,1360.4395751953,,, +24.3984375000,390,1359.7069091797,,, +24.4003906250,390,1359.7069091797,,, +24.4023437500,390,1359.7069091797,,, +24.4042968750,390,1358.9743652344,,, +24.4062500000,390,1357.5091552734,,, +24.4082031250,390,1357.5091552734,,, +24.4101562500,390,1356.7766113281,,, +24.4121093750,390,1356.0439453125,,, +24.4140625000,390,1356.0439453125,,, +24.4160156250,390,1355.3114013672,,, +24.4179687500,390,1354.5787353516,,, +24.4199218750,390,1353.1135253906,,, +24.4218750000,390,1352.3809814453,,, +24.4238281250,390,1352.3809814453,,, +24.4257812500,390,1350.9157714844,,, +24.4277343750,390,1350.1831054688,,, +24.4296875000,390,1349.4505615234,,, +24.4316406250,390,1348.7178955078,,, +24.4335937500,390,1347.9853515625,,, +24.4355468750,390,1347.2528076172,,, +24.4375000000,391,1345.7875976562,,, +24.4394531250,391,1344.3223876953,,, +24.4414062500,391,1342.8571777344,,, +24.4433593750,391,1342.8571777344,,, +24.4453125000,391,1341.3919677734,,, +24.4472656250,391,1340.6593017578,,, +24.4492187500,391,1340.6593017578,,, +24.4511718750,391,1340.6593017578,,, +24.4531250000,391,1338.4615478516,,, +24.4550781250,391,1337.7288818359,,, +24.4570312500,391,1336.9963378906,,, +24.4589843750,391,1335.5311279297,,, +24.4609375000,391,1334.0659179688,,, +24.4628906250,391,1331.8681640625,,, +24.4648437500,391,1329.6702880859,,, +24.4667968750,391,1328.2050781250,,, +24.4687500000,391,1326.7398681641,,, +24.4707031250,391,1323.8095703125,,, +24.4726562500,391,1323.0769042969,,, +24.4746093750,391,1322.3443603516,,, +24.4765625000,391,1320.8791503906,,, +24.4785156250,391,1321.6116943359,,, +24.4804687500,391,1323.0769042969,,, +24.4824218750,391,1323.0769042969,,, +24.4843750000,391,1325.2747802734,,, +24.4863281250,391,1326.7398681641,,, +24.4882812500,391,1328.2050781250,,, +24.4902343750,391,1330.4029541016,,, +24.4921875000,391,1331.8681640625,,, +24.4941406250,391,1333.3333740234,,, +24.4960937500,391,1335.5311279297,,, +24.4980468750,391,1336.9963378906,,, +24.5000000000,392,1338.4615478516,,, +24.5019531250,392,1339.1940917969,,, +24.5039062500,392,1339.9267578125,,, +24.5058593750,392,1341.3919677734,,, +24.5078125000,392,1341.3919677734,,, +24.5097656250,392,1342.1245117188,,, +24.5117187500,392,1342.8571777344,,, +24.5136718750,392,1342.1245117188,,, +24.5156250000,392,1342.1245117188,,, +24.5175781250,392,1342.1245117188,,, +24.5195312500,392,1342.1245117188,,, +24.5214843750,392,1342.1245117188,,, +24.5234375000,392,1341.3919677734,,, +24.5253906250,392,1340.6593017578,,, +24.5273437500,392,1340.6593017578,,, +24.5292968750,392,1340.6593017578,,, +24.5312500000,392,1340.6593017578,,, +24.5332031250,392,1342.1245117188,,, +24.5351562500,392,1342.8571777344,,, +24.5371093750,392,1343.5897216797,,, +24.5390625000,392,1345.0549316406,,, +24.5410156250,392,1346.5201416016,,, +24.5429687500,392,1347.9853515625,,, +24.5449218750,392,1347.9853515625,,, +24.5468750000,392,1347.9853515625,,, +24.5488281250,392,1347.2528076172,,, +24.5507812500,392,1345.7875976562,,, +24.5527343750,392,1345.7875976562,,, +24.5546875000,392,1345.0549316406,,, +24.5566406250,392,1344.3223876953,,, +24.5585937500,392,1343.5897216797,,, +24.5605468750,392,1342.1245117188,,, +24.5625000000,393,1341.3919677734,,, +24.5644531250,393,1340.6593017578,,, +24.5664062500,393,1339.1940917969,,, +24.5683593750,393,1339.9267578125,,, +24.5703125000,393,1339.1940917969,,, +24.5722656250,393,1339.1940917969,,, +24.5742187500,393,1339.1940917969,,, +24.5761718750,393,1338.4615478516,,, +24.5781250000,393,1337.7288818359,,, +24.5800781250,393,1336.9963378906,,, +24.5820312500,393,1336.9963378906,,, +24.5839843750,393,1336.9963378906,,, +24.5859375000,393,1336.9963378906,,, +24.5878906250,393,1336.9963378906,,, +24.5898437500,393,1337.7288818359,,, +24.5917968750,393,1337.7288818359,,, +24.5937500000,393,1337.7288818359,,, +24.5957031250,393,1337.7288818359,,, +24.5976562500,393,1336.2637939453,,, +24.5996093750,393,1334.7985839844,,, +24.6015625000,393,1333.3333740234,,, +24.6035156250,393,1332.6007080078,,, +24.6054687500,393,1330.4029541016,,, +24.6074218750,393,1329.6702880859,,, +24.6093750000,393,1327.4725341797,,, +24.6113281250,393,1326.0073242188,,, +24.6132812500,393,1325.2747802734,,, +24.6152343750,393,1323.8095703125,,, +24.6171875000,393,1321.6116943359,,, +24.6191406250,393,1320.8791503906,,, +24.6210937500,393,1320.1464843750,,, +24.6230468750,393,1320.1464843750,,, +24.6250000000,394,1320.1464843750,,, +24.6269531250,394,1320.8791503906,,, +24.6289062500,394,1321.6116943359,,, +24.6308593750,394,1322.3443603516,,, +24.6328125000,394,1323.8095703125,,, +24.6347656250,394,1324.5421142578,,, +24.6367187500,394,1326.7398681641,,, +24.6386718750,394,1328.9377441406,,, +24.6406250000,394,1331.1354980469,,, +24.6425781250,394,1332.6007080078,,, +24.6445312500,394,1336.9963378906,,, +24.6464843750,394,1342.1245117188,,, +24.6484375000,394,1346.5201416016,,, +24.6503906250,394,1352.3809814453,,, +24.6523437500,394,1357.5091552734,,, +24.6542968750,394,1362.6373291016,,, +24.6562500000,394,1369.2307128906,,, +24.6582031250,394,1376.5567626953,,, +24.6601562500,394,1383.8828125000,,, +24.6621093750,394,1392.6739501953,,, +24.6640625000,394,1400.7325439453,,, +24.6660156250,394,1410.2564697266,,, +24.6679687500,394,1419.0476074219,,, +24.6699218750,394,1428.5714111328,,, +24.6718750000,394,1437.3626708984,,, +24.6738281250,394,1456.4102783203,,, +24.6757812500,394,1466.6666259766,,, +24.6777343750,394,1476.1904296875,,, +24.6796875000,394,1487.1794433594,,, +24.6816406250,394,1498.1684570312,,, +24.6835937500,394,1509.8901367188,,, +24.6855468750,394,1522.3443603516,,, +24.6875000000,395,1534.7985839844,,, +24.6894531250,395,1546.5201416016,,, +24.6914062500,395,1559.7069091797,,, +24.6933593750,395,1572.8937988281,,, +24.6953125000,395,1586.0805664062,,, +24.6972656250,395,1600.7325439453,,, +24.6992187500,395,1615.3846435547,,, +24.7011718750,395,1628.5714111328,,, +24.7031250000,395,1641.7583007812,,, +24.7050781250,395,1654.9450683594,,, +24.7070312500,395,1666.6666259766,,, +24.7089843750,395,1679.8535156250,,, +24.7109375000,395,1691.5750732422,,, +24.7128906250,395,1704.0292968750,,, +24.7148437500,395,1716.4835205078,,, +24.7167968750,395,1728.9377441406,,, +24.7187500000,395,1740.6593017578,,, +24.7207031250,395,1752.3809814453,,, +24.7226562500,395,1763.3699951172,,, +24.7246093750,395,1774.3590087891,,, +24.7265625000,395,1785.3480224609,,, +24.7285156250,395,1795.6043701172,,, +24.7304687500,395,1805.8608398438,,, +24.7324218750,395,1815.3846435547,,, +24.7343750000,395,1824.9084472656,,, +24.7363281250,395,1824.9084472656,,, +24.7382812500,395,1833.6995849609,,, +24.7402343750,395,1841.0256347656,,, +24.7421875000,395,1847.6190185547,,, +24.7441406250,395,1852.7471923828,,, +24.7460937500,395,1856.4102783203,,, +24.7480468750,395,1860.0732421875,,, +24.7500000000,396,1862.2711181641,,, +24.7519531250,396,1863.7362060547,,, +24.7539062500,396,1865.9340820312,,, +24.7558593750,396,1866.6666259766,,, +24.7578125000,396,1866.6666259766,,, +24.7597656250,396,1866.6666259766,,, +24.7617187500,396,1865.9340820312,,, +24.7636718750,396,1865.9340820312,,, +24.7656250000,396,1863.7362060547,,, +24.7675781250,396,1861.5384521484,,, +24.7695312500,396,1859.3406982422,,, +24.7714843750,396,1855.6776123047,,, +24.7734375000,396,1852.7471923828,,, +24.7753906250,396,1850.5494384766,,, +24.7773437500,396,1847.6190185547,,, +24.7792968750,396,1845.4212646484,,, +24.7812500000,396,1841.0256347656,,, +24.7832031250,396,1835.8974609375,,, +24.7851562500,396,1830.7692871094,,, +24.7871093750,396,1824.9084472656,,, +24.7890625000,396,1818.3150634766,,, +24.7910156250,396,1813.1867675781,,, +24.7929687500,396,1807.3260498047,,, +24.7949218750,396,1801.4652099609,,, +24.7968750000,396,1794.8718261719,,, +24.7988281250,396,1789.0109863281,,, +24.8007812500,396,1789.0109863281,,, +24.8027343750,396,1789.0109863281,,, +24.8046875000,396,1783.8828125000,,, +24.8066406250,396,1777.2894287109,,, +24.8085937500,396,1770.6959228516,,, +24.8105468750,396,1765.5677490234,,, +24.8125000000,397,1759.7069091797,,, +24.8144531250,397,1751.6483154297,,, +24.8164062500,397,1745.0549316406,,, +24.8183593750,397,1738.4615478516,,, +24.8203125000,397,1731.8681640625,,, +24.8222656250,397,1723.8095703125,,, +24.8242187500,397,1715.0183105469,,, +24.8261718750,397,1708.4249267578,,, +24.8281250000,397,1698.9011230469,,, +24.8300781250,397,1690.8425292969,,, +24.8320312500,397,1682.7839355469,,, +24.8339843750,397,1674.7252197266,,, +24.8359375000,397,1666.6666259766,,, +24.8378906250,397,1659.3406982422,,, +24.8398437500,397,1652.0146484375,,, +24.8417968750,397,1643.9560546875,,, +24.8437500000,397,1636.6300048828,,, +24.8457031250,397,1629.3040771484,,, +24.8476562500,397,1621.2453613281,,, +24.8496093750,397,1613.9194335938,,, +24.8515625000,397,1605.8608398438,,, +24.8535156250,397,1599.2674560547,,, +24.8554687500,397,1593.4066162109,,, +24.8574218750,397,1587.5457763672,,, +24.8593750000,397,1581.6849365234,,, +24.8613281250,397,1575.0915527344,,, +24.8632812500,397,1569.2307128906,,, +24.8652343750,397,1561.1721191406,,, +24.8671875000,397,1553.8461914062,,, +24.8691406250,397,1545.7875976562,,, +24.8710937500,397,1537.7288818359,,, +24.8730468750,397,1528.9377441406,,, +24.8750000000,398,1522.3443603516,,, +24.8769531250,398,1514.2857666016,,, +24.8789062500,398,1506.9597167969,,, +24.8808593750,398,1500.3663330078,,, +24.8828125000,398,1493.7729492188,,, +24.8847656250,398,1488.6446533203,,, +24.8867187500,398,1483.5164794922,,, +24.8886718750,398,1477.6556396484,,, +24.8906250000,398,1473.2601318359,,, +24.8925781250,398,1468.1318359375,,, +24.8945312500,398,1463.0036621094,,, +24.8964843750,398,1458.6080322266,,, +24.8984375000,398,1454.2124023438,,, +24.9003906250,398,1449.8168945312,,, +24.9023437500,398,1444.6885986328,,, +24.9042968750,398,1440.2930908203,,, +24.9062500000,398,1437.3626708984,,, +24.9082031250,398,1432.9670410156,,, +24.9101562500,398,1428.5714111328,,, +24.9121093750,398,1426.3736572266,,, +24.9140625000,398,1423.4432373047,,, +24.9160156250,398,1420.5128173828,,, +24.9179687500,398,1419.7802734375,,, +24.9199218750,398,1418.3150634766,,, +24.9218750000,398,1416.8498535156,,, +24.9238281250,398,1416.1171875000,,, +24.9257812500,398,1415.3846435547,,, +24.9277343750,398,1413.1867675781,,, +24.9296875000,398,1410.9890136719,,, +24.9316406250,398,1408.7912597656,,, +24.9335937500,398,1406.5933837891,,, +24.9355468750,398,1405.8608398438,,, +24.9375000000,399,1404.3956298828,,, +24.9394531250,399,1402.1977539062,,, +24.9414062500,399,1402.1977539062,,, +24.9433593750,399,1401.4652099609,,, +24.9453125000,399,1402.9304199219,,, +24.9472656250,399,1402.9304199219,,, +24.9492187500,399,1404.3956298828,,, +24.9511718750,399,1405.1281738281,,, +24.9531250000,399,1405.8608398438,,, +24.9550781250,399,1406.5933837891,,, +24.9570312500,399,1407.3260498047,,, +24.9589843750,399,1408.7912597656,,, +24.9609375000,399,1409.5238037109,,, +24.9628906250,399,1410.2564697266,,, +24.9648437500,399,1412.4542236328,,, +24.9667968750,399,1413.9194335938,,, +24.9687500000,399,1416.1171875000,,, +24.9707031250,399,1417.5823974609,,, +24.9726562500,399,1419.7802734375,,, +24.9746093750,399,1421.9780273438,,, +24.9765625000,399,1423.4432373047,,, +24.9785156250,399,1425.6409912109,,, +24.9804687500,399,1427.1062011719,,, +24.9824218750,399,1428.5714111328,,, +24.9843750000,399,1430.0366210938,,, +24.9863281250,399,1431.5018310547,,, +24.9882812500,399,1432.9670410156,,, +24.9902343750,399,1435.8974609375,,, +24.9921875000,399,1438.8278808594,,, +24.9941406250,399,1440.2930908203,,, +24.9960937500,399,1443.9560546875,,, +24.9980468750,399,1445.4212646484,,, +25.0000000000,400,1446.8864746094,,, +25.0019531250,400,1446.8864746094,,, +25.0039062500,400,1447.6190185547,,, +25.0058593750,400,1448.3516845703,,, +25.0078125000,400,1448.3516845703,,, +25.0097656250,400,1448.3516845703,,, +25.0117187500,400,1449.0842285156,,, +25.0136718750,400,1451.2821044922,,, +25.0156250000,400,1453.4798583984,,, +25.0175781250,400,1454.9450683594,,, +25.0195312500,400,1457.1428222656,,, +25.0214843750,400,1457.8754882812,,, +25.0234375000,400,1457.8754882812,,, +25.0253906250,400,1457.8754882812,,, +25.0273437500,400,1457.8754882812,,, +25.0292968750,400,1457.1428222656,,, +25.0312500000,400,1457.1428222656,,, +25.0332031250,400,1457.1428222656,,, +25.0351562500,400,1456.4102783203,,, +25.0371093750,400,1455.6776123047,,, +25.0390625000,400,1455.6776123047,,, +25.0410156250,400,1455.6776123047,,, +25.0429687500,400,1455.6776123047,,, +25.0449218750,400,1457.1428222656,,, +25.0468750000,400,1457.8754882812,,, +25.0488281250,400,1458.6080322266,,, +25.0507812500,400,1460.0732421875,,, +25.0527343750,400,1458.6080322266,,, +25.0546875000,400,1457.8754882812,,, +25.0566406250,400,1456.4102783203,,, +25.0585937500,400,1454.2124023438,,, +25.0605468750,400,1453.4798583984,,, +25.0625000000,401,1451.2821044922,,, +25.0644531250,401,1448.3516845703,,, +25.0664062500,401,1446.8864746094,,, +25.0683593750,401,1445.4212646484,,, +25.0703125000,401,1443.2233886719,,, +25.0722656250,401,1440.2930908203,,, +25.0742187500,401,1438.8278808594,,, +25.0761718750,401,1437.3626708984,,, +25.0781250000,401,1435.1647949219,,, +25.0800781250,401,1434.4322509766,,, +25.0820312500,401,1431.5018310547,,, +25.0839843750,401,1430.0366210938,,, +25.0859375000,401,1428.5714111328,,, +25.0878906250,401,1427.1062011719,,, +25.0898437500,401,1425.6409912109,,, +25.0917968750,401,1424.1757812500,,, +25.0937500000,401,1424.1757812500,,, +25.0957031250,401,1421.9780273438,,, +25.0976562500,401,1421.2453613281,,, +25.0996093750,401,1420.5128173828,,, +25.1015625000,401,1418.3150634766,,, +25.1035156250,401,1416.8498535156,,, +25.1054687500,401,1414.6519775391,,, +25.1074218750,401,1412.4542236328,,, +25.1093750000,401,1410.2564697266,,, +25.1113281250,401,1406.5933837891,,, +25.1132812500,401,1404.3956298828,,, +25.1152343750,401,1400.7325439453,,, +25.1171875000,401,1398.5347900391,,, +25.1191406250,401,1396.3370361328,,, +25.1210937500,401,1394.1391601562,,, +25.1230468750,401,1391.2087402344,,, +25.1250000000,402,1389.7435302734,,, +25.1269531250,402,1388.2784423828,,, +25.1289062500,402,1386.8132324219,,, +25.1308593750,402,1385.3480224609,,, +25.1328125000,402,1383.8828125000,,, +25.1347656250,402,1381.6849365234,,, +25.1367187500,402,1380.9523925781,,, +25.1386718750,402,1378.7546386719,,, +25.1406250000,402,1377.2894287109,,, +25.1425781250,402,1375.0915527344,,, +25.1445312500,402,1373.6263427734,,, +25.1464843750,402,1372.1611328125,,, +25.1484375000,402,1370.6959228516,,, +25.1503906250,402,1368.4981689453,,, +25.1523437500,402,1367.0329589844,,, +25.1542968750,402,1365.5677490234,,, +25.1562500000,402,1364.8352050781,,, +25.1582031250,402,1364.8352050781,,, +25.1601562500,402,1364.8352050781,,, +25.1621093750,402,1364.8352050781,,, +25.1640625000,402,1363.3699951172,,, +25.1660156250,402,1361.1721191406,,, +25.1679687500,402,1359.7069091797,,, +25.1699218750,402,1357.5091552734,,, +25.1718750000,402,1355.3114013672,,, +25.1738281250,402,1353.1135253906,,, +25.1757812500,402,1351.6483154297,,, +25.1777343750,402,1351.6483154297,,, +25.1796875000,402,1350.1831054688,,, +25.1816406250,402,1347.9853515625,,, +25.1835937500,402,1345.7875976562,,, +25.1855468750,402,1344.3223876953,,, +25.1875000000,403,1340.6593017578,,, +25.1894531250,403,1339.1940917969,,, +25.1914062500,403,1338.4615478516,,, +25.1933593750,403,1337.7288818359,,, +25.1953125000,403,1336.2637939453,,, +25.1972656250,403,1334.7985839844,,, +25.1992187500,403,1333.3333740234,,, +25.2011718750,403,1331.1354980469,,, +25.2031250000,403,1328.9377441406,,, +25.2050781250,403,1327.4725341797,,, +25.2070312500,403,1327.4725341797,,, +25.2089843750,403,1327.4725341797,,, +25.2109375000,403,1326.7398681641,,, +25.2128906250,403,1325.2747802734,,, +25.2148437500,403,1324.5421142578,,, +25.2167968750,403,1324.5421142578,,, +25.2187500000,403,1323.8095703125,,, +25.2207031250,403,1324.5421142578,,, +25.2226562500,403,1325.2747802734,,, +25.2246093750,403,1326.7398681641,,, +25.2265625000,403,1328.9377441406,,, +25.2285156250,403,1329.6702880859,,, +25.2304687500,403,1328.9377441406,,, +25.2324218750,403,1329.6702880859,,, +25.2343750000,403,1329.6702880859,,, +25.2363281250,403,1329.6702880859,,, +25.2382812500,403,1330.4029541016,,, +25.2402343750,403,1331.1354980469,,, +25.2421875000,403,1333.3333740234,,, +25.2441406250,403,1334.7985839844,,, +25.2460937500,403,1335.5311279297,,, +25.2480468750,403,1335.5311279297,,, +25.2500000000,404,1336.2637939453,,, +25.2519531250,404,1336.2637939453,,, +25.2539062500,404,1336.9963378906,,, +25.2558593750,404,1338.4615478516,,, +25.2578125000,404,1339.1940917969,,, +25.2597656250,404,1342.1245117188,,, +25.2617187500,404,1343.5897216797,,, +25.2636718750,404,1345.7875976562,,, +25.2656250000,404,1347.2528076172,,, +25.2675781250,404,1348.7178955078,,, +25.2695312500,404,1350.1831054688,,, +25.2714843750,404,1350.9157714844,,, +25.2734375000,404,1350.9157714844,,, +25.2753906250,404,1351.6483154297,,, +25.2773437500,404,1352.3809814453,,, +25.2792968750,404,1351.6483154297,,, +25.2812500000,404,1352.3809814453,,, +25.2832031250,404,1352.3809814453,,, +25.2851562500,404,1351.6483154297,,, +25.2871093750,404,1351.6483154297,,, +25.2890625000,404,1352.3809814453,,, +25.2910156250,404,1351.6483154297,,, +25.2929687500,404,1351.6483154297,,, +25.2949218750,404,1351.6483154297,,, +25.2968750000,404,1350.9157714844,,, +25.2988281250,404,1351.6483154297,,, +25.3007812500,404,1350.9157714844,,, +25.3027343750,404,1350.9157714844,,, +25.3046875000,404,1350.9157714844,,, +25.3066406250,404,1350.9157714844,,, +25.3085937500,404,1350.1831054688,,, +25.3105468750,404,1350.9157714844,,, +25.3125000000,405,1350.1831054688,,, +25.3144531250,405,1350.1831054688,,, +25.3164062500,405,1350.1831054688,,, +25.3183593750,405,1350.1831054688,,, +25.3203125000,405,1349.4505615234,,, +25.3222656250,405,1349.4505615234,,, +25.3242187500,405,1347.9853515625,,, +25.3261718750,405,1348.7178955078,,, +25.3281250000,405,1348.7178955078,,, +25.3300781250,405,1349.4505615234,,, +25.3320312500,405,1348.7178955078,,, +25.3339843750,405,1348.7178955078,,, +25.3359375000,405,1347.9853515625,,, +25.3378906250,405,1349.4505615234,,, +25.3398437500,405,1349.4505615234,,, +25.3417968750,405,1348.7178955078,,, +25.3437500000,405,1347.2528076172,,, +25.3457031250,405,1346.5201416016,,, +25.3476562500,405,1346.5201416016,,, +25.3496093750,405,1345.0549316406,,, +25.3515625000,405,1345.0549316406,,, +25.3535156250,405,1343.5897216797,,, +25.3554687500,405,1342.8571777344,,, +25.3574218750,405,1341.3919677734,,, +25.3593750000,405,1340.6593017578,,, +25.3613281250,405,1341.3919677734,,, +25.3632812500,405,1340.6593017578,,, +25.3652343750,405,1339.9267578125,,, +25.3671875000,405,1339.9267578125,,, +25.3691406250,405,1339.9267578125,,, +25.3710937500,405,1339.9267578125,,, +25.3730468750,405,1338.4615478516,,, +25.3750000000,406,1338.4615478516,,, +25.3769531250,406,1336.9963378906,,, +25.3789062500,406,1336.2637939453,,, +25.3808593750,406,1335.5311279297,,, +25.3828125000,406,1334.7985839844,,, +25.3847656250,406,1334.0659179688,,, +25.3867187500,406,1332.6007080078,,, +25.3886718750,406,1331.8681640625,,, +25.3906250000,406,1331.8681640625,,, +25.3925781250,406,1330.4029541016,,, +25.3945312500,406,1329.6702880859,,, +25.3964843750,406,1328.9377441406,,, +25.3984375000,406,1328.9377441406,,, +25.4003906250,406,1326.7398681641,,, +25.4023437500,406,1326.0073242188,,, +25.4042968750,406,1326.0073242188,,, +25.4062500000,406,1324.5421142578,,, +25.4082031250,406,1323.0769042969,,, +25.4101562500,406,1322.3443603516,,, +25.4121093750,406,1320.8791503906,,, +25.4140625000,406,1320.1464843750,,, +25.4160156250,406,1319.4139404297,,, +25.4179687500,406,1320.8791503906,,, +25.4199218750,406,1320.8791503906,,, +25.4218750000,406,1320.8791503906,,, +25.4238281250,406,1321.6116943359,,, +25.4257812500,406,1321.6116943359,,, +25.4277343750,406,1321.6116943359,,, +25.4296875000,406,1322.3443603516,,, +25.4316406250,406,1321.6116943359,,, +25.4335937500,406,1321.6116943359,,, +25.4355468750,406,1321.6116943359,,, +25.4375000000,407,1320.8791503906,,, +25.4394531250,407,1320.1464843750,,, +25.4414062500,407,1319.4139404297,,, +25.4433593750,407,1318.6812744141,,, +25.4453125000,407,1317.2160644531,,, +25.4472656250,407,1316.4835205078,,, +25.4492187500,407,1315.7509765625,,, +25.4511718750,407,1315.0183105469,,, +25.4531250000,407,1314.2857666016,,, +25.4550781250,407,1315.0183105469,,, +25.4570312500,407,1315.0183105469,,, +25.4589843750,407,1315.7509765625,,, +25.4609375000,407,1315.7509765625,,, +25.4628906250,407,1315.7509765625,,, +25.4648437500,407,1315.7509765625,,, +25.4667968750,407,1315.7509765625,,, +25.4687500000,407,1315.7509765625,,, +25.4707031250,407,1315.7509765625,,, +25.4726562500,407,1314.2857666016,,, +25.4746093750,407,1312.8205566406,,, +25.4765625000,407,1312.8205566406,,, +25.4785156250,407,1312.0878906250,,, +25.4804687500,407,1311.3553466797,,, +25.4824218750,407,1310.6226806641,,, +25.4843750000,407,1309.8901367188,,, +25.4863281250,407,1308.4249267578,,, +25.4882812500,407,1309.1574707031,,, +25.4902343750,407,1309.1574707031,,, +25.4921875000,407,1308.4249267578,,, +25.4941406250,407,1308.4249267578,,, +25.4960937500,407,1308.4249267578,,, +25.4980468750,407,1309.1574707031,,, +25.5000000000,408,1309.8901367188,,, +25.5019531250,408,1309.8901367188,,, +25.5039062500,408,1309.1574707031,,, +25.5058593750,408,1309.8901367188,,, +25.5078125000,408,1309.1574707031,,, +25.5097656250,408,1308.4249267578,,, +25.5117187500,408,1307.6922607422,,, +25.5136718750,408,1306.9597167969,,, +25.5156250000,408,1306.2270507812,,, +25.5175781250,408,1305.4945068359,,, +25.5195312500,408,1304.7619628906,,, +25.5214843750,408,1304.0292968750,,, +25.5234375000,408,1303.2967529297,,, +25.5253906250,408,1303.2967529297,,, +25.5273437500,408,1302.5640869141,,, +25.5292968750,408,1301.8315429688,,, +25.5312500000,408,1301.8315429688,,, +25.5332031250,408,1301.8315429688,,, +25.5351562500,408,1301.0988769531,,, +25.5371093750,408,1301.0988769531,,, +25.5390625000,408,1300.3663330078,,, +25.5410156250,408,1299.6336669922,,, +25.5429687500,408,1300.3663330078,,, +25.5449218750,408,1299.6336669922,,, +25.5468750000,408,1299.6336669922,,, +25.5488281250,408,1299.6336669922,,, +25.5507812500,408,1299.6336669922,,, +25.5527343750,408,1299.6336669922,,, +25.5546875000,408,1300.3663330078,,, +25.5566406250,408,1301.0988769531,,, +25.5585937500,408,1301.0988769531,,, +25.5605468750,408,1301.0988769531,,, +25.5625000000,409,1301.0988769531,,, +25.5644531250,409,1301.8315429688,,, +25.5664062500,409,1302.5640869141,,, +25.5683593750,409,1303.2967529297,,, +25.5703125000,409,1303.2967529297,,, +25.5722656250,409,1304.0292968750,,, +25.5742187500,409,1304.7619628906,,, +25.5761718750,409,1305.4945068359,,, +25.5781250000,409,1306.9597167969,,, +25.5800781250,409,1307.6922607422,,, +25.5820312500,409,1309.1574707031,,, +25.5839843750,409,1309.1574707031,,, +25.5859375000,409,1309.8901367188,,, +25.5878906250,409,1309.8901367188,,, +25.5898437500,409,1310.6226806641,,, +25.5917968750,409,1310.6226806641,,, +25.5937500000,409,1311.3553466797,,, +25.5957031250,409,1311.3553466797,,, +25.5976562500,409,1312.0878906250,,, +25.5996093750,409,1312.0878906250,,, +25.6015625000,409,1312.8205566406,,, +25.6035156250,409,1314.2857666016,,, +25.6054687500,409,1315.7509765625,,, +25.6074218750,409,1316.4835205078,,, +25.6093750000,409,1317.9487304688,,, +25.6113281250,409,1318.6812744141,,, +25.6132812500,409,1319.4139404297,,, +25.6152343750,409,1319.4139404297,,, +25.6171875000,409,1320.1464843750,,, +25.6191406250,409,1321.6116943359,,, +25.6210937500,409,1321.6116943359,,, +25.6230468750,409,1323.8095703125,,, +25.6250000000,410,1323.8095703125,,, +25.6269531250,410,1325.2747802734,,, +25.6289062500,410,1326.0073242188,,, +25.6308593750,410,1327.4725341797,,, +25.6328125000,410,1328.9377441406,,, +25.6347656250,410,1330.4029541016,,, +25.6367187500,410,1331.1354980469,,, +25.6386718750,410,1331.8681640625,,, +25.6406250000,410,1334.0659179688,,, +25.6425781250,410,1335.5311279297,,, +25.6445312500,410,1336.9963378906,,, +25.6464843750,410,1339.1940917969,,, +25.6484375000,410,1341.3919677734,,, +25.6503906250,410,1343.5897216797,,, +25.6523437500,410,1347.2528076172,,, +25.6542968750,410,1349.4505615234,,, +25.6562500000,410,1352.3809814453,,, +25.6582031250,410,1354.5787353516,,, +25.6601562500,410,1358.2416992188,,, +25.6621093750,410,1361.9047851562,,, +25.6640625000,410,1366.3004150391,,, +25.6660156250,410,1371.4285888672,,, +25.6679687500,410,1376.5567626953,,, +25.6699218750,410,1381.6849365234,,, +25.6718750000,410,1387.5457763672,,, +25.6738281250,410,1393.4066162109,,, +25.6757812500,410,1400.0000000000,,, +25.6777343750,410,1408.0585937500,,, +25.6796875000,410,1415.3846435547,,, +25.6816406250,410,1424.1757812500,,, +25.6835937500,410,1433.6995849609,,, +25.6855468750,410,1443.2233886719,,, +25.6875000000,411,1452.7471923828,,, +25.6894531250,411,1463.7362060547,,, +25.6914062500,411,1473.9926757812,,, +25.6933593750,411,1485.7142333984,,, +25.6953125000,411,1498.1684570312,,, +25.6972656250,411,1509.8901367188,,, +25.6992187500,411,1522.3443603516,,, +25.7011718750,411,1536.2637939453,,, +25.7031250000,411,1549.4505615234,,, +25.7050781250,411,1563.3699951172,,, +25.7070312500,411,1578.0219726562,,, +25.7089843750,411,1591.9414062500,,, +25.7109375000,411,1605.1281738281,,, +25.7128906250,411,1619.7802734375,,, +25.7148437500,411,1634.4322509766,,, +25.7167968750,411,1648.3516845703,,, +25.7187500000,411,1662.2711181641,,, +25.7207031250,411,1676.1904296875,,, +25.7226562500,411,1689.3773193359,,, +25.7246093750,411,1702.5640869141,,, +25.7265625000,411,1715.0183105469,,, +25.7285156250,411,1726.0073242188,,, +25.7304687500,411,1737.7288818359,,, +25.7324218750,411,1747.9853515625,,, +25.7343750000,411,1759.7069091797,,, +25.7363281250,411,1769.9633789062,,, +25.7382812500,411,1780.9523925781,,, +25.7402343750,411,1799.2674560547,,, +25.7421875000,411,1806.5933837891,,, +25.7441406250,411,1813.9194335938,,, +25.7460937500,411,1821.2453613281,,, +25.7480468750,411,1827.8388671875,,, +25.7500000000,412,1834.4322509766,,, +25.7519531250,412,1839.5604248047,,, +25.7539062500,412,1843.2233886719,,, +25.7558593750,412,1847.6190185547,,, +25.7578125000,412,1851.2821044922,,, +25.7597656250,412,1853.4798583984,,, +25.7617187500,412,1855.6776123047,,, +25.7636718750,412,1857.8754882812,,, +25.7656250000,412,1858.6080322266,,, +25.7675781250,412,1858.6080322266,,, +25.7695312500,412,1857.8754882812,,, +25.7714843750,412,1857.8754882812,,, +25.7734375000,412,1857.1428222656,,, +25.7753906250,412,1854.9450683594,,, +25.7773437500,412,1852.7471923828,,, +25.7792968750,412,1849.8168945312,,, +25.7812500000,412,1846.1538085938,,, +25.7832031250,412,1841.7583007812,,, +25.7851562500,412,1838.0952148438,,, +25.7871093750,412,1832.9670410156,,, +25.7890625000,412,1828.5714111328,,, +25.7910156250,412,1823.4432373047,,, +25.7929687500,412,1817.5823974609,,, +25.7949218750,412,1813.1867675781,,, +25.7968750000,412,1806.5933837891,,, +25.7988281250,412,1782.4176025391,,, +25.8007812500,412,1772.8937988281,,, +25.8027343750,412,1764.1025390625,,, +25.8046875000,412,1753.8461914062,,, +25.8066406250,412,1744.3223876953,,, +25.8085937500,412,1735.5311279297,,, +25.8105468750,412,1725.2747802734,,, +25.8125000000,413,1716.4835205078,,, +25.8144531250,413,1708.4249267578,,, +25.8164062500,413,1699.6336669922,,, +25.8183593750,413,1690.8425292969,,, +25.8203125000,413,1682.0512695312,,, +25.8222656250,413,1673.2601318359,,, +25.8242187500,413,1663.7362060547,,, +25.8261718750,413,1654.9450683594,,, +25.8281250000,413,1646.1538085938,,, +25.8300781250,413,1636.6300048828,,, +25.8320312500,413,1627.8388671875,,, +25.8339843750,413,1619.0476074219,,, +25.8359375000,413,1610.2564697266,,, +25.8378906250,413,1602.1977539062,,, +25.8398437500,413,1594.1391601562,,, +25.8417968750,413,1586.0805664062,,, +25.8437500000,413,1577.2894287109,,, +25.8457031250,413,1569.9633789062,,, +25.8476562500,413,1562.6373291016,,, +25.8496093750,413,1554.5787353516,,, +25.8515625000,413,1546.5201416016,,, +25.8535156250,413,1539.1940917969,,, +25.8554687500,413,1531.8681640625,,, +25.8574218750,413,1525.2747802734,,, +25.8593750000,413,1519.4139404297,,, +25.8613281250,413,1512.8205566406,,, +25.8632812500,413,1506.9597167969,,, +25.8652343750,413,1501.0988769531,,, +25.8671875000,413,1495.2380371094,,, +25.8691406250,413,1489.3773193359,,, +25.8710937500,413,1484.2490234375,,, +25.8730468750,413,1479.1208496094,,, +25.8750000000,414,1473.2601318359,,, +25.8769531250,414,1468.1318359375,,, +25.8789062500,414,1463.7362060547,,, +25.8808593750,414,1457.8754882812,,, +25.8828125000,414,1453.4798583984,,, +25.8847656250,414,1448.3516845703,,, +25.8867187500,414,1443.9560546875,,, +25.8886718750,414,1438.8278808594,,, +25.8906250000,414,1434.4322509766,,, +25.8925781250,414,1429.3040771484,,, +25.8945312500,414,1424.9084472656,,, +25.8964843750,414,1421.2453613281,,, +25.8984375000,414,1416.1171875000,,, +25.9003906250,414,1411.7215576172,,, +25.9023437500,414,1408.0585937500,,, +25.9042968750,414,1403.6629638672,,, +25.9062500000,414,1400.0000000000,,, +25.9082031250,414,1396.3370361328,,, +25.9101562500,414,1392.6739501953,,, +25.9121093750,414,1389.7435302734,,, +25.9140625000,414,1386.8132324219,,, +25.9160156250,414,1383.8828125000,,, +25.9179687500,414,1381.6849365234,,, +25.9199218750,414,1378.7546386719,,, +25.9218750000,414,1375.8242187500,,, +25.9238281250,414,1372.8937988281,,, +25.9257812500,414,1370.6959228516,,, +25.9277343750,414,1368.4981689453,,, +25.9296875000,414,1367.7656250000,,, +25.9316406250,414,1366.3004150391,,, +25.9335937500,414,1365.5677490234,,, +25.9355468750,414,1365.5677490234,,, +25.9375000000,415,1364.8352050781,,, +25.9394531250,415,1364.8352050781,,, +25.9414062500,415,1364.8352050781,,, +25.9433593750,415,1364.8352050781,,, +25.9453125000,415,1364.1025390625,,, +25.9472656250,415,1364.1025390625,,, +25.9492187500,415,1364.1025390625,,, +25.9511718750,415,1364.1025390625,,, +25.9531250000,415,1364.1025390625,,, +25.9550781250,415,1364.1025390625,,, +25.9570312500,415,1365.5677490234,,, +25.9589843750,415,1366.3004150391,,, +25.9609375000,415,1367.0329589844,,, +25.9628906250,415,1368.4981689453,,, +25.9648437500,415,1369.9633789062,,, +25.9667968750,415,1370.6959228516,,, +25.9687500000,415,1372.8937988281,,, +25.9707031250,415,1374.3590087891,,, +25.9726562500,415,1376.5567626953,,, +25.9746093750,415,1379.4871826172,,, +25.9765625000,415,1380.9523925781,,, +25.9785156250,415,1382.4176025391,,, +25.9804687500,415,1385.3480224609,,, +25.9824218750,415,1386.8132324219,,, +25.9843750000,415,1389.7435302734,,, +25.9863281250,415,1391.9414062500,,, +25.9882812500,415,1393.4066162109,,, +25.9902343750,415,1395.6043701172,,, +25.9921875000,415,1397.0695800781,,, +25.9941406250,415,1398.5347900391,,, +25.9960937500,415,1399.2674560547,,, +25.9980468750,415,1401.4652099609,,, +26.0000000000,416,1402.1977539062,,, +26.0019531250,416,1403.6629638672,,, +26.0039062500,416,1404.3956298828,,, +26.0058593750,416,1405.1281738281,,, +26.0078125000,416,1405.8608398438,,, +26.0097656250,416,1406.5933837891,,, +26.0117187500,416,1406.5933837891,,, +26.0136718750,416,1407.3260498047,,, +26.0156250000,416,1408.0585937500,,, +26.0175781250,416,1408.0585937500,,, +26.0195312500,416,1408.7912597656,,, +26.0214843750,416,1409.5238037109,,, +26.0234375000,416,1410.2564697266,,, +26.0253906250,416,1411.7215576172,,, +26.0273437500,416,1411.7215576172,,, +26.0292968750,416,1412.4542236328,,, +26.0312500000,416,1412.4542236328,,, +26.0332031250,416,1413.1867675781,,, +26.0351562500,416,1413.9194335938,,, +26.0371093750,416,1413.9194335938,,, +26.0390625000,416,1413.9194335938,,, +26.0410156250,416,1414.6519775391,,, +26.0429687500,416,1414.6519775391,,, +26.0449218750,416,1415.3846435547,,, +26.0468750000,416,1416.1171875000,,, +26.0488281250,416,1416.8498535156,,, +26.0507812500,416,1417.5823974609,,, +26.0527343750,416,1418.3150634766,,, +26.0546875000,416,1418.3150634766,,, +26.0566406250,416,1418.3150634766,,, +26.0585937500,416,1417.5823974609,,, +26.0605468750,416,1416.8498535156,,, +26.0625000000,417,1416.1171875000,,, +26.0644531250,417,1416.1171875000,,, +26.0664062500,417,1414.6519775391,,, +26.0683593750,417,1413.1867675781,,, +26.0703125000,417,1410.9890136719,,, +26.0722656250,417,1409.5238037109,,, +26.0742187500,417,1408.7912597656,,, +26.0761718750,417,1406.5933837891,,, +26.0781250000,417,1405.1281738281,,, +26.0800781250,417,1403.6629638672,,, +26.0820312500,417,1401.4652099609,,, +26.0839843750,417,1399.2674560547,,, +26.0859375000,417,1397.0695800781,,, +26.0878906250,417,1395.6043701172,,, +26.0898437500,417,1393.4066162109,,, +26.0917968750,417,1390.4761962891,,, +26.0937500000,417,1389.0109863281,,, +26.0957031250,417,1386.0805664062,,, +26.0976562500,417,1384.6153564453,,, +26.0996093750,417,1381.6849365234,,, +26.1015625000,417,1378.7546386719,,, +26.1035156250,417,1375.8242187500,,, +26.1054687500,417,1371.4285888672,,, +26.1074218750,417,1367.7656250000,,, +26.1093750000,417,1365.5677490234,,, +26.1113281250,417,1362.6373291016,,, +26.1132812500,417,1361.1721191406,,, +26.1152343750,417,1359.7069091797,,, +26.1171875000,417,1358.9743652344,,, +26.1191406250,417,1356.7766113281,,, +26.1210937500,417,1354.5787353516,,, +26.1230468750,417,1352.3809814453,,, +26.1250000000,418,1349.4505615234,,, +26.1269531250,418,1347.2528076172,,, +26.1289062500,418,1345.0549316406,,, +26.1308593750,418,1343.5897216797,,, +26.1328125000,418,1342.1245117188,,, +26.1347656250,418,1340.6593017578,,, +26.1367187500,418,1339.9267578125,,, +26.1386718750,418,1339.1940917969,,, +26.1406250000,418,1337.7288818359,,, +26.1425781250,418,1336.9963378906,,, +26.1445312500,418,1336.2637939453,,, +26.1464843750,418,1335.5311279297,,, +26.1484375000,418,1334.0659179688,,, +26.1503906250,418,1333.3333740234,,, +26.1523437500,418,1331.8681640625,,, +26.1542968750,418,1330.4029541016,,, +26.1562500000,418,1328.9377441406,,, +26.1582031250,418,1327.4725341797,,, +26.1601562500,418,1326.0073242188,,, +26.1621093750,418,1325.2747802734,,, +26.1640625000,418,1323.8095703125,,, +26.1660156250,418,1322.3443603516,,, +26.1679687500,418,1320.1464843750,,, +26.1699218750,418,1319.4139404297,,, +26.1718750000,418,1317.9487304688,,, +26.1738281250,418,1316.4835205078,,, +26.1757812500,418,1315.0183105469,,, +26.1777343750,418,1313.5531005859,,, +26.1796875000,418,1312.0878906250,,, +26.1816406250,418,1311.3553466797,,, +26.1835937500,418,1309.8901367188,,, +26.1855468750,418,1307.6922607422,,, +26.1875000000,419,1306.2270507812,,, +26.1894531250,419,1304.7619628906,,, +26.1914062500,419,1303.2967529297,,, +26.1933593750,419,1302.5640869141,,, +26.1953125000,419,1301.8315429688,,, +26.1972656250,419,1301.0988769531,,, +26.1992187500,419,1301.0988769531,,, +26.2011718750,419,1301.0988769531,,, +26.2031250000,419,1299.6336669922,,, +26.2050781250,419,1299.6336669922,,, +26.2070312500,419,1298.9011230469,,, +26.2089843750,419,1298.9011230469,,, +26.2109375000,419,1298.9011230469,,, +26.2128906250,419,1298.9011230469,,, +26.2148437500,419,1298.1684570312,,, +26.2167968750,419,1298.9011230469,,, +26.2187500000,419,1299.6336669922,,, +26.2207031250,419,1300.3663330078,,, +26.2226562500,419,1300.3663330078,,, +26.2246093750,419,1299.6336669922,,, +26.2265625000,419,1300.3663330078,,, +26.2285156250,419,1299.6336669922,,, +26.2304687500,419,1300.3663330078,,, +26.2324218750,419,1301.0988769531,,, +26.2343750000,419,1301.8315429688,,, +26.2363281250,419,1301.8315429688,,, +26.2382812500,419,1303.2967529297,,, +26.2402343750,419,1303.2967529297,,, +26.2421875000,419,1304.0292968750,,, +26.2441406250,419,1305.4945068359,,, +26.2460937500,419,1305.4945068359,,, +26.2480468750,419,1306.2270507812,,, +26.2500000000,420,1307.6922607422,,, +26.2519531250,420,1307.6922607422,,, +26.2539062500,420,1309.1574707031,,, +26.2558593750,420,1310.6226806641,,, +26.2578125000,420,1310.6226806641,,, +26.2597656250,420,1311.3553466797,,, +26.2617187500,420,1311.3553466797,,, +26.2636718750,420,1311.3553466797,,, +26.2656250000,420,1311.3553466797,,, +26.2675781250,420,1311.3553466797,,, +26.2695312500,420,1309.8901367188,,, +26.2714843750,420,1309.1574707031,,, +26.2734375000,420,1309.1574707031,,, +26.2753906250,420,1308.4249267578,,, +26.2773437500,420,1307.6922607422,,, +26.2792968750,420,1307.6922607422,,, +26.2812500000,420,1307.6922607422,,, +26.2832031250,420,1307.6922607422,,, +26.2851562500,420,1308.4249267578,,, +26.2871093750,420,1308.4249267578,,, +26.2890625000,420,1308.4249267578,,, +26.2910156250,420,1309.8901367188,,, +26.2929687500,420,1310.6226806641,,, +26.2949218750,420,1311.3553466797,,, +26.2968750000,420,1310.6226806641,,, +26.2988281250,420,1310.6226806641,,, +26.3007812500,420,1309.8901367188,,, +26.3027343750,420,1309.1574707031,,, +26.3046875000,420,1308.4249267578,,, +26.3066406250,420,1308.4249267578,,, +26.3085937500,420,1307.6922607422,,, +26.3105468750,420,1307.6922607422,,, +26.3125000000,421,1306.9597167969,,, +26.3144531250,421,1306.2270507812,,, +26.3164062500,421,1305.4945068359,,, +26.3183593750,421,1306.2270507812,,, +26.3203125000,421,1306.2270507812,,, +26.3222656250,421,1306.2270507812,,, +26.3242187500,421,1306.2270507812,,, +26.3261718750,421,1306.2270507812,,, +26.3281250000,421,1306.9597167969,,, +26.3300781250,421,1306.9597167969,,, +26.3320312500,421,1308.4249267578,,, +26.3339843750,421,1309.1574707031,,, +26.3359375000,421,1309.8901367188,,, +26.3378906250,421,1310.6226806641,,, +26.3398437500,421,1311.3553466797,,, +26.3417968750,421,1312.0878906250,,, +26.3437500000,421,1312.0878906250,,, +26.3457031250,421,1312.8205566406,,, +26.3476562500,421,1312.8205566406,,, +26.3496093750,421,1313.5531005859,,, +26.3515625000,421,1314.2857666016,,, +26.3535156250,421,1315.0183105469,,, +26.3554687500,421,1315.7509765625,,, +26.3574218750,421,1317.2160644531,,, +26.3593750000,421,1317.9487304688,,, +26.3613281250,421,1319.4139404297,,, +26.3632812500,421,1320.1464843750,,, +26.3652343750,421,1320.1464843750,,, +26.3671875000,421,1321.6116943359,,, +26.3691406250,421,1322.3443603516,,, +26.3710937500,421,1322.3443603516,,, +26.3730468750,421,1323.8095703125,,, +26.3750000000,422,1323.0769042969,,, +26.3769531250,422,1323.8095703125,,, +26.3789062500,422,1324.5421142578,,, +26.3808593750,422,1324.5421142578,,, +26.3828125000,422,1323.8095703125,,, +26.3847656250,422,1323.8095703125,,, +26.3867187500,422,1323.8095703125,,, +26.3886718750,422,1323.8095703125,,, +26.3906250000,422,1323.8095703125,,, +26.3925781250,422,1325.2747802734,,, +26.3945312500,422,1325.2747802734,,, +26.3964843750,422,1326.7398681641,,, +26.3984375000,422,1326.7398681641,,, +26.4003906250,422,1327.4725341797,,, +26.4023437500,422,1328.2050781250,,, +26.4042968750,422,1328.2050781250,,, +26.4062500000,422,1328.2050781250,,, +26.4082031250,422,1330.4029541016,,, +26.4101562500,422,1331.1354980469,,, +26.4121093750,422,1331.8681640625,,, +26.4140625000,422,1332.6007080078,,, +26.4160156250,422,1334.0659179688,,, +26.4179687500,422,1334.0659179688,,, +26.4199218750,422,1334.7985839844,,, +26.4218750000,422,1335.5311279297,,, +26.4238281250,422,1335.5311279297,,, +26.4257812500,422,1336.2637939453,,, +26.4277343750,422,1336.2637939453,,, +26.4296875000,422,1336.2637939453,,, +26.4316406250,422,1335.5311279297,,, +26.4335937500,422,1335.5311279297,,, +26.4355468750,422,1334.0659179688,,, +26.4375000000,423,1332.6007080078,,, +26.4394531250,423,1331.1354980469,,, +26.4414062500,423,1329.6702880859,,, +26.4433593750,423,1328.2050781250,,, +26.4453125000,423,1326.7398681641,,, +26.4472656250,423,1326.7398681641,,, +26.4492187500,423,1325.2747802734,,, +26.4511718750,423,1324.5421142578,,, +26.4531250000,423,1323.8095703125,,, +26.4550781250,423,1322.3443603516,,, +26.4570312500,423,1321.6116943359,,, +26.4589843750,423,1320.8791503906,,, +26.4609375000,423,1319.4139404297,,, +26.4628906250,423,1318.6812744141,,, +26.4648437500,423,1317.2160644531,,, +26.4667968750,423,1315.0183105469,,, +26.4687500000,423,1314.2857666016,,, +26.4707031250,423,1312.8205566406,,, +26.4726562500,423,1311.3553466797,,, +26.4746093750,423,1311.3553466797,,, +26.4765625000,423,1309.8901367188,,, +26.4785156250,423,1308.4249267578,,, +26.4804687500,423,1308.4249267578,,, +26.4824218750,423,1307.6922607422,,, +26.4843750000,423,1306.9597167969,,, +26.4863281250,423,1306.9597167969,,, +26.4882812500,423,1306.2270507812,,, +26.4902343750,423,1306.9597167969,,, +26.4921875000,423,1305.4945068359,,, +26.4941406250,423,1305.4945068359,,, +26.4960937500,423,1305.4945068359,,, +26.4980468750,423,1304.7619628906,,, +26.5000000000,424,1303.2967529297,,, +26.5019531250,424,1302.5640869141,,, +26.5039062500,424,1301.8315429688,,, +26.5058593750,424,1301.8315429688,,, +26.5078125000,424,1301.0988769531,,, +26.5097656250,424,1301.0988769531,,, +26.5117187500,424,1300.3663330078,,, +26.5136718750,424,1300.3663330078,,, +26.5156250000,424,1300.3663330078,,, +26.5175781250,424,1300.3663330078,,, +26.5195312500,424,1299.6336669922,,, +26.5214843750,424,1298.9011230469,,, +26.5234375000,424,1298.1684570312,,, +26.5253906250,424,1297.4359130859,,, +26.5273437500,424,1296.7032470703,,, +26.5292968750,424,1295.2380371094,,, +26.5312500000,424,1295.2380371094,,, +26.5332031250,424,1295.2380371094,,, +26.5351562500,424,1295.9707031250,,, +26.5371093750,424,1295.9707031250,,, +26.5390625000,424,1295.9707031250,,, +26.5410156250,424,1297.4359130859,,, +26.5429687500,424,1298.1684570312,,, +26.5449218750,424,1299.6336669922,,, +26.5468750000,424,1301.0988769531,,, +26.5488281250,424,1302.5640869141,,, +26.5507812500,424,1304.7619628906,,, +26.5527343750,424,1306.9597167969,,, +26.5546875000,424,1309.1574707031,,, +26.5566406250,424,1311.3553466797,,, +26.5585937500,424,1312.0878906250,,, +26.5605468750,424,1313.5531005859,,, +26.5625000000,425,1315.0183105469,,, +26.5644531250,425,1317.2160644531,,, +26.5664062500,425,1317.9487304688,,, +26.5683593750,425,1319.4139404297,,, +26.5703125000,425,1320.1464843750,,, +26.5722656250,425,1322.3443603516,,, +26.5742187500,425,1323.0769042969,,, +26.5761718750,425,1325.2747802734,,, +26.5781250000,425,1326.0073242188,,, +26.5800781250,425,1326.7398681641,,, +26.5820312500,425,1328.9377441406,,, +26.5839843750,425,1331.1354980469,,, +26.5859375000,425,1331.8681640625,,, +26.5878906250,425,1334.0659179688,,, +26.5898437500,425,1336.2637939453,,, +26.5917968750,425,1338.4615478516,,, +26.5937500000,425,1340.6593017578,,, +26.5957031250,425,1343.5897216797,,, +26.5976562500,425,1347.9853515625,,, +26.5996093750,425,1351.6483154297,,, +26.6015625000,425,1356.7766113281,,, +26.6035156250,425,1361.9047851562,,, +26.6054687500,425,1367.0329589844,,, +26.6074218750,425,1372.8937988281,,, +26.6093750000,425,1378.7546386719,,, +26.6113281250,425,1385.3480224609,,, +26.6132812500,425,1392.6739501953,,, +26.6152343750,425,1400.7325439453,,, +26.6171875000,425,1409.5238037109,,, +26.6191406250,425,1419.0476074219,,, +26.6210937500,425,1427.8388671875,,, +26.6230468750,425,1435.8974609375,,, +26.6250000000,426,1445.4212646484,,, +26.6269531250,426,1454.9450683594,,, +26.6289062500,426,1464.4688720703,,, +26.6308593750,426,1475.4578857422,,, +26.6328125000,426,1486.4468994141,,, +26.6347656250,426,1498.9011230469,,, +26.6367187500,426,1510.6226806641,,, +26.6386718750,426,1523.8095703125,,, +26.6406250000,426,1536.2637939453,,, +26.6425781250,426,1549.4505615234,,, +26.6445312500,426,1563.3699951172,,, +26.6464843750,426,1576.5567626953,,, +26.6484375000,426,1591.2087402344,,, +26.6503906250,426,1603.6629638672,,, +26.6523437500,426,1617.5823974609,,, +26.6542968750,426,1631.5018310547,,, +26.6562500000,426,1646.1538085938,,, +26.6582031250,426,1660.0732421875,,, +26.6601562500,426,1674.7252197266,,, +26.6621093750,426,1688.6446533203,,, +26.6640625000,426,1702.5640869141,,, +26.6660156250,426,1718.6812744141,,, +26.6679687500,426,1732.6007080078,,, +26.6699218750,426,1747.2528076172,,, +26.6718750000,426,1760.4395751953,,, +26.6738281250,426,1773.6263427734,,, +26.6757812500,426,1784.6153564453,,, +26.6777343750,426,1796.3370361328,,, +26.6796875000,426,1805.8608398438,,, +26.6816406250,426,1814.6519775391,,, +26.6835937500,426,1821.9780273438,,, +26.6855468750,426,1830.7692871094,,, +26.6875000000,427,1837.3626708984,,, +26.6894531250,427,1844.6885986328,,, +26.6914062500,427,1850.5494384766,,, +26.6933593750,427,1855.6776123047,,, +26.6953125000,427,1860.8059082031,,, +26.6972656250,427,1865.2014160156,,, +26.6992187500,427,1868.1318359375,,, +26.7011718750,427,1871.0622558594,,, +26.7031250000,427,1873.2601318359,,, +26.7050781250,427,1873.9926757812,,, +26.7070312500,427,1875.4578857422,,, +26.7089843750,427,1876.1904296875,,, +26.7109375000,427,1875.4578857422,,, +26.7128906250,427,1875.4578857422,,, +26.7148437500,427,1873.9926757812,,, +26.7167968750,427,1871.7949218750,,, +26.7187500000,427,1868.8645019531,,, +26.7207031250,427,1865.9340820312,,, +26.7226562500,427,1861.5384521484,,, +26.7246093750,427,1857.1428222656,,, +26.7265625000,427,1852.0146484375,,, +26.7285156250,427,1845.4212646484,,, +26.7304687500,427,1839.5604248047,,, +26.7324218750,427,1832.2343750000,,, +26.7343750000,427,1825.6409912109,,, +26.7363281250,427,1825.6409912109,,, +26.7382812500,427,1818.3150634766,,, +26.7402343750,427,1810.9890136719,,, +26.7421875000,427,1803.6629638672,,, +26.7441406250,427,1795.6043701172,,, +26.7460937500,427,1786.0805664062,,, +26.7480468750,427,1776.5567626953,,, +26.7500000000,428,1767.0329589844,,, +26.7519531250,428,1758.2416992188,,, +26.7539062500,428,1747.9853515625,,, +26.7558593750,428,1737.7288818359,,, +26.7578125000,428,1728.2050781250,,, +26.7597656250,428,1718.6812744141,,, +26.7617187500,428,1708.4249267578,,, +26.7636718750,428,1698.1684570312,,, +26.7656250000,428,1687.1794433594,,, +26.7675781250,428,1676.9230957031,,, +26.7695312500,428,1665.2014160156,,, +26.7714843750,428,1652.7471923828,,, +26.7734375000,428,1641.0256347656,,, +26.7753906250,428,1629.3040771484,,, +26.7773437500,428,1616.8498535156,,, +26.7792968750,428,1605.1281738281,,, +26.7812500000,428,1593.4066162109,,, +26.7832031250,428,1582.4176025391,,, +26.7851562500,428,1571.4285888672,,, +26.7871093750,428,1561.1721191406,,, +26.7890625000,428,1550.1831054688,,, +26.7910156250,428,1539.9267578125,,, +26.7929687500,428,1530.4029541016,,, +26.7949218750,428,1520.8791503906,,, +26.7968750000,428,1511.3553466797,,, +26.7988281250,428,1502.5640869141,,, +26.8007812500,428,1493.7729492188,,, +26.8027343750,428,1484.9816894531,,, +26.8046875000,428,1476.9230957031,,, +26.8066406250,428,1468.8645019531,,, +26.8085937500,428,1460.8059082031,,, +26.8105468750,428,1453.4798583984,,, +26.8125000000,429,1446.8864746094,,, +26.8144531250,429,1439.5604248047,,, +26.8164062500,429,1432.9670410156,,, +26.8183593750,429,1425.6409912109,,, +26.8203125000,429,1419.0476074219,,, +26.8222656250,429,1412.4542236328,,, +26.8242187500,429,1406.5933837891,,, +26.8261718750,429,1400.7325439453,,, +26.8281250000,429,1394.8718261719,,, +26.8300781250,429,1390.4761962891,,, +26.8320312500,429,1385.3480224609,,, +26.8339843750,429,1380.9523925781,,, +26.8359375000,429,1376.5567626953,,, +26.8378906250,429,1372.1611328125,,, +26.8398437500,429,1367.7656250000,,, +26.8417968750,429,1363.3699951172,,, +26.8437500000,429,1361.1721191406,,, +26.8457031250,429,1358.2416992188,,, +26.8476562500,429,1356.7766113281,,, +26.8496093750,429,1354.5787353516,,, +26.8515625000,429,1352.3809814453,,, +26.8535156250,429,1350.9157714844,,, +26.8554687500,429,1349.4505615234,,, +26.8574218750,429,1347.2528076172,,, +26.8593750000,429,1345.7875976562,,, +26.8613281250,429,1343.5897216797,,, +26.8632812500,429,1340.6593017578,,, +26.8652343750,429,1339.1940917969,,, +26.8671875000,429,1336.2637939453,,, +26.8691406250,429,1335.5311279297,,, +26.8710937500,429,1334.7985839844,,, +26.8730468750,429,1334.0659179688,,, +26.8750000000,430,1334.7985839844,,, +26.8769531250,430,1335.5311279297,,, +26.8789062500,430,1336.2637939453,,, +26.8808593750,430,1337.7288818359,,, +26.8828125000,430,1339.9267578125,,, +26.8847656250,430,1341.3919677734,,, +26.8867187500,430,1342.8571777344,,, +26.8886718750,430,1344.3223876953,,, +26.8906250000,430,1345.0549316406,,, +26.8925781250,430,1346.5201416016,,, +26.8945312500,430,1347.2528076172,,, +26.8964843750,430,1347.9853515625,,, +26.8984375000,430,1350.1831054688,,, +26.9003906250,430,1351.6483154297,,, +26.9023437500,430,1353.1135253906,,, +26.9042968750,430,1355.3114013672,,, +26.9062500000,430,1358.2416992188,,, +26.9082031250,430,1361.1721191406,,, +26.9101562500,430,1364.1025390625,,, +26.9121093750,430,1367.0329589844,,, +26.9140625000,430,1370.6959228516,,, +26.9160156250,430,1374.3590087891,,, +26.9179687500,430,1377.2894287109,,, +26.9199218750,430,1380.2197265625,,, +26.9218750000,430,1382.4176025391,,, +26.9238281250,430,1385.3480224609,,, +26.9257812500,430,1387.5457763672,,, +26.9277343750,430,1389.7435302734,,, +26.9296875000,430,1392.6739501953,,, +26.9316406250,430,1394.8718261719,,, +26.9335937500,430,1397.8022460938,,, +26.9355468750,430,1401.4652099609,,, +26.9375000000,431,1404.3956298828,,, +26.9394531250,431,1405.1281738281,,, +26.9414062500,431,1407.3260498047,,, +26.9433593750,431,1408.7912597656,,, +26.9453125000,431,1409.5238037109,,, +26.9472656250,431,1410.9890136719,,, +26.9492187500,431,1412.4542236328,,, +26.9511718750,431,1413.1867675781,,, +26.9531250000,431,1415.3846435547,,, +26.9550781250,431,1417.5823974609,,, +26.9570312500,431,1419.0476074219,,, +26.9589843750,431,1420.5128173828,,, +26.9609375000,431,1421.2453613281,,, +26.9628906250,431,1421.9780273438,,, +26.9648437500,431,1421.9780273438,,, +26.9667968750,431,1421.9780273438,,, +26.9687500000,431,1419.7802734375,,, +26.9707031250,431,1419.7802734375,,, +26.9726562500,431,1417.5823974609,,, +26.9746093750,431,1416.1171875000,,, +26.9765625000,431,1415.3846435547,,, +26.9785156250,431,1414.6519775391,,, +26.9804687500,431,1411.7215576172,,, +26.9824218750,431,1410.2564697266,,, +26.9843750000,431,1408.7912597656,,, +26.9863281250,431,1407.3260498047,,, +26.9882812500,431,1406.5933837891,,, +26.9902343750,431,1405.8608398438,,, +26.9921875000,431,1405.8608398438,,, +26.9941406250,431,1405.1281738281,,, +26.9960937500,431,1405.8608398438,,, +26.9980468750,431,1405.8608398438,,, +27.0000000000,432,1405.8608398438,,, +27.0019531250,432,1406.5933837891,,, +27.0039062500,432,1408.0585937500,,, +27.0058593750,432,1409.5238037109,,, +27.0078125000,432,1410.2564697266,,, +27.0097656250,432,1410.2564697266,,, +27.0117187500,432,1410.9890136719,,, +27.0136718750,432,1411.7215576172,,, +27.0156250000,432,1410.9890136719,,, +27.0175781250,432,1410.2564697266,,, +27.0195312500,432,1408.0585937500,,, +27.0214843750,432,1405.8608398438,,, +27.0234375000,432,1404.3956298828,,, +27.0253906250,432,1401.4652099609,,, +27.0273437500,432,1399.2674560547,,, +27.0292968750,432,1397.0695800781,,, +27.0312500000,432,1394.1391601562,,, +27.0332031250,432,1392.6739501953,,, +27.0351562500,432,1391.2087402344,,, +27.0371093750,432,1389.0109863281,,, +27.0390625000,432,1388.2784423828,,, +27.0410156250,432,1387.5457763672,,, +27.0429687500,432,1386.0805664062,,, +27.0449218750,432,1384.6153564453,,, +27.0468750000,432,1381.6849365234,,, +27.0488281250,432,1379.4871826172,,, +27.0507812500,432,1376.5567626953,,, +27.0527343750,432,1375.0915527344,,, +27.0546875000,432,1372.1611328125,,, +27.0566406250,432,1369.9633789062,,, +27.0585937500,432,1367.0329589844,,, +27.0605468750,432,1367.0329589844,,, +27.0625000000,433,1364.8352050781,,, +27.0644531250,433,1362.6373291016,,, +27.0664062500,433,1361.1721191406,,, +27.0683593750,433,1358.9743652344,,, +27.0703125000,433,1357.5091552734,,, +27.0722656250,433,1356.0439453125,,, +27.0742187500,433,1354.5787353516,,, +27.0761718750,433,1353.1135253906,,, +27.0781250000,433,1351.6483154297,,, +27.0800781250,433,1349.4505615234,,, +27.0820312500,433,1347.9853515625,,, +27.0839843750,433,1345.0549316406,,, +27.0859375000,433,1342.8571777344,,, +27.0878906250,433,1340.6593017578,,, +27.0898437500,433,1338.4615478516,,, +27.0917968750,433,1336.2637939453,,, +27.0937500000,433,1334.0659179688,,, +27.0957031250,433,1332.6007080078,,, +27.0976562500,433,1331.1354980469,,, +27.0996093750,433,1330.4029541016,,, +27.1015625000,433,1329.6702880859,,, +27.1035156250,433,1328.2050781250,,, +27.1054687500,433,1327.4725341797,,, +27.1074218750,433,1326.0073242188,,, +27.1093750000,433,1324.5421142578,,, +27.1113281250,433,1323.0769042969,,, +27.1132812500,433,1321.6116943359,,, +27.1152343750,433,1319.4139404297,,, +27.1171875000,433,1317.9487304688,,, +27.1191406250,433,1315.7509765625,,, +27.1210937500,433,1313.5531005859,,, +27.1230468750,433,1311.3553466797,,, +27.1250000000,434,1308.4249267578,,, +27.1269531250,434,1305.4945068359,,, +27.1289062500,434,1304.0292968750,,, +27.1308593750,434,1302.5640869141,,, +27.1328125000,434,1299.6336669922,,, +27.1347656250,434,1298.1684570312,,, +27.1367187500,434,1296.7032470703,,, +27.1386718750,434,1295.2380371094,,, +27.1406250000,434,1294.5054931641,,, +27.1425781250,434,1293.7729492188,,, +27.1445312500,434,1292.3077392578,,, +27.1464843750,434,1292.3077392578,,, +27.1484375000,434,1292.3077392578,,, +27.1503906250,434,1292.3077392578,,, +27.1523437500,434,1293.0402832031,,, +27.1542968750,434,1293.0402832031,,, +27.1562500000,434,1293.7729492188,,, +27.1582031250,434,1293.7729492188,,, +27.1601562500,434,1293.0402832031,,, +27.1621093750,434,1293.0402832031,,, +27.1640625000,434,1293.0402832031,,, +27.1660156250,434,1292.3077392578,,, +27.1679687500,434,1291.5750732422,,, +27.1699218750,434,1290.8425292969,,, +27.1718750000,434,1290.1098632812,,, +27.1738281250,434,1289.3773193359,,, +27.1757812500,434,1288.6446533203,,, +27.1777343750,434,1288.6446533203,,, +27.1796875000,434,1287.9121093750,,, +27.1816406250,434,1287.9121093750,,, +27.1835937500,434,1287.1794433594,,, +27.1855468750,434,1287.1794433594,,, +27.1875000000,435,1286.4468994141,,, +27.1894531250,435,1284.9816894531,,, +27.1914062500,435,1284.9816894531,,, +27.1933593750,435,1284.9816894531,,, +27.1953125000,435,1285.7142333984,,, +27.1972656250,435,1286.4468994141,,, +27.1992187500,435,1287.1794433594,,, +27.2011718750,435,1288.6446533203,,, +27.2031250000,435,1290.8425292969,,, +27.2050781250,435,1293.0402832031,,, +27.2070312500,435,1294.5054931641,,, +27.2089843750,435,1295.2380371094,,, +27.2109375000,435,1294.5054931641,,, +27.2128906250,435,1293.7729492188,,, +27.2148437500,435,1293.7729492188,,, +27.2167968750,435,1293.7729492188,,, +27.2187500000,435,1293.0402832031,,, +27.2207031250,435,1293.7729492188,,, +27.2226562500,435,1293.7729492188,,, +27.2246093750,435,1293.7729492188,,, +27.2265625000,435,1294.5054931641,,, +27.2285156250,435,1295.9707031250,,, +27.2304687500,435,1297.4359130859,,, +27.2324218750,435,1298.1684570312,,, +27.2343750000,435,1298.1684570312,,, +27.2363281250,435,1298.1684570312,,, +27.2382812500,435,1298.9011230469,,, +27.2402343750,435,1298.1684570312,,, +27.2421875000,435,1298.1684570312,,, +27.2441406250,435,1297.4359130859,,, +27.2460937500,435,1297.4359130859,,, +27.2480468750,435,1298.1684570312,,, +27.2500000000,436,1298.9011230469,,, +27.2519531250,436,1299.6336669922,,, +27.2539062500,436,1301.8315429688,,, +27.2558593750,436,1304.0292968750,,, +27.2578125000,436,1306.2270507812,,, +27.2597656250,436,1308.4249267578,,, +27.2617187500,436,1310.6226806641,,, +27.2636718750,436,1312.8205566406,,, +27.2656250000,436,1314.2857666016,,, +27.2675781250,436,1315.7509765625,,, +27.2695312500,436,1316.4835205078,,, +27.2714843750,436,1317.2160644531,,, +27.2734375000,436,1317.9487304688,,, +27.2753906250,436,1318.6812744141,,, +27.2773437500,436,1320.1464843750,,, +27.2792968750,436,1320.8791503906,,, +27.2812500000,436,1322.3443603516,,, +27.2832031250,436,1323.0769042969,,, +27.2851562500,436,1324.5421142578,,, +27.2871093750,436,1324.5421142578,,, +27.2890625000,436,1326.0073242188,,, +27.2910156250,436,1327.4725341797,,, +27.2929687500,436,1328.9377441406,,, +27.2949218750,436,1331.1354980469,,, +27.2968750000,436,1332.6007080078,,, +27.2988281250,436,1333.3333740234,,, +27.3007812500,436,1333.3333740234,,, +27.3027343750,436,1331.8681640625,,, +27.3046875000,436,1330.4029541016,,, +27.3066406250,436,1329.6702880859,,, +27.3085937500,436,1328.9377441406,,, +27.3105468750,436,1328.2050781250,,, +27.3125000000,437,1326.7398681641,,, +27.3144531250,437,1326.0073242188,,, +27.3164062500,437,1324.5421142578,,, +27.3183593750,437,1324.5421142578,,, +27.3203125000,437,1323.8095703125,,, +27.3222656250,437,1323.0769042969,,, +27.3242187500,437,1323.8095703125,,, +27.3261718750,437,1323.8095703125,,, +27.3281250000,437,1324.5421142578,,, +27.3300781250,437,1326.0073242188,,, +27.3320312500,437,1326.0073242188,,, +27.3339843750,437,1325.2747802734,,, +27.3359375000,437,1326.7398681641,,, +27.3378906250,437,1326.0073242188,,, +27.3398437500,437,1324.5421142578,,, +27.3417968750,437,1324.5421142578,,, +27.3437500000,437,1323.8095703125,,, +27.3457031250,437,1322.3443603516,,, +27.3476562500,437,1321.6116943359,,, +27.3496093750,437,1320.1464843750,,, +27.3515625000,437,1319.4139404297,,, +27.3535156250,437,1318.6812744141,,, +27.3554687500,437,1318.6812744141,,, +27.3574218750,437,1317.9487304688,,, +27.3593750000,437,1317.9487304688,,, +27.3613281250,437,1317.9487304688,,, +27.3632812500,437,1317.9487304688,,, +27.3652343750,437,1317.2160644531,,, +27.3671875000,437,1315.7509765625,,, +27.3691406250,437,1314.2857666016,,, +27.3710937500,437,1311.3553466797,,, +27.3730468750,437,1309.8901367188,,, +27.3750000000,438,1308.4249267578,,, +27.3769531250,438,1306.9597167969,,, +27.3789062500,438,1305.4945068359,,, +27.3808593750,438,1304.0292968750,,, +27.3828125000,438,1302.5640869141,,, +27.3847656250,438,1301.8315429688,,, +27.3867187500,438,1299.6336669922,,, +27.3886718750,438,1298.1684570312,,, +27.3906250000,438,1297.4359130859,,, +27.3925781250,438,1295.9707031250,,, +27.3945312500,438,1296.7032470703,,, +27.3964843750,438,1296.7032470703,,, +27.3984375000,438,1295.9707031250,,, +27.4003906250,438,1295.2380371094,,, +27.4023437500,438,1295.9707031250,,, +27.4042968750,438,1295.9707031250,,, +27.4062500000,438,1297.4359130859,,, +27.4082031250,438,1298.1684570312,,, +27.4101562500,438,1300.3663330078,,, +27.4121093750,438,1303.2967529297,,, +27.4140625000,438,1305.4945068359,,, +27.4160156250,438,1307.6922607422,,, +27.4179687500,438,1310.6226806641,,, +27.4199218750,438,1312.8205566406,,, +27.4218750000,438,1314.2857666016,,, +27.4238281250,438,1317.2160644531,,, +27.4257812500,438,1320.8791503906,,, +27.4277343750,438,1324.5421142578,,, +27.4296875000,438,1328.2050781250,,, +27.4316406250,438,1333.3333740234,,, +27.4335937500,438,1338.4615478516,,, +27.4355468750,438,1345.0549316406,,, +27.4375000000,439,1350.9157714844,,, +27.4394531250,439,1358.2416992188,,, +27.4414062500,439,1365.5677490234,,, +27.4433593750,439,1374.3590087891,,, +27.4453125000,439,1384.6153564453,,, +27.4472656250,439,1394.8718261719,,, +27.4492187500,439,1405.8608398438,,, +27.4511718750,439,1417.5823974609,,, +27.4531250000,439,1429.3040771484,,, +27.4550781250,439,1441.7583007812,,, +27.4570312500,439,1454.2124023438,,, +27.4589843750,439,1466.6666259766,,, +27.4609375000,439,1477.6556396484,,, +27.4628906250,439,1490.1098632812,,, +27.4648437500,439,1502.5640869141,,, +27.4667968750,439,1515.0183105469,,, +27.4687500000,439,1528.2050781250,,, +27.4707031250,439,1542.1245117188,,, +27.4726562500,439,1554.5787353516,,, +27.4746093750,439,1568.4981689453,,, +27.4765625000,439,1582.4176025391,,, +27.4785156250,439,1595.6043701172,,, +27.4804687500,439,1610.9890136719,,, +27.4824218750,439,1624.1757812500,,, +27.4843750000,439,1638.0952148438,,, +27.4863281250,439,1653.4798583984,,, +27.4882812500,439,1667.3992919922,,, +27.4902343750,439,1682.7839355469,,, +27.4921875000,439,1697.4359130859,,, +27.4941406250,439,1711.3553466797,,, +27.4960937500,439,1726.7398681641,,, +27.4980468750,439,1741.3919677734,,, +27.5000000000,440,1754.5787353516,,, +27.5019531250,440,1767.7656250000,,, +27.5039062500,440,1779.4871826172,,, +27.5058593750,440,1790.4761962891,,, +27.5078125000,440,1802.1977539062,,, +27.5097656250,440,1810.9890136719,,, +27.5117187500,440,1819.7802734375,,, +27.5136718750,440,1827.1062011719,,, +27.5156250000,440,1835.1647949219,,, +27.5175781250,440,1841.7583007812,,, +27.5195312500,440,1848.3516845703,,, +27.5214843750,440,1853.4798583984,,, +27.5234375000,440,1857.1428222656,,, +27.5253906250,440,1861.5384521484,,, +27.5273437500,440,1864.4688720703,,, +27.5292968750,440,1866.6666259766,,, +27.5312500000,440,1868.8645019531,,, +27.5332031250,440,1868.8645019531,,, +27.5351562500,440,1869.5970458984,,, +27.5371093750,440,1868.1318359375,,, +27.5390625000,440,1866.6666259766,,, +27.5410156250,440,1865.2014160156,,, +27.5429687500,440,1862.2711181641,,, +27.5449218750,440,1857.8754882812,,, +27.5468750000,440,1853.4798583984,,, +27.5488281250,440,1849.0842285156,,, +27.5507812500,440,1843.9560546875,,, +27.5527343750,440,1838.0952148438,,, +27.5546875000,440,1830.7692871094,,, +27.5566406250,440,1823.4432373047,,, +27.5585937500,440,1815.3846435547,,, +27.5605468750,440,1806.5933837891,,, +27.5625000000,441,1797.8022460938,,, +27.5644531250,441,1788.2784423828,,, +27.5664062500,441,1779.4871826172,,, +27.5683593750,441,1769.9633789062,,, +27.5703125000,441,1759.7069091797,,, +27.5722656250,441,1750.9157714844,,, +27.5742187500,441,1739.9267578125,,, +27.5761718750,441,1728.9377441406,,, +27.5781250000,441,1717.2160644531,,, +27.5800781250,441,1705.4945068359,,, +27.5820312500,441,1691.5750732422,,, +27.5839843750,441,1679.1208496094,,, +27.5859375000,441,1665.2014160156,,, +27.5878906250,441,1650.5494384766,,, +27.5898437500,441,1637.3626708984,,, +27.5917968750,441,1623.4432373047,,, +27.5937500000,441,1610.2564697266,,, +27.5957031250,441,1597.8022460938,,, +27.5976562500,441,1585.3480224609,,, +27.5996093750,441,1572.1611328125,,, +27.6015625000,441,1560.4395751953,,, +27.6035156250,441,1547.9853515625,,, +27.6054687500,441,1536.9963378906,,, +27.6074218750,441,1525.2747802734,,, +27.6093750000,441,1515.0183105469,,, +27.6113281250,441,1504.7619628906,,, +27.6132812500,441,1495.9707031250,,, +27.6152343750,441,1487.1794433594,,, +27.6171875000,441,1479.1208496094,,, +27.6191406250,441,1471.0622558594,,, +27.6210937500,441,1463.7362060547,,, +27.6230468750,441,1456.4102783203,,, +27.6250000000,442,1449.8168945312,,, +27.6269531250,442,1441.0256347656,,, +27.6289062500,442,1432.9670410156,,, +27.6308593750,442,1424.9084472656,,, +27.6328125000,442,1417.5823974609,,, +27.6347656250,442,1410.2564697266,,, +27.6367187500,442,1403.6629638672,,, +27.6386718750,442,1396.3370361328,,, +27.6406250000,442,1388.2784423828,,, +27.6425781250,442,1381.6849365234,,, +27.6445312500,442,1375.0915527344,,, +27.6464843750,442,1368.4981689453,,, +27.6484375000,442,1362.6373291016,,, +27.6503906250,442,1356.7766113281,,, +27.6523437500,442,1350.9157714844,,, +27.6542968750,442,1346.5201416016,,, +27.6562500000,442,1340.6593017578,,, +27.6582031250,442,1335.5311279297,,, +27.6601562500,442,1330.4029541016,,, +27.6621093750,442,1326.0073242188,,, +27.6640625000,442,1321.6116943359,,, +27.6660156250,442,1318.6812744141,,, +27.6679687500,442,1315.7509765625,,, +27.6699218750,442,1312.0878906250,,, +27.6718750000,442,1309.8901367188,,, +27.6738281250,442,1306.9597167969,,, +27.6757812500,442,1303.2967529297,,, +27.6777343750,442,1300.3663330078,,, +27.6796875000,442,1298.1684570312,,, +27.6816406250,442,1295.2380371094,,, +27.6835937500,442,1292.3077392578,,, +27.6855468750,442,1290.1098632812,,, +27.6875000000,443,1288.6446533203,,, +27.6894531250,443,1287.1794433594,,, +27.6914062500,443,1286.4468994141,,, +27.6933593750,443,1284.9816894531,,, +27.6953125000,443,1284.9816894531,,, +27.6972656250,443,1283.5164794922,,, +27.6992187500,443,1283.5164794922,,, +27.7011718750,443,1283.5164794922,,, +27.7031250000,443,1282.7839355469,,, +27.7050781250,443,1282.7839355469,,, +27.7070312500,443,1283.5164794922,,, +27.7089843750,443,1284.9816894531,,, +27.7109375000,443,1286.4468994141,,, +27.7128906250,443,1287.9121093750,,, +27.7148437500,443,1288.6446533203,,, +27.7167968750,443,1290.8425292969,,, +27.7187500000,443,1293.7729492188,,, +27.7207031250,443,1296.7032470703,,, +27.7226562500,443,1298.9011230469,,, +27.7246093750,443,1301.0988769531,,, +27.7265625000,443,1304.7619628906,,, +27.7285156250,443,1307.6922607422,,, +27.7304687500,443,1312.0878906250,,, +27.7324218750,443,1315.0183105469,,, +27.7343750000,443,1318.6812744141,,, +27.7363281250,443,1321.6116943359,,, +27.7382812500,443,1324.5421142578,,, +27.7402343750,443,1326.7398681641,,, +27.7421875000,443,1329.6702880859,,, +27.7441406250,443,1332.6007080078,,, +27.7460937500,443,1335.5311279297,,, +27.7480468750,443,1338.4615478516,,, +27.7500000000,444,1341.3919677734,,, +27.7519531250,444,1345.0549316406,,, +27.7539062500,444,1349.4505615234,,, +27.7558593750,444,1353.8461914062,,, +27.7578125000,444,1358.2416992188,,, +27.7597656250,444,1362.6373291016,,, +27.7617187500,444,1367.7656250000,,, +27.7636718750,444,1372.1611328125,,, +27.7656250000,444,1375.8242187500,,, +27.7675781250,444,1379.4871826172,,, +27.7695312500,444,1382.4176025391,,, +27.7714843750,444,1385.3480224609,,, +27.7734375000,444,1388.2784423828,,, +27.7753906250,444,1390.4761962891,,, +27.7773437500,444,1391.9414062500,,, +27.7792968750,444,1394.1391601562,,, +27.7812500000,444,1396.3370361328,,, +27.7832031250,444,1397.8022460938,,, +27.7851562500,444,1399.2674560547,,, +27.7871093750,444,1400.7325439453,,, +27.7890625000,444,1402.1977539062,,, +27.7910156250,444,1404.3956298828,,, +27.7929687500,444,1405.8608398438,,, +27.7949218750,444,1406.5933837891,,, +27.7968750000,444,1408.7912597656,,, +27.7988281250,444,1409.5238037109,,, +27.8007812500,444,1411.7215576172,,, +27.8027343750,444,1413.1867675781,,, +27.8046875000,444,1413.9194335938,,, +27.8066406250,444,1413.9194335938,,, +27.8085937500,444,1413.1867675781,,, +27.8105468750,444,1412.4542236328,,, +27.8125000000,445,1410.9890136719,,, +27.8144531250,445,1410.2564697266,,, +27.8164062500,445,1408.0585937500,,, +27.8183593750,445,1407.3260498047,,, +27.8203125000,445,1406.5933837891,,, +27.8222656250,445,1405.1281738281,,, +27.8242187500,445,1404.3956298828,,, +27.8261718750,445,1404.3956298828,,, +27.8281250000,445,1404.3956298828,,, +27.8300781250,445,1404.3956298828,,, +27.8320312500,445,1403.6629638672,,, +27.8339843750,445,1402.1977539062,,, +27.8359375000,445,1400.7325439453,,, +27.8378906250,445,1398.5347900391,,, +27.8398437500,445,1396.3370361328,,, +27.8417968750,445,1394.1391601562,,, +27.8437500000,445,1391.2087402344,,, +27.8457031250,445,1388.2784423828,,, +27.8476562500,445,1386.0805664062,,, +27.8496093750,445,1383.1501464844,,, +27.8515625000,445,1381.6849365234,,, +27.8535156250,445,1380.2197265625,,, +27.8554687500,445,1377.2894287109,,, +27.8574218750,445,1375.0915527344,,, +27.8593750000,445,1372.1611328125,,, +27.8613281250,445,1369.2307128906,,, +27.8632812500,445,1365.5677490234,,, +27.8652343750,445,1363.3699951172,,, +27.8671875000,445,1359.7069091797,,, +27.8691406250,445,1356.7766113281,,, +27.8710937500,445,1354.5787353516,,, +27.8730468750,445,1351.6483154297,,, +27.8750000000,446,1349.4505615234,,, +27.8769531250,446,1347.9853515625,,, +27.8789062500,446,1345.0549316406,,, +27.8808593750,446,1341.3919677734,,, +27.8828125000,446,1337.7288818359,,, +27.8847656250,446,1334.0659179688,,, +27.8867187500,446,1330.4029541016,,, +27.8886718750,446,1327.4725341797,,, +27.8906250000,446,1324.5421142578,,, +27.8925781250,446,1321.6116943359,,, +27.8945312500,446,1319.4139404297,,, +27.8964843750,446,1317.2160644531,,, +27.8984375000,446,1313.5531005859,,, +27.9003906250,446,1310.6226806641,,, +27.9023437500,446,1307.6922607422,,, +27.9042968750,446,1304.0292968750,,, +27.9062500000,446,1301.0988769531,,, +27.9082031250,446,1299.6336669922,,, +27.9101562500,446,1298.1684570312,,, +27.9121093750,446,1298.1684570312,,, +27.9140625000,446,1297.4359130859,,, +27.9160156250,446,1297.4359130859,,, +27.9179687500,446,1297.4359130859,,, +27.9199218750,446,1297.4359130859,,, +27.9218750000,446,1295.9707031250,,, +27.9238281250,446,1294.5054931641,,, +27.9257812500,446,1294.5054931641,,, +27.9277343750,446,1293.7729492188,,, +27.9296875000,446,1293.7729492188,,, +27.9316406250,446,1293.7729492188,,, +27.9335937500,446,1293.0402832031,,, +27.9355468750,446,1292.3077392578,,, +27.9375000000,447,1290.1098632812,,, +27.9394531250,447,1288.6446533203,,, +27.9414062500,447,1287.1794433594,,, +27.9433593750,447,1286.4468994141,,, +27.9453125000,447,1285.7142333984,,, +27.9472656250,447,1286.4468994141,,, +27.9492187500,447,1287.1794433594,,, +27.9511718750,447,1287.9121093750,,, +27.9531250000,447,1287.9121093750,,, +27.9550781250,447,1287.9121093750,,, +27.9570312500,447,1287.9121093750,,, +27.9589843750,447,1287.9121093750,,, +27.9609375000,447,1287.9121093750,,, +27.9628906250,447,1288.6446533203,,, +27.9648437500,447,1289.3773193359,,, +27.9667968750,447,1290.1098632812,,, +27.9687500000,447,1290.1098632812,,, +27.9707031250,447,1291.5750732422,,, +27.9726562500,447,1292.3077392578,,, +27.9746093750,447,1293.0402832031,,, +27.9765625000,447,1293.0402832031,,, +27.9785156250,447,1292.3077392578,,, +27.9804687500,447,1290.8425292969,,, +27.9824218750,447,1290.1098632812,,, +27.9843750000,447,1288.6446533203,,, +27.9863281250,447,1288.6446533203,,, +27.9882812500,447,1287.1794433594,,, +27.9902343750,447,1287.9121093750,,, +27.9921875000,447,1287.9121093750,,, +27.9941406250,447,1288.6446533203,,, +27.9960937500,447,1290.1098632812,,, +27.9980468750,447,1289.3773193359,,, +28.0000000000,448,1290.1098632812,,, +28.0019531250,448,1289.3773193359,,, +28.0039062500,448,1287.9121093750,,, +28.0058593750,448,1285.7142333984,,, +28.0078125000,448,1284.9816894531,,, +28.0097656250,448,1284.2490234375,,, +28.0117187500,448,1283.5164794922,,, +28.0136718750,448,1282.7839355469,,, +28.0156250000,448,1282.7839355469,,, +28.0175781250,448,1284.2490234375,,, +28.0195312500,448,1284.2490234375,,, +28.0214843750,448,1282.7839355469,,, +28.0234375000,448,1282.0512695312,,, +28.0253906250,448,1282.0512695312,,, +28.0273437500,448,1281.3187255859,,, +28.0292968750,448,1281.3187255859,,, +28.0312500000,448,1281.3187255859,,, +28.0332031250,448,1282.0512695312,,, +28.0351562500,448,1284.2490234375,,, +28.0371093750,448,1285.7142333984,,, +28.0390625000,448,1287.1794433594,,, +28.0410156250,448,1289.3773193359,,, +28.0429687500,448,1291.5750732422,,, +28.0449218750,448,1291.5750732422,,, +28.0468750000,448,1293.0402832031,,, +28.0488281250,448,1293.7729492188,,, +28.0507812500,448,1294.5054931641,,, +28.0527343750,448,1295.2380371094,,, +28.0546875000,448,1296.7032470703,,, +28.0566406250,448,1298.1684570312,,, +28.0585937500,448,1299.6336669922,,, +28.0605468750,448,1301.8315429688,,, +28.0625000000,449,1302.5640869141,,, +28.0644531250,449,1302.5640869141,,, +28.0664062500,449,1302.5640869141,,, +28.0683593750,449,1302.5640869141,,, +28.0703125000,449,1302.5640869141,,, +28.0722656250,449,1303.2967529297,,, +28.0742187500,449,1303.2967529297,,, +28.0761718750,449,1304.0292968750,,, +28.0781250000,449,1304.7619628906,,, +28.0800781250,449,1306.2270507812,,, +28.0820312500,449,1308.4249267578,,, +28.0839843750,449,1309.8901367188,,, +28.0859375000,449,1309.8901367188,,, +28.0878906250,449,1309.8901367188,,, +28.0898437500,449,1309.1574707031,,, +28.0917968750,449,1309.1574707031,,, +28.0937500000,449,1309.1574707031,,, +28.0957031250,449,1309.1574707031,,, +28.0976562500,449,1309.8901367188,,, +28.0996093750,449,1309.8901367188,,, +28.1015625000,449,1310.6226806641,,, +28.1035156250,449,1311.3553466797,,, +28.1054687500,449,1312.8205566406,,, +28.1074218750,449,1313.5531005859,,, +28.1093750000,449,1312.8205566406,,, +28.1113281250,449,1311.3553466797,,, +28.1132812500,449,1310.6226806641,,, +28.1152343750,449,1309.1574707031,,, +28.1171875000,449,1308.4249267578,,, +28.1191406250,449,1307.6922607422,,, +28.1210937500,449,1307.6922607422,,, +28.1230468750,449,1308.4249267578,,, +28.1250000000,450,1309.1574707031,,, +28.1269531250,450,1309.8901367188,,, +28.1289062500,450,1310.6226806641,,, +28.1308593750,450,1310.6226806641,,, +28.1328125000,450,1309.1574707031,,, +28.1347656250,450,1309.8901367188,,, +28.1367187500,450,1309.1574707031,,, +28.1386718750,450,1308.4249267578,,, +28.1406250000,450,1309.1574707031,,, +28.1425781250,450,1309.1574707031,,, +28.1445312500,450,1309.1574707031,,, +28.1464843750,450,1309.8901367188,,, +28.1484375000,450,1310.6226806641,,, +28.1503906250,450,1312.0878906250,,, +28.1523437500,450,1312.0878906250,,, +28.1542968750,450,1312.0878906250,,, +28.1562500000,450,1309.8901367188,,, +28.1582031250,450,1308.4249267578,,, +28.1601562500,450,1307.6922607422,,, +28.1621093750,450,1306.2270507812,,, +28.1640625000,450,1305.4945068359,,, +28.1660156250,450,1304.0292968750,,, +28.1679687500,450,1303.2967529297,,, +28.1699218750,450,1301.8315429688,,, +28.1718750000,450,1301.0988769531,,, +28.1738281250,450,1300.3663330078,,, +28.1757812500,450,1300.3663330078,,, +28.1777343750,450,1301.0988769531,,, +28.1796875000,450,1301.0988769531,,, +28.1816406250,450,1301.8315429688,,, +28.1835937500,450,1302.5640869141,,, +28.1855468750,450,1302.5640869141,,, +28.1875000000,451,1302.5640869141,,, +28.1894531250,451,1302.5640869141,,, +28.1914062500,451,1302.5640869141,,, +28.1933593750,451,1301.8315429688,,, +28.1953125000,451,1300.3663330078,,, +28.1972656250,451,1298.9011230469,,, +28.1992187500,451,1298.9011230469,,, +28.2011718750,451,1298.1684570312,,, +28.2031250000,451,1298.1684570312,,, +28.2050781250,451,1298.1684570312,,, +28.2070312500,451,1298.9011230469,,, +28.2089843750,451,1300.3663330078,,, +28.2109375000,451,1301.0988769531,,, +28.2128906250,451,1302.5640869141,,, +28.2148437500,451,1305.4945068359,,, +28.2167968750,451,1309.8901367188,,, +28.2187500000,451,1313.5531005859,,, +28.2207031250,451,1318.6812744141,,, +28.2226562500,451,1322.3443603516,,, +28.2246093750,451,1326.0073242188,,, +28.2265625000,451,1330.4029541016,,, +28.2285156250,451,1335.5311279297,,, +28.2304687500,451,1340.6593017578,,, +28.2324218750,451,1346.5201416016,,, +28.2343750000,451,1353.1135253906,,, +28.2363281250,451,1361.1721191406,,, +28.2382812500,451,1369.2307128906,,, +28.2402343750,451,1378.0219726562,,, +28.2421875000,451,1386.8132324219,,, +28.2441406250,451,1396.3370361328,,, +28.2460937500,451,1406.5933837891,,, +28.2480468750,451,1419.0476074219,,, +28.2500000000,452,1431.5018310547,,, +28.2519531250,452,1444.6885986328,,, +28.2539062500,452,1460.0732421875,,, +28.2558593750,452,1474.7252197266,,, +28.2578125000,452,1490.8425292969,,, +28.2597656250,452,1504.7619628906,,, +28.2617187500,452,1520.1464843750,,, +28.2636718750,452,1535.5311279297,,, +28.2656250000,452,1551.6483154297,,, +28.2675781250,452,1567.7656250000,,, +28.2695312500,452,1584.6153564453,,, +28.2714843750,452,1601.4652099609,,, +28.2734375000,452,1619.0476074219,,, +28.2753906250,452,1636.6300048828,,, +28.2773437500,452,1654.9450683594,,, +28.2792968750,452,1673.2601318359,,, +28.2812500000,452,1692.3077392578,,, +28.2832031250,452,1712.0878906250,,, +28.2851562500,452,1731.1354980469,,, +28.2871093750,452,1749.4505615234,,, +28.2890625000,452,1767.0329589844,,, +28.2910156250,452,1783.8828125000,,, +28.2929687500,452,1799.2674560547,,, +28.2949218750,452,1814.6519775391,,, +28.2968750000,452,1829.3040771484,,, +28.2988281250,452,1842.4908447266,,, +28.3007812500,452,1855.6776123047,,, +28.3027343750,452,1868.8645019531,,, +28.3046875000,452,1882.0512695312,,, +28.3066406250,452,1894.5054931641,,, +28.3085937500,452,1906.9597167969,,, +28.3105468750,452,1918.6812744141,,, +28.3125000000,453,1930.4029541016,,, +28.3144531250,453,1940.6593017578,,, +28.3164062500,453,1949.4505615234,,, +28.3183593750,453,1956.7766113281,,, +28.3203125000,453,1962.6373291016,,, +28.3222656250,453,1966.3004150391,,, +28.3242187500,453,1969.2307128906,,, +28.3261718750,453,1972.1611328125,,, +28.3281250000,453,1974.3590087891,,, +28.3300781250,453,1975.0915527344,,, +28.3320312500,453,1975.0915527344,,, +28.3339843750,453,1974.3590087891,,, +28.3359375000,453,1972.8937988281,,, +28.3378906250,453,1970.6959228516,,, +28.3398437500,453,1968.4981689453,,, +28.3417968750,453,1966.3004150391,,, +28.3437500000,453,1962.6373291016,,, +28.3457031250,453,1958.2416992188,,, +28.3476562500,453,1953.1135253906,,, +28.3496093750,453,1946.5201416016,,, +28.3515625000,453,1937.7288818359,,, +28.3535156250,453,1928.9377441406,,, +28.3554687500,453,1919.4139404297,,, +28.3574218750,453,1909.1574707031,,, +28.3593750000,453,1897.4359130859,,, +28.3613281250,453,1886.4468994141,,, +28.3632812500,453,1876.1904296875,,, +28.3652343750,453,1865.9340820312,,, +28.3671875000,453,1856.4102783203,,, +28.3691406250,453,1845.4212646484,,, +28.3710937500,453,1832.9670410156,,, +28.3730468750,453,1821.2453613281,,, +28.3750000000,454,1808.0585937500,,, +28.3769531250,454,1794.8718261719,,, +28.3789062500,454,1782.4176025391,,, +28.3808593750,454,1769.9633789062,,, +28.3828125000,454,1757.5091552734,,, +28.3847656250,454,1745.7875976562,,, +28.3867187500,454,1732.6007080078,,, +28.3886718750,454,1719.4139404297,,, +28.3906250000,454,1705.4945068359,,, +28.3925781250,454,1692.3077392578,,, +28.3945312500,454,1677.6556396484,,, +28.3964843750,454,1664.4688720703,,, +28.3984375000,454,1651.2821044922,,, +28.4003906250,454,1638.8278808594,,, +28.4023437500,454,1626.3736572266,,, +28.4042968750,454,1614.6519775391,,, +28.4062500000,454,1603.6629638672,,, +28.4082031250,454,1594.1391601562,,, +28.4101562500,454,1584.6153564453,,, +28.4121093750,454,1573.6263427734,,, +28.4140625000,454,1562.6373291016,,, +28.4160156250,454,1552.3809814453,,, +28.4179687500,454,1541.3919677734,,, +28.4199218750,454,1531.1354980469,,, +28.4218750000,454,1521.6116943359,,, +28.4238281250,454,1512.8205566406,,, +28.4257812500,454,1504.7619628906,,, +28.4277343750,454,1497.4359130859,,, +28.4296875000,454,1490.8425292969,,, +28.4316406250,454,1483.5164794922,,, +28.4335937500,454,1476.1904296875,,, +28.4355468750,454,1467.3992919922,,, +28.4375000000,455,1459.3406982422,,, +28.4394531250,455,1450.5494384766,,, +28.4414062500,455,1441.0256347656,,, +28.4433593750,455,1434.4322509766,,, +28.4453125000,455,1428.5714111328,,, +28.4472656250,455,1422.7105712891,,, +28.4492187500,455,1417.5823974609,,, +28.4511718750,455,1410.9890136719,,, +28.4531250000,455,1404.3956298828,,, +28.4550781250,455,1398.5347900391,,, +28.4570312500,455,1392.6739501953,,, +28.4589843750,455,1386.8132324219,,, +28.4609375000,455,1381.6849365234,,, +28.4628906250,455,1377.2894287109,,, +28.4648437500,455,1373.6263427734,,, +28.4667968750,455,1369.9633789062,,, +28.4687500000,455,1366.3004150391,,, +28.4707031250,455,1361.1721191406,,, +28.4726562500,455,1356.7766113281,,, +28.4746093750,455,1353.1135253906,,, +28.4765625000,455,1348.7178955078,,, +28.4785156250,455,1345.0549316406,,, +28.4804687500,455,1341.3919677734,,, +28.4824218750,455,1338.4615478516,,, +28.4843750000,455,1336.2637939453,,, +28.4863281250,455,1335.5311279297,,, +28.4882812500,455,1334.7985839844,,, +28.4902343750,455,1332.6007080078,,, +28.4921875000,455,1331.1354980469,,, +28.4941406250,455,1328.9377441406,,, +28.4960937500,455,1327.4725341797,,, +28.4980468750,455,1326.7398681641,,, +28.5000000000,456,1325.2747802734,,, +28.5019531250,456,1325.2747802734,,, +28.5039062500,456,1324.5421142578,,, +28.5058593750,456,1325.2747802734,,, +28.5078125000,456,1327.4725341797,,, +28.5097656250,456,1327.4725341797,,, +28.5117187500,456,1328.9377441406,,, +28.5136718750,456,1328.9377441406,,, +28.5156250000,456,1330.4029541016,,, +28.5175781250,456,1331.8681640625,,, +28.5195312500,456,1331.8681640625,,, +28.5214843750,456,1332.6007080078,,, +28.5234375000,456,1334.0659179688,,, +28.5253906250,456,1336.2637939453,,, +28.5273437500,456,1337.7288818359,,, +28.5292968750,456,1339.9267578125,,, +28.5312500000,456,1344.3223876953,,, +28.5332031250,456,1347.2528076172,,, +28.5351562500,456,1349.4505615234,,, +28.5371093750,456,1350.9157714844,,, +28.5390625000,456,1353.1135253906,,, +28.5410156250,456,1353.8461914062,,, +28.5429687500,456,1355.3114013672,,, +28.5449218750,456,1356.7766113281,,, +28.5468750000,456,1358.9743652344,,, +28.5488281250,456,1361.1721191406,,, +28.5507812500,456,1364.8352050781,,, +28.5527343750,456,1367.7656250000,,, +28.5546875000,456,1370.6959228516,,, +28.5566406250,456,1372.8937988281,,, +28.5585937500,456,1373.6263427734,,, +28.5605468750,456,1375.8242187500,,, +28.5625000000,457,1378.0219726562,,, +28.5644531250,457,1380.2197265625,,, +28.5664062500,457,1381.6849365234,,, +28.5683593750,457,1383.8828125000,,, +28.5703125000,457,1384.6153564453,,, +28.5722656250,457,1386.8132324219,,, +28.5742187500,457,1388.2784423828,,, +28.5761718750,457,1390.4761962891,,, +28.5781250000,457,1393.4066162109,,, +28.5800781250,457,1395.6043701172,,, +28.5820312500,457,1396.3370361328,,, +28.5839843750,457,1397.0695800781,,, +28.5859375000,457,1397.8022460938,,, +28.5878906250,457,1397.8022460938,,, +28.5898437500,457,1398.5347900391,,, +28.5917968750,457,1399.2674560547,,, +28.5937500000,457,1400.0000000000,,, +28.5957031250,457,1401.4652099609,,, +28.5976562500,457,1402.9304199219,,, +28.5996093750,457,1402.9304199219,,, +28.6015625000,457,1402.1977539062,,, +28.6035156250,457,1401.4652099609,,, +28.6054687500,457,1399.2674560547,,, +28.6074218750,457,1397.0695800781,,, +28.6093750000,457,1395.6043701172,,, +28.6113281250,457,1395.6043701172,,, +28.6132812500,457,1394.8718261719,,, +28.6152343750,457,1393.4066162109,,, +28.6171875000,457,1393.4066162109,,, +28.6191406250,457,1392.6739501953,,, +28.6210937500,457,1391.9414062500,,, +28.6230468750,457,1390.4761962891,,, +28.6250000000,458,1388.2784423828,,, +28.6269531250,458,1387.5457763672,,, +28.6289062500,458,1386.0805664062,,, +28.6308593750,458,1384.6153564453,,, +28.6328125000,458,1383.1501464844,,, +28.6347656250,458,1381.6849365234,,, +28.6367187500,458,1379.4871826172,,, +28.6386718750,458,1378.0219726562,,, +28.6406250000,458,1376.5567626953,,, +28.6425781250,458,1374.3590087891,,, +28.6445312500,458,1372.1611328125,,, +28.6464843750,458,1369.9633789062,,, +28.6484375000,458,1367.0329589844,,, +28.6503906250,458,1364.8352050781,,, +28.6523437500,458,1362.6373291016,,, +28.6542968750,458,1360.4395751953,,, +28.6562500000,458,1358.2416992188,,, +28.6582031250,458,1356.0439453125,,, +28.6601562500,458,1353.1135253906,,, +28.6621093750,458,1351.6483154297,,, +28.6640625000,458,1348.7178955078,,, +28.6660156250,458,1345.7875976562,,, +28.6679687500,458,1343.5897216797,,, +28.6699218750,458,1340.6593017578,,, +28.6718750000,458,1337.7288818359,,, +28.6738281250,458,1334.7985839844,,, +28.6757812500,458,1332.6007080078,,, +28.6777343750,458,1331.1354980469,,, +28.6796875000,458,1328.9377441406,,, +28.6816406250,458,1328.2050781250,,, +28.6835937500,458,1325.2747802734,,, +28.6855468750,458,1323.0769042969,,, +28.6875000000,459,1321.6116943359,,, +28.6894531250,459,1320.8791503906,,, +28.6914062500,459,1318.6812744141,,, +28.6933593750,459,1317.2160644531,,, +28.6953125000,459,1315.7509765625,,, +28.6972656250,459,1314.2857666016,,, +28.6992187500,459,1312.8205566406,,, +28.7011718750,459,1312.0878906250,,, +28.7031250000,459,1310.6226806641,,, +28.7050781250,459,1309.1574707031,,, +28.7070312500,459,1308.4249267578,,, +28.7089843750,459,1306.9597167969,,, +28.7109375000,459,1306.2270507812,,, +28.7128906250,459,1304.7619628906,,, +28.7148437500,459,1303.2967529297,,, +28.7167968750,459,1302.5640869141,,, +28.7187500000,459,1302.5640869141,,, +28.7207031250,459,1301.0988769531,,, +28.7226562500,459,1299.6336669922,,, +28.7246093750,459,1298.1684570312,,, +28.7265625000,459,1295.9707031250,,, +28.7285156250,459,1294.5054931641,,, +28.7304687500,459,1293.0402832031,,, +28.7324218750,459,1291.5750732422,,, +28.7343750000,459,1290.1098632812,,, +28.7363281250,459,1287.9121093750,,, +28.7382812500,459,1285.7142333984,,, +28.7402343750,459,1284.2490234375,,, +28.7421875000,459,1282.7839355469,,, +28.7441406250,459,1281.3187255859,,, +28.7460937500,459,1279.8535156250,,, +28.7480468750,459,1278.3883056641,,, +28.7500000000,460,1277.6556396484,,, +28.7519531250,460,1275.4578857422,,, +28.7539062500,460,1274.7252197266,,, +28.7558593750,460,1273.9926757812,,, +28.7578125000,460,1271.7949218750,,, +28.7597656250,460,1271.0622558594,,, +28.7617187500,460,1270.3297119141,,, +28.7636718750,460,1268.8645019531,,, +28.7656250000,460,1268.1318359375,,, +28.7675781250,460,1267.3992919922,,, +28.7695312500,460,1266.6666259766,,, +28.7714843750,460,1265.9340820312,,, +28.7734375000,460,1265.9340820312,,, +28.7753906250,460,1265.9340820312,,, +28.7773437500,460,1265.9340820312,,, +28.7792968750,460,1264.4688720703,,, +28.7812500000,460,1263.7362060547,,, +28.7832031250,460,1263.7362060547,,, +28.7851562500,460,1263.0036621094,,, +28.7871093750,460,1262.2711181641,,, +28.7890625000,460,1263.0036621094,,, +28.7910156250,460,1263.7362060547,,, +28.7929687500,460,1265.2014160156,,, +28.7949218750,460,1266.6666259766,,, +28.7968750000,460,1268.8645019531,,, +28.7988281250,460,1269.5970458984,,, +28.8007812500,460,1270.3297119141,,, +28.8027343750,460,1271.0622558594,,, +28.8046875000,460,1270.3297119141,,, +28.8066406250,460,1271.0622558594,,, +28.8085937500,460,1269.5970458984,,, +28.8105468750,460,1268.8645019531,,, +28.8125000000,461,1268.8645019531,,, +28.8144531250,461,1268.8645019531,,, +28.8164062500,461,1268.1318359375,,, +28.8183593750,461,1268.8645019531,,, +28.8203125000,461,1268.1318359375,,, +28.8222656250,461,1267.3992919922,,, +28.8242187500,461,1268.1318359375,,, +28.8261718750,461,1268.1318359375,,, +28.8281250000,461,1268.1318359375,,, +28.8300781250,461,1268.8645019531,,, +28.8320312500,461,1269.5970458984,,, +28.8339843750,461,1269.5970458984,,, +28.8359375000,461,1270.3297119141,,, +28.8378906250,461,1271.0622558594,,, +28.8398437500,461,1271.7949218750,,, +28.8417968750,461,1272.5274658203,,, +28.8437500000,461,1271.7949218750,,, +28.8457031250,461,1271.7949218750,,, +28.8476562500,461,1273.2601318359,,, +28.8496093750,461,1273.9926757812,,, +28.8515625000,461,1275.4578857422,,, +28.8535156250,461,1276.1904296875,,, +28.8554687500,461,1277.6556396484,,, +28.8574218750,461,1279.1208496094,,, +28.8593750000,461,1280.5860595703,,, +28.8613281250,461,1281.3187255859,,, +28.8632812500,461,1281.3187255859,,, +28.8652343750,461,1282.7839355469,,, +28.8671875000,461,1284.2490234375,,, +28.8691406250,461,1285.7142333984,,, +28.8710937500,461,1286.4468994141,,, +28.8730468750,461,1287.1794433594,,, +28.8750000000,462,1287.9121093750,,, +28.8769531250,462,1288.6446533203,,, +28.8789062500,462,1289.3773193359,,, +28.8808593750,462,1290.1098632812,,, +28.8828125000,462,1290.8425292969,,, +28.8847656250,462,1291.5750732422,,, +28.8867187500,462,1292.3077392578,,, +28.8886718750,462,1294.5054931641,,, +28.8906250000,462,1295.9707031250,,, +28.8925781250,462,1298.9011230469,,, +28.8945312500,462,1301.0988769531,,, +28.8964843750,462,1303.2967529297,,, +28.8984375000,462,1306.2270507812,,, +28.9003906250,462,1308.4249267578,,, +28.9023437500,462,1310.6226806641,,, +28.9042968750,462,1312.0878906250,,, +28.9062500000,462,1314.2857666016,,, +28.9082031250,462,1316.4835205078,,, +28.9101562500,462,1317.9487304688,,, +28.9121093750,462,1319.4139404297,,, +28.9140625000,462,1321.6116943359,,, +28.9160156250,462,1323.8095703125,,, +28.9179687500,462,1326.0073242188,,, +28.9199218750,462,1328.2050781250,,, +28.9218750000,462,1329.6702880859,,, +28.9238281250,462,1331.1354980469,,, +28.9257812500,462,1333.3333740234,,, +28.9277343750,462,1335.5311279297,,, +28.9296875000,462,1336.9963378906,,, +28.9316406250,462,1338.4615478516,,, +28.9335937500,462,1339.1940917969,,, +28.9355468750,462,1339.1940917969,,, +28.9375000000,463,1339.1940917969,,, +28.9394531250,463,1339.1940917969,,, +28.9414062500,463,1338.4615478516,,, +28.9433593750,463,1337.7288818359,,, +28.9453125000,463,1336.2637939453,,, +28.9472656250,463,1336.2637939453,,, +28.9492187500,463,1334.7985839844,,, +28.9511718750,463,1333.3333740234,,, +28.9531250000,463,1331.8681640625,,, +28.9550781250,463,1330.4029541016,,, +28.9570312500,463,1328.2050781250,,, +28.9589843750,463,1326.7398681641,,, +28.9609375000,463,1325.2747802734,,, +28.9628906250,463,1323.0769042969,,, +28.9648437500,463,1323.0769042969,,, +28.9667968750,463,1322.3443603516,,, +28.9687500000,463,1321.6116943359,,, +28.9707031250,463,1320.1464843750,,, +28.9726562500,463,1319.4139404297,,, +28.9746093750,463,1318.6812744141,,, +28.9765625000,463,1317.2160644531,,, +28.9785156250,463,1316.4835205078,,, +28.9804687500,463,1315.7509765625,,, +28.9824218750,463,1315.0183105469,,, +28.9843750000,463,1314.2857666016,,, +28.9863281250,463,1313.5531005859,,, +28.9882812500,463,1312.0878906250,,, +28.9902343750,463,1310.6226806641,,, +28.9921875000,463,1309.1574707031,,, +28.9941406250,463,1307.6922607422,,, +28.9960937500,463,1306.9597167969,,, +28.9980468750,463,1305.4945068359,,, +29.0000000000,464,1304.0292968750,,, +29.0019531250,464,1302.5640869141,,, +29.0039062500,464,1302.5640869141,,, +29.0058593750,464,1301.0988769531,,, +29.0078125000,464,1301.0988769531,,, +29.0097656250,464,1301.0988769531,,, +29.0117187500,464,1300.3663330078,,, +29.0136718750,464,1300.3663330078,,, +29.0156250000,464,1300.3663330078,,, +29.0175781250,464,1300.3663330078,,, +29.0195312500,464,1301.0988769531,,, +29.0214843750,464,1301.0988769531,,, +29.0234375000,464,1301.0988769531,,, +29.0253906250,464,1299.6336669922,,, +29.0273437500,464,1298.9011230469,,, +29.0292968750,464,1297.4359130859,,, +29.0312500000,464,1297.4359130859,,, +29.0332031250,464,1296.7032470703,,, +29.0351562500,464,1296.7032470703,,, +29.0371093750,464,1297.4359130859,,, +29.0390625000,464,1298.9011230469,,, +29.0410156250,464,1301.0988769531,,, +29.0429687500,464,1304.7619628906,,, +29.0449218750,464,1309.1574707031,,, +29.0468750000,464,1314.2857666016,,, +29.0488281250,464,1320.1464843750,,, +29.0507812500,464,1327.4725341797,,, +29.0527343750,464,1335.5311279297,,, +29.0546875000,464,1344.3223876953,,, +29.0566406250,464,1355.3114013672,,, +29.0585937500,464,1365.5677490234,,, +29.0605468750,464,1378.0219726562,,, +29.0625000000,465,1391.2087402344,,, +29.0644531250,465,1405.1281738281,,, +29.0664062500,465,1419.7802734375,,, +29.0683593750,465,1434.4322509766,,, +29.0703125000,465,1450.5494384766,,, +29.0722656250,465,1465.9340820312,,, +29.0742187500,465,1481.3187255859,,, +29.0761718750,465,1497.4359130859,,, +29.0781250000,465,1514.2857666016,,, +29.0800781250,465,1531.1354980469,,, +29.0820312500,465,1549.4505615234,,, +29.0839843750,465,1567.7656250000,,, +29.0859375000,465,1586.0805664062,,, +29.0878906250,465,1603.6629638672,,, +29.0898437500,465,1622.7105712891,,, +29.0917968750,465,1641.7583007812,,, +29.0937500000,465,1660.8059082031,,, +29.0957031250,465,1679.1208496094,,, +29.0976562500,465,1698.1684570312,,, +29.0996093750,465,1717.2160644531,,, +29.1015625000,465,1736.2637939453,,, +29.1035156250,465,1754.5787353516,,, +29.1054687500,465,1772.1611328125,,, +29.1074218750,465,1789.0109863281,,, +29.1093750000,465,1805.1281738281,,, +29.1113281250,465,1819.7802734375,,, +29.1132812500,465,1834.4322509766,,, +29.1152343750,465,1849.0842285156,,, +29.1171875000,465,1862.2711181641,,, +29.1191406250,465,1874.7252197266,,, +29.1210937500,465,1885.7142333984,,, +29.1230468750,465,1896.7032470703,,, +29.1250000000,466,1906.9597167969,,, +29.1269531250,466,1917.9487304688,,, +29.1289062500,466,1927.4725341797,,, +29.1308593750,466,1936.9963378906,,, +29.1328125000,466,1945.0549316406,,, +29.1347656250,466,1952.3809814453,,, +29.1367187500,466,1958.2416992188,,, +29.1386718750,466,1962.6373291016,,, +29.1406250000,466,1964.8352050781,,, +29.1425781250,466,1967.0329589844,,, +29.1445312500,466,1967.7656250000,,, +29.1464843750,466,1967.7656250000,,, +29.1484375000,466,1966.3004150391,,, +29.1503906250,466,1963.3699951172,,, +29.1523437500,466,1960.4395751953,,, +29.1542968750,466,1956.7766113281,,, +29.1562500000,466,1952.3809814453,,, +29.1582031250,466,1947.2528076172,,, +29.1601562500,466,1941.3919677734,,, +29.1621093750,466,1934.7985839844,,, +29.1640625000,466,1928.2050781250,,, +29.1660156250,466,1920.1464843750,,, +29.1679687500,466,1912.0878906250,,, +29.1699218750,466,1903.2967529297,,, +29.1718750000,466,1894.5054931641,,, +29.1738281250,466,1884.2490234375,,, +29.1757812500,466,1873.2601318359,,, +29.1777343750,466,1861.5384521484,,, +29.1796875000,466,1849.0842285156,,, +29.1816406250,466,1835.8974609375,,, +29.1835937500,466,1822.7105712891,,, +29.1855468750,466,1808.7912597656,,, +29.1875000000,467,1794.8718261719,,, +29.1894531250,467,1780.9523925781,,, +29.1914062500,467,1766.3004150391,,, +29.1933593750,467,1751.6483154297,,, +29.1953125000,467,1739.1940917969,,, +29.1972656250,467,1726.0073242188,,, +29.1992187500,467,1713.5531005859,,, +29.2011718750,467,1701.8315429688,,, +29.2031250000,467,1688.6446533203,,, +29.2050781250,467,1676.1904296875,,, +29.2070312500,467,1663.0036621094,,, +29.2089843750,467,1649.0842285156,,, +29.2109375000,467,1635.8974609375,,, +29.2128906250,467,1622.7105712891,,, +29.2148437500,467,1610.2564697266,,, +29.2167968750,467,1598.5347900391,,, +29.2187500000,467,1587.5457763672,,, +29.2207031250,467,1575.8242187500,,, +29.2226562500,467,1564.1025390625,,, +29.2246093750,467,1553.1135253906,,, +29.2265625000,467,1542.1245117188,,, +29.2285156250,467,1531.8681640625,,, +29.2304687500,467,1522.3443603516,,, +29.2324218750,467,1513.5531005859,,, +29.2343750000,467,1504.7619628906,,, +29.2363281250,467,1497.4359130859,,, +29.2382812500,467,1488.6446533203,,, +29.2402343750,467,1479.8535156250,,, +29.2421875000,467,1471.0622558594,,, +29.2441406250,467,1462.2711181641,,, +29.2460937500,467,1453.4798583984,,, +29.2480468750,467,1445.4212646484,,, +29.2500000000,468,1438.0952148438,,, +29.2519531250,468,1430.0366210938,,, +29.2539062500,468,1423.4432373047,,, +29.2558593750,468,1416.8498535156,,, +29.2578125000,468,1411.7215576172,,, +29.2597656250,468,1407.3260498047,,, +29.2617187500,468,1402.1977539062,,, +29.2636718750,468,1397.8022460938,,, +29.2656250000,468,1393.4066162109,,, +29.2675781250,468,1389.0109863281,,, +29.2695312500,468,1383.1501464844,,, +29.2714843750,468,1378.0219726562,,, +29.2734375000,468,1373.6263427734,,, +29.2753906250,468,1368.4981689453,,, +29.2773437500,468,1364.1025390625,,, +29.2792968750,468,1360.4395751953,,, +29.2812500000,468,1356.7766113281,,, +29.2832031250,468,1353.8461914062,,, +29.2851562500,468,1350.9157714844,,, +29.2871093750,468,1347.9853515625,,, +29.2890625000,468,1345.7875976562,,, +29.2910156250,468,1343.5897216797,,, +29.2929687500,468,1341.3919677734,,, +29.2949218750,468,1339.1940917969,,, +29.2968750000,468,1336.9963378906,,, +29.2988281250,468,1333.3333740234,,, +29.3007812500,468,1330.4029541016,,, +29.3027343750,468,1328.2050781250,,, +29.3046875000,468,1324.5421142578,,, +29.3066406250,468,1321.6116943359,,, +29.3085937500,468,1318.6812744141,,, +29.3105468750,468,1315.7509765625,,, +29.3125000000,469,1312.8205566406,,, +29.3144531250,469,1309.8901367188,,, +29.3164062500,469,1306.9597167969,,, +29.3183593750,469,1306.2270507812,,, +29.3203125000,469,1305.4945068359,,, +29.3222656250,469,1304.0292968750,,, +29.3242187500,469,1303.2967529297,,, +29.3261718750,469,1302.5640869141,,, +29.3281250000,469,1301.8315429688,,, +29.3300781250,469,1302.5640869141,,, +29.3320312500,469,1303.2967529297,,, +29.3339843750,469,1303.2967529297,,, +29.3359375000,469,1304.7619628906,,, +29.3378906250,469,1304.7619628906,,, +29.3398437500,469,1304.7619628906,,, +29.3417968750,469,1304.7619628906,,, +29.3437500000,469,1304.0292968750,,, +29.3457031250,469,1304.7619628906,,, +29.3476562500,469,1305.4945068359,,, +29.3496093750,469,1306.2270507812,,, +29.3515625000,469,1306.9597167969,,, +29.3535156250,469,1309.1574707031,,, +29.3554687500,469,1311.3553466797,,, +29.3574218750,469,1312.8205566406,,, +29.3593750000,469,1315.7509765625,,, +29.3613281250,469,1317.9487304688,,, +29.3632812500,469,1320.8791503906,,, +29.3652343750,469,1323.0769042969,,, +29.3671875000,469,1326.7398681641,,, +29.3691406250,469,1328.9377441406,,, +29.3710937500,469,1331.8681640625,,, +29.3730468750,469,1334.7985839844,,, +29.3750000000,470,1336.9963378906,,, +29.3769531250,470,1339.1940917969,,, +29.3789062500,470,1342.1245117188,,, +29.3808593750,470,1343.5897216797,,, +29.3828125000,470,1345.7875976562,,, +29.3847656250,470,1347.2528076172,,, +29.3867187500,470,1348.7178955078,,, +29.3886718750,470,1350.1831054688,,, +29.3906250000,470,1353.8461914062,,, +29.3925781250,470,1356.7766113281,,, +29.3945312500,470,1361.1721191406,,, +29.3964843750,470,1364.8352050781,,, +29.3984375000,470,1367.7656250000,,, +29.4003906250,470,1370.6959228516,,, +29.4023437500,470,1372.8937988281,,, +29.4042968750,470,1374.3590087891,,, +29.4062500000,470,1375.8242187500,,, +29.4082031250,470,1375.8242187500,,, +29.4101562500,470,1375.8242187500,,, +29.4121093750,470,1375.8242187500,,, +29.4140625000,470,1375.8242187500,,, +29.4160156250,470,1375.8242187500,,, +29.4179687500,470,1375.8242187500,,, +29.4199218750,470,1376.5567626953,,, +29.4218750000,470,1376.5567626953,,, +29.4238281250,470,1376.5567626953,,, +29.4257812500,470,1378.0219726562,,, +29.4277343750,470,1378.0219726562,,, +29.4296875000,470,1378.0219726562,,, +29.4316406250,470,1377.2894287109,,, +29.4335937500,470,1376.5567626953,,, +29.4355468750,470,1373.6263427734,,, +29.4375000000,471,1371.4285888672,,, +29.4394531250,471,1369.9633789062,,, +29.4414062500,471,1367.7656250000,,, +29.4433593750,471,1365.5677490234,,, +29.4453125000,471,1364.1025390625,,, +29.4472656250,471,1362.6373291016,,, +29.4492187500,471,1361.1721191406,,, +29.4511718750,471,1359.7069091797,,, +29.4531250000,471,1358.2416992188,,, +29.4550781250,471,1356.7766113281,,, +29.4570312500,471,1355.3114013672,,, +29.4589843750,471,1354.5787353516,,, +29.4609375000,471,1353.8461914062,,, +29.4628906250,471,1353.1135253906,,, +29.4648437500,471,1352.3809814453,,, +29.4667968750,471,1351.6483154297,,, +29.4687500000,471,1350.9157714844,,, +29.4707031250,471,1349.4505615234,,, +29.4726562500,471,1346.5201416016,,, +29.4746093750,471,1343.5897216797,,, +29.4765625000,471,1340.6593017578,,, +29.4785156250,471,1337.7288818359,,, +29.4804687500,471,1334.7985839844,,, +29.4824218750,471,1331.8681640625,,, +29.4843750000,471,1328.2050781250,,, +29.4863281250,471,1325.2747802734,,, +29.4882812500,471,1323.0769042969,,, +29.4902343750,471,1320.1464843750,,, +29.4921875000,471,1317.2160644531,,, +29.4941406250,471,1315.0183105469,,, +29.4960937500,471,1312.8205566406,,, +29.4980468750,471,1309.8901367188,,, +29.5000000000,472,1308.4249267578,,, +29.5019531250,472,1306.9597167969,,, +29.5039062500,472,1305.4945068359,,, +29.5058593750,472,1304.7619628906,,, +29.5078125000,472,1303.2967529297,,, +29.5097656250,472,1301.8315429688,,, +29.5117187500,472,1301.0988769531,,, +29.5136718750,472,1301.0988769531,,, +29.5156250000,472,1301.0988769531,,, +29.5175781250,472,1301.0988769531,,, +29.5195312500,472,1301.8315429688,,, +29.5214843750,472,1301.0988769531,,, +29.5234375000,472,1300.3663330078,,, +29.5253906250,472,1300.3663330078,,, +29.5273437500,472,1300.3663330078,,, +29.5292968750,472,1299.6336669922,,, +29.5312500000,472,1299.6336669922,,, +29.5332031250,472,1299.6336669922,,, +29.5351562500,472,1298.1684570312,,, +29.5371093750,472,1298.1684570312,,, +29.5390625000,472,1296.7032470703,,, +29.5410156250,472,1296.7032470703,,, +29.5429687500,472,1296.7032470703,,, +29.5449218750,472,1295.2380371094,,, +29.5468750000,472,1294.5054931641,,, +29.5488281250,472,1293.7729492188,,, +29.5507812500,472,1292.3077392578,,, +29.5527343750,472,1291.5750732422,,, +29.5546875000,472,1290.1098632812,,, +29.5566406250,472,1287.9121093750,,, +29.5585937500,472,1286.4468994141,,, +29.5605468750,472,1284.9816894531,,, +29.5625000000,473,1283.5164794922,,, +29.5644531250,473,1282.7839355469,,, +29.5664062500,473,1282.7839355469,,, +29.5683593750,473,1283.5164794922,,, +29.5703125000,473,1284.9816894531,,, +29.5722656250,473,1284.9816894531,,, +29.5742187500,473,1284.9816894531,,, +29.5761718750,473,1285.7142333984,,, +29.5781250000,473,1285.7142333984,,, +29.5800781250,473,1285.7142333984,,, +29.5820312500,473,1284.9816894531,,, +29.5839843750,473,1283.5164794922,,, +29.5859375000,473,1283.5164794922,,, +29.5878906250,473,1283.5164794922,,, +29.5898437500,473,1283.5164794922,,, +29.5917968750,473,1282.7839355469,,, +29.5937500000,473,1283.5164794922,,, +29.5957031250,473,1284.2490234375,,, +29.5976562500,473,1285.7142333984,,, +29.5996093750,473,1284.9816894531,,, +29.6015625000,473,1284.9816894531,,, +29.6035156250,473,1284.2490234375,,, +29.6054687500,473,1284.2490234375,,, +29.6074218750,473,1283.5164794922,,, +29.6093750000,473,1282.7839355469,,, +29.6113281250,473,1282.0512695312,,, +29.6132812500,473,1281.3187255859,,, +29.6152343750,473,1280.5860595703,,, +29.6171875000,473,1281.3187255859,,, +29.6191406250,473,1282.0512695312,,, +29.6210937500,473,1282.0512695312,,, +29.6230468750,473,1282.0512695312,,, +29.6250000000,474,1280.5860595703,,, +29.6269531250,474,1279.1208496094,,, +29.6289062500,474,1276.9230957031,,, +29.6308593750,474,1276.9230957031,,, +29.6328125000,474,1276.1904296875,,, +29.6347656250,474,1276.1904296875,,, +29.6367187500,474,1277.6556396484,,, +29.6386718750,474,1277.6556396484,,, +29.6406250000,474,1277.6556396484,,, +29.6425781250,474,1276.9230957031,,, +29.6445312500,474,1275.4578857422,,, +29.6464843750,474,1275.4578857422,,, +29.6484375000,474,1274.7252197266,,, +29.6503906250,474,1273.9926757812,,, +29.6523437500,474,1273.2601318359,,, +29.6542968750,474,1273.2601318359,,, +29.6562500000,474,1273.2601318359,,, +29.6582031250,474,1273.9926757812,,, +29.6601562500,474,1274.7252197266,,, +29.6621093750,474,1275.4578857422,,, +29.6640625000,474,1276.1904296875,,, +29.6660156250,474,1276.9230957031,,, +29.6679687500,474,1276.1904296875,,, +29.6699218750,474,1275.4578857422,,, +29.6718750000,474,1274.7252197266,,, +29.6738281250,474,1274.7252197266,,, +29.6757812500,474,1274.7252197266,,, +29.6777343750,474,1274.7252197266,,, +29.6796875000,474,1274.7252197266,,, +29.6816406250,474,1275.4578857422,,, +29.6835937500,474,1277.6556396484,,, +29.6855468750,474,1279.1208496094,,, +29.6875000000,475,1280.5860595703,,, +29.6894531250,475,1282.0512695312,,, +29.6914062500,475,1283.5164794922,,, +29.6933593750,475,1284.9816894531,,, +29.6953125000,475,1285.7142333984,,, +29.6972656250,475,1286.4468994141,,, +29.6992187500,475,1287.9121093750,,, +29.7011718750,475,1288.6446533203,,, +29.7031250000,475,1288.6446533203,,, +29.7050781250,475,1290.1098632812,,, +29.7070312500,475,1290.1098632812,,, +29.7089843750,475,1290.8425292969,,, +29.7109375000,475,1293.0402832031,,, +29.7128906250,475,1294.5054931641,,, +29.7148437500,475,1296.7032470703,,, +29.7167968750,475,1298.1684570312,,, +29.7187500000,475,1298.1684570312,,, +29.7207031250,475,1298.1684570312,,, +29.7226562500,475,1298.1684570312,,, +29.7246093750,475,1298.9011230469,,, +29.7265625000,475,1298.9011230469,,, +29.7285156250,475,1299.6336669922,,, +29.7304687500,475,1300.3663330078,,, +29.7324218750,475,1301.8315429688,,, +29.7343750000,475,1303.2967529297,,, +29.7363281250,475,1305.4945068359,,, +29.7382812500,475,1306.9597167969,,, +29.7402343750,475,1309.1574707031,,, +29.7421875000,475,1309.1574707031,,, +29.7441406250,475,1309.8901367188,,, +29.7460937500,475,1309.8901367188,,, +29.7480468750,475,1310.6226806641,,, +29.7500000000,476,1311.3553466797,,, +29.7519531250,476,1312.8205566406,,, +29.7539062500,476,1312.0878906250,,, +29.7558593750,476,1313.5531005859,,, +29.7578125000,476,1315.0183105469,,, +29.7597656250,476,1316.4835205078,,, +29.7617187500,476,1317.9487304688,,, +29.7636718750,476,1317.9487304688,,, +29.7656250000,476,1317.9487304688,,, +29.7675781250,476,1317.2160644531,,, +29.7695312500,476,1316.4835205078,,, +29.7714843750,476,1314.2857666016,,, +29.7734375000,476,1313.5531005859,,, +29.7753906250,476,1312.0878906250,,, +29.7773437500,476,1309.8901367188,,, +29.7792968750,476,1309.1574707031,,, +29.7812500000,476,1307.6922607422,,, +29.7832031250,476,1305.4945068359,,, +29.7851562500,476,1304.7619628906,,, +29.7871093750,476,1304.0292968750,,, +29.7890625000,476,1304.0292968750,,, +29.7910156250,476,1304.0292968750,,, +29.7929687500,476,1303.2967529297,,, +29.7949218750,476,1301.0988769531,,, +29.7968750000,476,1299.6336669922,,, +29.7988281250,476,1298.9011230469,,, +29.8007812500,476,1296.7032470703,,, +29.8027343750,476,1295.2380371094,,, +29.8046875000,476,1294.5054931641,,, +29.8066406250,476,1293.0402832031,,, +29.8085937500,476,1292.3077392578,,, +29.8105468750,476,1292.3077392578,,, +29.8125000000,477,1292.3077392578,,, +29.8144531250,477,1292.3077392578,,, +29.8164062500,477,1293.0402832031,,, +29.8183593750,477,1292.3077392578,,, +29.8203125000,477,1292.3077392578,,, +29.8222656250,477,1291.5750732422,,, +29.8242187500,477,1289.3773193359,,, +29.8261718750,477,1288.6446533203,,, +29.8281250000,477,1287.1794433594,,, +29.8300781250,477,1285.7142333984,,, +29.8320312500,477,1285.7142333984,,, +29.8339843750,477,1284.9816894531,,, +29.8359375000,477,1285.7142333984,,, +29.8378906250,477,1287.1794433594,,, +29.8398437500,477,1287.9121093750,,, +29.8417968750,477,1288.6446533203,,, +29.8437500000,477,1288.6446533203,,, +29.8457031250,477,1287.9121093750,,, +29.8476562500,477,1286.4468994141,,, +29.8496093750,477,1285.7142333984,,, +29.8515625000,477,1284.9816894531,,, +29.8535156250,477,1284.2490234375,,, +29.8554687500,477,1284.2490234375,,, +29.8574218750,477,1283.5164794922,,, +29.8593750000,477,1283.5164794922,,, +29.8613281250,477,1282.7839355469,,, +29.8632812500,477,1283.5164794922,,, +29.8652343750,477,1283.5164794922,,, +29.8671875000,477,1284.2490234375,,, +29.8691406250,477,1283.5164794922,,, +29.8710937500,477,1282.7839355469,,, +29.8730468750,477,1282.0512695312,,, +29.8750000000,478,1280.5860595703,,, +29.8769531250,478,1279.1208496094,,, +29.8789062500,478,1279.1208496094,,, +29.8808593750,478,1278.3883056641,,, +29.8828125000,478,1276.9230957031,,, +29.8847656250,478,1276.1904296875,,, +29.8867187500,478,1275.4578857422,,, +29.8886718750,478,1274.7252197266,,, +29.8906250000,478,1275.4578857422,,, +29.8925781250,478,1276.1904296875,,, +29.8945312500,478,1276.9230957031,,, +29.8964843750,478,1277.6556396484,,, +29.8984375000,478,1278.3883056641,,, +29.9003906250,478,1279.1208496094,,, +29.9023437500,478,1279.1208496094,,, +29.9042968750,478,1279.1208496094,,, +29.9062500000,478,1277.6556396484,,, +29.9082031250,478,1278.3883056641,,, +29.9101562500,478,1277.6556396484,,, +29.9121093750,478,1278.3883056641,,, +29.9140625000,478,1280.5860595703,,, +29.9160156250,478,1281.3187255859,,, +29.9179687500,478,1282.7839355469,,, +29.9199218750,478,1285.7142333984,,, +29.9218750000,478,1287.9121093750,,, +29.9238281250,478,1290.8425292969,,, +29.9257812500,478,1296.7032470703,,, +29.9277343750,478,1301.8315429688,,, +29.9296875000,478,1306.2270507812,,, +29.9316406250,478,1312.0878906250,,, +29.9335937500,478,1317.9487304688,,, +29.9355468750,478,1323.8095703125,,, +29.9375000000,479,1331.8681640625,,, +29.9394531250,479,1339.1940917969,,, +29.9414062500,479,1347.2528076172,,, +29.9433593750,479,1356.7766113281,,, +29.9453125000,479,1367.7656250000,,, +29.9472656250,479,1380.2197265625,,, +29.9492187500,479,1394.8718261719,,, +29.9511718750,479,1409.5238037109,,, +29.9531250000,479,1424.9084472656,,, +29.9550781250,479,1441.0256347656,,, +29.9570312500,479,1457.1428222656,,, +29.9589843750,479,1472.5274658203,,, +29.9609375000,479,1490.8425292969,,, +29.9628906250,479,1509.1574707031,,, +29.9648437500,479,1527.4725341797,,, +29.9667968750,479,1547.2528076172,,, +29.9687500000,479,1567.0329589844,,, +29.9707031250,479,1587.5457763672,,, +29.9726562500,479,1608.7912597656,,, +29.9746093750,479,1629.3040771484,,, +29.9765625000,479,1649.8168945312,,, +29.9785156250,479,1670.3297119141,,, +29.9804687500,479,1690.1098632812,,, +29.9824218750,479,1709.1574707031,,, +29.9843750000,479,1728.9377441406,,, +29.9863281250,479,1748.7178955078,,, +29.9882812500,479,1748.7178955078,,, +29.9902343750,479,1767.7656250000,,, +29.9921875000,479,1787.5457763672,,, +29.9941406250,479,1807.3260498047,,, +29.9960937500,479,1826.3736572266,,, +29.9980468750,479,1845.4212646484,,, +30.0000000000,480,1863.0036621094,,, +30.0019531250,480,1879.1208496094,,, +30.0039062500,480,1894.5054931641,,, +30.0058593750,480,1909.1574707031,,, +30.0078125000,480,1921.6116943359,,, +30.0097656250,480,1934.0659179688,,, +30.0117187500,480,1945.0549316406,,, +30.0136718750,480,1955.3114013672,,, +30.0156250000,480,1964.8352050781,,, +30.0175781250,480,1973.6263427734,,, +30.0195312500,480,1981.6849365234,,, +30.0214843750,480,1989.7435302734,,, +30.0234375000,480,1997.0695800781,,, +30.0253906250,480,2003.6629638672,,, +30.0273437500,480,2008.7912597656,,, +30.0292968750,480,2012.4542236328,,, +30.0312500000,480,2014.6519775391,,, +30.0332031250,480,2016.8498535156,,, +30.0351562500,480,2016.8498535156,,, +30.0371093750,480,2016.1171875000,,, +30.0390625000,480,2013.1867675781,,, +30.0410156250,480,2009.5238037109,,, +30.0429687500,480,2004.3956298828,,, +30.0449218750,480,1999.2674560547,,, +30.0468750000,480,1994.1391601562,,, +30.0488281250,480,1987.5457763672,,, +30.0507812500,480,1980.9523925781,,, +30.0527343750,480,1972.8937988281,,, +30.0546875000,480,1964.8352050781,,, +30.0566406250,480,1956.0439453125,,, +30.0585937500,480,1947.2528076172,,, +30.0605468750,480,1936.9963378906,,, +30.0625000000,481,1925.2747802734,,, +30.0644531250,481,1913.5531005859,,, +30.0664062500,481,1900.3663330078,,, +30.0683593750,481,1887.1794433594,,, +30.0703125000,481,1873.2601318359,,, +30.0722656250,481,1858.6080322266,,, +30.0742187500,481,1843.9560546875,,, +30.0761718750,481,1830.0366210938,,, +30.0781250000,481,1815.3846435547,,, +30.0800781250,481,1802.1977539062,,, +30.0820312500,481,1788.2784423828,,, +30.0839843750,481,1773.6263427734,,, +30.0859375000,481,1758.2416992188,,, +30.0878906250,481,1742.1245117188,,, +30.0898437500,481,1726.7398681641,,, +30.0917968750,481,1710.6226806641,,, +30.0937500000,481,1694.5054931641,,, +30.0957031250,481,1679.8535156250,,, +30.0976562500,481,1665.2014160156,,, +30.0996093750,481,1651.2821044922,,, +30.1015625000,481,1638.8278808594,,, +30.1035156250,481,1625.6409912109,,, +30.1054687500,481,1612.4542236328,,, +30.1074218750,481,1600.0000000000,,, +30.1093750000,481,1586.8132324219,,, +30.1113281250,481,1573.6263427734,,, +30.1132812500,481,1561.9047851562,,, +30.1152343750,481,1550.1831054688,,, +30.1171875000,481,1539.1940917969,,, +30.1191406250,481,1528.2050781250,,, +30.1210937500,481,1518.6812744141,,, +30.1230468750,481,1509.1574707031,,, +30.1250000000,482,1500.3663330078,,, +30.1269531250,482,1491.5750732422,,, +30.1289062500,482,1482.0512695312,,, +30.1308593750,482,1472.5274658203,,, +30.1328125000,482,1463.0036621094,,, +30.1347656250,482,1455.6776123047,,, +30.1367187500,482,1449.0842285156,,, +30.1386718750,482,1443.2233886719,,, +30.1406250000,482,1436.6300048828,,, +30.1425781250,482,1429.3040771484,,, +30.1445312500,482,1421.9780273438,,, +30.1464843750,482,1414.6519775391,,, +30.1484375000,482,1408.7912597656,,, +30.1503906250,482,1405.1281738281,,, +30.1523437500,482,1399.2674560547,,, +30.1542968750,482,1394.8718261719,,, +30.1562500000,482,1389.7435302734,,, +30.1582031250,482,1383.8828125000,,, +30.1601562500,482,1378.7546386719,,, +30.1621093750,482,1375.0915527344,,, +30.1640625000,482,1372.1611328125,,, +30.1660156250,482,1369.2307128906,,, +30.1679687500,482,1364.8352050781,,, +30.1699218750,482,1360.4395751953,,, +30.1718750000,482,1356.7766113281,,, +30.1738281250,482,1353.1135253906,,, +30.1757812500,482,1350.9157714844,,, +30.1777343750,482,1347.9853515625,,, +30.1796875000,482,1344.3223876953,,, +30.1816406250,482,1339.1940917969,,, +30.1835937500,482,1336.2637939453,,, +30.1855468750,482,1334.0659179688,,, +30.1875000000,483,1333.3333740234,,, +30.1894531250,483,1331.1354980469,,, +30.1914062500,483,1328.2050781250,,, +30.1933593750,483,1325.2747802734,,, +30.1953125000,483,1323.8095703125,,, +30.1972656250,483,1321.6116943359,,, +30.1992187500,483,1320.8791503906,,, +30.2011718750,483,1320.1464843750,,, +30.2031250000,483,1319.4139404297,,, +30.2050781250,483,1317.2160644531,,, +30.2070312500,483,1315.0183105469,,, +30.2089843750,483,1313.5531005859,,, +30.2109375000,483,1313.5531005859,,, +30.2128906250,483,1315.0183105469,,, +30.2148437500,483,1315.0183105469,,, +30.2167968750,483,1313.5531005859,,, +30.2187500000,483,1313.5531005859,,, +30.2207031250,483,1312.8205566406,,, +30.2226562500,483,1313.5531005859,,, +30.2246093750,483,1314.2857666016,,, +30.2265625000,483,1315.0183105469,,, +30.2285156250,483,1316.4835205078,,, +30.2304687500,483,1317.2160644531,,, +30.2324218750,483,1317.9487304688,,, +30.2343750000,483,1317.9487304688,,, +30.2363281250,483,1319.4139404297,,, +30.2382812500,483,1322.3443603516,,, +30.2402343750,483,1322.3443603516,,, +30.2421875000,483,1324.5421142578,,, +30.2441406250,483,1326.7398681641,,, +30.2460937500,483,1327.4725341797,,, +30.2480468750,483,1327.4725341797,,, +30.2500000000,484,1329.6702880859,,, +30.2519531250,484,1331.1354980469,,, +30.2539062500,484,1334.0659179688,,, +30.2558593750,484,1336.9963378906,,, +30.2578125000,484,1338.4615478516,,, +30.2597656250,484,1340.6593017578,,, +30.2617187500,484,1341.3919677734,,, +30.2636718750,484,1343.5897216797,,, +30.2656250000,484,1347.2528076172,,, +30.2675781250,484,1349.4505615234,,, +30.2695312500,484,1350.9157714844,,, +30.2714843750,484,1352.3809814453,,, +30.2734375000,484,1353.8461914062,,, +30.2753906250,484,1355.3114013672,,, +30.2773437500,484,1357.5091552734,,, +30.2792968750,484,1360.4395751953,,, +30.2812500000,484,1361.1721191406,,, +30.2832031250,484,1362.6373291016,,, +30.2851562500,484,1362.6373291016,,, +30.2871093750,484,1364.1025390625,,, +30.2890625000,484,1367.0329589844,,, +30.2910156250,484,1369.9633789062,,, +30.2929687500,484,1370.6959228516,,, +30.2949218750,484,1372.8937988281,,, +30.2968750000,484,1373.6263427734,,, +30.2988281250,484,1375.0915527344,,, +30.3007812500,484,1378.7546386719,,, +30.3027343750,484,1381.6849365234,,, +30.3046875000,484,1381.6849365234,,, +30.3066406250,484,1382.4176025391,,, +30.3085937500,484,1383.8828125000,,, +30.3105468750,484,1384.6153564453,,, +30.3125000000,485,1385.3480224609,,, +30.3144531250,485,1389.0109863281,,, +30.3164062500,485,1390.4761962891,,, +30.3183593750,485,1391.2087402344,,, +30.3203125000,485,1391.9414062500,,, +30.3222656250,485,1391.9414062500,,, +30.3242187500,485,1392.6739501953,,, +30.3261718750,485,1394.8718261719,,, +30.3281250000,485,1395.6043701172,,, +30.3300781250,485,1395.6043701172,,, +30.3320312500,485,1395.6043701172,,, +30.3339843750,485,1394.1391601562,,, +30.3359375000,485,1393.4066162109,,, +30.3378906250,485,1393.4066162109,,, +30.3398437500,485,1394.1391601562,,, +30.3417968750,485,1393.4066162109,,, +30.3437500000,485,1391.9414062500,,, +30.3457031250,485,1390.4761962891,,, +30.3476562500,485,1389.0109863281,,, +30.3496093750,485,1387.5457763672,,, +30.3515625000,485,1387.5457763672,,, +30.3535156250,485,1384.6153564453,,, +30.3554687500,485,1382.4176025391,,, +30.3574218750,485,1379.4871826172,,, +30.3593750000,485,1376.5567626953,,, +30.3613281250,485,1374.3590087891,,, +30.3632812500,485,1372.8937988281,,, +30.3652343750,485,1371.4285888672,,, +30.3671875000,485,1369.2307128906,,, +30.3691406250,485,1367.0329589844,,, +30.3710937500,485,1364.1025390625,,, +30.3730468750,485,1363.3699951172,,, +30.3750000000,486,1361.1721191406,,, +30.3769531250,486,1360.4395751953,,, +30.3789062500,486,1359.7069091797,,, +30.3808593750,486,1356.7766113281,,, +30.3828125000,486,1353.8461914062,,, +30.3847656250,486,1352.3809814453,,, +30.3867187500,486,1350.9157714844,,, +30.3886718750,486,1349.4505615234,,, +30.3906250000,486,1349.4505615234,,, +30.3925781250,486,1348.7178955078,,, +30.3945312500,486,1346.5201416016,,, +30.3964843750,486,1344.3223876953,,, +30.3984375000,486,1343.5897216797,,, +30.4003906250,486,1341.3919677734,,, +30.4023437500,486,1341.3919677734,,, +30.4042968750,486,1339.9267578125,,, +30.4062500000,486,1338.4615478516,,, +30.4082031250,486,1336.2637939453,,, +30.4101562500,486,1332.6007080078,,, +30.4121093750,486,1330.4029541016,,, +30.4140625000,486,1328.2050781250,,, +30.4160156250,486,1327.4725341797,,, +30.4179687500,486,1325.2747802734,,, +30.4199218750,486,1321.6116943359,,, +30.4218750000,486,1318.6812744141,,, +30.4238281250,486,1315.7509765625,,, +30.4257812500,486,1313.5531005859,,, +30.4277343750,486,1312.0878906250,,, +30.4296875000,486,1310.6226806641,,, +30.4316406250,486,1307.6922607422,,, +30.4335937500,486,1304.7619628906,,, +30.4355468750,486,1301.0988769531,,, +30.4375000000,487,1299.6336669922,,, +30.4394531250,487,1297.4359130859,,, +30.4414062500,487,1295.9707031250,,, +30.4433593750,487,1293.7729492188,,, +30.4453125000,487,1290.8425292969,,, +30.4472656250,487,1288.6446533203,,, +30.4492187500,487,1287.1794433594,,, +30.4511718750,487,1287.1794433594,,, +30.4531250000,487,1285.7142333984,,, +30.4550781250,487,1284.9816894531,,, +30.4570312500,487,1283.5164794922,,, +30.4589843750,487,1282.0512695312,,, +30.4609375000,487,1281.3187255859,,, +30.4628906250,487,1282.7839355469,,, +30.4648437500,487,1283.5164794922,,, +30.4667968750,487,1282.7839355469,,, +30.4687500000,487,1282.7839355469,,, +30.4707031250,487,1282.7839355469,,, +30.4726562500,487,1283.5164794922,,, +30.4746093750,487,1284.9816894531,,, +30.4765625000,487,1285.7142333984,,, +30.4785156250,487,1286.4468994141,,, +30.4804687500,487,1286.4468994141,,, +30.4824218750,487,1287.9121093750,,, +30.4843750000,487,1290.1098632812,,, +30.4863281250,487,1292.3077392578,,, +30.4882812500,487,1293.7729492188,,, +30.4902343750,487,1294.5054931641,,, +30.4921875000,487,1296.7032470703,,, +30.4941406250,487,1298.9011230469,,, +30.4960937500,487,1298.9011230469,,, +30.4980468750,487,1299.6336669922,,, +30.5000000000,488,1300.3663330078,,, +30.5019531250,488,1302.5640869141,,, +30.5039062500,488,1302.5640869141,,, +30.5058593750,488,1302.5640869141,,, +30.5078125000,488,1302.5640869141,,, +30.5097656250,488,1304.0292968750,,, +30.5117187500,488,1304.7619628906,,, +30.5136718750,488,1304.7619628906,,, +30.5156250000,488,1304.0292968750,,, +30.5175781250,488,1304.0292968750,,, +30.5195312500,488,1306.2270507812,,, +30.5214843750,488,1306.9597167969,,, +30.5234375000,488,1306.9597167969,,, +30.5253906250,488,1307.6922607422,,, +30.5273437500,488,1306.9597167969,,, +30.5292968750,488,1309.1574707031,,, +30.5312500000,488,1308.4249267578,,, +30.5332031250,488,1308.4249267578,,, +30.5351562500,488,1308.4249267578,,, +30.5371093750,488,1310.6226806641,,, +30.5390625000,488,1310.6226806641,,, +30.5410156250,488,1309.8901367188,,, +30.5429687500,488,1309.1574707031,,, +30.5449218750,488,1309.1574707031,,, +30.5468750000,488,1309.8901367188,,, +30.5488281250,488,1309.1574707031,,, +30.5507812500,488,1307.6922607422,,, +30.5527343750,488,1306.2270507812,,, +30.5546875000,488,1306.2270507812,,, +30.5566406250,488,1304.7619628906,,, +30.5585937500,488,1304.0292968750,,, +30.5605468750,488,1302.5640869141,,, +30.5625000000,489,1300.3663330078,,, +30.5644531250,489,1299.6336669922,,, +30.5664062500,489,1298.9011230469,,, +30.5683593750,489,1296.7032470703,,, +30.5703125000,489,1294.5054931641,,, +30.5722656250,489,1293.0402832031,,, +30.5742187500,489,1293.0402832031,,, +30.5761718750,489,1292.3077392578,,, +30.5781250000,489,1290.8425292969,,, +30.5800781250,489,1288.6446533203,,, +30.5820312500,489,1286.4468994141,,, +30.5839843750,489,1287.1794433594,,, +30.5859375000,489,1285.7142333984,,, +30.5878906250,489,1284.2490234375,,, +30.5898437500,489,1282.7839355469,,, +30.5917968750,489,1282.0512695312,,, +30.5937500000,489,1282.0512695312,,, +30.5957031250,489,1280.5860595703,,, +30.5976562500,489,1279.1208496094,,, +30.5996093750,489,1277.6556396484,,, +30.6015625000,489,1276.9230957031,,, +30.6035156250,489,1278.3883056641,,, +30.6054687500,489,1278.3883056641,,, +30.6074218750,489,1277.6556396484,,, +30.6093750000,489,1276.9230957031,,, +30.6113281250,489,1276.1904296875,,, +30.6132812500,489,1276.9230957031,,, +30.6152343750,489,1278.3883056641,,, +30.6171875000,489,1278.3883056641,,, +30.6191406250,489,1279.1208496094,,, +30.6210937500,489,1279.1208496094,,, +30.6230468750,489,1279.8535156250,,, +30.6250000000,490,1281.3187255859,,, +30.6269531250,490,1283.5164794922,,, +30.6289062500,490,1284.2490234375,,, +30.6308593750,490,1284.2490234375,,, +30.6328125000,490,1284.9816894531,,, +30.6347656250,490,1285.7142333984,,, +30.6367187500,490,1287.1794433594,,, +30.6386718750,490,1289.3773193359,,, +30.6406250000,490,1290.8425292969,,, +30.6425781250,490,1290.8425292969,,, +30.6445312500,490,1291.5750732422,,, +30.6464843750,490,1292.3077392578,,, +30.6484375000,490,1293.0402832031,,, +30.6503906250,490,1294.5054931641,,, +30.6523437500,490,1293.7729492188,,, +30.6542968750,490,1292.3077392578,,, +30.6562500000,490,1292.3077392578,,, +30.6582031250,490,1293.7729492188,,, +30.6601562500,490,1294.5054931641,,, +30.6621093750,490,1294.5054931641,,, +30.6640625000,490,1293.0402832031,,, +30.6660156250,490,1292.3077392578,,, +30.6679687500,490,1291.5750732422,,, +30.6699218750,490,1291.5750732422,,, +30.6718750000,490,1291.5750732422,,, +30.6738281250,490,1290.8425292969,,, +30.6757812500,490,1290.1098632812,,, +30.6777343750,490,1289.3773193359,,, +30.6796875000,490,1289.3773193359,,, +30.6816406250,490,1291.5750732422,,, +30.6835937500,490,1291.5750732422,,, +30.6855468750,490,1291.5750732422,,, +30.6875000000,491,1292.3077392578,,, +30.6894531250,491,1292.3077392578,,, +30.6914062500,491,1293.7729492188,,, +30.6933593750,491,1295.2380371094,,, +30.6953125000,491,1296.7032470703,,, +30.6972656250,491,1296.7032470703,,, +30.6992187500,491,1297.4359130859,,, +30.7011718750,491,1298.9011230469,,, +30.7031250000,491,1301.0988769531,,, +30.7050781250,491,1302.5640869141,,, +30.7070312500,491,1302.5640869141,,, +30.7089843750,491,1303.2967529297,,, +30.7109375000,491,1303.2967529297,,, +30.7128906250,491,1304.7619628906,,, +30.7148437500,491,1306.2270507812,,, +30.7167968750,491,1305.4945068359,,, +30.7187500000,491,1305.4945068359,,, +30.7207031250,491,1304.7619628906,,, +30.7226562500,491,1304.0292968750,,, +30.7246093750,491,1305.4945068359,,, +30.7265625000,491,1306.2270507812,,, +30.7285156250,491,1305.4945068359,,, +30.7304687500,491,1305.4945068359,,, +30.7324218750,491,1305.4945068359,,, +30.7343750000,491,1306.2270507812,,, +30.7363281250,491,1306.9597167969,,, +30.7382812500,491,1306.9597167969,,, +30.7402343750,491,1306.2270507812,,, +30.7421875000,491,1307.6922607422,,, +30.7441406250,491,1309.8901367188,,, +30.7460937500,491,1309.8901367188,,, +30.7480468750,491,1310.6226806641,,, +30.7500000000,492,1310.6226806641,,, +30.7519531250,492,1311.3553466797,,, +30.7539062500,492,1313.5531005859,,, +30.7558593750,492,1315.0183105469,,, +30.7578125000,492,1315.0183105469,,, +30.7597656250,492,1315.0183105469,,, +30.7617187500,492,1315.7509765625,,, +30.7636718750,492,1317.2160644531,,, +30.7656250000,492,1317.9487304688,,, +30.7675781250,492,1317.2160644531,,, +30.7695312500,492,1317.2160644531,,, +30.7714843750,492,1317.9487304688,,, +30.7734375000,492,1319.4139404297,,, +30.7753906250,492,1318.6812744141,,, +30.7773437500,492,1318.6812744141,,, +30.7792968750,492,1317.2160644531,,, +30.7812500000,492,1317.2160644531,,, +30.7832031250,492,1318.6812744141,,, +30.7851562500,492,1318.6812744141,,, +30.7871093750,492,1317.9487304688,,, +30.7890625000,492,1316.4835205078,,, +30.7910156250,492,1315.0183105469,,, +30.7929687500,492,1315.0183105469,,, +30.7949218750,492,1315.0183105469,,, +30.7968750000,492,1312.8205566406,,, +30.7988281250,492,1311.3553466797,,, +30.8007812500,492,1311.3553466797,,, +30.8027343750,492,1311.3553466797,,, +30.8046875000,492,1311.3553466797,,, +30.8066406250,492,1311.3553466797,,, +30.8085937500,492,1310.6226806641,,, +30.8105468750,492,1310.6226806641,,, +30.8125000000,493,1310.6226806641,,, +30.8144531250,493,1309.1574707031,,, +30.8164062500,493,1308.4249267578,,, +30.8183593750,493,1307.6922607422,,, +30.8203125000,493,1308.4249267578,,, +30.8222656250,493,1308.4249267578,,, +30.8242187500,493,1307.6922607422,,, +30.8261718750,493,1306.9597167969,,, +30.8281250000,493,1305.4945068359,,, +30.8300781250,493,1304.7619628906,,, +30.8320312500,493,1304.0292968750,,, +30.8339843750,493,1302.5640869141,,, +30.8359375000,493,1300.3663330078,,, +30.8378906250,493,1300.3663330078,,, +30.8398437500,493,1301.0988769531,,, +30.8417968750,493,1301.8315429688,,, +30.8437500000,493,1301.0988769531,,, +30.8457031250,493,1301.0988769531,,, +30.8476562500,493,1301.0988769531,,, +30.8496093750,493,1301.8315429688,,, +30.8515625000,493,1303.2967529297,,, +30.8535156250,493,1303.2967529297,,, +30.8554687500,493,1304.0292968750,,, +30.8574218750,493,1305.4945068359,,, +30.8593750000,493,1306.2270507812,,, +30.8613281250,493,1309.8901367188,,, +30.8632812500,493,1312.8205566406,,, +30.8652343750,493,1315.0183105469,,, +30.8671875000,493,1318.6812744141,,, +30.8691406250,493,1322.3443603516,,, +30.8710937500,493,1327.4725341797,,, +30.8730468750,493,1333.3333740234,,, +30.8750000000,494,1337.7288818359,,, +30.8769531250,494,1342.1245117188,,, +30.8789062500,494,1349.4505615234,,, +30.8808593750,494,1358.9743652344,,, +30.8828125000,494,1367.0329589844,,, +30.8847656250,494,1375.8242187500,,, +30.8867187500,494,1386.8132324219,,, +30.8886718750,494,1396.3370361328,,, +30.8906250000,494,1408.0585937500,,, +30.8925781250,494,1422.7105712891,,, +30.8945312500,494,1436.6300048828,,, +30.8964843750,494,1449.8168945312,,, +30.8984375000,494,1465.2014160156,,, +30.9003906250,494,1479.8535156250,,, +30.9023437500,494,1495.9707031250,,, +30.9042968750,494,1512.8205566406,,, +30.9062500000,494,1530.4029541016,,, +30.9082031250,494,1548.7178955078,,, +30.9101562500,494,1564.8352050781,,, +30.9121093750,494,1581.6849365234,,, +30.9140625000,494,1599.2674560547,,, +30.9160156250,494,1616.8498535156,,, +30.9179687500,494,1635.1647949219,,, +30.9199218750,494,1654.2124023438,,, +30.9218750000,494,1671.7949218750,,, +30.9238281250,494,1688.6446533203,,, +30.9257812500,494,1704.7619628906,,, +30.9277343750,494,1756.7766113281,,, +30.9296875000,494,1772.8937988281,,, +30.9316406250,494,1788.2784423828,,, +30.9335937500,494,1803.6629638672,,, +30.9355468750,494,1818.3150634766,,, +30.9375000000,495,1832.9670410156,,, +30.9394531250,495,1846.8864746094,,, +30.9414062500,495,1860.8059082031,,, +30.9433593750,495,1873.9926757812,,, +30.9453125000,495,1885.7142333984,,, +30.9472656250,495,1895.9707031250,,, +30.9492187500,495,1908.4249267578,,, +30.9511718750,495,1920.1464843750,,, +30.9531250000,495,1929.6702880859,,, +30.9550781250,495,1937.7288818359,,, +30.9570312500,495,1944.3223876953,,, +30.9589843750,495,1950.1831054688,,, +30.9609375000,495,1955.3114013672,,, +30.9628906250,495,1960.4395751953,,, +30.9648437500,495,1964.1025390625,,, +30.9667968750,495,1967.7656250000,,, +30.9687500000,495,1968.4981689453,,, +30.9707031250,495,1967.0329589844,,, +30.9726562500,495,1967.0329589844,,, +30.9746093750,495,1966.3004150391,,, +30.9765625000,495,1965.5677490234,,, +30.9785156250,495,1962.6373291016,,, +30.9804687500,495,1957.5091552734,,, +30.9824218750,495,1952.3809814453,,, +30.9843750000,495,1945.7875976562,,, +30.9863281250,495,1939.9267578125,,, +30.9882812500,495,1933.3333740234,,, +30.9902343750,495,1924.5421142578,,, +30.9921875000,495,1914.2857666016,,, +30.9941406250,495,1904.7619628906,,, +30.9960937500,495,1895.2380371094,,, +30.9980468750,495,1885.7142333984,,, +31.0000000000,496,1874.7252197266,,, +31.0019531250,496,1862.2711181641,,, +31.0039062500,496,1849.0842285156,,, +31.0058593750,496,1837.3626708984,,, +31.0078125000,496,1824.9084472656,,, +31.0097656250,496,1813.1867675781,,, +31.0117187500,496,1800.0000000000,,, +31.0136718750,496,1784.6153564453,,, +31.0156250000,496,1769.9633789062,,, +31.0175781250,496,1756.7766113281,,, +31.0195312500,496,1744.3223876953,,, +31.0214843750,496,1731.1354980469,,, +31.0234375000,496,1715.7509765625,,, +31.0253906250,496,1701.0988769531,,, +31.0273437500,496,1686.4468994141,,, +31.0292968750,496,1673.2601318359,,, +31.0312500000,496,1659.3406982422,,, +31.0332031250,496,1645.4212646484,,, +31.0351562500,496,1631.5018310547,,, +31.0371093750,496,1616.8498535156,,, +31.0390625000,496,1602.9304199219,,, +31.0410156250,496,1590.4761962891,,, +31.0429687500,496,1579.4871826172,,, +31.0449218750,496,1569.2307128906,,, +31.0468750000,496,1557.5091552734,,, +31.0488281250,496,1545.7875976562,,, +31.0507812500,496,1536.2637939453,,, +31.0527343750,496,1527.4725341797,,, +31.0546875000,496,1518.6812744141,,, +31.0566406250,496,1509.1574707031,,, +31.0585937500,496,1499.6336669922,,, +31.0605468750,496,1490.1098632812,,, +31.0625000000,497,1481.3187255859,,, +31.0644531250,497,1473.2601318359,,, +31.0664062500,497,1466.6666259766,,, +31.0683593750,497,1459.3406982422,,, +31.0703125000,497,1452.0146484375,,, +31.0722656250,497,1445.4212646484,,, +31.0742187500,497,1438.0952148438,,, +31.0761718750,497,1431.5018310547,,, +31.0781250000,497,1426.3736572266,,, +31.0800781250,497,1421.2453613281,,, +31.0820312500,497,1415.3846435547,,, +31.0839843750,497,1408.7912597656,,, +31.0859375000,497,1402.9304199219,,, +31.0878906250,497,1397.8022460938,,, +31.0898437500,497,1391.9414062500,,, +31.0917968750,497,1388.2784423828,,, +31.0937500000,497,1383.1501464844,,, +31.0957031250,497,1379.4871826172,,, +31.0976562500,497,1374.3590087891,,, +31.0996093750,497,1370.6959228516,,, +31.1015625000,497,1367.0329589844,,, +31.1035156250,497,1363.3699951172,,, +31.1054687500,497,1360.4395751953,,, +31.1074218750,497,1356.7766113281,,, +31.1093750000,497,1352.3809814453,,, +31.1113281250,497,1347.9853515625,,, +31.1132812500,497,1345.0549316406,,, +31.1152343750,497,1343.5897216797,,, +31.1171875000,497,1341.3919677734,,, +31.1191406250,497,1337.7288818359,,, +31.1210937500,497,1335.5311279297,,, +31.1230468750,497,1333.3333740234,,, +31.1250000000,498,1330.4029541016,,, +31.1269531250,498,1328.9377441406,,, +31.1289062500,498,1327.4725341797,,, +31.1308593750,498,1324.5421142578,,, +31.1328125000,498,1322.3443603516,,, +31.1347656250,498,1320.8791503906,,, +31.1367187500,498,1320.1464843750,,, +31.1386718750,498,1319.4139404297,,, +31.1406250000,498,1317.2160644531,,, +31.1425781250,498,1314.2857666016,,, +31.1445312500,498,1312.8205566406,,, +31.1464843750,498,1311.3553466797,,, +31.1484375000,498,1310.6226806641,,, +31.1503906250,498,1309.1574707031,,, +31.1523437500,498,1307.6922607422,,, +31.1542968750,498,1307.6922607422,,, +31.1562500000,498,1308.4249267578,,, +31.1582031250,498,1310.6226806641,,, +31.1601562500,498,1312.0878906250,,, +31.1621093750,498,1312.8205566406,,, +31.1640625000,498,1313.5531005859,,, +31.1660156250,498,1315.0183105469,,, +31.1679687500,498,1316.4835205078,,, +31.1699218750,498,1318.6812744141,,, +31.1718750000,498,1321.6116943359,,, +31.1738281250,498,1323.0769042969,,, +31.1757812500,498,1324.5421142578,,, +31.1777343750,498,1325.2747802734,,, +31.1796875000,498,1328.2050781250,,, +31.1816406250,498,1330.4029541016,,, +31.1835937500,498,1334.0659179688,,, +31.1855468750,498,1335.5311279297,,, +31.1875000000,499,1337.7288818359,,, +31.1894531250,499,1340.6593017578,,, +31.1914062500,499,1343.5897216797,,, +31.1933593750,499,1345.7875976562,,, +31.1953125000,499,1348.7178955078,,, +31.1972656250,499,1349.4505615234,,, +31.1992187500,499,1350.9157714844,,, +31.2011718750,499,1354.5787353516,,, +31.2031250000,499,1356.0439453125,,, +31.2050781250,499,1358.2416992188,,, +31.2070312500,499,1358.9743652344,,, +31.2089843750,499,1361.1721191406,,, +31.2109375000,499,1363.3699951172,,, +31.2128906250,499,1363.3699951172,,, +31.2148437500,499,1364.1025390625,,, +31.2167968750,499,1364.1025390625,,, +31.2187500000,499,1364.8352050781,,, +31.2207031250,499,1366.3004150391,,, +31.2226562500,499,1365.5677490234,,, +31.2246093750,499,1365.5677490234,,, +31.2265625000,499,1364.8352050781,,, +31.2285156250,499,1366.3004150391,,, +31.2304687500,499,1367.7656250000,,, +31.2324218750,499,1367.0329589844,,, +31.2343750000,499,1367.7656250000,,, +31.2363281250,499,1368.4981689453,,, +31.2382812500,499,1370.6959228516,,, +31.2402343750,499,1369.9633789062,,, +31.2421875000,499,1369.2307128906,,, +31.2441406250,499,1368.4981689453,,, +31.2460937500,499,1368.4981689453,,, +31.2480468750,499,1368.4981689453,,, +31.2500000000,500,1366.3004150391,,, +31.2519531250,500,1365.5677490234,,, +31.2539062500,500,1364.8352050781,,, +31.2558593750,500,1365.5677490234,,, +31.2578125000,500,1364.8352050781,,, +31.2597656250,500,1362.6373291016,,, +31.2617187500,500,1361.9047851562,,, +31.2636718750,500,1360.4395751953,,, +31.2656250000,500,1358.9743652344,,, +31.2675781250,500,1356.7766113281,,, +31.2695312500,500,1354.5787353516,,, +31.2714843750,500,1352.3809814453,,, +31.2734375000,500,1350.9157714844,,, +31.2753906250,500,1349.4505615234,,, +31.2773437500,500,1347.9853515625,,, +31.2792968750,500,1345.7875976562,,, +31.2812500000,500,1345.7875976562,,, +31.2832031250,500,1345.0549316406,,, +31.2851562500,500,1342.8571777344,,, +31.2871093750,500,1339.9267578125,,, +31.2890625000,500,1338.4615478516,,, +31.2910156250,500,1337.7288818359,,, +31.2929687500,500,1336.2637939453,,, +31.2949218750,500,1334.7985839844,,, +31.2968750000,500,1333.3333740234,,, +31.2988281250,500,1331.8681640625,,, +31.3007812500,500,1331.8681640625,,, +31.3027343750,500,1328.9377441406,,, +31.3046875000,500,1325.2747802734,,, +31.3066406250,500,1324.5421142578,,, +31.3085937500,500,1323.0769042969,,, +31.3105468750,500,1320.8791503906,,, +31.3125000000,501,1319.4139404297,,, +31.3144531250,501,1317.2160644531,,, +31.3164062500,501,1315.7509765625,,, +31.3183593750,501,1312.8205566406,,, +31.3203125000,501,1309.8901367188,,, +31.3222656250,501,1306.9597167969,,, +31.3242187500,501,1305.4945068359,,, +31.3261718750,501,1304.7619628906,,, +31.3281250000,501,1301.8315429688,,, +31.3300781250,501,1299.6336669922,,, +31.3320312500,501,1297.4359130859,,, +31.3339843750,501,1295.2380371094,,, +31.3359375000,501,1294.5054931641,,, +31.3378906250,501,1292.3077392578,,, +31.3398437500,501,1289.3773193359,,, +31.3417968750,501,1286.4468994141,,, +31.3437500000,501,1286.4468994141,,, +31.3457031250,501,1285.7142333984,,, +31.3476562500,501,1282.7839355469,,, +31.3496093750,501,1280.5860595703,,, +31.3515625000,501,1279.1208496094,,, +31.3535156250,501,1278.3883056641,,, +31.3554687500,501,1276.1904296875,,, +31.3574218750,501,1273.9926757812,,, +31.3593750000,501,1271.7949218750,,, +31.3613281250,501,1269.5970458984,,, +31.3632812500,501,1268.8645019531,,, +31.3652343750,501,1268.8645019531,,, +31.3671875000,501,1265.9340820312,,, +31.3691406250,501,1265.2014160156,,, +31.3710937500,501,1263.7362060547,,, +31.3730468750,501,1261.5384521484,,, +31.3750000000,502,1261.5384521484,,, +31.3769531250,502,1260.0732421875,,, +31.3789062500,502,1257.8754882812,,, +31.3808593750,502,1257.1428222656,,, +31.3828125000,502,1256.4102783203,,, +31.3847656250,502,1256.4102783203,,, +31.3867187500,502,1255.6776123047,,, +31.3886718750,502,1254.9450683594,,, +31.3906250000,502,1253.4798583984,,, +31.3925781250,502,1253.4798583984,,, +31.3945312500,502,1252.0146484375,,, +31.3964843750,502,1250.5494384766,,, +31.3984375000,502,1250.5494384766,,, +31.4003906250,502,1249.8168945312,,, +31.4023437500,502,1250.5494384766,,, +31.4042968750,502,1249.8168945312,,, +31.4062500000,502,1248.3516845703,,, +31.4082031250,502,1248.3516845703,,, +31.4101562500,502,1249.0842285156,,, +31.4121093750,502,1249.8168945312,,, +31.4140625000,502,1250.5494384766,,, +31.4160156250,502,1250.5494384766,,, +31.4179687500,502,1251.2821044922,,, +31.4199218750,502,1254.2124023438,,, +31.4218750000,502,1256.4102783203,,, +31.4238281250,502,1257.1428222656,,, +31.4257812500,502,1258.6080322266,,, +31.4277343750,502,1259.3406982422,,, +31.4296875000,502,1260.0732421875,,, +31.4316406250,502,1263.0036621094,,, +31.4335937500,502,1264.4688720703,,, +31.4355468750,502,1264.4688720703,,, +31.4375000000,503,1265.2014160156,,, +31.4394531250,503,1265.9340820312,,, +31.4414062500,503,1268.1318359375,,, +31.4433593750,503,1270.3297119141,,, +31.4453125000,503,1271.0622558594,,, +31.4472656250,503,1271.0622558594,,, +31.4492187500,503,1271.0622558594,,, +31.4511718750,503,1271.7949218750,,, +31.4531250000,503,1273.2601318359,,, +31.4550781250,503,1273.9926757812,,, +31.4570312500,503,1273.9926757812,,, +31.4589843750,503,1273.9926757812,,, +31.4609375000,503,1273.2601318359,,, +31.4628906250,503,1275.4578857422,,, +31.4648437500,503,1276.1904296875,,, +31.4667968750,503,1276.9230957031,,, +31.4687500000,503,1276.9230957031,,, +31.4707031250,503,1278.3883056641,,, +31.4726562500,503,1280.5860595703,,, +31.4746093750,503,1280.5860595703,,, +31.4765625000,503,1280.5860595703,,, +31.4785156250,503,1280.5860595703,,, +31.4804687500,503,1281.3187255859,,, +31.4824218750,503,1284.2490234375,,, +31.4843750000,503,1285.7142333984,,, +31.4863281250,503,1286.4468994141,,, +31.4882812500,503,1287.9121093750,,, +31.4902343750,503,1288.6446533203,,, +31.4921875000,503,1290.1098632812,,, +31.4941406250,503,1293.0402832031,,, +31.4960937500,503,1294.5054931641,,, +31.4980468750,503,1294.5054931641,,, +31.5000000000,504,1297.4359130859,,, +31.5019531250,504,1301.0988769531,,, +31.5039062500,504,1302.5640869141,,, +31.5058593750,504,1304.0292968750,,, +31.5078125000,504,1305.4945068359,,, +31.5097656250,504,1306.9597167969,,, +31.5117187500,504,1307.6922607422,,, +31.5136718750,504,1309.1574707031,,, +31.5156250000,504,1309.1574707031,,, +31.5175781250,504,1311.3553466797,,, +31.5195312500,504,1313.5531005859,,, +31.5214843750,504,1314.2857666016,,, +31.5234375000,504,1315.7509765625,,, +31.5253906250,504,1317.2160644531,,, +31.5273437500,504,1319.4139404297,,, +31.5292968750,504,1321.6116943359,,, +31.5312500000,504,1322.3443603516,,, +31.5332031250,504,1322.3443603516,,, +31.5351562500,504,1323.0769042969,,, +31.5371093750,504,1326.0073242188,,, +31.5390625000,504,1326.7398681641,,, +31.5410156250,504,1327.4725341797,,, +31.5429687500,504,1328.2050781250,,, +31.5449218750,504,1330.4029541016,,, +31.5468750000,504,1331.8681640625,,, +31.5488281250,504,1331.1354980469,,, +31.5507812500,504,1331.1354980469,,, +31.5527343750,504,1331.8681640625,,, +31.5546875000,504,1333.3333740234,,, +31.5566406250,504,1334.0659179688,,, +31.5585937500,504,1333.3333740234,,, +31.5605468750,504,1331.8681640625,,, +31.5625000000,505,1331.8681640625,,, +31.5644531250,505,1331.8681640625,,, +31.5664062500,505,1331.1354980469,,, +31.5683593750,505,1329.6702880859,,, +31.5703125000,505,1328.2050781250,,, +31.5722656250,505,1327.4725341797,,, +31.5742187500,505,1327.4725341797,,, +31.5761718750,505,1326.7398681641,,, +31.5781250000,505,1324.5421142578,,, +31.5800781250,505,1323.0769042969,,, +31.5820312500,505,1322.3443603516,,, +31.5839843750,505,1320.8791503906,,, +31.5859375000,505,1318.6812744141,,, +31.5878906250,505,1315.7509765625,,, +31.5898437500,505,1314.2857666016,,, +31.5917968750,505,1313.5531005859,,, +31.5937500000,505,1312.0878906250,,, +31.5957031250,505,1310.6226806641,,, +31.5976562500,505,1308.4249267578,,, +31.5996093750,505,1306.2270507812,,, +31.6015625000,505,1305.4945068359,,, +31.6035156250,505,1304.0292968750,,, +31.6054687500,505,1302.5640869141,,, +31.6074218750,505,1299.6336669922,,, +31.6093750000,505,1298.9011230469,,, +31.6113281250,505,1296.7032470703,,, +31.6132812500,505,1295.2380371094,,, +31.6152343750,505,1293.7729492188,,, +31.6171875000,505,1291.5750732422,,, +31.6191406250,505,1290.8425292969,,, +31.6210937500,505,1289.3773193359,,, +31.6230468750,505,1287.1794433594,,, +31.6250000000,506,1284.9816894531,,, +31.6269531250,506,1282.7839355469,,, +31.6289062500,506,1282.0512695312,,, +31.6308593750,506,1279.8535156250,,, +31.6328125000,506,1276.9230957031,,, +31.6347656250,506,1275.4578857422,,, +31.6367187500,506,1273.2601318359,,, +31.6386718750,506,1271.7949218750,,, +31.6406250000,506,1270.3297119141,,, +31.6425781250,506,1268.1318359375,,, +31.6445312500,506,1265.9340820312,,, +31.6464843750,506,1265.9340820312,,, +31.6484375000,506,1265.9340820312,,, +31.6503906250,506,1263.0036621094,,, +31.6523437500,506,1261.5384521484,,, +31.6542968750,506,1261.5384521484,,, +31.6562500000,506,1261.5384521484,,, +31.6582031250,506,1260.0732421875,,, +31.6601562500,506,1259.3406982422,,, +31.6621093750,506,1257.8754882812,,, +31.6640625000,506,1256.4102783203,,, +31.6660156250,506,1256.4102783203,,, +31.6679687500,506,1255.6776123047,,, +31.6699218750,506,1254.9450683594,,, +31.6718750000,506,1254.9450683594,,, +31.6738281250,506,1255.6776123047,,, +31.6757812500,506,1254.9450683594,,, +31.6777343750,506,1254.2124023438,,, +31.6796875000,506,1254.2124023438,,, +31.6816406250,506,1254.9450683594,,, +31.6835937500,506,1255.6776123047,,, +31.6855468750,506,1255.6776123047,,, +31.6875000000,507,1255.6776123047,,, +31.6894531250,507,1257.1428222656,,, +31.6914062500,507,1258.6080322266,,, +31.6933593750,507,1257.8754882812,,, +31.6953125000,507,1257.1428222656,,, +31.6972656250,507,1257.8754882812,,, +31.6992187500,507,1258.6080322266,,, +31.7011718750,507,1258.6080322266,,, +31.7031250000,507,1258.6080322266,,, +31.7050781250,507,1259.3406982422,,, +31.7070312500,507,1260.0732421875,,, +31.7089843750,507,1259.3406982422,,, +31.7109375000,507,1257.8754882812,,, +31.7128906250,507,1257.8754882812,,, +31.7148437500,507,1259.3406982422,,, +31.7167968750,507,1258.6080322266,,, +31.7187500000,507,1259.3406982422,,, +31.7207031250,507,1259.3406982422,,, +31.7226562500,507,1261.5384521484,,, +31.7246093750,507,1262.2711181641,,, +31.7265625000,507,1263.0036621094,,, +31.7285156250,507,1263.0036621094,,, +31.7304687500,507,1263.7362060547,,, +31.7324218750,507,1265.9340820312,,, +31.7343750000,507,1268.1318359375,,, +31.7363281250,507,1268.8645019531,,, +31.7382812500,507,1269.5970458984,,, +31.7402343750,507,1271.7949218750,,, +31.7421875000,507,1274.7252197266,,, +31.7441406250,507,1275.4578857422,,, +31.7460937500,507,1276.9230957031,,, +31.7480468750,507,1278.3883056641,,, +31.7500000000,508,1280.5860595703,,, +31.7519531250,508,1282.7839355469,,, +31.7539062500,508,1283.5164794922,,, +31.7558593750,508,1284.9816894531,,, +31.7578125000,508,1287.1794433594,,, +31.7597656250,508,1290.1098632812,,, +31.7617187500,508,1290.8425292969,,, +31.7636718750,508,1292.3077392578,,, +31.7656250000,508,1294.5054931641,,, +31.7675781250,508,1297.4359130859,,, +31.7695312500,508,1298.9011230469,,, +31.7714843750,508,1300.3663330078,,, +31.7734375000,508,1301.8315429688,,, +31.7753906250,508,1303.2967529297,,, +31.7773437500,508,1306.2270507812,,, +31.7792968750,508,1306.2270507812,,, +31.7812500000,508,1306.2270507812,,, +31.7832031250,508,1306.9597167969,,, +31.7851562500,508,1308.4249267578,,, +31.7871093750,508,1307.6922607422,,, +31.7890625000,508,1307.6922607422,,, +31.7910156250,508,1307.6922607422,,, +31.7929687500,508,1308.4249267578,,, +31.7949218750,508,1309.1574707031,,, +31.7968750000,508,1308.4249267578,,, +31.7988281250,508,1307.6922607422,,, +31.8007812500,508,1306.9597167969,,, +31.8027343750,508,1308.4249267578,,, +31.8046875000,508,1306.9597167969,,, +31.8066406250,508,1306.2270507812,,, +31.8085937500,508,1306.2270507812,,, +31.8105468750,508,1306.2270507812,,, +31.8125000000,509,1306.2270507812,,, +31.8144531250,509,1305.4945068359,,, +31.8164062500,509,1304.7619628906,,, +31.8183593750,509,1303.2967529297,,, +31.8203125000,509,1304.0292968750,,, +31.8222656250,509,1304.0292968750,,, +31.8242187500,509,1302.5640869141,,, +31.8261718750,509,1301.8315429688,,, +31.8281250000,509,1300.3663330078,,, +31.8300781250,509,1300.3663330078,,, +31.8320312500,509,1298.1684570312,,, +31.8339843750,509,1296.7032470703,,, +31.8359375000,509,1295.2380371094,,, +31.8378906250,509,1293.7729492188,,, +31.8398437500,509,1293.7729492188,,, +31.8417968750,509,1291.5750732422,,, +31.8437500000,509,1289.3773193359,,, +31.8457031250,509,1288.6446533203,,, +31.8476562500,509,1289.3773193359,,, +31.8496093750,509,1287.1794433594,,, +31.8515625000,509,1286.4468994141,,, +31.8535156250,509,1286.4468994141,,, +31.8554687500,509,1287.9121093750,,, +31.8574218750,509,1288.6446533203,,, +31.8593750000,509,1290.1098632812,,, +31.8613281250,509,1291.5750732422,,, +31.8632812500,509,1294.5054931641,,, +31.8652343750,509,1296.7032470703,,, +31.8671875000,509,1299.6336669922,,, +31.8691406250,509,1303.2967529297,,, +31.8710937500,509,1309.1574707031,,, +31.8730468750,509,1315.0183105469,,, +31.8750000000,510,1320.8791503906,,, +31.8769531250,510,1328.2050781250,,, +31.8789062500,510,1336.2637939453,,, +31.8808593750,510,1345.0549316406,,, +31.8828125000,510,1353.1135253906,,, +31.8847656250,510,1362.6373291016,,, +31.8867187500,510,1374.3590087891,,, +31.8886718750,510,1385.3480224609,,, +31.8906250000,510,1397.0695800781,,, +31.8925781250,510,1409.5238037109,,, +31.8945312500,510,1424.1757812500,,, +31.8964843750,510,1438.0952148438,,, +31.8984375000,510,1452.0146484375,,, +31.9003906250,510,1467.3992919922,,, +31.9023437500,510,1485.7142333984,,, +31.9042968750,510,1501.0988769531,,, +31.9062500000,510,1517.2160644531,,, +31.9082031250,510,1535.5311279297,,, +31.9101562500,510,1554.5787353516,,, +31.9121093750,510,1572.1611328125,,, +31.9140625000,510,1589.7435302734,,, +31.9160156250,510,1608.0585937500,,, +31.9179687500,510,1628.5714111328,,, +31.9199218750,510,1647.6190185547,,, +31.9218750000,510,1665.9340820312,,, +31.9238281250,510,1684.9816894531,,, +31.9257812500,510,1703.2967529297,,, +31.9277343750,510,1723.0769042969,,, +31.9296875000,510,1742.1245117188,,, +31.9316406250,510,1759.7069091797,,, +31.9335937500,510,1778.0219726562,,, +31.9355468750,510,1797.0695800781,,, +31.9375000000,511,1813.1867675781,,, +31.9394531250,511,1829.3040771484,,, +31.9414062500,511,1844.6885986328,,, +31.9433593750,511,1860.0732421875,,, +31.9453125000,511,1872.5274658203,,, +31.9472656250,511,1884.2490234375,,, +31.9492187500,511,1896.7032470703,,, +31.9511718750,511,1908.4249267578,,, +31.9531250000,511,1917.9487304688,,, +31.9550781250,511,1926.7398681641,,, +31.9570312500,511,1935.5311279297,,, +31.9589843750,511,1942.8571777344,,, +31.9609375000,511,1948.7178955078,,, +31.9628906250,511,1952.3809814453,,, +31.9648437500,511,1958.2416992188,,, +31.9667968750,511,1961.1721191406,,, +31.9687500000,511,1961.1721191406,,, +31.9707031250,511,1961.1721191406,,, +31.9726562500,511,1961.1721191406,,, +31.9746093750,511,1958.9743652344,,, +31.9765625000,511,1957.5091552734,,, +31.9785156250,511,1953.1135253906,,, +31.9804687500,511,1946.5201416016,,, +31.9824218750,511,1940.6593017578,,, +31.9843750000,511,1935.5311279297,,, +31.9863281250,511,1928.9377441406,,, +31.9882812500,511,1920.1464843750,,, +31.9902343750,511,1910.6226806641,,, +31.9921875000,511,1901.8315429688,,, +31.9941406250,511,1893.0402832031,,, +31.9960937500,511,1884.2490234375,,, +31.9980468750,511,1873.2601318359,,, +32.0000000000,512,1860.8059082031,,, +32.0019531250,512,1849.8168945312,,, +32.0039062500,512,1838.8278808594,,, +32.0058593750,512,1827.8388671875,,, +32.0078125000,512,1814.6519775391,,, +32.0097656250,512,1802.1977539062,,, +32.0117187500,512,1789.7435302734,,, +32.0136718750,512,1778.0219726562,,, +32.0156250000,512,1764.1025390625,,, +32.0175781250,512,1750.1831054688,,, +32.0195312500,512,1736.9963378906,,, +32.0214843750,512,1724.5421142578,,, +32.0234375000,512,1710.6226806641,,, +32.0253906250,512,1695.9707031250,,, +32.0273437500,512,1682.7839355469,,, +32.0292968750,512,1670.3297119141,,, +32.0312500000,512,1656.4102783203,,, +32.0332031250,512,1642.4908447266,,, +32.0351562500,512,1628.5714111328,,, +32.0371093750,512,1616.1171875000,,, +32.0390625000,512,1603.6629638672,,, +32.0410156250,512,1590.4761962891,,, +32.0429687500,512,1576.5567626953,,, +32.0449218750,512,1564.8352050781,,, +32.0468750000,512,1554.5787353516,,, +32.0488281250,512,1542.1245117188,,, +32.0507812500,512,1530.4029541016,,, +32.0527343750,512,1520.1464843750,,, +32.0546875000,512,1510.6226806641,,, +32.0566406250,512,1500.3663330078,,, +32.0585937500,512,1490.1098632812,,, +32.0605468750,512,1479.8535156250,,, +32.0625000000,513,1471.0622558594,,, +32.0644531250,513,1462.2711181641,,, +32.0664062500,513,1453.4798583984,,, +32.0683593750,513,1444.6885986328,,, +32.0703125000,513,1436.6300048828,,, +32.0722656250,513,1430.7692871094,,, +32.0742187500,513,1424.1757812500,,, +32.0761718750,513,1416.1171875000,,, +32.0781250000,513,1409.5238037109,,, +32.0800781250,513,1403.6629638672,,, +32.0820312500,513,1399.2674560547,,, +32.0839843750,513,1394.1391601562,,, +32.0859375000,513,1389.0109863281,,, +32.0878906250,513,1384.6153564453,,, +32.0898437500,513,1381.6849365234,,, +32.0917968750,513,1378.0219726562,,, +32.0937500000,513,1373.6263427734,,, +32.0957031250,513,1369.9633789062,,, +32.0976562500,513,1365.5677490234,,, +32.0996093750,513,1361.9047851562,,, +32.1015625000,513,1358.9743652344,,, +32.1035156250,513,1356.7766113281,,, +32.1054687500,513,1352.3809814453,,, +32.1074218750,513,1348.7178955078,,, +32.1093750000,513,1345.0549316406,,, +32.1113281250,513,1342.1245117188,,, +32.1132812500,513,1340.6593017578,,, +32.1152343750,513,1339.1940917969,,, +32.1171875000,513,1336.9963378906,,, +32.1191406250,513,1334.7985839844,,, +32.1210937500,513,1331.8681640625,,, +32.1230468750,513,1330.4029541016,,, +32.1250000000,514,1328.2050781250,,, +32.1269531250,514,1328.9377441406,,, +32.1289062500,514,1328.2050781250,,, +32.1308593750,514,1326.7398681641,,, +32.1328125000,514,1325.2747802734,,, +32.1347656250,514,1325.2747802734,,, +32.1367187500,514,1324.5421142578,,, +32.1386718750,514,1325.2747802734,,, +32.1406250000,514,1326.7398681641,,, +32.1425781250,514,1326.7398681641,,, +32.1445312500,514,1325.2747802734,,, +32.1464843750,514,1325.2747802734,,, +32.1484375000,514,1325.2747802734,,, +32.1503906250,514,1325.2747802734,,, +32.1523437500,514,1325.2747802734,,, +32.1542968750,514,1327.4725341797,,, +32.1562500000,514,1328.2050781250,,, +32.1582031250,514,1328.2050781250,,, +32.1601562500,514,1328.2050781250,,, +32.1621093750,514,1327.4725341797,,, +32.1640625000,514,1327.4725341797,,, +32.1660156250,514,1328.9377441406,,, +32.1679687500,514,1330.4029541016,,, +32.1699218750,514,1330.4029541016,,, +32.1718750000,514,1331.1354980469,,, +32.1738281250,514,1331.1354980469,,, +32.1757812500,514,1331.8681640625,,, +32.1777343750,514,1333.3333740234,,, +32.1796875000,514,1334.0659179688,,, +32.1816406250,514,1334.7985839844,,, +32.1835937500,514,1335.5311279297,,, +32.1855468750,514,1337.7288818359,,, +32.1875000000,515,1339.9267578125,,, +32.1894531250,515,1341.3919677734,,, +32.1914062500,515,1342.8571777344,,, +32.1933593750,515,1344.3223876953,,, +32.1953125000,515,1347.2528076172,,, +32.1972656250,515,1350.1831054688,,, +32.1992187500,515,1351.6483154297,,, +32.2011718750,515,1351.6483154297,,, +32.2031250000,515,1353.1135253906,,, +32.2050781250,515,1356.0439453125,,, +32.2070312500,515,1358.2416992188,,, +32.2089843750,515,1358.9743652344,,, +32.2109375000,515,1361.1721191406,,, +32.2128906250,515,1362.6373291016,,, +32.2148437500,515,1364.8352050781,,, +32.2167968750,515,1366.3004150391,,, +32.2187500000,515,1367.7656250000,,, +32.2207031250,515,1368.4981689453,,, +32.2226562500,515,1369.9633789062,,, +32.2246093750,515,1372.1611328125,,, +32.2265625000,515,1373.6263427734,,, +32.2285156250,515,1372.8937988281,,, +32.2304687500,515,1373.6263427734,,, +32.2324218750,515,1374.3590087891,,, +32.2343750000,515,1375.0915527344,,, +32.2363281250,515,1374.3590087891,,, +32.2382812500,515,1373.6263427734,,, +32.2402343750,515,1373.6263427734,,, +32.2421875000,515,1373.6263427734,,, +32.2441406250,515,1373.6263427734,,, +32.2460937500,515,1372.8937988281,,, +32.2480468750,515,1371.4285888672,,, +32.2500000000,516,1372.1611328125,,, +32.2519531250,516,1372.1611328125,,, +32.2539062500,516,1370.6959228516,,, +32.2558593750,516,1368.4981689453,,, +32.2578125000,516,1368.4981689453,,, +32.2597656250,516,1367.0329589844,,, +32.2617187500,516,1365.5677490234,,, +32.2636718750,516,1364.1025390625,,, +32.2656250000,516,1362.6373291016,,, +32.2675781250,516,1361.9047851562,,, +32.2695312500,516,1359.7069091797,,, +32.2714843750,516,1356.7766113281,,, +32.2734375000,516,1355.3114013672,,, +32.2753906250,516,1355.3114013672,,, +32.2773437500,516,1353.8461914062,,, +32.2792968750,516,1351.6483154297,,, +32.2812500000,516,1350.1831054688,,, +32.2832031250,516,1348.7178955078,,, +32.2851562500,516,1347.9853515625,,, +32.2871093750,516,1345.0549316406,,, +32.2890625000,516,1342.1245117188,,, +32.2910156250,516,1339.9267578125,,, +32.2929687500,516,1338.4615478516,,, +32.2949218750,516,1336.2637939453,,, +32.2968750000,516,1333.3333740234,,, +32.2988281250,516,1330.4029541016,,, +32.3007812500,516,1328.9377441406,,, +32.3027343750,516,1326.7398681641,,, +32.3046875000,516,1322.3443603516,,, +32.3066406250,516,1318.6812744141,,, +32.3085937500,516,1315.7509765625,,, +32.3105468750,516,1314.2857666016,,, +32.3125000000,517,1312.0878906250,,, +32.3144531250,517,1309.1574707031,,, +32.3164062500,517,1306.2270507812,,, +32.3183593750,517,1304.7619628906,,, +32.3203125000,517,1303.2967529297,,, +32.3222656250,517,1300.3663330078,,, +32.3242187500,517,1298.1684570312,,, +32.3261718750,517,1296.7032470703,,, +32.3281250000,517,1295.9707031250,,, +32.3300781250,517,1293.7729492188,,, +32.3320312500,517,1292.3077392578,,, +32.3339843750,517,1290.1098632812,,, +32.3359375000,517,1290.1098632812,,, +32.3378906250,517,1287.9121093750,,, +32.3398437500,517,1286.4468994141,,, +32.3417968750,517,1286.4468994141,,, +32.3437500000,517,1286.4468994141,,, +32.3457031250,517,1285.7142333984,,, +32.3476562500,517,1284.9816894531,,, +32.3496093750,517,1284.2490234375,,, +32.3515625000,517,1284.2490234375,,, +32.3535156250,517,1284.2490234375,,, +32.3554687500,517,1282.7839355469,,, +32.3574218750,517,1282.7839355469,,, +32.3593750000,517,1281.3187255859,,, +32.3613281250,517,1281.3187255859,,, +32.3632812500,517,1282.0512695312,,, +32.3652343750,517,1279.8535156250,,, +32.3671875000,517,1277.6556396484,,, +32.3691406250,517,1276.9230957031,,, +32.3710937500,517,1276.1904296875,,, +32.3730468750,517,1275.4578857422,,, +32.3750000000,518,1274.7252197266,,, +32.3769531250,518,1272.5274658203,,, +32.3789062500,518,1271.0622558594,,, +32.3808593750,518,1270.3297119141,,, +32.3828125000,518,1268.8645019531,,, +32.3847656250,518,1266.6666259766,,, +32.3867187500,518,1265.9340820312,,, +32.3886718750,518,1265.9340820312,,, +32.3906250000,518,1263.0036621094,,, +32.3925781250,518,1261.5384521484,,, +32.3945312500,518,1260.0732421875,,, +32.3964843750,518,1260.0732421875,,, +32.3984375000,518,1259.3406982422,,, +32.4003906250,518,1257.8754882812,,, +32.4023437500,518,1256.4102783203,,, +32.4042968750,518,1254.9450683594,,, +32.4062500000,518,1254.9450683594,,, +32.4082031250,518,1253.4798583984,,, +32.4101562500,518,1253.4798583984,,, +32.4121093750,518,1252.0146484375,,, +32.4140625000,518,1252.7471923828,,, +32.4160156250,518,1252.7471923828,,, +32.4179687500,518,1252.0146484375,,, +32.4199218750,518,1252.0146484375,,, +32.4218750000,518,1251.2821044922,,, +32.4238281250,518,1252.0146484375,,, +32.4257812500,518,1252.0146484375,,, +32.4277343750,518,1252.0146484375,,, +32.4296875000,518,1252.7471923828,,, +32.4316406250,518,1253.4798583984,,, +32.4335937500,518,1254.2124023438,,, +32.4355468750,518,1254.2124023438,,, +32.4375000000,519,1254.9450683594,,, +32.4394531250,519,1255.6776123047,,, +32.4414062500,519,1257.1428222656,,, +32.4433593750,519,1258.6080322266,,, +32.4453125000,519,1259.3406982422,,, +32.4472656250,519,1259.3406982422,,, +32.4492187500,519,1260.8059082031,,, +32.4511718750,519,1263.7362060547,,, +32.4531250000,519,1263.7362060547,,, +32.4550781250,519,1265.2014160156,,, +32.4570312500,519,1266.6666259766,,, +32.4589843750,519,1268.8645019531,,, +32.4609375000,519,1269.5970458984,,, +32.4628906250,519,1270.3297119141,,, +32.4648437500,519,1271.7949218750,,, +32.4667968750,519,1273.9926757812,,, +32.4687500000,519,1276.1904296875,,, +32.4707031250,519,1276.9230957031,,, +32.4726562500,519,1278.3883056641,,, +32.4746093750,519,1279.1208496094,,, +32.4765625000,519,1282.0512695312,,, +32.4785156250,519,1282.7839355469,,, +32.4804687500,519,1283.5164794922,,, +32.4824218750,519,1285.7142333984,,, +32.4843750000,519,1288.6446533203,,, +32.4863281250,519,1290.8425292969,,, +32.4882812500,519,1292.3077392578,,, +32.4902343750,519,1293.7729492188,,, +32.4921875000,519,1295.2380371094,,, +32.4941406250,519,1297.4359130859,,, +32.4960937500,519,1298.1684570312,,, +32.4980468750,519,1298.1684570312,,, +32.5000000000,520,1298.1684570312,,, +32.5019531250,520,1298.1684570312,,, +32.5039062500,520,1298.9011230469,,, +32.5058593750,520,1298.9011230469,,, +32.5078125000,520,1298.1684570312,,, +32.5097656250,520,1297.4359130859,,, +32.5117187500,520,1297.4359130859,,, +32.5136718750,520,1298.9011230469,,, +32.5156250000,520,1298.1684570312,,, +32.5175781250,520,1297.4359130859,,, +32.5195312500,520,1297.4359130859,,, +32.5214843750,520,1297.4359130859,,, +32.5234375000,520,1296.7032470703,,, +32.5253906250,520,1295.9707031250,,, +32.5273437500,520,1295.9707031250,,, +32.5292968750,520,1295.9707031250,,, +32.5312500000,520,1295.9707031250,,, +32.5332031250,520,1295.9707031250,,, +32.5351562500,520,1295.9707031250,,, +32.5371093750,520,1295.2380371094,,, +32.5390625000,520,1293.7729492188,,, +32.5410156250,520,1293.7729492188,,, +32.5429687500,520,1293.7729492188,,, +32.5449218750,520,1294.5054931641,,, +32.5468750000,520,1295.2380371094,,, +32.5488281250,520,1293.7729492188,,, +32.5507812500,520,1293.7729492188,,, +32.5527343750,520,1293.7729492188,,, +32.5546875000,520,1293.0402832031,,, +32.5566406250,520,1294.5054931641,,, +32.5585937500,520,1294.5054931641,,, +32.5605468750,520,1293.0402832031,,, +32.5625000000,521,1291.5750732422,,, +32.5644531250,521,1290.1098632812,,, +32.5664062500,521,1288.6446533203,,, +32.5683593750,521,1288.6446533203,,, +32.5703125000,521,1288.6446533203,,, +32.5722656250,521,1288.6446533203,,, +32.5742187500,521,1287.1794433594,,, +32.5761718750,521,1284.9816894531,,, +32.5781250000,521,1282.7839355469,,, +32.5800781250,521,1280.5860595703,,, +32.5820312500,521,1280.5860595703,,, +32.5839843750,521,1279.1208496094,,, +32.5859375000,521,1278.3883056641,,, +32.5878906250,521,1277.6556396484,,, +32.5898437500,521,1275.4578857422,,, +32.5917968750,521,1275.4578857422,,, +32.5937500000,521,1275.4578857422,,, +32.5957031250,521,1276.1904296875,,, +32.5976562500,521,1275.4578857422,,, +32.5996093750,521,1274.7252197266,,, +32.6015625000,521,1275.4578857422,,, +32.6035156250,521,1275.4578857422,,, +32.6054687500,521,1276.9230957031,,, +32.6074218750,521,1276.1904296875,,, +32.6093750000,521,1276.1904296875,,, +32.6113281250,521,1276.9230957031,,, +32.6132812500,521,1279.8535156250,,, +32.6152343750,521,1279.8535156250,,, +32.6171875000,521,1279.1208496094,,, +32.6191406250,521,1279.8535156250,,, +32.6210937500,521,1280.5860595703,,, +32.6230468750,521,1281.3187255859,,, +32.6250000000,522,1281.3187255859,,, +32.6269531250,522,1280.5860595703,,, +32.6289062500,522,1282.0512695312,,, +32.6308593750,522,1282.7839355469,,, +32.6328125000,522,1282.0512695312,,, +32.6347656250,522,1282.0512695312,,, +32.6367187500,522,1282.7839355469,,, +32.6386718750,522,1284.2490234375,,, +32.6406250000,522,1283.5164794922,,, +32.6425781250,522,1282.7839355469,,, +32.6445312500,522,1283.5164794922,,, +32.6464843750,522,1284.2490234375,,, +32.6484375000,522,1284.2490234375,,, +32.6503906250,522,1284.9816894531,,, +32.6523437500,522,1284.9816894531,,, +32.6542968750,522,1286.4468994141,,, +32.6562500000,522,1286.4468994141,,, +32.6582031250,522,1285.7142333984,,, +32.6601562500,522,1284.9816894531,,, +32.6621093750,522,1286.4468994141,,, +32.6640625000,522,1286.4468994141,,, +32.6660156250,522,1286.4468994141,,, +32.6679687500,522,1286.4468994141,,, +32.6699218750,522,1285.7142333984,,, +32.6718750000,522,1287.1794433594,,, +32.6738281250,522,1285.7142333984,,, +32.6757812500,522,1285.7142333984,,, +32.6777343750,522,1286.4468994141,,, +32.6796875000,522,1286.4468994141,,, +32.6816406250,522,1287.9121093750,,, +32.6835937500,522,1287.9121093750,,, +32.6855468750,522,1287.1794433594,,, +32.6875000000,523,1288.6446533203,,, +32.6894531250,523,1290.1098632812,,, +32.6914062500,523,1290.1098632812,,, +32.6933593750,523,1289.3773193359,,, +32.6953125000,523,1290.8425292969,,, +32.6972656250,523,1292.3077392578,,, +32.6992187500,523,1293.0402832031,,, +32.7011718750,523,1292.3077392578,,, +32.7031250000,523,1293.0402832031,,, +32.7050781250,523,1294.5054931641,,, +32.7070312500,523,1295.2380371094,,, +32.7089843750,523,1294.5054931641,,, +32.7109375000,523,1295.2380371094,,, +32.7128906250,523,1296.7032470703,,, +32.7148437500,523,1298.1684570312,,, +32.7167968750,523,1297.4359130859,,, +32.7187500000,523,1298.1684570312,,, +32.7207031250,523,1298.1684570312,,, +32.7226562500,523,1299.6336669922,,, +32.7246093750,523,1299.6336669922,,, +32.7265625000,523,1298.9011230469,,, +32.7285156250,523,1298.9011230469,,, +32.7304687500,523,1299.6336669922,,, +32.7324218750,523,1301.0988769531,,, +32.7343750000,523,1300.3663330078,,, +32.7363281250,523,1300.3663330078,,, +32.7382812500,523,1301.0988769531,,, +32.7402343750,523,1303.2967529297,,, +32.7421875000,523,1301.8315429688,,, +32.7441406250,523,1301.8315429688,,, +32.7460937500,523,1301.8315429688,,, +32.7480468750,523,1302.5640869141,,, +32.7500000000,524,1303.2967529297,,, +32.7519531250,524,1302.5640869141,,, +32.7539062500,524,1301.0988769531,,, +32.7558593750,524,1301.0988769531,,, +32.7578125000,524,1300.3663330078,,, +32.7597656250,524,1298.9011230469,,, +32.7617187500,524,1298.1684570312,,, +32.7636718750,524,1298.1684570312,,, +32.7656250000,524,1298.1684570312,,, +32.7675781250,524,1298.9011230469,,, +32.7695312500,524,1298.9011230469,,, +32.7714843750,524,1298.1684570312,,, +32.7734375000,524,1297.4359130859,,, +32.7753906250,524,1298.9011230469,,, +32.7773437500,524,1298.1684570312,,, +32.7792968750,524,1296.7032470703,,, +32.7812500000,524,1296.7032470703,,, +32.7832031250,524,1296.7032470703,,, +32.7851562500,524,1296.7032470703,,, +32.7871093750,524,1296.7032470703,,, +32.7890625000,524,1295.9707031250,,, +32.7910156250,524,1298.1684570312,,, +32.7929687500,524,1298.1684570312,,, +32.7949218750,524,1297.4359130859,,, +32.7968750000,524,1297.4359130859,,, +32.7988281250,524,1297.4359130859,,, +32.8007812500,524,1298.1684570312,,, +32.8027343750,524,1299.6336669922,,, +32.8046875000,524,1299.6336669922,,, +32.8066406250,524,1300.3663330078,,, +32.8085937500,524,1300.3663330078,,, +32.8105468750,524,1301.8315429688,,, +32.8125000000,525,1304.7619628906,,, +32.8144531250,525,1306.2270507812,,, +32.8164062500,525,1306.9597167969,,, +32.8183593750,525,1309.1574707031,,, +32.8203125000,525,1312.8205566406,,, +32.8222656250,525,1316.4835205078,,, +32.8242187500,525,1318.6812744141,,, +32.8261718750,525,1322.3443603516,,, +32.8281250000,525,1327.4725341797,,, +32.8300781250,525,1331.1354980469,,, +32.8320312500,525,1336.2637939453,,, +32.8339843750,525,1342.8571777344,,, +32.8359375000,525,1350.1831054688,,, +32.8378906250,525,1358.9743652344,,, +32.8398437500,525,1366.3004150391,,, +32.8417968750,525,1375.0915527344,,, +32.8437500000,525,1385.3480224609,,, +32.8457031250,525,1396.3370361328,,, +32.8476562500,525,1406.5933837891,,, +32.8496093750,525,1417.5823974609,,, +32.8515625000,525,1430.7692871094,,, +32.8535156250,525,1443.9560546875,,, +32.8554687500,525,1457.8754882812,,, +32.8574218750,525,1471.7949218750,,, +32.8593750000,525,1487.1794433594,,, +32.8613281250,525,1503.2967529297,,, +32.8632812500,525,1517.9487304688,,, +32.8652343750,525,1533.3333740234,,, +32.8671875000,525,1550.1831054688,,, +32.8691406250,525,1567.7656250000,,, +32.8710937500,525,1584.6153564453,,, +32.8730468750,525,1600.7325439453,,, +32.8750000000,526,1618.3150634766,,, +32.8769531250,526,1635.1647949219,,, +32.8789062500,526,1652.0146484375,,, +32.8808593750,526,1667.3992919922,,, +32.8828125000,526,1684.9816894531,,, +32.8847656250,526,1701.0988769531,,, +32.8867187500,526,1717.2160644531,,, +32.8886718750,526,1732.6007080078,,, +32.8906250000,526,1748.7178955078,,, +32.8925781250,526,1762.6373291016,,, +32.8945312500,526,1775.8242187500,,, +32.8964843750,526,1789.7435302734,,, +32.8984375000,526,1803.6629638672,,, +32.9003906250,526,1815.3846435547,,, +32.9023437500,526,1827.1062011719,,, +32.9042968750,526,1838.0952148438,,, +32.9062500000,526,1848.3516845703,,, +32.9082031250,526,1857.1428222656,,, +32.9101562500,526,1865.9340820312,,, +32.9121093750,526,1875.4578857422,,, +32.9140625000,526,1883.5164794922,,, +32.9160156250,526,1889.3773193359,,, +32.9179687500,526,1895.9707031250,,, +32.9199218750,526,1902.5640869141,,, +32.9218750000,526,1905.4945068359,,, +32.9238281250,526,1908.4249267578,,, +32.9257812500,526,1912.0878906250,,, +32.9277343750,526,1915.0183105469,,, +32.9296875000,526,1915.0183105469,,, +32.9316406250,526,1915.0183105469,,, +32.9335937500,526,1915.7509765625,,, +32.9355468750,526,1912.0878906250,,, +32.9375000000,527,1908.4249267578,,, +32.9394531250,527,1904.7619628906,,, +32.9414062500,527,1900.3663330078,,, +32.9433593750,527,1894.5054931641,,, +32.9453125000,527,1887.9121093750,,, +32.9472656250,527,1881.3187255859,,, +32.9492187500,527,1874.7252197266,,, +32.9511718750,527,1865.2014160156,,, +32.9531250000,527,1856.4102783203,,, +32.9550781250,527,1847.6190185547,,, +32.9570312500,527,1836.6300048828,,, +32.9589843750,527,1825.6409912109,,, +32.9609375000,527,1813.9194335938,,, +32.9628906250,527,1803.6629638672,,, +32.9648437500,527,1791.2087402344,,, +32.9667968750,527,1778.7546386719,,, +32.9687500000,527,1767.7656250000,,, +32.9707031250,527,1756.0439453125,,, +32.9726562500,527,1743.5897216797,,, +32.9746093750,527,1730.4029541016,,, +32.9765625000,527,1717.9487304688,,, +32.9785156250,527,1706.2270507812,,, +32.9804687500,527,1692.3077392578,,, +32.9824218750,527,1679.1208496094,,, +32.9843750000,527,1665.9340820312,,, +32.9863281250,527,1652.7471923828,,, +32.9882812500,527,1639.5604248047,,, +32.9902343750,527,1626.3736572266,,, +32.9921875000,527,1613.1867675781,,, +32.9941406250,527,1600.0000000000,,, +32.9960937500,527,1586.0805664062,,, +32.9980468750,527,1573.6263427734,,, +33.0000000000,528,1562.6373291016,,, +33.0019531250,528,1549.4505615234,,, +33.0039062500,528,1537.7288818359,,, +33.0058593750,528,1526.0073242188,,, +33.0078125000,528,1515.7509765625,,, +33.0097656250,528,1504.7619628906,,, +33.0117187500,528,1493.0402832031,,, +33.0136718750,528,1482.7839355469,,, +33.0156250000,528,1474.7252197266,,, +33.0175781250,528,1466.6666259766,,, +33.0195312500,528,1456.4102783203,,, +33.0214843750,528,1447.6190185547,,, +33.0234375000,528,1440.2930908203,,, +33.0253906250,528,1432.2343750000,,, +33.0273437500,528,1424.1757812500,,, +33.0292968750,528,1416.1171875000,,, +33.0312500000,528,1410.9890136719,,, +33.0332031250,528,1405.1281738281,,, +33.0351562500,528,1398.5347900391,,, +33.0371093750,528,1392.6739501953,,, +33.0390625000,528,1386.8132324219,,, +33.0410156250,528,1380.2197265625,,, +33.0429687500,528,1374.3590087891,,, +33.0449218750,528,1369.2307128906,,, +33.0468750000,528,1365.5677490234,,, +33.0488281250,528,1361.9047851562,,, +33.0507812500,528,1357.5091552734,,, +33.0527343750,528,1351.6483154297,,, +33.0546875000,528,1348.7178955078,,, +33.0566406250,528,1345.0549316406,,, +33.0585937500,528,1339.9267578125,,, +33.0605468750,528,1334.7985839844,,, +33.0625000000,529,1331.8681640625,,, +33.0644531250,529,1328.2050781250,,, +33.0664062500,529,1326.0073242188,,, +33.0683593750,529,1322.3443603516,,, +33.0703125000,529,1318.6812744141,,, +33.0722656250,529,1315.7509765625,,, +33.0742187500,529,1314.2857666016,,, +33.0761718750,529,1312.8205566406,,, +33.0781250000,529,1311.3553466797,,, +33.0800781250,529,1308.4249267578,,, +33.0820312500,529,1307.6922607422,,, +33.0839843750,529,1307.6922607422,,, +33.0859375000,529,1308.4249267578,,, +33.0878906250,529,1306.9597167969,,, +33.0898437500,529,1306.2270507812,,, +33.0917968750,529,1305.4945068359,,, +33.0937500000,529,1306.2270507812,,, +33.0957031250,529,1306.2270507812,,, +33.0976562500,529,1306.2270507812,,, +33.0996093750,529,1306.2270507812,,, +33.1015625000,529,1305.4945068359,,, +33.1035156250,529,1306.9597167969,,, +33.1054687500,529,1308.4249267578,,, +33.1074218750,529,1307.6922607422,,, +33.1093750000,529,1308.4249267578,,, +33.1113281250,529,1311.3553466797,,, +33.1132812500,529,1312.0878906250,,, +33.1152343750,529,1312.0878906250,,, +33.1171875000,529,1313.5531005859,,, +33.1191406250,529,1315.0183105469,,, +33.1210937500,529,1315.7509765625,,, +33.1230468750,529,1315.7509765625,,, +33.1250000000,530,1318.6812744141,,, +33.1269531250,530,1320.1464843750,,, +33.1289062500,530,1319.4139404297,,, +33.1308593750,530,1320.1464843750,,, +33.1328125000,530,1320.8791503906,,, +33.1347656250,530,1320.8791503906,,, +33.1367187500,530,1321.6116943359,,, +33.1386718750,530,1323.8095703125,,, +33.1406250000,530,1324.5421142578,,, +33.1425781250,530,1325.2747802734,,, +33.1445312500,530,1326.7398681641,,, +33.1464843750,530,1328.9377441406,,, +33.1484375000,530,1329.6702880859,,, +33.1503906250,530,1331.1354980469,,, +33.1523437500,530,1333.3333740234,,, +33.1542968750,530,1335.5311279297,,, +33.1562500000,530,1336.2637939453,,, +33.1582031250,530,1336.9963378906,,, +33.1601562500,530,1338.4615478516,,, +33.1621093750,530,1341.3919677734,,, +33.1640625000,530,1342.1245117188,,, +33.1660156250,530,1342.8571777344,,, +33.1679687500,530,1344.3223876953,,, +33.1699218750,530,1345.7875976562,,, +33.1718750000,530,1345.0549316406,,, +33.1738281250,530,1345.7875976562,,, +33.1757812500,530,1345.7875976562,,, +33.1777343750,530,1347.9853515625,,, +33.1796875000,530,1348.7178955078,,, +33.1816406250,530,1350.1831054688,,, +33.1835937500,530,1351.6483154297,,, +33.1855468750,530,1353.8461914062,,, +33.1875000000,531,1353.8461914062,,, +33.1894531250,531,1355.3114013672,,, +33.1914062500,531,1357.5091552734,,, +33.1933593750,531,1358.2416992188,,, +33.1953125000,531,1359.7069091797,,, +33.1972656250,531,1361.1721191406,,, +33.1992187500,531,1361.9047851562,,, +33.2011718750,531,1363.3699951172,,, +33.2031250000,531,1364.1025390625,,, +33.2050781250,531,1365.5677490234,,, +33.2070312500,531,1367.0329589844,,, +33.2089843750,531,1367.7656250000,,, +33.2109375000,531,1368.4981689453,,, +33.2128906250,531,1369.9633789062,,, +33.2148437500,531,1370.6959228516,,, +33.2167968750,531,1371.4285888672,,, +33.2187500000,531,1369.9633789062,,, +33.2207031250,531,1371.4285888672,,, +33.2226562500,531,1372.8937988281,,, +33.2246093750,531,1370.6959228516,,, +33.2265625000,531,1372.1611328125,,, +33.2285156250,531,1372.1611328125,,, +33.2304687500,531,1370.6959228516,,, +33.2324218750,531,1369.9633789062,,, +33.2343750000,531,1369.2307128906,,, +33.2363281250,531,1369.2307128906,,, +33.2382812500,531,1367.7656250000,,, +33.2402343750,531,1367.7656250000,,, +33.2421875000,531,1366.3004150391,,, +33.2441406250,531,1364.8352050781,,, +33.2460937500,531,1364.1025390625,,, +33.2480468750,531,1362.6373291016,,, +33.2500000000,532,1358.9743652344,,, +33.2519531250,532,1356.0439453125,,, +33.2539062500,532,1356.0439453125,,, +33.2558593750,532,1354.5787353516,,, +33.2578125000,532,1351.6483154297,,, +33.2597656250,532,1349.4505615234,,, +33.2617187500,532,1349.4505615234,,, +33.2636718750,532,1347.2528076172,,, +33.2656250000,532,1344.3223876953,,, +33.2675781250,532,1342.1245117188,,, +33.2695312500,532,1340.6593017578,,, +33.2714843750,532,1337.7288818359,,, +33.2734375000,532,1335.5311279297,,, +33.2753906250,532,1333.3333740234,,, +33.2773437500,532,1331.8681640625,,, +33.2792968750,532,1329.6702880859,,, +33.2812500000,532,1326.7398681641,,, +33.2832031250,532,1324.5421142578,,, +33.2851562500,532,1323.0769042969,,, +33.2871093750,532,1321.6116943359,,, +33.2890625000,532,1318.6812744141,,, +33.2910156250,532,1316.4835205078,,, +33.2929687500,532,1314.2857666016,,, +33.2949218750,532,1312.8205566406,,, +33.2968750000,532,1309.8901367188,,, +33.2988281250,532,1306.2270507812,,, +33.3007812500,532,1303.2967529297,,, +33.3027343750,532,1301.0988769531,,, +33.3046875000,532,1298.9011230469,,, +33.3066406250,532,1296.7032470703,,, +33.3085937500,532,1293.7729492188,,, +33.3105468750,532,1290.1098632812,,, +33.3125000000,533,1289.3773193359,,, +33.3144531250,533,1287.1794433594,,, +33.3164062500,533,1284.9816894531,,, +33.3183593750,533,1284.2490234375,,, +33.3203125000,533,1281.3187255859,,, +33.3222656250,533,1278.3883056641,,, +33.3242187500,533,1276.9230957031,,, +33.3261718750,533,1275.4578857422,,, +33.3281250000,533,1272.5274658203,,, +33.3300781250,533,1270.3297119141,,, +33.3320312500,533,1270.3297119141,,, +33.3339843750,533,1267.3992919922,,, +33.3359375000,533,1265.9340820312,,, +33.3378906250,533,1264.4688720703,,, +33.3398437500,533,1263.7362060547,,, +33.3417968750,533,1261.5384521484,,, +33.3437500000,533,1260.0732421875,,, +33.3457031250,533,1260.0732421875,,, +33.3476562500,533,1259.3406982422,,, +33.3496093750,533,1259.3406982422,,, +33.3515625000,533,1258.6080322266,,, +33.3535156250,533,1259.3406982422,,, +33.3554687500,533,1258.6080322266,,, +33.3574218750,533,1257.8754882812,,, +33.3593750000,533,1257.1428222656,,, +33.3613281250,533,1257.8754882812,,, +33.3632812500,533,1257.1428222656,,, +33.3652343750,533,1257.1428222656,,, +33.3671875000,533,1257.1428222656,,, +33.3691406250,533,1257.8754882812,,, +33.3710937500,533,1256.4102783203,,, +33.3730468750,533,1257.1428222656,,, +33.3750000000,534,1257.8754882812,,, +33.3769531250,534,1258.6080322266,,, +33.3789062500,534,1257.1428222656,,, +33.3808593750,534,1259.3406982422,,, +33.3828125000,534,1259.3406982422,,, +33.3847656250,534,1258.6080322266,,, +33.3867187500,534,1259.3406982422,,, +33.3886718750,534,1260.8059082031,,, +33.3906250000,534,1260.8059082031,,, +33.3925781250,534,1261.5384521484,,, +33.3945312500,534,1261.5384521484,,, +33.3964843750,534,1262.2711181641,,, +33.3984375000,534,1262.2711181641,,, +33.4003906250,534,1263.0036621094,,, +33.4023437500,534,1264.4688720703,,, +33.4042968750,534,1265.2014160156,,, +33.4062500000,534,1265.2014160156,,, +33.4082031250,534,1268.1318359375,,, +33.4101562500,534,1268.1318359375,,, +33.4121093750,534,1268.1318359375,,, +33.4140625000,534,1269.5970458984,,, +33.4160156250,534,1272.5274658203,,, +33.4179687500,534,1272.5274658203,,, +33.4199218750,534,1273.2601318359,,, +33.4218750000,534,1274.7252197266,,, +33.4238281250,534,1275.4578857422,,, +33.4257812500,534,1276.1904296875,,, +33.4277343750,534,1276.9230957031,,, +33.4296875000,534,1279.1208496094,,, +33.4316406250,534,1280.5860595703,,, +33.4335937500,534,1280.5860595703,,, +33.4355468750,534,1280.5860595703,,, +33.4375000000,535,1282.7839355469,,, +33.4394531250,535,1282.7839355469,,, +33.4414062500,535,1283.5164794922,,, +33.4433593750,535,1284.9816894531,,, +33.4453125000,535,1285.7142333984,,, +33.4472656250,535,1285.7142333984,,, +33.4492187500,535,1286.4468994141,,, +33.4511718750,535,1287.1794433594,,, +33.4531250000,535,1287.1794433594,,, +33.4550781250,535,1287.9121093750,,, +33.4570312500,535,1287.1794433594,,, +33.4589843750,535,1287.9121093750,,, +33.4609375000,535,1289.3773193359,,, +33.4628906250,535,1290.1098632812,,, +33.4648437500,535,1291.5750732422,,, +33.4667968750,535,1291.5750732422,,, +33.4687500000,535,1291.5750732422,,, +33.4707031250,535,1293.0402832031,,, +33.4726562500,535,1291.5750732422,,, +33.4746093750,535,1290.1098632812,,, +33.4765625000,535,1290.8425292969,,, +33.4785156250,535,1291.5750732422,,, +33.4804687500,535,1291.5750732422,,, +33.4824218750,535,1290.8425292969,,, +33.4843750000,535,1289.3773193359,,, +33.4863281250,535,1289.3773193359,,, +33.4882812500,535,1290.8425292969,,, +33.4902343750,535,1290.1098632812,,, +33.4921875000,535,1290.8425292969,,, +33.4941406250,535,1290.8425292969,,, +33.4960937500,535,1290.1098632812,,, +33.4980468750,535,1290.1098632812,,, +33.5000000000,536,1290.8425292969,,, +33.5019531250,536,1290.1098632812,,, +33.5039062500,536,1290.1098632812,,, +33.5058593750,536,1289.3773193359,,, +33.5078125000,536,1290.8425292969,,, +33.5097656250,536,1289.3773193359,,, +33.5117187500,536,1288.6446533203,,, +33.5136718750,536,1290.1098632812,,, +33.5156250000,536,1290.1098632812,,, +33.5175781250,536,1288.6446533203,,, +33.5195312500,536,1288.6446533203,,, +33.5214843750,536,1289.3773193359,,, +33.5234375000,536,1287.9121093750,,, +33.5253906250,536,1287.9121093750,,, +33.5273437500,536,1288.6446533203,,, +33.5292968750,536,1287.9121093750,,, +33.5312500000,536,1288.6446533203,,, +33.5332031250,536,1288.6446533203,,, +33.5351562500,536,1288.6446533203,,, +33.5371093750,536,1288.6446533203,,, +33.5390625000,536,1287.9121093750,,, +33.5410156250,536,1287.1794433594,,, +33.5429687500,536,1287.1794433594,,, +33.5449218750,536,1286.4468994141,,, +33.5468750000,536,1285.7142333984,,, +33.5488281250,536,1286.4468994141,,, +33.5507812500,536,1285.7142333984,,, +33.5527343750,536,1286.4468994141,,, +33.5546875000,536,1285.7142333984,,, +33.5566406250,536,1287.1794433594,,, +33.5585937500,536,1287.1794433594,,, +33.5605468750,536,1286.4468994141,,, +33.5625000000,537,1285.7142333984,,, +33.5644531250,537,1286.4468994141,,, +33.5664062500,537,1286.4468994141,,, +33.5683593750,537,1285.7142333984,,, +33.5703125000,537,1286.4468994141,,, +33.5722656250,537,1285.7142333984,,, +33.5742187500,537,1284.2490234375,,, +33.5761718750,537,1284.9816894531,,, +33.5781250000,537,1283.5164794922,,, +33.5800781250,537,1283.5164794922,,, +33.5820312500,537,1282.7839355469,,, +33.5839843750,537,1282.0512695312,,, +33.5859375000,537,1281.3187255859,,, +33.5878906250,537,1281.3187255859,,, +33.5898437500,537,1282.7839355469,,, +33.5917968750,537,1283.5164794922,,, +33.5937500000,537,1282.7839355469,,, +33.5957031250,537,1282.7839355469,,, +33.5976562500,537,1283.5164794922,,, +33.5996093750,537,1282.7839355469,,, +33.6015625000,537,1280.5860595703,,, +33.6035156250,537,1281.3187255859,,, +33.6054687500,537,1282.0512695312,,, +33.6074218750,537,1280.5860595703,,, +33.6093750000,537,1280.5860595703,,, +33.6113281250,537,1281.3187255859,,, +33.6132812500,537,1280.5860595703,,, +33.6152343750,537,1279.8535156250,,, +33.6171875000,537,1279.8535156250,,, +33.6191406250,537,1279.8535156250,,, +33.6210937500,537,1279.8535156250,,, +33.6230468750,537,1279.8535156250,,, +33.6250000000,538,1281.3187255859,,, +33.6269531250,538,1280.5860595703,,, +33.6289062500,538,1280.5860595703,,, +33.6308593750,538,1281.3187255859,,, +33.6328125000,538,1282.7839355469,,, +33.6347656250,538,1282.0512695312,,, +33.6367187500,538,1282.0512695312,,, +33.6386718750,538,1282.7839355469,,, +33.6406250000,538,1283.5164794922,,, +33.6425781250,538,1283.5164794922,,, +33.6445312500,538,1283.5164794922,,, +33.6464843750,538,1284.2490234375,,, +33.6484375000,538,1284.2490234375,,, +33.6503906250,538,1283.5164794922,,, +33.6523437500,538,1284.2490234375,,, +33.6542968750,538,1284.2490234375,,, +33.6562500000,538,1282.7839355469,,, +33.6582031250,538,1283.5164794922,,, +33.6601562500,538,1284.2490234375,,, +33.6621093750,538,1284.9816894531,,, +33.6640625000,538,1285.7142333984,,, +33.6660156250,538,1286.4468994141,,, +33.6679687500,538,1286.4468994141,,, +33.6699218750,538,1286.4468994141,,, +33.6718750000,538,1287.9121093750,,, +33.6738281250,538,1287.9121093750,,, +33.6757812500,538,1289.3773193359,,, +33.6777343750,538,1290.8425292969,,, +33.6796875000,538,1291.5750732422,,, +33.6816406250,538,1291.5750732422,,, +33.6835937500,538,1293.0402832031,,, +33.6855468750,538,1294.5054931641,,, +33.6875000000,539,1294.5054931641,,, +33.6894531250,539,1295.2380371094,,, +33.6914062500,539,1296.7032470703,,, +33.6933593750,539,1295.9707031250,,, +33.6953125000,539,1295.9707031250,,, +33.6972656250,539,1297.4359130859,,, +33.6992187500,539,1296.7032470703,,, +33.7011718750,539,1295.2380371094,,, +33.7031250000,539,1295.2380371094,,, +33.7050781250,539,1294.5054931641,,, +33.7070312500,539,1292.3077392578,,, +33.7089843750,539,1291.5750732422,,, +33.7109375000,539,1290.8425292969,,, +33.7128906250,539,1289.3773193359,,, +33.7148437500,539,1289.3773193359,,, +33.7167968750,539,1289.3773193359,,, +33.7187500000,539,1289.3773193359,,, +33.7207031250,539,1288.6446533203,,, +33.7226562500,539,1288.6446533203,,, +33.7246093750,539,1287.9121093750,,, +33.7265625000,539,1287.1794433594,,, +33.7285156250,539,1286.4468994141,,, +33.7304687500,539,1286.4468994141,,, +33.7324218750,539,1284.9816894531,,, +33.7343750000,539,1283.5164794922,,, +33.7363281250,539,1284.2490234375,,, +33.7382812500,539,1283.5164794922,,, +33.7402343750,539,1280.5860595703,,, +33.7421875000,539,1279.8535156250,,, +33.7441406250,539,1279.8535156250,,, +33.7460937500,539,1279.8535156250,,, +33.7480468750,539,1278.3883056641,,, +33.7500000000,540,1276.9230957031,,, +33.7519531250,540,1276.9230957031,,, +33.7539062500,540,1277.6556396484,,, +33.7558593750,540,1277.6556396484,,, +33.7578125000,540,1276.9230957031,,, +33.7597656250,540,1276.9230957031,,, +33.7617187500,540,1277.6556396484,,, +33.7636718750,540,1278.3883056641,,, +33.7656250000,540,1277.6556396484,,, +33.7675781250,540,1276.9230957031,,, +33.7695312500,540,1276.9230957031,,, +33.7714843750,540,1276.9230957031,,, +33.7734375000,540,1277.6556396484,,, +33.7753906250,540,1277.6556396484,,, +33.7773437500,540,1276.9230957031,,, +33.7792968750,540,1276.9230957031,,, +33.7812500000,540,1277.6556396484,,, +33.7832031250,540,1279.1208496094,,, +33.7851562500,540,1278.3883056641,,, +33.7871093750,540,1277.6556396484,,, +33.7890625000,540,1278.3883056641,,, +33.7910156250,540,1279.8535156250,,, +33.7929687500,540,1281.3187255859,,, +33.7949218750,540,1282.0512695312,,, +33.7968750000,540,1282.0512695312,,, +33.7988281250,540,1284.2490234375,,, +33.8007812500,540,1286.4468994141,,, +33.8027343750,540,1287.1794433594,,, +33.8046875000,540,1288.6446533203,,, +33.8066406250,540,1292.3077392578,,, +33.8085937500,540,1294.5054931641,,, +33.8105468750,540,1296.7032470703,,, +33.8125000000,541,1299.6336669922,,, +33.8144531250,541,1304.0292968750,,, +33.8164062500,541,1306.9597167969,,, +33.8183593750,541,1311.3553466797,,, +33.8203125000,541,1317.2160644531,,, +33.8222656250,541,1321.6116943359,,, +33.8242187500,541,1327.4725341797,,, +33.8261718750,541,1336.2637939453,,, +33.8281250000,541,1343.5897216797,,, +33.8300781250,541,1350.9157714844,,, +33.8320312500,541,1361.1721191406,,, +33.8339843750,541,1371.4285888672,,, +33.8359375000,541,1380.2197265625,,, +33.8378906250,541,1391.9414062500,,, +33.8398437500,541,1405.1281738281,,, +33.8417968750,541,1416.8498535156,,, +33.8437500000,541,1430.0366210938,,, +33.8457031250,541,1444.6885986328,,, +33.8476562500,541,1458.6080322266,,, +33.8496093750,541,1473.2601318359,,, +33.8515625000,541,1487.9121093750,,, +33.8535156250,541,1504.0292968750,,, +33.8554687500,541,1519.4139404297,,, +33.8574218750,541,1536.2637939453,,, +33.8593750000,541,1554.5787353516,,, +33.8613281250,541,1570.6959228516,,, +33.8632812500,541,1588.2784423828,,, +33.8652343750,541,1606.5933837891,,, +33.8671875000,541,1623.4432373047,,, +33.8691406250,541,1641.0256347656,,, +33.8710937500,541,1658.6080322266,,, +33.8730468750,541,1676.9230957031,,, +33.8750000000,542,1693.0402832031,,, +33.8769531250,542,1709.8901367188,,, +33.8789062500,542,1726.7398681641,,, +33.8808593750,542,1741.3919677734,,, +33.8828125000,542,1756.0439453125,,, +33.8847656250,542,1772.1611328125,,, +33.8867187500,542,1785.3480224609,,, +33.8886718750,542,1799.2674560547,,, +33.8906250000,542,1813.1867675781,,, +33.8925781250,542,1824.9084472656,,, +33.8945312500,542,1837.3626708984,,, +33.8964843750,542,1849.8168945312,,, +33.8984375000,542,1862.2711181641,,, +33.9003906250,542,1871.7949218750,,, +33.9023437500,542,1880.5860595703,,, +33.9042968750,542,1890.1098632812,,, +33.9062500000,542,1895.9707031250,,, +33.9082031250,542,1902.5640869141,,, +33.9101562500,542,1909.8901367188,,, +33.9121093750,542,1913.5531005859,,, +33.9140625000,542,1917.9487304688,,, +33.9160156250,542,1920.8791503906,,, +33.9179687500,542,1923.0769042969,,, +33.9199218750,542,1923.0769042969,,, +33.9218750000,542,1923.0769042969,,, +33.9238281250,542,1923.0769042969,,, +33.9257812500,542,1920.1464843750,,, +33.9277343750,542,1917.2160644531,,, +33.9296875000,542,1915.0183105469,,, +33.9316406250,542,1909.1574707031,,, +33.9335937500,542,1904.0292968750,,, +33.9355468750,542,1898.1684570312,,, +33.9375000000,543,1892.3077392578,,, +33.9394531250,543,1884.2490234375,,, +33.9414062500,543,1876.1904296875,,, +33.9433593750,543,1868.8645019531,,, +33.9453125000,543,1857.8754882812,,, +33.9472656250,543,1846.8864746094,,, +33.9492187500,543,1837.3626708984,,, +33.9511718750,543,1827.1062011719,,, +33.9531250000,543,1815.3846435547,,, +33.9550781250,543,1803.6629638672,,, +33.9570312500,543,1792.6739501953,,, +33.9589843750,543,1779.4871826172,,, +33.9609375000,543,1767.7656250000,,, +33.9628906250,543,1756.7766113281,,, +33.9648437500,543,1743.5897216797,,, +33.9667968750,543,1731.1354980469,,, +33.9687500000,543,1718.6812744141,,, +33.9707031250,543,1705.4945068359,,, +33.9726562500,543,1691.5750732422,,, +33.9746093750,543,1678.3883056641,,, +33.9765625000,543,1666.6666259766,,, +33.9785156250,543,1653.4798583984,,, +33.9804687500,543,1640.2930908203,,, +33.9824218750,543,1628.5714111328,,, +33.9843750000,543,1615.3846435547,,, +33.9863281250,543,1602.1977539062,,, +33.9882812500,543,1591.9414062500,,, +33.9902343750,543,1578.7546386719,,, +33.9921875000,543,1566.3004150391,,, +33.9941406250,543,1556.0439453125,,, +33.9960937500,543,1544.3223876953,,, +33.9980468750,543,1531.1354980469,,, +34.0000000000,544,1520.1464843750,,, +34.0019531250,544,1509.8901367188,,, +34.0039062500,544,1498.9011230469,,, +34.0058593750,544,1487.9121093750,,, +34.0078125000,544,1479.8535156250,,, +34.0097656250,544,1468.8645019531,,, +34.0117187500,544,1457.1428222656,,, +34.0136718750,544,1449.8168945312,,, +34.0156250000,544,1441.7583007812,,, +34.0175781250,544,1432.9670410156,,, +34.0195312500,544,1424.9084472656,,, +34.0214843750,544,1417.5823974609,,, +34.0234375000,544,1408.7912597656,,, +34.0253906250,544,1401.4652099609,,, +34.0273437500,544,1394.8718261719,,, +34.0292968750,544,1388.2784423828,,, +34.0312500000,544,1380.2197265625,,, +34.0332031250,544,1373.6263427734,,, +34.0351562500,544,1367.7656250000,,, +34.0371093750,544,1361.1721191406,,, +34.0390625000,544,1354.5787353516,,, +34.0410156250,544,1348.7178955078,,, +34.0429687500,544,1345.0549316406,,, +34.0449218750,544,1339.1940917969,,, +34.0468750000,544,1334.7985839844,,, +34.0488281250,544,1331.8681640625,,, +34.0507812500,544,1328.2050781250,,, +34.0527343750,544,1323.8095703125,,, +34.0546875000,544,1321.6116943359,,, +34.0566406250,544,1319.4139404297,,, +34.0585937500,544,1316.4835205078,,, +34.0605468750,544,1314.2857666016,,, +34.0625000000,545,1312.0878906250,,, +34.0644531250,545,1309.1574707031,,, +34.0664062500,545,1306.9597167969,,, +34.0683593750,545,1305.4945068359,,, +34.0703125000,545,1304.0292968750,,, +34.0722656250,545,1302.5640869141,,, +34.0742187500,545,1301.0988769531,,, +34.0761718750,545,1301.0988769531,,, +34.0781250000,545,1299.6336669922,,, +34.0800781250,545,1298.9011230469,,, +34.0820312500,545,1297.4359130859,,, +34.0839843750,545,1298.9011230469,,, +34.0859375000,545,1297.4359130859,,, +34.0878906250,545,1297.4359130859,,, +34.0898437500,545,1298.9011230469,,, +34.0917968750,545,1299.6336669922,,, +34.0937500000,545,1298.9011230469,,, +34.0957031250,545,1299.6336669922,,, +34.0976562500,545,1301.8315429688,,, +34.0996093750,545,1302.5640869141,,, +34.1015625000,545,1304.0292968750,,, +34.1035156250,545,1305.4945068359,,, +34.1054687500,545,1306.9597167969,,, +34.1074218750,545,1308.4249267578,,, +34.1093750000,545,1309.1574707031,,, +34.1113281250,545,1311.3553466797,,, +34.1132812500,545,1312.8205566406,,, +34.1152343750,545,1313.5531005859,,, +34.1171875000,545,1316.4835205078,,, +34.1191406250,545,1317.9487304688,,, +34.1210937500,545,1317.9487304688,,, +34.1230468750,545,1318.6812744141,,, +34.1250000000,546,1321.6116943359,,, +34.1269531250,546,1322.3443603516,,, +34.1289062500,546,1323.8095703125,,, +34.1308593750,546,1326.0073242188,,, +34.1328125000,546,1328.9377441406,,, +34.1347656250,546,1331.8681640625,,, +34.1367187500,546,1333.3333740234,,, +34.1386718750,546,1336.2637939453,,, +34.1406250000,546,1339.1940917969,,, +34.1425781250,546,1341.3919677734,,, +34.1445312500,546,1344.3223876953,,, +34.1464843750,546,1347.2528076172,,, +34.1484375000,546,1349.4505615234,,, +34.1503906250,546,1350.9157714844,,, +34.1523437500,546,1353.1135253906,,, +34.1542968750,546,1356.0439453125,,, +34.1562500000,546,1357.5091552734,,, +34.1582031250,546,1360.4395751953,,, +34.1601562500,546,1363.3699951172,,, +34.1621093750,546,1366.3004150391,,, +34.1640625000,546,1367.7656250000,,, +34.1660156250,546,1370.6959228516,,, +34.1679687500,546,1374.3590087891,,, +34.1699218750,546,1376.5567626953,,, +34.1718750000,546,1377.2894287109,,, +34.1738281250,546,1380.2197265625,,, +34.1757812500,546,1384.6153564453,,, +34.1777343750,546,1386.8132324219,,, +34.1796875000,546,1388.2784423828,,, +34.1816406250,546,1390.4761962891,,, +34.1835937500,546,1390.4761962891,,, +34.1855468750,546,1392.6739501953,,, +34.1875000000,547,1393.4066162109,,, +34.1894531250,547,1393.4066162109,,, +34.1914062500,547,1394.1391601562,,, +34.1933593750,547,1395.6043701172,,, +34.1953125000,547,1395.6043701172,,, +34.1972656250,547,1394.8718261719,,, +34.1992187500,547,1394.8718261719,,, +34.2011718750,547,1394.1391601562,,, +34.2031250000,547,1392.6739501953,,, +34.2050781250,547,1391.2087402344,,, +34.2070312500,547,1390.4761962891,,, +34.2089843750,547,1389.0109863281,,, +34.2109375000,547,1386.8132324219,,, +34.2128906250,547,1384.6153564453,,, +34.2148437500,547,1384.6153564453,,, +34.2167968750,547,1381.6849365234,,, +34.2187500000,547,1379.4871826172,,, +34.2207031250,547,1378.0219726562,,, +34.2226562500,547,1376.5567626953,,, +34.2246093750,547,1374.3590087891,,, +34.2265625000,547,1372.8937988281,,, +34.2285156250,547,1370.6959228516,,, +34.2304687500,547,1368.4981689453,,, +34.2324218750,547,1367.0329589844,,, +34.2343750000,547,1366.3004150391,,, +34.2363281250,547,1364.8352050781,,, +34.2382812500,547,1361.9047851562,,, +34.2402343750,547,1359.7069091797,,, +34.2421875000,547,1358.9743652344,,, +34.2441406250,547,1356.7766113281,,, +34.2460937500,547,1353.1135253906,,, +34.2480468750,547,1350.9157714844,,, +34.2500000000,548,1350.1831054688,,, +34.2519531250,548,1347.9853515625,,, +34.2539062500,548,1344.3223876953,,, +34.2558593750,548,1342.1245117188,,, +34.2578125000,548,1341.3919677734,,, +34.2597656250,548,1337.7288818359,,, +34.2617187500,548,1334.0659179688,,, +34.2636718750,548,1331.8681640625,,, +34.2656250000,548,1330.4029541016,,, +34.2675781250,548,1327.4725341797,,, +34.2695312500,548,1325.2747802734,,, +34.2714843750,548,1323.0769042969,,, +34.2734375000,548,1320.1464843750,,, +34.2753906250,548,1317.2160644531,,, +34.2773437500,548,1315.0183105469,,, +34.2792968750,548,1312.8205566406,,, +34.2812500000,548,1311.3553466797,,, +34.2832031250,548,1308.4249267578,,, +34.2851562500,548,1305.4945068359,,, +34.2871093750,548,1303.2967529297,,, +34.2890625000,548,1301.0988769531,,, +34.2910156250,548,1298.1684570312,,, +34.2929687500,548,1295.2380371094,,, +34.2949218750,548,1294.5054931641,,, +34.2968750000,548,1292.3077392578,,, +34.2988281250,548,1288.6446533203,,, +34.3007812500,548,1288.6446533203,,, +34.3027343750,548,1286.4468994141,,, +34.3046875000,548,1284.9816894531,,, +34.3066406250,548,1282.0512695312,,, +34.3085937500,548,1279.8535156250,,, +34.3105468750,548,1279.1208496094,,, +34.3125000000,549,1277.6556396484,,, +34.3144531250,549,1276.1904296875,,, +34.3164062500,549,1273.9926757812,,, +34.3183593750,549,1273.9926757812,,, +34.3203125000,549,1272.5274658203,,, +34.3222656250,549,1271.0622558594,,, +34.3242187500,549,1270.3297119141,,, +34.3261718750,549,1270.3297119141,,, +34.3281250000,549,1268.1318359375,,, +34.3300781250,549,1268.1318359375,,, +34.3320312500,549,1268.1318359375,,, +34.3339843750,549,1268.1318359375,,, +34.3359375000,549,1268.8645019531,,, +34.3378906250,549,1268.1318359375,,, +34.3398437500,549,1268.8645019531,,, +34.3417968750,549,1270.3297119141,,, +34.3437500000,549,1269.5970458984,,, +34.3457031250,549,1269.5970458984,,, +34.3476562500,549,1270.3297119141,,, +34.3496093750,549,1271.0622558594,,, +34.3515625000,549,1271.0622558594,,, +34.3535156250,549,1271.0622558594,,, +34.3554687500,549,1272.5274658203,,, +34.3574218750,549,1273.9926757812,,, +34.3593750000,549,1275.4578857422,,, +34.3613281250,549,1275.4578857422,,, +34.3632812500,549,1276.1904296875,,, +34.3652343750,549,1276.9230957031,,, +34.3671875000,549,1276.9230957031,,, +34.3691406250,549,1279.8535156250,,, +34.3710937500,549,1279.8535156250,,, +34.3730468750,549,1279.1208496094,,, +34.3750000000,550,1280.5860595703,,, +34.3769531250,550,1282.0512695312,,, +34.3789062500,550,1284.2490234375,,, +34.3808593750,550,1284.9816894531,,, +34.3828125000,550,1285.7142333984,,, +34.3847656250,550,1287.1794433594,,, +34.3867187500,550,1286.4468994141,,, +34.3886718750,550,1288.6446533203,,, +34.3906250000,550,1288.6446533203,,, +34.3925781250,550,1289.3773193359,,, +34.3945312500,550,1290.1098632812,,, +34.3964843750,550,1290.8425292969,,, +34.3984375000,550,1293.0402832031,,, +34.4003906250,550,1293.7729492188,,, +34.4023437500,550,1293.7729492188,,, +34.4042968750,550,1293.7729492188,,, +34.4062500000,550,1293.7729492188,,, +34.4082031250,550,1294.5054931641,,, +34.4101562500,550,1295.9707031250,,, +34.4121093750,550,1295.2380371094,,, +34.4140625000,550,1295.2380371094,,, +34.4160156250,550,1295.9707031250,,, +34.4179687500,550,1296.7032470703,,, +34.4199218750,550,1296.7032470703,,, +34.4218750000,550,1296.7032470703,,, +34.4238281250,550,1296.7032470703,,, +34.4257812500,550,1297.4359130859,,, +34.4277343750,550,1298.1684570312,,, +34.4296875000,550,1299.6336669922,,, +34.4316406250,550,1298.9011230469,,, +34.4335937500,550,1299.6336669922,,, +34.4355468750,550,1300.3663330078,,, +34.4375000000,551,1301.8315429688,,, +34.4394531250,551,1302.5640869141,,, +34.4414062500,551,1303.2967529297,,, +34.4433593750,551,1304.0292968750,,, +34.4453125000,551,1305.4945068359,,, +34.4472656250,551,1306.2270507812,,, +34.4492187500,551,1305.4945068359,,, +34.4511718750,551,1306.2270507812,,, +34.4531250000,551,1307.6922607422,,, +34.4550781250,551,1306.9597167969,,, +34.4570312500,551,1306.9597167969,,, +34.4589843750,551,1308.4249267578,,, +34.4609375000,551,1308.4249267578,,, +34.4628906250,551,1307.6922607422,,, +34.4648437500,551,1306.9597167969,,, +34.4667968750,551,1307.6922607422,,, +34.4687500000,551,1306.9597167969,,, +34.4707031250,551,1306.2270507812,,, +34.4726562500,551,1308.4249267578,,, +34.4746093750,551,1308.4249267578,,, +34.4765625000,551,1307.6922607422,,, +34.4785156250,551,1308.4249267578,,, +34.4804687500,551,1309.8901367188,,, +34.4824218750,551,1309.1574707031,,, +34.4843750000,551,1308.4249267578,,, +34.4863281250,551,1309.1574707031,,, +34.4882812500,551,1308.4249267578,,, +34.4902343750,551,1307.6922607422,,, +34.4921875000,551,1308.4249267578,,, +34.4941406250,551,1307.6922607422,,, +34.4960937500,551,1307.6922607422,,, +34.4980468750,551,1306.9597167969,,, +34.5000000000,552,1307.6922607422,,, +34.5019531250,552,1307.6922607422,,, +34.5039062500,552,1307.6922607422,,, +34.5058593750,552,1308.4249267578,,, +34.5078125000,552,1307.6922607422,,, +34.5097656250,552,1306.9597167969,,, +34.5117187500,552,1306.2270507812,,, +34.5136718750,552,1306.2270507812,,, +34.5156250000,552,1304.0292968750,,, +34.5175781250,552,1302.5640869141,,, +34.5195312500,552,1303.2967529297,,, +34.5214843750,552,1302.5640869141,,, +34.5234375000,552,1301.8315429688,,, +34.5253906250,552,1301.8315429688,,, +34.5273437500,552,1301.0988769531,,, +34.5292968750,552,1299.6336669922,,, +34.5312500000,552,1300.3663330078,,, +34.5332031250,552,1299.6336669922,,, +34.5351562500,552,1298.1684570312,,, +34.5371093750,552,1297.4359130859,,, +34.5390625000,552,1298.1684570312,,, +34.5410156250,552,1296.7032470703,,, +34.5429687500,552,1295.2380371094,,, +34.5449218750,552,1294.5054931641,,, +34.5468750000,552,1294.5054931641,,, +34.5488281250,552,1293.7729492188,,, +34.5507812500,552,1293.0402832031,,, +34.5527343750,552,1293.7729492188,,, +34.5546875000,552,1293.0402832031,,, +34.5566406250,552,1291.5750732422,,, +34.5585937500,552,1293.0402832031,,, +34.5605468750,552,1293.0402832031,,, +34.5625000000,553,1292.3077392578,,, +34.5644531250,553,1292.3077392578,,, +34.5664062500,553,1293.0402832031,,, +34.5683593750,553,1292.3077392578,,, +34.5703125000,553,1291.5750732422,,, +34.5722656250,553,1292.3077392578,,, +34.5742187500,553,1292.3077392578,,, +34.5761718750,553,1292.3077392578,,, +34.5781250000,553,1291.5750732422,,, +34.5800781250,553,1291.5750732422,,, +34.5820312500,553,1290.1098632812,,, +34.5839843750,553,1289.3773193359,,, +34.5859375000,553,1290.1098632812,,, +34.5878906250,553,1290.1098632812,,, +34.5898437500,553,1290.1098632812,,, +34.5917968750,553,1290.1098632812,,, +34.5937500000,553,1291.5750732422,,, +34.5957031250,553,1291.5750732422,,, +34.5976562500,553,1291.5750732422,,, +34.5996093750,553,1293.7729492188,,, +34.6015625000,553,1293.7729492188,,, +34.6035156250,553,1293.7729492188,,, +34.6054687500,553,1293.7729492188,,, +34.6074218750,553,1294.5054931641,,, +34.6093750000,553,1293.0402832031,,, +34.6113281250,553,1293.0402832031,,, +34.6132812500,553,1293.0402832031,,, +34.6152343750,553,1292.3077392578,,, +34.6171875000,553,1290.8425292969,,, +34.6191406250,553,1291.5750732422,,, +34.6210937500,553,1290.1098632812,,, +34.6230468750,553,1287.9121093750,,, +34.6250000000,554,1289.3773193359,,, +34.6269531250,554,1287.9121093750,,, +34.6289062500,554,1286.4468994141,,, +34.6308593750,554,1285.7142333984,,, +34.6328125000,554,1286.4468994141,,, +34.6347656250,554,1284.2490234375,,, +34.6367187500,554,1283.5164794922,,, +34.6386718750,554,1284.2490234375,,, +34.6406250000,554,1283.5164794922,,, +34.6425781250,554,1283.5164794922,,, +34.6445312500,554,1284.2490234375,,, +34.6464843750,554,1283.5164794922,,, +34.6484375000,554,1284.2490234375,,, +34.6503906250,554,1285.7142333984,,, +34.6523437500,554,1286.4468994141,,, +34.6542968750,554,1286.4468994141,,, +34.6562500000,554,1287.9121093750,,, +34.6582031250,554,1288.6446533203,,, +34.6601562500,554,1289.3773193359,,, +34.6621093750,554,1290.8425292969,,, +34.6640625000,554,1291.5750732422,,, +34.6660156250,554,1291.5750732422,,, +34.6679687500,554,1292.3077392578,,, +34.6699218750,554,1294.5054931641,,, +34.6718750000,554,1295.2380371094,,, +34.6738281250,554,1295.2380371094,,, +34.6757812500,554,1296.7032470703,,, +34.6777343750,554,1295.2380371094,,, +34.6796875000,554,1295.2380371094,,, +34.6816406250,554,1295.2380371094,,, +34.6835937500,554,1294.5054931641,,, +34.6855468750,554,1294.5054931641,,, +34.6875000000,555,1295.2380371094,,, +34.6894531250,555,1295.2380371094,,, +34.6914062500,555,1293.7729492188,,, +34.6933593750,555,1293.7729492188,,, +34.6953125000,555,1293.7729492188,,, +34.6972656250,555,1293.0402832031,,, +34.6992187500,555,1292.3077392578,,, +34.7011718750,555,1292.3077392578,,, +34.7031250000,555,1293.0402832031,,, +34.7050781250,555,1293.0402832031,,, +34.7070312500,555,1293.0402832031,,, +34.7089843750,555,1293.0402832031,,, +34.7109375000,555,1293.7729492188,,, +34.7128906250,555,1294.5054931641,,, +34.7148437500,555,1295.2380371094,,, +34.7167968750,555,1295.9707031250,,, +34.7187500000,555,1296.7032470703,,, +34.7207031250,555,1297.4359130859,,, +34.7226562500,555,1297.4359130859,,, +34.7246093750,555,1296.7032470703,,, +34.7265625000,555,1296.7032470703,,, +34.7285156250,555,1296.7032470703,,, +34.7304687500,555,1296.7032470703,,, +34.7324218750,555,1295.9707031250,,, +34.7343750000,555,1295.9707031250,,, +34.7363281250,555,1295.2380371094,,, +34.7382812500,555,1295.2380371094,,, +34.7402343750,555,1295.2380371094,,, +34.7421875000,555,1294.5054931641,,, +34.7441406250,555,1295.2380371094,,, +34.7460937500,555,1294.5054931641,,, +34.7480468750,555,1293.0402832031,,, +34.7500000000,556,1293.0402832031,,, +34.7519531250,556,1292.3077392578,,, +34.7539062500,556,1292.3077392578,,, +34.7558593750,556,1292.3077392578,,, +34.7578125000,556,1292.3077392578,,, +34.7597656250,556,1290.1098632812,,, +34.7617187500,556,1290.1098632812,,, +34.7636718750,556,1290.1098632812,,, +34.7656250000,556,1289.3773193359,,, +34.7675781250,556,1288.6446533203,,, +34.7695312500,556,1289.3773193359,,, +34.7714843750,556,1289.3773193359,,, +34.7734375000,556,1289.3773193359,,, +34.7753906250,556,1290.8425292969,,, +34.7773437500,556,1290.8425292969,,, +34.7792968750,556,1291.5750732422,,, +34.7812500000,556,1292.3077392578,,, +34.7832031250,556,1292.3077392578,,, +34.7851562500,556,1291.5750732422,,, +34.7871093750,556,1292.3077392578,,, +34.7890625000,556,1293.7729492188,,, +34.7910156250,556,1293.7729492188,,, +34.7929687500,556,1293.7729492188,,, +34.7949218750,556,1294.5054931641,,, +34.7968750000,556,1295.2380371094,,, +34.7988281250,556,1294.5054931641,,, +34.8007812500,556,1294.5054931641,,, +34.8027343750,556,1296.7032470703,,, +34.8046875000,556,1296.7032470703,,, +34.8066406250,556,1296.7032470703,,, +34.8085937500,556,1298.1684570312,,, +34.8105468750,556,1299.6336669922,,, +34.8125000000,557,1300.3663330078,,, +34.8144531250,557,1301.0988769531,,, +34.8164062500,557,1304.0292968750,,, +34.8183593750,557,1305.4945068359,,, +34.8203125000,557,1308.4249267578,,, +34.8222656250,557,1309.8901367188,,, +34.8242187500,557,1315.0183105469,,, +34.8261718750,557,1317.2160644531,,, +34.8281250000,557,1320.1464843750,,, +34.8300781250,557,1325.2747802734,,, +34.8320312500,557,1331.1354980469,,, +34.8339843750,557,1335.5311279297,,, +34.8359375000,557,1341.3919677734,,, +34.8378906250,557,1347.9853515625,,, +34.8398437500,557,1353.8461914062,,, +34.8417968750,557,1360.4395751953,,, +34.8437500000,557,1369.2307128906,,, +34.8457031250,557,1377.2894287109,,, +34.8476562500,557,1386.0805664062,,, +34.8496093750,557,1394.8718261719,,, +34.8515625000,557,1405.8608398438,,, +34.8535156250,557,1416.8498535156,,, +34.8554687500,557,1427.1062011719,,, +34.8574218750,557,1441.0256347656,,, +34.8593750000,557,1452.7471923828,,, +34.8613281250,557,1465.2014160156,,, +34.8632812500,557,1479.1208496094,,, +34.8652343750,557,1493.7729492188,,, +34.8671875000,557,1506.9597167969,,, +34.8691406250,557,1520.8791503906,,, +34.8710937500,557,1537.7288818359,,, +34.8730468750,557,1553.1135253906,,, +34.8750000000,558,1568.4981689453,,, +34.8769531250,558,1585.3480224609,,, +34.8789062500,558,1602.1977539062,,, +34.8808593750,558,1617.5823974609,,, +34.8828125000,558,1632.2343750000,,, +34.8847656250,558,1649.8168945312,,, +34.8867187500,558,1665.2014160156,,, +34.8886718750,558,1680.5860595703,,, +34.8906250000,558,1696.7032470703,,, +34.8925781250,558,1713.5531005859,,, +34.8945312500,558,1727.4725341797,,, +34.8964843750,558,1742.1245117188,,, +34.8984375000,558,1757.5091552734,,, +34.9003906250,558,1772.1611328125,,, +34.9023437500,558,1786.0805664062,,, +34.9042968750,558,1798.5347900391,,, +34.9062500000,558,1812.4542236328,,, +34.9082031250,558,1824.9084472656,,, +34.9101562500,558,1835.8974609375,,, +34.9121093750,558,1846.1538085938,,, +34.9140625000,558,1857.8754882812,,, +34.9160156250,558,1865.2014160156,,, +34.9179687500,558,1873.9926757812,,, +34.9199218750,558,1882.0512695312,,, +34.9218750000,558,1887.9121093750,,, +34.9238281250,558,1892.3077392578,,, +34.9257812500,558,1896.7032470703,,, +34.9277343750,558,1900.3663330078,,, +34.9296875000,558,1902.5640869141,,, +34.9316406250,558,1904.0292968750,,, +34.9335937500,558,1906.2270507812,,, +34.9355468750,558,1906.2270507812,,, +34.9375000000,559,1904.0292968750,,, +34.9394531250,559,1902.5640869141,,, +34.9414062500,559,1901.8315429688,,, +34.9433593750,559,1897.4359130859,,, +34.9453125000,559,1892.3077392578,,, +34.9472656250,559,1889.3773193359,,, +34.9492187500,559,1884.2490234375,,, +34.9511718750,559,1876.1904296875,,, +34.9531250000,559,1870.3297119141,,, +34.9550781250,559,1864.4688720703,,, +34.9570312500,559,1856.4102783203,,, +34.9589843750,559,1849.0842285156,,, +34.9609375000,559,1840.2930908203,,, +34.9628906250,559,1830.7692871094,,, +34.9648437500,559,1819.7802734375,,, +34.9667968750,559,1810.2564697266,,, +34.9687500000,559,1800.0000000000,,, +34.9707031250,559,1787.5457763672,,, +34.9726562500,559,1776.5567626953,,, +34.9746093750,559,1764.8352050781,,, +34.9765625000,559,1750.1831054688,,, +34.9785156250,559,1737.7288818359,,, +34.9804687500,559,1726.0073242188,,, +34.9824218750,559,1711.3553466797,,, +34.9843750000,559,1698.1684570312,,, +34.9863281250,559,1684.9816894531,,, +34.9882812500,559,1654.9450683594,,, +34.9902343750,559,1641.0256347656,,, +34.9921875000,559,1626.3736572266,,, +34.9941406250,559,1612.4542236328,,, +34.9960937500,559,1598.5347900391,,, +34.9980468750,559,1584.6153564453,,, +35.0000000000,560,1569.9633789062,,, +35.0019531250,560,1556.0439453125,,, +35.0039062500,560,1543.5897216797,,, +35.0058593750,560,1530.4029541016,,, +35.0078125000,560,1517.9487304688,,, +35.0097656250,560,1505.4945068359,,, +35.0117187500,560,1493.7729492188,,, +35.0136718750,560,1482.7839355469,,, +35.0156250000,560,1473.2601318359,,, +35.0175781250,560,1462.2711181641,,, +35.0195312500,560,1452.7471923828,,, +35.0214843750,560,1442.4908447266,,, +35.0234375000,560,1432.2343750000,,, +35.0253906250,560,1424.1757812500,,, +35.0273437500,560,1415.3846435547,,, +35.0292968750,560,1406.5933837891,,, +35.0312500000,560,1400.0000000000,,, +35.0332031250,560,1392.6739501953,,, +35.0351562500,560,1385.3480224609,,, +35.0371093750,560,1378.7546386719,,, +35.0390625000,560,1372.8937988281,,, +35.0410156250,560,1367.0329589844,,, +35.0429687500,560,1361.1721191406,,, +35.0449218750,560,1355.3114013672,,, +35.0468750000,560,1351.6483154297,,, +35.0488281250,560,1347.2528076172,,, +35.0507812500,560,1341.3919677734,,, +35.0527343750,560,1337.7288818359,,, +35.0546875000,560,1334.0659179688,,, +35.0566406250,560,1330.4029541016,,, +35.0585937500,560,1328.9377441406,,, +35.0605468750,560,1326.7398681641,,, +35.0625000000,561,1324.5421142578,,, +35.0644531250,561,1323.0769042969,,, +35.0664062500,561,1321.6116943359,,, +35.0683593750,561,1319.4139404297,,, +35.0703125000,561,1318.6812744141,,, +35.0722656250,561,1317.2160644531,,, +35.0742187500,561,1315.7509765625,,, +35.0761718750,561,1315.0183105469,,, +35.0781250000,561,1312.8205566406,,, +35.0800781250,561,1312.0878906250,,, +35.0820312500,561,1311.3553466797,,, +35.0839843750,561,1309.8901367188,,, +35.0859375000,561,1308.4249267578,,, +35.0878906250,561,1308.4249267578,,, +35.0898437500,561,1306.9597167969,,, +35.0917968750,561,1305.4945068359,,, +35.0937500000,561,1305.4945068359,,, +35.0957031250,561,1304.0292968750,,, +35.0976562500,561,1304.0292968750,,, +35.0996093750,561,1303.2967529297,,, +35.1015625000,561,1301.8315429688,,, +35.1035156250,561,1301.8315429688,,, +35.1054687500,561,1301.8315429688,,, +35.1074218750,561,1301.8315429688,,, +35.1093750000,561,1301.8315429688,,, +35.1113281250,561,1303.2967529297,,, +35.1132812500,561,1303.2967529297,,, +35.1152343750,561,1304.0292968750,,, +35.1171875000,561,1304.7619628906,,, +35.1191406250,561,1304.7619628906,,, +35.1210937500,561,1305.4945068359,,, +35.1230468750,561,1307.6922607422,,, +35.1250000000,562,1308.4249267578,,, +35.1269531250,562,1309.8901367188,,, +35.1289062500,562,1311.3553466797,,, +35.1308593750,562,1312.8205566406,,, +35.1328125000,562,1314.2857666016,,, +35.1347656250,562,1316.4835205078,,, +35.1367187500,562,1318.6812744141,,, +35.1386718750,562,1320.1464843750,,, +35.1406250000,562,1322.3443603516,,, +35.1425781250,562,1324.5421142578,,, +35.1445312500,562,1326.7398681641,,, +35.1464843750,562,1329.6702880859,,, +35.1484375000,562,1331.8681640625,,, +35.1503906250,562,1333.3333740234,,, +35.1523437500,562,1336.2637939453,,, +35.1542968750,562,1337.7288818359,,, +35.1562500000,562,1340.6593017578,,, +35.1582031250,562,1342.1245117188,,, +35.1601562500,562,1343.5897216797,,, +35.1621093750,562,1345.7875976562,,, +35.1640625000,562,1346.5201416016,,, +35.1660156250,562,1348.7178955078,,, +35.1679687500,562,1351.6483154297,,, +35.1699218750,562,1352.3809814453,,, +35.1718750000,562,1353.8461914062,,, +35.1738281250,562,1356.7766113281,,, +35.1757812500,562,1357.5091552734,,, +35.1777343750,562,1358.9743652344,,, +35.1796875000,562,1361.1721191406,,, +35.1816406250,562,1361.1721191406,,, +35.1835937500,562,1362.6373291016,,, +35.1855468750,562,1364.8352050781,,, +35.1875000000,563,1365.5677490234,,, +35.1894531250,563,1367.0329589844,,, +35.1914062500,563,1368.4981689453,,, +35.1933593750,563,1368.4981689453,,, +35.1953125000,563,1369.2307128906,,, +35.1972656250,563,1370.6959228516,,, +35.1992187500,563,1372.8937988281,,, +35.2011718750,563,1373.6263427734,,, +35.2031250000,563,1374.3590087891,,, +35.2050781250,563,1374.3590087891,,, +35.2070312500,563,1376.5567626953,,, +35.2089843750,563,1376.5567626953,,, +35.2109375000,563,1377.2894287109,,, +35.2128906250,563,1378.7546386719,,, +35.2148437500,563,1378.7546386719,,, +35.2167968750,563,1380.2197265625,,, +35.2187500000,563,1380.9523925781,,, +35.2207031250,563,1381.6849365234,,, +35.2226562500,563,1381.6849365234,,, +35.2246093750,563,1383.1501464844,,, +35.2265625000,563,1382.4176025391,,, +35.2285156250,563,1382.4176025391,,, +35.2304687500,563,1383.8828125000,,, +35.2324218750,563,1383.1501464844,,, +35.2343750000,563,1383.1501464844,,, +35.2363281250,563,1383.8828125000,,, +35.2382812500,563,1382.4176025391,,, +35.2402343750,563,1381.6849365234,,, +35.2421875000,563,1382.4176025391,,, +35.2441406250,563,1380.9523925781,,, +35.2460937500,563,1379.4871826172,,, +35.2480468750,563,1379.4871826172,,, +35.2500000000,564,1377.2894287109,,, +35.2519531250,564,1375.8242187500,,, +35.2539062500,564,1375.0915527344,,, +35.2558593750,564,1372.1611328125,,, +35.2578125000,564,1370.6959228516,,, +35.2597656250,564,1369.2307128906,,, +35.2617187500,564,1367.0329589844,,, +35.2636718750,564,1364.8352050781,,, +35.2656250000,564,1363.3699951172,,, +35.2675781250,564,1361.1721191406,,, +35.2695312500,564,1358.9743652344,,, +35.2714843750,564,1358.9743652344,,, +35.2734375000,564,1356.0439453125,,, +35.2753906250,564,1354.5787353516,,, +35.2773437500,564,1351.6483154297,,, +35.2792968750,564,1347.9853515625,,, +35.2812500000,564,1347.2528076172,,, +35.2832031250,564,1343.5897216797,,, +35.2851562500,564,1340.6593017578,,, +35.2871093750,564,1339.1940917969,,, +35.2890625000,564,1335.5311279297,,, +35.2910156250,564,1331.8681640625,,, +35.2929687500,564,1330.4029541016,,, +35.2949218750,564,1326.7398681641,,, +35.2968750000,564,1323.0769042969,,, +35.2988281250,564,1320.8791503906,,, +35.3007812500,564,1317.2160644531,,, +35.3027343750,564,1314.2857666016,,, +35.3046875000,564,1311.3553466797,,, +35.3066406250,564,1307.6922607422,,, +35.3085937500,564,1304.0292968750,,, +35.3105468750,564,1302.5640869141,,, +35.3125000000,565,1299.6336669922,,, +35.3144531250,565,1296.7032470703,,, +35.3164062500,565,1294.5054931641,,, +35.3183593750,565,1292.3077392578,,, +35.3203125000,565,1290.1098632812,,, +35.3222656250,565,1288.6446533203,,, +35.3242187500,565,1287.1794433594,,, +35.3261718750,565,1285.7142333984,,, +35.3281250000,565,1284.9816894531,,, +35.3300781250,565,1284.2490234375,,, +35.3320312500,565,1282.0512695312,,, +35.3339843750,565,1282.0512695312,,, +35.3359375000,565,1280.5860595703,,, +35.3378906250,565,1279.1208496094,,, +35.3398437500,565,1277.6556396484,,, +35.3417968750,565,1276.9230957031,,, +35.3437500000,565,1274.7252197266,,, +35.3457031250,565,1272.5274658203,,, +35.3476562500,565,1273.2601318359,,, +35.3496093750,565,1271.0622558594,,, +35.3515625000,565,1269.5970458984,,, +35.3535156250,565,1270.3297119141,,, +35.3554687500,565,1268.8645019531,,, +35.3574218750,565,1267.3992919922,,, +35.3593750000,565,1268.8645019531,,, +35.3613281250,565,1267.3992919922,,, +35.3632812500,565,1267.3992919922,,, +35.3652343750,565,1267.3992919922,,, +35.3671875000,565,1266.6666259766,,, +35.3691406250,565,1265.9340820312,,, +35.3710937500,565,1266.6666259766,,, +35.3730468750,565,1266.6666259766,,, +35.3750000000,566,1267.3992919922,,, +35.3769531250,566,1267.3992919922,,, +35.3789062500,566,1266.6666259766,,, +35.3808593750,566,1265.9340820312,,, +35.3828125000,566,1266.6666259766,,, +35.3847656250,566,1265.9340820312,,, +35.3867187500,566,1265.9340820312,,, +35.3886718750,566,1265.2014160156,,, +35.3906250000,566,1265.2014160156,,, +35.3925781250,566,1265.2014160156,,, +35.3945312500,566,1264.4688720703,,, +35.3964843750,566,1265.9340820312,,, +35.3984375000,566,1265.9340820312,,, +35.4003906250,566,1266.6666259766,,, +35.4023437500,566,1268.8645019531,,, +35.4042968750,566,1270.3297119141,,, +35.4062500000,566,1270.3297119141,,, +35.4082031250,566,1272.5274658203,,, +35.4101562500,566,1273.2601318359,,, +35.4121093750,566,1273.2601318359,,, +35.4140625000,566,1275.4578857422,,, +35.4160156250,566,1275.4578857422,,, +35.4179687500,566,1275.4578857422,,, +35.4199218750,566,1278.3883056641,,, +35.4218750000,566,1279.1208496094,,, +35.4238281250,566,1279.8535156250,,, +35.4257812500,566,1281.3187255859,,, +35.4277343750,566,1281.3187255859,,, +35.4296875000,566,1282.0512695312,,, +35.4316406250,566,1282.7839355469,,, +35.4335937500,566,1282.7839355469,,, +35.4355468750,566,1283.5164794922,,, +35.4375000000,567,1284.2490234375,,, +35.4394531250,567,1284.2490234375,,, +35.4414062500,567,1283.5164794922,,, +35.4433593750,567,1284.2490234375,,, +35.4453125000,567,1284.2490234375,,, +35.4472656250,567,1284.2490234375,,, +35.4492187500,567,1284.9816894531,,, +35.4511718750,567,1284.2490234375,,, +35.4531250000,567,1284.2490234375,,, +35.4550781250,567,1284.9816894531,,, +35.4570312500,567,1284.9816894531,,, +35.4589843750,567,1284.2490234375,,, +35.4609375000,567,1283.5164794922,,, +35.4628906250,567,1283.5164794922,,, +35.4648437500,567,1282.0512695312,,, +35.4667968750,567,1281.3187255859,,, +35.4687500000,567,1281.3187255859,,, +35.4707031250,567,1280.5860595703,,, +35.4726562500,567,1280.5860595703,,, +35.4746093750,567,1280.5860595703,,, +35.4765625000,567,1279.1208496094,,, +35.4785156250,567,1279.8535156250,,, +35.4804687500,567,1280.5860595703,,, +35.4824218750,567,1279.1208496094,,, +35.4843750000,567,1279.1208496094,,, +35.4863281250,567,1279.8535156250,,, +35.4882812500,567,1279.8535156250,,, +35.4902343750,567,1279.1208496094,,, +35.4921875000,567,1279.8535156250,,, +35.4941406250,567,1281.3187255859,,, +35.4960937500,567,1281.3187255859,,, +35.4980468750,567,1282.0512695312,,, +35.5000000000,568,1282.7839355469,,, +35.5019531250,568,1282.7839355469,,, +35.5039062500,568,1281.3187255859,,, +35.5058593750,568,1282.0512695312,,, +35.5078125000,568,1282.0512695312,,, +35.5097656250,568,1282.0512695312,,, +35.5117187500,568,1282.7839355469,,, +35.5136718750,568,1284.9816894531,,, +35.5156250000,568,1284.9816894531,,, +35.5175781250,568,1285.7142333984,,, +35.5195312500,568,1287.1794433594,,, +35.5214843750,568,1286.4468994141,,, +35.5234375000,568,1287.1794433594,,, +35.5253906250,568,1287.1794433594,,, +35.5273437500,568,1287.9121093750,,, +35.5292968750,568,1287.9121093750,,, +35.5312500000,568,1288.6446533203,,, +35.5332031250,568,1289.3773193359,,, +35.5351562500,568,1288.6446533203,,, +35.5371093750,568,1289.3773193359,,, +35.5390625000,568,1290.8425292969,,, +35.5410156250,568,1290.8425292969,,, +35.5429687500,568,1290.8425292969,,, +35.5449218750,568,1293.0402832031,,, +35.5468750000,568,1293.0402832031,,, +35.5488281250,568,1293.0402832031,,, +35.5507812500,568,1294.5054931641,,, +35.5527343750,568,1294.5054931641,,, +35.5546875000,568,1294.5054931641,,, +35.5566406250,568,1295.9707031250,,, +35.5585937500,568,1297.4359130859,,, +35.5605468750,568,1297.4359130859,,, +35.5625000000,569,1298.1684570312,,, +35.5644531250,569,1299.6336669922,,, +35.5664062500,569,1299.6336669922,,, +35.5683593750,569,1299.6336669922,,, +35.5703125000,569,1301.8315429688,,, +35.5722656250,569,1302.5640869141,,, +35.5742187500,569,1304.0292968750,,, +35.5761718750,569,1304.0292968750,,, +35.5781250000,569,1305.4945068359,,, +35.5800781250,569,1305.4945068359,,, +35.5820312500,569,1306.2270507812,,, +35.5839843750,569,1307.6922607422,,, +35.5859375000,569,1307.6922607422,,, +35.5878906250,569,1307.6922607422,,, +35.5898437500,569,1308.4249267578,,, +35.5917968750,569,1309.1574707031,,, +35.5937500000,569,1309.1574707031,,, +35.5957031250,569,1309.8901367188,,, +35.5976562500,569,1311.3553466797,,, +35.5996093750,569,1312.0878906250,,, +35.6015625000,569,1312.8205566406,,, +35.6035156250,569,1314.2857666016,,, +35.6054687500,569,1315.0183105469,,, +35.6074218750,569,1315.7509765625,,, +35.6093750000,569,1317.2160644531,,, +35.6113281250,569,1317.2160644531,,, +35.6132812500,569,1317.2160644531,,, +35.6152343750,569,1317.9487304688,,, +35.6171875000,569,1317.9487304688,,, +35.6191406250,569,1317.2160644531,,, +35.6210937500,569,1317.9487304688,,, +35.6230468750,569,1317.9487304688,,, +35.6250000000,570,1318.6812744141,,, +35.6269531250,570,1318.6812744141,,, +35.6289062500,570,1320.1464843750,,, +35.6308593750,570,1319.4139404297,,, +35.6328125000,570,1320.1464843750,,, +35.6347656250,570,1321.6116943359,,, +35.6367187500,570,1320.8791503906,,, +35.6386718750,570,1321.6116943359,,, +35.6406250000,570,1323.0769042969,,, +35.6425781250,570,1322.3443603516,,, +35.6445312500,570,1321.6116943359,,, +35.6464843750,570,1322.3443603516,,, +35.6484375000,570,1323.0769042969,,, +35.6503906250,570,1321.6116943359,,, +35.6523437500,570,1321.6116943359,,, +35.6542968750,570,1322.3443603516,,, +35.6562500000,570,1321.6116943359,,, +35.6582031250,570,1320.1464843750,,, +35.6601562500,570,1320.8791503906,,, +35.6621093750,570,1320.8791503906,,, +35.6640625000,570,1319.4139404297,,, +35.6660156250,570,1317.9487304688,,, +35.6679687500,570,1317.2160644531,,, +35.6699218750,570,1315.7509765625,,, +35.6718750000,570,1314.2857666016,,, +35.6738281250,570,1314.2857666016,,, +35.6757812500,570,1312.0878906250,,, +35.6777343750,570,1311.3553466797,,, +35.6796875000,570,1309.8901367188,,, +35.6816406250,570,1309.1574707031,,, +35.6835937500,570,1306.9597167969,,, +35.6855468750,570,1306.2270507812,,, +35.6875000000,571,1305.4945068359,,, +35.6894531250,571,1304.0292968750,,, +35.6914062500,571,1303.2967529297,,, +35.6933593750,571,1304.0292968750,,, +35.6953125000,571,1301.8315429688,,, +35.6972656250,571,1300.3663330078,,, +35.6992187500,571,1300.3663330078,,, +35.7011718750,571,1298.9011230469,,, +35.7031250000,571,1297.4359130859,,, +35.7050781250,571,1295.2380371094,,, +35.7070312500,571,1293.7729492188,,, +35.7089843750,571,1291.5750732422,,, +35.7109375000,571,1289.3773193359,,, +35.7128906250,571,1288.6446533203,,, +35.7148437500,571,1287.1794433594,,, +35.7167968750,571,1284.2490234375,,, +35.7187500000,571,1284.2490234375,,, +35.7207031250,571,1282.7839355469,,, +35.7226562500,571,1280.5860595703,,, +35.7246093750,571,1279.8535156250,,, +35.7265625000,571,1279.8535156250,,, +35.7285156250,571,1278.3883056641,,, +35.7304687500,571,1278.3883056641,,, +35.7324218750,571,1279.1208496094,,, +35.7343750000,571,1277.6556396484,,, +35.7363281250,571,1276.9230957031,,, +35.7382812500,571,1276.9230957031,,, +35.7402343750,571,1275.4578857422,,, +35.7421875000,571,1274.7252197266,,, +35.7441406250,571,1273.9926757812,,, +35.7460937500,571,1273.2601318359,,, +35.7480468750,571,1272.5274658203,,, +35.7500000000,572,1271.7949218750,,, +35.7519531250,572,1273.2601318359,,, +35.7539062500,572,1272.5274658203,,, +35.7558593750,572,1271.7949218750,,, +35.7578125000,572,1271.7949218750,,, +35.7597656250,572,1270.3297119141,,, +35.7617187500,572,1271.0622558594,,, +35.7636718750,572,1271.0622558594,,, +35.7656250000,572,1269.5970458984,,, +35.7675781250,572,1269.5970458984,,, +35.7695312500,572,1268.8645019531,,, +35.7714843750,572,1268.1318359375,,, +35.7734375000,572,1268.8645019531,,, +35.7753906250,572,1269.5970458984,,, +35.7773437500,572,1268.8645019531,,, +35.7792968750,572,1268.8645019531,,, +35.7812500000,572,1269.5970458984,,, +35.7832031250,572,1270.3297119141,,, +35.7851562500,572,1269.5970458984,,, +35.7871093750,572,1270.3297119141,,, +35.7890625000,572,1270.3297119141,,, +35.7910156250,572,1271.0622558594,,, +35.7929687500,572,1271.0622558594,,, +35.7949218750,572,1273.2601318359,,, +35.7968750000,572,1273.2601318359,,, +35.7988281250,572,1274.7252197266,,, +35.8007812500,572,1277.6556396484,,, +35.8027343750,572,1278.3883056641,,, +35.8046875000,572,1280.5860595703,,, +35.8066406250,572,1282.7839355469,,, +35.8085937500,572,1284.9816894531,,, +35.8105468750,572,1287.9121093750,,, +35.8125000000,573,1290.8425292969,,, +35.8144531250,573,1294.5054931641,,, +35.8164062500,573,1298.9011230469,,, +35.8183593750,573,1302.5640869141,,, +35.8203125000,573,1308.4249267578,,, +35.8222656250,573,1312.0878906250,,, +35.8242187500,573,1316.4835205078,,, +35.8261718750,573,1323.8095703125,,, +35.8281250000,573,1330.4029541016,,, +35.8300781250,573,1336.9963378906,,, +35.8320312500,573,1345.7875976562,,, +35.8339843750,573,1353.8461914062,,, +35.8359375000,573,1361.9047851562,,, +35.8378906250,573,1372.1611328125,,, +35.8398437500,573,1382.4176025391,,, +35.8417968750,573,1391.9414062500,,, +35.8437500000,573,1402.9304199219,,, +35.8457031250,573,1415.3846435547,,, +35.8476562500,573,1425.6409912109,,, +35.8496093750,573,1438.0952148438,,, +35.8515625000,573,1452.7471923828,,, +35.8535156250,573,1466.6666259766,,, +35.8554687500,573,1480.5860595703,,, +35.8574218750,573,1495.2380371094,,, +35.8593750000,573,1511.3553466797,,, +35.8613281250,573,1526.7398681641,,, +35.8632812500,573,1542.8571777344,,, +35.8652343750,573,1560.4395751953,,, +35.8671875000,573,1575.0915527344,,, +35.8691406250,573,1591.9414062500,,, +35.8710937500,573,1608.7912597656,,, +35.8730468750,573,1625.6409912109,,, +35.8750000000,574,1641.0256347656,,, +35.8769531250,574,1657.8754882812,,, +35.8789062500,574,1674.7252197266,,, +35.8808593750,574,1690.1098632812,,, +35.8828125000,574,1706.2270507812,,, +35.8847656250,574,1722.3443603516,,, +35.8867187500,574,1736.9963378906,,, +35.8886718750,574,1750.9157714844,,, +35.8906250000,574,1765.5677490234,,, +35.8925781250,574,1778.7546386719,,, +35.8945312500,574,1790.4761962891,,, +35.8964843750,574,1803.6629638672,,, +35.8984375000,574,1814.6519775391,,, +35.9003906250,574,1823.4432373047,,, +35.9023437500,574,1835.1647949219,,, +35.9042968750,574,1844.6885986328,,, +35.9062500000,574,1852.0146484375,,, +35.9082031250,574,1859.3406982422,,, +35.9101562500,574,1865.9340820312,,, +35.9121093750,574,1870.3297119141,,, +35.9140625000,574,1875.4578857422,,, +35.9160156250,574,1879.8535156250,,, +35.9179687500,574,1882.0512695312,,, +35.9199218750,574,1884.2490234375,,, +35.9218750000,574,1886.4468994141,,, +35.9238281250,574,1885.7142333984,,, +35.9257812500,574,1885.7142333984,,, +35.9277343750,574,1884.2490234375,,, +35.9296875000,574,1881.3187255859,,, +35.9316406250,574,1878.3883056641,,, +35.9335937500,574,1874.7252197266,,, +35.9355468750,574,1870.3297119141,,, +35.9375000000,575,1865.2014160156,,, +35.9394531250,575,1860.0732421875,,, +35.9414062500,575,1852.0146484375,,, +35.9433593750,575,1844.6885986328,,, +35.9453125000,575,1838.0952148438,,, +35.9472656250,575,1827.8388671875,,, +35.9492187500,575,1817.5823974609,,, +35.9511718750,575,1808.7912597656,,, +35.9531250000,575,1798.5347900391,,, +35.9550781250,575,1786.8132324219,,, +35.9570312500,575,1777.2894287109,,, +35.9589843750,575,1766.3004150391,,, +35.9609375000,575,1753.8461914062,,, +35.9628906250,575,1742.1245117188,,, +35.9648437500,575,1731.1354980469,,, +35.9667968750,575,1717.9487304688,,, +35.9687500000,575,1704.7619628906,,, +35.9707031250,575,1693.0402832031,,, +35.9726562500,575,1679.8535156250,,, +35.9746093750,575,1667.3992919922,,, +35.9765625000,575,1654.9450683594,,, +35.9785156250,575,1641.0256347656,,, +35.9804687500,575,1627.8388671875,,, +35.9824218750,575,1614.6519775391,,, +35.9843750000,575,1600.7325439453,,, +35.9863281250,575,1587.5457763672,,, +35.9882812500,575,1575.0915527344,,, +35.9902343750,575,1562.6373291016,,, +35.9921875000,575,1550.9157714844,,, +35.9941406250,575,1539.9267578125,,, +35.9960937500,575,1526.7398681641,,, +35.9980468750,575,1515.7509765625,,, +36.0000000000,576,1506.2270507812,,, +36.0019531250,576,1494.5054931641,,, +36.0039062500,576,1484.2490234375,,, +36.0058593750,576,1474.7252197266,,, +36.0078125000,576,1463.7362060547,,, +36.0097656250,576,1452.7471923828,,, +36.0117187500,576,1445.4212646484,,, +36.0136718750,576,1437.3626708984,,, +36.0156250000,576,1427.8388671875,,, +36.0175781250,576,1420.5128173828,,, +36.0195312500,576,1413.9194335938,,, +36.0214843750,576,1405.8608398438,,, +36.0234375000,576,1399.2674560547,,, +36.0253906250,576,1393.4066162109,,, +36.0273437500,576,1386.8132324219,,, +36.0292968750,576,1380.2197265625,,, +36.0312500000,576,1376.5567626953,,, +36.0332031250,576,1370.6959228516,,, +36.0351562500,576,1367.0329589844,,, +36.0371093750,576,1362.6373291016,,, +36.0390625000,576,1358.9743652344,,, +36.0410156250,576,1355.3114013672,,, +36.0429687500,576,1353.1135253906,,, +36.0449218750,576,1349.4505615234,,, +36.0468750000,576,1345.7875976562,,, +36.0488281250,576,1345.0549316406,,, +36.0507812500,576,1342.1245117188,,, +36.0527343750,576,1339.9267578125,,, +36.0546875000,576,1338.4615478516,,, +36.0566406250,576,1336.2637939453,,, +36.0585937500,576,1332.6007080078,,, +36.0605468750,576,1331.1354980469,,, +36.0625000000,577,1328.9377441406,,, +36.0644531250,577,1326.7398681641,,, +36.0664062500,577,1326.7398681641,,, +36.0683593750,577,1324.5421142578,,, +36.0703125000,577,1323.0769042969,,, +36.0722656250,577,1323.8095703125,,, +36.0742187500,577,1321.6116943359,,, +36.0761718750,577,1320.1464843750,,, +36.0781250000,577,1320.1464843750,,, +36.0800781250,577,1317.9487304688,,, +36.0820312500,577,1316.4835205078,,, +36.0839843750,577,1316.4835205078,,, +36.0859375000,577,1315.0183105469,,, +36.0878906250,577,1315.0183105469,,, +36.0898437500,577,1315.7509765625,,, +36.0917968750,577,1315.0183105469,,, +36.0937500000,577,1314.2857666016,,, +36.0957031250,577,1315.7509765625,,, +36.0976562500,577,1315.0183105469,,, +36.0996093750,577,1314.2857666016,,, +36.1015625000,577,1315.0183105469,,, +36.1035156250,577,1314.2857666016,,, +36.1054687500,577,1314.2857666016,,, +36.1074218750,577,1315.0183105469,,, +36.1093750000,577,1315.0183105469,,, +36.1113281250,577,1314.2857666016,,, +36.1132812500,577,1315.7509765625,,, +36.1152343750,577,1315.7509765625,,, +36.1171875000,577,1315.7509765625,,, +36.1191406250,577,1317.2160644531,,, +36.1210937500,577,1317.2160644531,,, +36.1230468750,577,1317.2160644531,,, +36.1250000000,578,1318.6812744141,,, +36.1269531250,578,1319.4139404297,,, +36.1289062500,578,1319.4139404297,,, +36.1308593750,578,1320.1464843750,,, +36.1328125000,578,1322.3443603516,,, +36.1347656250,578,1323.0769042969,,, +36.1367187500,578,1325.2747802734,,, +36.1386718750,578,1327.4725341797,,, +36.1406250000,578,1328.2050781250,,, +36.1425781250,578,1328.9377441406,,, +36.1445312500,578,1331.1354980469,,, +36.1464843750,578,1333.3333740234,,, +36.1484375000,578,1335.5311279297,,, +36.1503906250,578,1336.9963378906,,, +36.1523437500,578,1339.1940917969,,, +36.1542968750,578,1340.6593017578,,, +36.1562500000,578,1342.8571777344,,, +36.1582031250,578,1345.7875976562,,, +36.1601562500,578,1347.2528076172,,, +36.1621093750,578,1348.7178955078,,, +36.1640625000,578,1351.6483154297,,, +36.1660156250,578,1353.8461914062,,, +36.1679687500,578,1356.0439453125,,, +36.1699218750,578,1358.9743652344,,, +36.1718750000,578,1361.1721191406,,, +36.1738281250,578,1364.1025390625,,, +36.1757812500,578,1365.5677490234,,, +36.1777343750,578,1367.0329589844,,, +36.1796875000,578,1370.6959228516,,, +36.1816406250,578,1371.4285888672,,, +36.1835937500,578,1373.6263427734,,, +36.1855468750,578,1375.8242187500,,, +36.1875000000,579,1378.0219726562,,, +36.1894531250,579,1378.7546386719,,, +36.1914062500,579,1381.6849365234,,, +36.1933593750,579,1383.1501464844,,, +36.1953125000,579,1383.1501464844,,, +36.1972656250,579,1383.8828125000,,, +36.1992187500,579,1385.3480224609,,, +36.2011718750,579,1385.3480224609,,, +36.2031250000,579,1385.3480224609,,, +36.2050781250,579,1386.0805664062,,, +36.2070312500,579,1384.6153564453,,, +36.2089843750,579,1384.6153564453,,, +36.2109375000,579,1383.8828125000,,, +36.2128906250,579,1383.1501464844,,, +36.2148437500,579,1382.4176025391,,, +36.2167968750,579,1382.4176025391,,, +36.2187500000,579,1380.9523925781,,, +36.2207031250,579,1379.4871826172,,, +36.2226562500,579,1378.7546386719,,, +36.2246093750,579,1378.7546386719,,, +36.2265625000,579,1378.0219726562,,, +36.2285156250,579,1376.5567626953,,, +36.2304687500,579,1375.0915527344,,, +36.2324218750,579,1375.8242187500,,, +36.2343750000,579,1375.0915527344,,, +36.2363281250,579,1372.8937988281,,, +36.2382812500,579,1370.6959228516,,, +36.2402343750,579,1370.6959228516,,, +36.2421875000,579,1368.4981689453,,, +36.2441406250,579,1364.8352050781,,, +36.2460937500,579,1363.3699951172,,, +36.2480468750,579,1362.6373291016,,, +36.2500000000,580,1359.7069091797,,, +36.2519531250,580,1358.2416992188,,, +36.2539062500,580,1356.0439453125,,, +36.2558593750,580,1354.5787353516,,, +36.2578125000,580,1353.8461914062,,, +36.2597656250,580,1351.6483154297,,, +36.2617187500,580,1350.9157714844,,, +36.2636718750,580,1350.1831054688,,, +36.2656250000,580,1347.2528076172,,, +36.2675781250,580,1345.7875976562,,, +36.2695312500,580,1344.3223876953,,, +36.2714843750,580,1342.1245117188,,, +36.2734375000,580,1340.6593017578,,, +36.2753906250,580,1338.4615478516,,, +36.2773437500,580,1336.2637939453,,, +36.2792968750,580,1334.0659179688,,, +36.2812500000,580,1332.6007080078,,, +36.2832031250,580,1329.6702880859,,, +36.2851562500,580,1327.4725341797,,, +36.2871093750,580,1326.0073242188,,, +36.2890625000,580,1323.0769042969,,, +36.2910156250,580,1321.6116943359,,, +36.2929687500,580,1320.1464843750,,, +36.2949218750,580,1317.9487304688,,, +36.2968750000,580,1315.0183105469,,, +36.2988281250,580,1314.2857666016,,, +36.3007812500,580,1311.3553466797,,, +36.3027343750,580,1308.4249267578,,, +36.3046875000,580,1307.6922607422,,, +36.3066406250,580,1304.0292968750,,, +36.3085937500,580,1301.0988769531,,, +36.3105468750,580,1300.3663330078,,, +36.3125000000,581,1298.9011230469,,, +36.3144531250,581,1296.7032470703,,, +36.3164062500,581,1294.5054931641,,, +36.3183593750,581,1294.5054931641,,, +36.3203125000,581,1292.3077392578,,, +36.3222656250,581,1291.5750732422,,, +36.3242187500,581,1290.8425292969,,, +36.3261718750,581,1289.3773193359,,, +36.3281250000,581,1287.9121093750,,, +36.3300781250,581,1287.1794433594,,, +36.3320312500,581,1284.9816894531,,, +36.3339843750,581,1284.2490234375,,, +36.3359375000,581,1282.7839355469,,, +36.3378906250,581,1282.0512695312,,, +36.3398437500,581,1280.5860595703,,, +36.3417968750,581,1279.8535156250,,, +36.3437500000,581,1276.9230957031,,, +36.3457031250,581,1275.4578857422,,, +36.3476562500,581,1273.9926757812,,, +36.3496093750,581,1272.5274658203,,, +36.3515625000,581,1271.0622558594,,, +36.3535156250,581,1270.3297119141,,, +36.3554687500,581,1268.8645019531,,, +36.3574218750,581,1267.3992919922,,, +36.3593750000,581,1266.6666259766,,, +36.3613281250,581,1265.2014160156,,, +36.3632812500,581,1263.7362060547,,, +36.3652343750,581,1263.7362060547,,, +36.3671875000,581,1261.5384521484,,, +36.3691406250,581,1259.3406982422,,, +36.3710937500,581,1259.3406982422,,, +36.3730468750,581,1257.8754882812,,, +36.3750000000,582,1257.1428222656,,, +36.3769531250,582,1256.4102783203,,, +36.3789062500,582,1254.9450683594,,, +36.3808593750,582,1252.7471923828,,, +36.3828125000,582,1254.2124023438,,, +36.3847656250,582,1252.7471923828,,, +36.3867187500,582,1252.7471923828,,, +36.3886718750,582,1253.4798583984,,, +36.3906250000,582,1253.4798583984,,, +36.3925781250,582,1252.7471923828,,, +36.3945312500,582,1254.2124023438,,, +36.3964843750,582,1254.9450683594,,, +36.3984375000,582,1254.9450683594,,, +36.4003906250,582,1255.6776123047,,, +36.4023437500,582,1256.4102783203,,, +36.4042968750,582,1256.4102783203,,, +36.4062500000,582,1257.1428222656,,, +36.4082031250,582,1258.6080322266,,, +36.4101562500,582,1259.3406982422,,, +36.4121093750,582,1257.8754882812,,, +36.4140625000,582,1260.0732421875,,, +36.4160156250,582,1259.3406982422,,, +36.4179687500,582,1258.6080322266,,, +36.4199218750,582,1260.0732421875,,, +36.4218750000,582,1260.8059082031,,, +36.4238281250,582,1260.0732421875,,, +36.4257812500,582,1262.2711181641,,, +36.4277343750,582,1263.7362060547,,, +36.4296875000,582,1263.7362060547,,, +36.4316406250,582,1264.4688720703,,, +36.4335937500,582,1265.2014160156,,, +36.4355468750,582,1266.6666259766,,, +36.4375000000,583,1268.1318359375,,, +36.4394531250,583,1268.8645019531,,, +36.4414062500,583,1268.8645019531,,, +36.4433593750,583,1270.3297119141,,, +36.4453125000,583,1271.0622558594,,, +36.4472656250,583,1271.7949218750,,, +36.4492187500,583,1273.2601318359,,, +36.4511718750,583,1273.9926757812,,, +36.4531250000,583,1273.9926757812,,, +36.4550781250,583,1274.7252197266,,, +36.4570312500,583,1276.1904296875,,, +36.4589843750,583,1276.1904296875,,, +36.4609375000,583,1276.9230957031,,, +36.4628906250,583,1278.3883056641,,, +36.4648437500,583,1277.6556396484,,, +36.4667968750,583,1278.3883056641,,, +36.4687500000,583,1280.5860595703,,, +36.4707031250,583,1282.0512695312,,, +36.4726562500,583,1282.0512695312,,, +36.4746093750,583,1284.9816894531,,, +36.4765625000,583,1284.9816894531,,, +36.4785156250,583,1285.7142333984,,, +36.4804687500,583,1287.9121093750,,, +36.4824218750,583,1287.9121093750,,, +36.4843750000,583,1289.3773193359,,, +36.4863281250,583,1290.1098632812,,, +36.4882812500,583,1290.1098632812,,, +36.4902343750,583,1290.1098632812,,, +36.4921875000,583,1291.5750732422,,, +36.4941406250,583,1291.5750732422,,, +36.4960937500,583,1293.0402832031,,, +36.4980468750,583,1293.0402832031,,, +36.5000000000,584,1293.7729492188,,, +36.5019531250,584,1293.7729492188,,, +36.5039062500,584,1295.2380371094,,, +36.5058593750,584,1295.9707031250,,, +36.5078125000,584,1297.4359130859,,, +36.5097656250,584,1298.1684570312,,, +36.5117187500,584,1299.6336669922,,, +36.5136718750,584,1300.3663330078,,, +36.5156250000,584,1301.8315429688,,, +36.5175781250,584,1304.0292968750,,, +36.5195312500,584,1304.7619628906,,, +36.5214843750,584,1304.7619628906,,, +36.5234375000,584,1307.6922607422,,, +36.5253906250,584,1307.6922607422,,, +36.5273437500,584,1308.4249267578,,, +36.5292968750,584,1309.8901367188,,, +36.5312500000,584,1309.8901367188,,, +36.5332031250,584,1310.6226806641,,, +36.5351562500,584,1311.3553466797,,, +36.5371093750,584,1312.0878906250,,, +36.5390625000,584,1311.3553466797,,, +36.5410156250,584,1312.0878906250,,, +36.5429687500,584,1312.0878906250,,, +36.5449218750,584,1311.3553466797,,, +36.5468750000,584,1311.3553466797,,, +36.5488281250,584,1311.3553466797,,, +36.5507812500,584,1311.3553466797,,, +36.5527343750,584,1309.8901367188,,, +36.5546875000,584,1309.8901367188,,, +36.5566406250,584,1309.8901367188,,, +36.5585937500,584,1308.4249267578,,, +36.5605468750,584,1306.9597167969,,, +36.5625000000,585,1307.6922607422,,, +36.5644531250,585,1306.9597167969,,, +36.5664062500,585,1305.4945068359,,, +36.5683593750,585,1306.2270507812,,, +36.5703125000,585,1305.4945068359,,, +36.5722656250,585,1304.7619628906,,, +36.5742187500,585,1304.7619628906,,, +36.5761718750,585,1304.7619628906,,, +36.5781250000,585,1304.0292968750,,, +36.5800781250,585,1304.0292968750,,, +36.5820312500,585,1304.0292968750,,, +36.5839843750,585,1304.0292968750,,, +36.5859375000,585,1303.2967529297,,, +36.5878906250,585,1302.5640869141,,, +36.5898437500,585,1301.8315429688,,, +36.5917968750,585,1302.5640869141,,, +36.5937500000,585,1303.2967529297,,, +36.5957031250,585,1303.2967529297,,, +36.5976562500,585,1303.2967529297,,, +36.5996093750,585,1303.2967529297,,, +36.6015625000,585,1302.5640869141,,, +36.6035156250,585,1302.5640869141,,, +36.6054687500,585,1301.8315429688,,, +36.6074218750,585,1300.3663330078,,, +36.6093750000,585,1301.0988769531,,, +36.6113281250,585,1298.9011230469,,, +36.6132812500,585,1297.4359130859,,, +36.6152343750,585,1297.4359130859,,, +36.6171875000,585,1295.9707031250,,, +36.6191406250,585,1294.5054931641,,, +36.6210937500,585,1294.5054931641,,, +36.6230468750,585,1293.0402832031,,, +36.6250000000,586,1290.8425292969,,, +36.6269531250,586,1290.8425292969,,, +36.6289062500,586,1290.1098632812,,, +36.6308593750,586,1290.8425292969,,, +36.6328125000,586,1290.1098632812,,, +36.6347656250,586,1290.1098632812,,, +36.6367187500,586,1291.5750732422,,, +36.6386718750,586,1290.8425292969,,, +36.6406250000,586,1292.3077392578,,, +36.6425781250,586,1292.3077392578,,, +36.6445312500,586,1292.3077392578,,, +36.6464843750,586,1293.7729492188,,, +36.6484375000,586,1293.7729492188,,, +36.6503906250,586,1293.0402832031,,, +36.6523437500,586,1293.7729492188,,, +36.6542968750,586,1293.0402832031,,, +36.6562500000,586,1293.7729492188,,, +36.6582031250,586,1293.0402832031,,, +36.6601562500,586,1293.0402832031,,, +36.6621093750,586,1294.5054931641,,, +36.6640625000,586,1294.5054931641,,, +36.6660156250,586,1293.7729492188,,, +36.6679687500,586,1293.7729492188,,, +36.6699218750,586,1293.7729492188,,, +36.6718750000,586,1293.7729492188,,, +36.6738281250,586,1295.2380371094,,, +36.6757812500,586,1295.2380371094,,, +36.6777343750,586,1296.7032470703,,, +36.6796875000,586,1296.7032470703,,, +36.6816406250,586,1297.4359130859,,, +36.6835937500,586,1298.9011230469,,, +36.6855468750,586,1298.1684570312,,, +36.6875000000,587,1298.1684570312,,, +36.6894531250,587,1298.9011230469,,, +36.6914062500,587,1298.9011230469,,, +36.6933593750,587,1299.6336669922,,, +36.6953125000,587,1299.6336669922,,, +36.6972656250,587,1298.9011230469,,, +36.6992187500,587,1299.6336669922,,, +36.7011718750,587,1298.9011230469,,, +36.7031250000,587,1298.1684570312,,, +36.7050781250,587,1298.9011230469,,, +36.7070312500,587,1297.4359130859,,, +36.7089843750,587,1296.7032470703,,, +36.7109375000,587,1297.4359130859,,, +36.7128906250,587,1296.7032470703,,, +36.7148437500,587,1295.9707031250,,, +36.7167968750,587,1295.9707031250,,, +36.7187500000,587,1294.5054931641,,, +36.7207031250,587,1293.7729492188,,, +36.7226562500,587,1294.5054931641,,, +36.7246093750,587,1295.2380371094,,, +36.7265625000,587,1295.2380371094,,, +36.7285156250,587,1293.7729492188,,, +36.7304687500,587,1293.7729492188,,, +36.7324218750,587,1294.5054931641,,, +36.7343750000,587,1293.0402832031,,, +36.7363281250,587,1293.0402832031,,, +36.7382812500,587,1293.7729492188,,, +36.7402343750,587,1291.5750732422,,, +36.7421875000,587,1290.8425292969,,, +36.7441406250,587,1290.8425292969,,, +36.7460937500,587,1289.3773193359,,, +36.7480468750,587,1288.6446533203,,, +36.7500000000,588,1288.6446533203,,, +36.7519531250,588,1287.1794433594,,, +36.7539062500,588,1287.1794433594,,, +36.7558593750,588,1287.9121093750,,, +36.7578125000,588,1287.9121093750,,, +36.7597656250,588,1287.9121093750,,, +36.7617187500,588,1289.3773193359,,, +36.7636718750,588,1288.6446533203,,, +36.7656250000,588,1288.6446533203,,, +36.7675781250,588,1289.3773193359,,, +36.7695312500,588,1290.1098632812,,, +36.7714843750,588,1289.3773193359,,, +36.7734375000,588,1290.8425292969,,, +36.7753906250,588,1292.3077392578,,, +36.7773437500,588,1292.3077392578,,, +36.7792968750,588,1292.3077392578,,, +36.7812500000,588,1293.7729492188,,, +36.7832031250,588,1295.9707031250,,, +36.7851562500,588,1295.9707031250,,, +36.7871093750,588,1298.1684570312,,, +36.7890625000,588,1300.3663330078,,, +36.7910156250,588,1301.0988769531,,, +36.7929687500,588,1302.5640869141,,, +36.7949218750,588,1305.4945068359,,, +36.7968750000,588,1309.1574707031,,, +36.7988281250,588,1314.2857666016,,, +36.8007812500,588,1319.4139404297,,, +36.8027343750,588,1323.0769042969,,, +36.8046875000,588,1326.7398681641,,, +36.8066406250,588,1333.3333740234,,, +36.8085937500,588,1340.6593017578,,, +36.8105468750,588,1347.2528076172,,, +36.8125000000,589,1353.8461914062,,, +36.8144531250,589,1364.1025390625,,, +36.8164062500,589,1372.8937988281,,, +36.8183593750,589,1382.4176025391,,, +36.8203125000,589,1393.4066162109,,, +36.8222656250,589,1405.8608398438,,, +36.8242187500,589,1416.8498535156,,, +36.8261718750,589,1429.3040771484,,, +36.8281250000,589,1443.2233886719,,, +36.8300781250,589,1456.4102783203,,, +36.8320312500,589,1469.5970458984,,, +36.8339843750,589,1484.2490234375,,, +36.8359375000,589,1501.0988769531,,, +36.8378906250,589,1517.2160644531,,, +36.8398437500,589,1532.6007080078,,, +36.8417968750,589,1550.1831054688,,, +36.8437500000,589,1568.4981689453,,, +36.8457031250,589,1583.8828125000,,, +36.8476562500,589,1601.4652099609,,, +36.8496093750,589,1619.7802734375,,, +36.8515625000,589,1638.0952148438,,, +36.8535156250,589,1654.9450683594,,, +36.8554687500,589,1672.5274658203,,, +36.8574218750,589,1690.1098632812,,, +36.8593750000,589,1706.9597167969,,, +36.8613281250,589,1721.6116943359,,, +36.8632812500,589,1737.7288818359,,, +36.8652343750,589,1753.1135253906,,, +36.8671875000,589,1768.4981689453,,, +36.8691406250,589,1782.4176025391,,, +36.8710937500,589,1797.8022460938,,, +36.8730468750,589,1810.9890136719,,, +36.8750000000,590,1823.4432373047,,, +36.8769531250,590,1837.3626708984,,, +36.8789062500,590,1847.6190185547,,, +36.8808593750,590,1858.6080322266,,, +36.8828125000,590,1868.8645019531,,, +36.8847656250,590,1875.4578857422,,, +36.8867187500,590,1884.2490234375,,, +36.8886718750,590,1893.0402832031,,, +36.8906250000,590,1898.9011230469,,, +36.8925781250,590,1904.7619628906,,, +36.8945312500,590,1910.6226806641,,, +36.8964843750,590,1912.8205566406,,, +36.8984375000,590,1915.7509765625,,, +36.9003906250,590,1918.6812744141,,, +36.9023437500,590,1919.4139404297,,, +36.9042968750,590,1920.1464843750,,, +36.9062500000,590,1920.8791503906,,, +36.9082031250,590,1917.9487304688,,, +36.9101562500,590,1915.7509765625,,, +36.9121093750,590,1912.8205566406,,, +36.9140625000,590,1907.6922607422,,, +36.9160156250,590,1902.5640869141,,, +36.9179687500,590,1897.4359130859,,, +36.9199218750,590,1889.3773193359,,, +36.9218750000,590,1880.5860595703,,, +36.9238281250,590,1873.2601318359,,, +36.9257812500,590,1861.5384521484,,, +36.9277343750,590,1852.0146484375,,, +36.9296875000,590,1841.7583007812,,, +36.9316406250,590,1830.0366210938,,, +36.9335937500,590,1818.3150634766,,, +36.9355468750,590,1808.0585937500,,, +36.9375000000,591,1794.8718261719,,, +36.9394531250,591,1781.6849365234,,, +36.9414062500,591,1769.2307128906,,, +36.9433593750,591,1755.3114013672,,, +36.9453125000,591,1742.1245117188,,, +36.9472656250,591,1728.2050781250,,, +36.9492187500,591,1715.0183105469,,, +36.9511718750,591,1702.5640869141,,, +36.9531250000,591,1687.1794433594,,, +36.9550781250,591,1673.2601318359,,, +36.9570312500,591,1660.8059082031,,, +36.9589843750,591,1646.1538085938,,, +36.9609375000,591,1632.9670410156,,, +36.9628906250,591,1619.7802734375,,, +36.9648437500,591,1605.1281738281,,, +36.9667968750,591,1592.6739501953,,, +36.9687500000,591,1580.9523925781,,, +36.9707031250,591,1568.4981689453,,, +36.9726562500,591,1556.7766113281,,, +36.9746093750,591,1545.7875976562,,, +36.9765625000,591,1534.0659179688,,, +36.9785156250,591,1523.0769042969,,, +36.9804687500,591,1513.5531005859,,, +36.9824218750,591,1503.2967529297,,, +36.9843750000,591,1494.5054931641,,, +36.9863281250,591,1484.9816894531,,, +36.9882812500,591,1476.1904296875,,, +36.9902343750,591,1468.1318359375,,, +36.9921875000,591,1460.8059082031,,, +36.9941406250,591,1452.7471923828,,, +36.9960937500,591,1445.4212646484,,, +36.9980468750,591,1438.8278808594,,, +37.0000000000,592,1431.5018310547,,, +37.0019531250,592,1427.1062011719,,, +37.0039062500,592,1421.2453613281,,, +37.0058593750,592,1416.1171875000,,, +37.0078125000,592,1411.7215576172,,, +37.0097656250,592,1406.5933837891,,, +37.0117187500,592,1402.1977539062,,, +37.0136718750,592,1399.2674560547,,, +37.0156250000,592,1394.8718261719,,, +37.0175781250,592,1390.4761962891,,, +37.0195312500,592,1388.2784423828,,, +37.0214843750,592,1384.6153564453,,, +37.0234375000,592,1380.9523925781,,, +37.0253906250,592,1379.4871826172,,, +37.0273437500,592,1375.8242187500,,, +37.0292968750,592,1373.6263427734,,, +37.0312500000,592,1371.4285888672,,, +37.0332031250,592,1367.7656250000,,, +37.0351562500,592,1365.5677490234,,, +37.0371093750,592,1363.3699951172,,, +37.0390625000,592,1361.1721191406,,, +37.0410156250,592,1360.4395751953,,, +37.0429687500,592,1357.5091552734,,, +37.0449218750,592,1353.8461914062,,, +37.0468750000,592,1350.9157714844,,, +37.0488281250,592,1348.7178955078,,, +37.0507812500,592,1345.0549316406,,, +37.0527343750,592,1342.8571777344,,, +37.0546875000,592,1341.3919677734,,, +37.0566406250,592,1338.4615478516,,, +37.0585937500,592,1335.5311279297,,, +37.0605468750,592,1333.3333740234,,, +37.0625000000,593,1332.6007080078,,, +37.0644531250,593,1331.1354980469,,, +37.0664062500,593,1328.9377441406,,, +37.0683593750,593,1328.9377441406,,, +37.0703125000,593,1326.7398681641,,, +37.0722656250,593,1325.2747802734,,, +37.0742187500,593,1326.7398681641,,, +37.0761718750,593,1326.7398681641,,, +37.0781250000,593,1324.5421142578,,, +37.0800781250,593,1324.5421142578,,, +37.0820312500,593,1325.2747802734,,, +37.0839843750,593,1324.5421142578,,, +37.0859375000,593,1323.8095703125,,, +37.0878906250,593,1325.2747802734,,, +37.0898437500,593,1326.0073242188,,, +37.0917968750,593,1326.7398681641,,, +37.0937500000,593,1326.7398681641,,, +37.0957031250,593,1328.2050781250,,, +37.0976562500,593,1328.2050781250,,, +37.0996093750,593,1328.2050781250,,, +37.1015625000,593,1328.9377441406,,, +37.1035156250,593,1331.8681640625,,, +37.1054687500,593,1333.3333740234,,, +37.1074218750,593,1335.5311279297,,, +37.1093750000,593,1338.4615478516,,, +37.1113281250,593,1340.6593017578,,, +37.1132812500,593,1342.1245117188,,, +37.1152343750,593,1343.5897216797,,, +37.1171875000,593,1344.3223876953,,, +37.1191406250,593,1346.5201416016,,, +37.1210937500,593,1347.2528076172,,, +37.1230468750,593,1347.9853515625,,, +37.1250000000,594,1350.1831054688,,, +37.1269531250,594,1350.9157714844,,, +37.1289062500,594,1352.3809814453,,, +37.1308593750,594,1354.5787353516,,, +37.1328125000,594,1357.5091552734,,, +37.1347656250,594,1359.7069091797,,, +37.1367187500,594,1361.9047851562,,, +37.1386718750,594,1364.1025390625,,, +37.1406250000,594,1366.3004150391,,, +37.1425781250,594,1366.3004150391,,, +37.1445312500,594,1367.7656250000,,, +37.1464843750,594,1369.9633789062,,, +37.1484375000,594,1369.9633789062,,, +37.1503906250,594,1372.1611328125,,, +37.1523437500,594,1372.8937988281,,, +37.1542968750,594,1373.6263427734,,, +37.1562500000,594,1375.8242187500,,, +37.1582031250,594,1377.2894287109,,, +37.1601562500,594,1378.0219726562,,, +37.1621093750,594,1380.2197265625,,, +37.1640625000,594,1381.6849365234,,, +37.1660156250,594,1382.4176025391,,, +37.1679687500,594,1385.3480224609,,, +37.1699218750,594,1386.8132324219,,, +37.1718750000,594,1388.2784423828,,, +37.1738281250,594,1390.4761962891,,, +37.1757812500,594,1391.9414062500,,, +37.1777343750,594,1391.9414062500,,, +37.1796875000,594,1393.4066162109,,, +37.1816406250,594,1395.6043701172,,, +37.1835937500,594,1396.3370361328,,, +37.1855468750,594,1397.8022460938,,, +37.1875000000,595,1399.2674560547,,, +37.1894531250,595,1400.7325439453,,, +37.1914062500,595,1400.7325439453,,, +37.1933593750,595,1402.9304199219,,, +37.1953125000,595,1403.6629638672,,, +37.1972656250,595,1403.6629638672,,, +37.1992187500,595,1403.6629638672,,, +37.2011718750,595,1403.6629638672,,, +37.2031250000,595,1401.4652099609,,, +37.2050781250,595,1402.1977539062,,, +37.2070312500,595,1400.7325439453,,, +37.2089843750,595,1399.2674560547,,, +37.2109375000,595,1399.2674560547,,, +37.2128906250,595,1398.5347900391,,, +37.2148437500,595,1396.3370361328,,, +37.2167968750,595,1394.8718261719,,, +37.2187500000,595,1394.1391601562,,, +37.2207031250,595,1391.9414062500,,, +37.2226562500,595,1389.0109863281,,, +37.2246093750,595,1387.5457763672,,, +37.2265625000,595,1386.0805664062,,, +37.2285156250,595,1382.4176025391,,, +37.2304687500,595,1379.4871826172,,, +37.2324218750,595,1378.0219726562,,, +37.2343750000,595,1375.0915527344,,, +37.2363281250,595,1371.4285888672,,, +37.2382812500,595,1370.6959228516,,, +37.2402343750,595,1367.0329589844,,, +37.2421875000,595,1363.3699951172,,, +37.2441406250,595,1361.1721191406,,, +37.2460937500,595,1358.2416992188,,, +37.2480468750,595,1355.3114013672,,, +37.2500000000,596,1352.3809814453,,, +37.2519531250,596,1349.4505615234,,, +37.2539062500,596,1346.5201416016,,, +37.2558593750,596,1342.8571777344,,, +37.2578125000,596,1340.6593017578,,, +37.2597656250,596,1336.9963378906,,, +37.2617187500,596,1333.3333740234,,, +37.2636718750,596,1330.4029541016,,, +37.2656250000,596,1326.7398681641,,, +37.2675781250,596,1323.0769042969,,, +37.2695312500,596,1320.1464843750,,, +37.2714843750,596,1317.9487304688,,, +37.2734375000,596,1314.2857666016,,, +37.2753906250,596,1310.6226806641,,, +37.2773437500,596,1308.4249267578,,, +37.2792968750,596,1304.7619628906,,, +37.2812500000,596,1302.5640869141,,, +37.2832031250,596,1300.3663330078,,, +37.2851562500,596,1298.1684570312,,, +37.2871093750,596,1297.4359130859,,, +37.2890625000,596,1294.5054931641,,, +37.2910156250,596,1293.0402832031,,, +37.2929687500,596,1292.3077392578,,, +37.2949218750,596,1290.1098632812,,, +37.2968750000,596,1289.3773193359,,, +37.2988281250,596,1286.4468994141,,, +37.3007812500,596,1284.9816894531,,, +37.3027343750,596,1282.7839355469,,, +37.3046875000,596,1281.3187255859,,, +37.3066406250,596,1279.8535156250,,, +37.3085937500,596,1277.6556396484,,, +37.3105468750,596,1275.4578857422,,, +37.3125000000,597,1274.7252197266,,, +37.3144531250,597,1273.2601318359,,, +37.3164062500,597,1271.0622558594,,, +37.3183593750,597,1271.0622558594,,, +37.3203125000,597,1269.5970458984,,, +37.3222656250,597,1270.3297119141,,, +37.3242187500,597,1270.3297119141,,, +37.3261718750,597,1269.5970458984,,, +37.3281250000,597,1270.3297119141,,, +37.3300781250,597,1270.3297119141,,, +37.3320312500,597,1270.3297119141,,, +37.3339843750,597,1271.7949218750,,, +37.3359375000,597,1271.7949218750,,, +37.3378906250,597,1273.2601318359,,, +37.3398437500,597,1273.2601318359,,, +37.3417968750,597,1273.2601318359,,, +37.3437500000,597,1275.4578857422,,, +37.3457031250,597,1276.1904296875,,, +37.3476562500,597,1278.3883056641,,, +37.3496093750,597,1281.3187255859,,, +37.3515625000,597,1282.0512695312,,, +37.3535156250,597,1284.2490234375,,, +37.3554687500,597,1286.4468994141,,, +37.3574218750,597,1287.9121093750,,, +37.3593750000,597,1289.3773193359,,, +37.3613281250,597,1290.1098632812,,, +37.3632812500,597,1290.8425292969,,, +37.3652343750,597,1293.0402832031,,, +37.3671875000,597,1294.5054931641,,, +37.3691406250,597,1295.2380371094,,, +37.3710937500,597,1296.7032470703,,, +37.3730468750,597,1295.2380371094,,, +37.3750000000,598,1296.7032470703,,, +37.3769531250,598,1298.1684570312,,, +37.3789062500,598,1298.1684570312,,, +37.3808593750,598,1298.9011230469,,, +37.3828125000,598,1301.0988769531,,, +37.3847656250,598,1301.0988769531,,, +37.3867187500,598,1300.3663330078,,, +37.3886718750,598,1301.8315429688,,, +37.3906250000,598,1303.2967529297,,, +37.3925781250,598,1303.2967529297,,, +37.3945312500,598,1304.0292968750,,, +37.3964843750,598,1305.4945068359,,, +37.3984375000,598,1306.2270507812,,, +37.4003906250,598,1305.4945068359,,, +37.4023437500,598,1307.6922607422,,, +37.4042968750,598,1307.6922607422,,, +37.4062500000,598,1307.6922607422,,, +37.4082031250,598,1308.4249267578,,, +37.4101562500,598,1309.1574707031,,, +37.4121093750,598,1309.1574707031,,, +37.4140625000,598,1310.6226806641,,, +37.4160156250,598,1309.8901367188,,, +37.4179687500,598,1310.6226806641,,, +37.4199218750,598,1311.3553466797,,, +37.4218750000,598,1312.0878906250,,, +37.4238281250,598,1311.3553466797,,, +37.4257812500,598,1312.0878906250,,, +37.4277343750,598,1313.5531005859,,, +37.4296875000,598,1315.0183105469,,, +37.4316406250,598,1315.7509765625,,, +37.4335937500,598,1317.9487304688,,, +37.4355468750,598,1317.9487304688,,, +37.4375000000,599,1319.4139404297,,, +37.4394531250,599,1321.6116943359,,, +37.4414062500,599,1321.6116943359,,, +37.4433593750,599,1323.0769042969,,, +37.4453125000,599,1325.2747802734,,, +37.4472656250,599,1325.2747802734,,, +37.4492187500,599,1326.7398681641,,, +37.4511718750,599,1328.2050781250,,, +37.4531250000,599,1328.9377441406,,, +37.4550781250,599,1328.9377441406,,, +37.4570312500,599,1330.4029541016,,, +37.4589843750,599,1330.4029541016,,, +37.4609375000,599,1329.6702880859,,, +37.4628906250,599,1330.4029541016,,, +37.4648437500,599,1330.4029541016,,, +37.4667968750,599,1329.6702880859,,, +37.4687500000,599,1329.6702880859,,, +37.4707031250,599,1329.6702880859,,, +37.4726562500,599,1329.6702880859,,, +37.4746093750,599,1329.6702880859,,, +37.4765625000,599,1329.6702880859,,, +37.4785156250,599,1328.9377441406,,, +37.4804687500,599,1328.2050781250,,, +37.4824218750,599,1328.9377441406,,, +37.4843750000,599,1328.2050781250,,, +37.4863281250,599,1328.2050781250,,, +37.4882812500,599,1326.7398681641,,, +37.4902343750,599,1326.7398681641,,, +37.4921875000,599,1326.0073242188,,, +37.4941406250,599,1324.5421142578,,, +37.4960937500,599,1321.6116943359,,, +37.4980468750,599,1320.8791503906,,, +37.5000000000,600,1320.1464843750,,, +37.5019531250,600,1316.4835205078,,, +37.5039062500,600,1315.7509765625,,, +37.5058593750,600,1312.8205566406,,, +37.5078125000,600,1311.3553466797,,, +37.5097656250,600,1309.8901367188,,, +37.5117187500,600,1307.6922607422,,, +37.5136718750,600,1306.2270507812,,, +37.5156250000,600,1304.7619628906,,, +37.5175781250,600,1302.5640869141,,, +37.5195312500,600,1302.5640869141,,, +37.5214843750,600,1301.0988769531,,, +37.5234375000,600,1298.9011230469,,, +37.5253906250,600,1297.4359130859,,, +37.5273437500,600,1296.7032470703,,, +37.5292968750,600,1295.2380371094,,, +37.5312500000,600,1293.7729492188,,, +37.5332031250,600,1292.3077392578,,, +37.5351562500,600,1290.1098632812,,, +37.5371093750,600,1287.9121093750,,, +37.5390625000,600,1287.9121093750,,, +37.5410156250,600,1285.7142333984,,, +37.5429687500,600,1284.9816894531,,, +37.5449218750,600,1284.2490234375,,, +37.5468750000,600,1282.0512695312,,, +37.5488281250,600,1282.0512695312,,, +37.5507812500,600,1281.3187255859,,, +37.5527343750,600,1280.5860595703,,, +37.5546875000,600,1280.5860595703,,, +37.5566406250,600,1279.1208496094,,, +37.5585937500,600,1280.5860595703,,, +37.5605468750,600,1279.1208496094,,, +37.5625000000,601,1278.3883056641,,, +37.5644531250,601,1279.1208496094,,, +37.5664062500,601,1277.6556396484,,, +37.5683593750,601,1276.9230957031,,, +37.5703125000,601,1277.6556396484,,, +37.5722656250,601,1276.9230957031,,, +37.5742187500,601,1276.9230957031,,, +37.5761718750,601,1276.1904296875,,, +37.5781250000,601,1275.4578857422,,, +37.5800781250,601,1276.1904296875,,, +37.5820312500,601,1276.1904296875,,, +37.5839843750,601,1276.9230957031,,, +37.5859375000,601,1276.1904296875,,, +37.5878906250,601,1276.1904296875,,, +37.5898437500,601,1276.1904296875,,, +37.5917968750,601,1274.7252197266,,, +37.5937500000,601,1275.4578857422,,, +37.5957031250,601,1274.7252197266,,, +37.5976562500,601,1273.9926757812,,, +37.5996093750,601,1274.7252197266,,, +37.6015625000,601,1273.9926757812,,, +37.6035156250,601,1273.9926757812,,, +37.6054687500,601,1272.5274658203,,, +37.6074218750,601,1273.2601318359,,, +37.6093750000,601,1273.2601318359,,, +37.6113281250,601,1272.5274658203,,, +37.6132812500,601,1273.2601318359,,, +37.6152343750,601,1271.7949218750,,, +37.6171875000,601,1271.7949218750,,, +37.6191406250,601,1271.7949218750,,, +37.6210937500,601,1271.7949218750,,, +37.6230468750,601,1271.7949218750,,, +37.6250000000,602,1271.0622558594,,, +37.6269531250,602,1271.0622558594,,, +37.6289062500,602,1271.7949218750,,, +37.6308593750,602,1270.3297119141,,, +37.6328125000,602,1270.3297119141,,, +37.6347656250,602,1271.0622558594,,, +37.6367187500,602,1270.3297119141,,, +37.6386718750,602,1270.3297119141,,, +37.6406250000,602,1271.0622558594,,, +37.6425781250,602,1271.0622558594,,, +37.6445312500,602,1270.3297119141,,, +37.6464843750,602,1272.5274658203,,, +37.6484375000,602,1272.5274658203,,, +37.6503906250,602,1273.9926757812,,, +37.6523437500,602,1276.1904296875,,, +37.6542968750,602,1276.1904296875,,, +37.6562500000,602,1276.9230957031,,, +37.6582031250,602,1278.3883056641,,, +37.6601562500,602,1278.3883056641,,, +37.6621093750,602,1279.8535156250,,, +37.6640625000,602,1282.7839355469,,, +37.6660156250,602,1283.5164794922,,, +37.6679687500,602,1285.7142333984,,, +37.6699218750,602,1288.6446533203,,, +37.6718750000,602,1288.6446533203,,, +37.6738281250,602,1290.1098632812,,, +37.6757812500,602,1290.8425292969,,, +37.6777343750,602,1292.3077392578,,, +37.6796875000,602,1295.2380371094,,, +37.6816406250,602,1296.7032470703,,, +37.6835937500,602,1298.1684570312,,, +37.6855468750,602,1299.6336669922,,, +37.6875000000,603,1299.6336669922,,, +37.6894531250,603,1301.8315429688,,, +37.6914062500,603,1303.2967529297,,, +37.6933593750,603,1304.7619628906,,, +37.6953125000,603,1306.9597167969,,, +37.6972656250,603,1307.6922607422,,, +37.6992187500,603,1310.6226806641,,, +37.7011718750,603,1312.0878906250,,, +37.7031250000,603,1312.8205566406,,, +37.7050781250,603,1315.7509765625,,, +37.7070312500,603,1316.4835205078,,, +37.7089843750,603,1317.9487304688,,, +37.7109375000,603,1320.1464843750,,, +37.7128906250,603,1321.6116943359,,, +37.7148437500,603,1323.0769042969,,, +37.7167968750,603,1322.3443603516,,, +37.7187500000,603,1322.3443603516,,, +37.7207031250,603,1323.0769042969,,, +37.7226562500,603,1323.0769042969,,, +37.7246093750,603,1323.8095703125,,, +37.7265625000,603,1323.8095703125,,, +37.7285156250,603,1323.8095703125,,, +37.7304687500,603,1325.2747802734,,, +37.7324218750,603,1324.5421142578,,, +37.7343750000,603,1324.5421142578,,, +37.7363281250,603,1325.2747802734,,, +37.7382812500,603,1324.5421142578,,, +37.7402343750,603,1324.5421142578,,, +37.7421875000,603,1324.5421142578,,, +37.7441406250,603,1323.0769042969,,, +37.7460937500,603,1323.8095703125,,, +37.7480468750,603,1321.6116943359,,, +37.7500000000,604,1320.1464843750,,, +37.7519531250,604,1319.4139404297,,, +37.7539062500,604,1318.6812744141,,, +37.7558593750,604,1317.2160644531,,, +37.7578125000,604,1315.7509765625,,, +37.7597656250,604,1314.2857666016,,, +37.7617187500,604,1314.2857666016,,, +37.7636718750,604,1312.8205566406,,, +37.7656250000,604,1311.3553466797,,, +37.7675781250,604,1308.4249267578,,, +37.7695312500,604,1306.9597167969,,, +37.7714843750,604,1306.9597167969,,, +37.7734375000,604,1305.4945068359,,, +37.7753906250,604,1304.7619628906,,, +37.7773437500,604,1302.5640869141,,, +37.7792968750,604,1301.0988769531,,, +37.7812500000,604,1301.0988769531,,, +37.7832031250,604,1298.9011230469,,, +37.7851562500,604,1298.9011230469,,, +37.7871093750,604,1297.4359130859,,, +37.7890625000,604,1297.4359130859,,, +37.7910156250,604,1297.4359130859,,, +37.7929687500,604,1297.4359130859,,, +37.7949218750,604,1298.1684570312,,, +37.7968750000,604,1298.1684570312,,, +37.7988281250,604,1297.4359130859,,, +37.8007812500,604,1300.3663330078,,, +37.8027343750,604,1301.0988769531,,, +37.8046875000,604,1302.5640869141,,, +37.8066406250,604,1304.0292968750,,, +37.8085937500,604,1305.4945068359,,, +37.8105468750,604,1309.8901367188,,, +37.8125000000,605,1312.8205566406,,, +37.8144531250,605,1315.7509765625,,, +37.8164062500,605,1319.4139404297,,, +37.8183593750,605,1323.8095703125,,, +37.8203125000,605,1328.9377441406,,, +37.8222656250,605,1335.5311279297,,, +37.8242187500,605,1342.1245117188,,, +37.8261718750,605,1347.9853515625,,, +37.8281250000,605,1356.7766113281,,, +37.8300781250,605,1365.5677490234,,, +37.8320312500,605,1374.3590087891,,, +37.8339843750,605,1385.3480224609,,, +37.8359375000,605,1395.6043701172,,, +37.8378906250,605,1408.0585937500,,, +37.8398437500,605,1421.2453613281,,, +37.8417968750,605,1434.4322509766,,, +37.8437500000,605,1447.6190185547,,, +37.8457031250,605,1462.2711181641,,, +37.8476562500,605,1476.9230957031,,, +37.8496093750,605,1493.7729492188,,, +37.8515625000,605,1509.8901367188,,, +37.8535156250,605,1526.0073242188,,, +37.8554687500,605,1542.8571777344,,, +37.8574218750,605,1558.9743652344,,, +37.8593750000,605,1577.2894287109,,, +37.8613281250,605,1594.1391601562,,, +37.8632812500,605,1611.7215576172,,, +37.8652343750,605,1629.3040771484,,, +37.8671875000,605,1645.4212646484,,, +37.8691406250,605,1664.4688720703,,, +37.8710937500,605,1681.3187255859,,, +37.8730468750,605,1698.9011230469,,, +37.8750000000,606,1716.4835205078,,, +37.8769531250,606,1733.3333740234,,, +37.8789062500,606,1750.9157714844,,, +37.8808593750,606,1767.0329589844,,, +37.8828125000,606,1783.1501464844,,, +37.8847656250,606,1798.5347900391,,, +37.8867187500,606,1813.1867675781,,, +37.8886718750,606,1828.5714111328,,, +37.8906250000,606,1842.4908447266,,, +37.8925781250,606,1855.6776123047,,, +37.8945312500,606,1868.1318359375,,, +37.8964843750,606,1879.1208496094,,, +37.8984375000,606,1892.3077392578,,, +37.9003906250,606,1901.8315429688,,, +37.9023437500,606,1910.6226806641,,, +37.9042968750,606,1920.1464843750,,, +37.9062500000,606,1926.7398681641,,, +37.9082031250,606,1932.6007080078,,, +37.9101562500,606,1938.4615478516,,, +37.9121093750,606,1942.8571777344,,, +37.9140625000,606,1947.2528076172,,, +37.9160156250,606,1949.4505615234,,, +37.9179687500,606,1949.4505615234,,, +37.9199218750,606,1950.9157714844,,, +37.9218750000,606,1949.4505615234,,, +37.9238281250,606,1947.9853515625,,, +37.9257812500,606,1944.3223876953,,, +37.9277343750,606,1940.6593017578,,, +37.9296875000,606,1937.7288818359,,, +37.9316406250,606,1932.6007080078,,, +37.9335937500,606,1926.7398681641,,, +37.9355468750,606,1918.6812744141,,, +37.9375000000,607,1911.3553466797,,, +37.9394531250,607,1902.5640869141,,, +37.9414062500,607,1893.7729492188,,, +37.9433593750,607,1885.7142333984,,, +37.9453125000,607,1873.9926757812,,, +37.9472656250,607,1863.7362060547,,, +37.9492187500,607,1853.4798583984,,, +37.9511718750,607,1842.4908447266,,, +37.9531250000,607,1832.2343750000,,, +37.9550781250,607,1819.7802734375,,, +37.9570312500,607,1807.3260498047,,, +37.9589843750,607,1796.3370361328,,, +37.9609375000,607,1783.8828125000,,, +37.9628906250,607,1771.4285888672,,, +37.9648437500,607,1758.9743652344,,, +37.9667968750,607,1745.7875976562,,, +37.9687500000,607,1734.0659179688,,, +37.9707031250,607,1720.8791503906,,, +37.9726562500,607,1706.9597167969,,, +37.9746093750,607,1694.5054931641,,, +37.9765625000,607,1681.3187255859,,, +37.9785156250,607,1668.8645019531,,, +37.9804687500,607,1655.6776123047,,, +37.9824218750,607,1641.7583007812,,, +37.9843750000,607,1629.3040771484,,, +37.9863281250,607,1616.1171875000,,, +37.9882812500,607,1604.3956298828,,, +37.9902343750,607,1591.2087402344,,, +37.9921875000,607,1578.7546386719,,, +37.9941406250,607,1565.5677490234,,, +37.9960937500,607,1553.8461914062,,, +37.9980468750,607,1542.8571777344,,, +38.0000000000,608,1530.4029541016,,, +38.0019531250,608,1520.1464843750,,, +38.0039062500,608,1510.6226806641,,, +38.0058593750,608,1500.3663330078,,, +38.0078125000,608,1491.5750732422,,, +38.0097656250,608,1482.0512695312,,, +38.0117187500,608,1472.5274658203,,, +38.0136718750,608,1464.4688720703,,, +38.0156250000,608,1454.2124023438,,, +38.0175781250,608,1446.8864746094,,, +38.0195312500,608,1438.0952148438,,, +38.0214843750,608,1430.0366210938,,, +38.0234375000,608,1422.7105712891,,, +38.0253906250,608,1415.3846435547,,, +38.0273437500,608,1408.7912597656,,, +38.0292968750,608,1403.6629638672,,, +38.0312500000,608,1396.3370361328,,, +38.0332031250,608,1391.9414062500,,, +38.0351562500,608,1386.0805664062,,, +38.0371093750,608,1380.2197265625,,, +38.0390625000,608,1377.2894287109,,, +38.0410156250,608,1372.8937988281,,, +38.0429687500,608,1369.2307128906,,, +38.0449218750,608,1365.5677490234,,, +38.0468750000,608,1361.1721191406,,, +38.0488281250,608,1359.7069091797,,, +38.0507812500,608,1356.7766113281,,, +38.0527343750,608,1353.8461914062,,, +38.0546875000,608,1351.6483154297,,, +38.0566406250,608,1349.4505615234,,, +38.0585937500,608,1348.7178955078,,, +38.0605468750,608,1346.5201416016,,, +38.0625000000,609,1345.0549316406,,, +38.0644531250,609,1343.5897216797,,, +38.0664062500,609,1341.3919677734,,, +38.0683593750,609,1340.6593017578,,, +38.0703125000,609,1338.4615478516,,, +38.0722656250,609,1338.4615478516,,, +38.0742187500,609,1337.7288818359,,, +38.0761718750,609,1336.2637939453,,, +38.0781250000,609,1335.5311279297,,, +38.0800781250,609,1334.0659179688,,, +38.0820312500,609,1334.7985839844,,, +38.0839843750,609,1333.3333740234,,, +38.0859375000,609,1331.8681640625,,, +38.0878906250,609,1331.8681640625,,, +38.0898437500,609,1331.8681640625,,, +38.0917968750,609,1331.1354980469,,, +38.0937500000,609,1330.4029541016,,, +38.0957031250,609,1331.8681640625,,, +38.0976562500,609,1331.1354980469,,, +38.0996093750,609,1331.8681640625,,, +38.1015625000,609,1331.8681640625,,, +38.1035156250,609,1332.6007080078,,, +38.1054687500,609,1334.0659179688,,, +38.1074218750,609,1334.0659179688,,, +38.1093750000,609,1335.5311279297,,, +38.1113281250,609,1335.5311279297,,, +38.1132812500,609,1336.2637939453,,, +38.1152343750,609,1338.4615478516,,, +38.1171875000,609,1339.9267578125,,, +38.1191406250,609,1341.3919677734,,, +38.1210937500,609,1342.8571777344,,, +38.1230468750,609,1345.0549316406,,, +38.1250000000,610,1348.7178955078,,, +38.1269531250,610,1350.9157714844,,, +38.1289062500,610,1353.1135253906,,, +38.1308593750,610,1355.3114013672,,, +38.1328125000,610,1357.5091552734,,, +38.1347656250,610,1361.1721191406,,, +38.1367187500,610,1363.3699951172,,, +38.1386718750,610,1366.3004150391,,, +38.1406250000,610,1368.4981689453,,, +38.1425781250,610,1369.9633789062,,, +38.1445312500,610,1373.6263427734,,, +38.1464843750,610,1375.0915527344,,, +38.1484375000,610,1377.2894287109,,, +38.1503906250,610,1379.4871826172,,, +38.1523437500,610,1380.9523925781,,, +38.1542968750,610,1383.8828125000,,, +38.1562500000,610,1385.3480224609,,, +38.1582031250,610,1386.8132324219,,, +38.1601562500,610,1389.0109863281,,, +38.1621093750,610,1389.7435302734,,, +38.1640625000,610,1391.2087402344,,, +38.1660156250,610,1393.4066162109,,, +38.1679687500,610,1394.8718261719,,, +38.1699218750,610,1397.8022460938,,, +38.1718750000,610,1399.2674560547,,, +38.1738281250,610,1400.0000000000,,, +38.1757812500,610,1402.1977539062,,, +38.1777343750,610,1402.1977539062,,, +38.1796875000,610,1403.6629638672,,, +38.1816406250,610,1404.3956298828,,, +38.1835937500,610,1404.3956298828,,, +38.1855468750,610,1406.5933837891,,, +38.1875000000,611,1407.3260498047,,, +38.1894531250,611,1408.0585937500,,, +38.1914062500,611,1408.7912597656,,, +38.1933593750,611,1409.5238037109,,, +38.1953125000,611,1410.2564697266,,, +38.1972656250,611,1410.9890136719,,, +38.1992187500,611,1410.9890136719,,, +38.2011718750,611,1410.2564697266,,, +38.2031250000,611,1410.9890136719,,, +38.2050781250,611,1410.2564697266,,, +38.2070312500,611,1409.5238037109,,, +38.2089843750,611,1409.5238037109,,, +38.2109375000,611,1409.5238037109,,, +38.2128906250,611,1408.7912597656,,, +38.2148437500,611,1407.3260498047,,, +38.2167968750,611,1406.5933837891,,, +38.2187500000,611,1405.1281738281,,, +38.2207031250,611,1402.1977539062,,, +38.2226562500,611,1400.0000000000,,, +38.2246093750,611,1397.8022460938,,, +38.2265625000,611,1394.8718261719,,, +38.2285156250,611,1391.9414062500,,, +38.2304687500,611,1390.4761962891,,, +38.2324218750,611,1387.5457763672,,, +38.2343750000,611,1384.6153564453,,, +38.2363281250,611,1382.4176025391,,, +38.2382812500,611,1380.2197265625,,, +38.2402343750,611,1378.0219726562,,, +38.2421875000,611,1375.0915527344,,, +38.2441406250,611,1374.3590087891,,, +38.2460937500,611,1371.4285888672,,, +38.2480468750,611,1368.4981689453,,, +38.2500000000,612,1367.0329589844,,, +38.2519531250,612,1364.8352050781,,, +38.2539062500,612,1362.6373291016,,, +38.2558593750,612,1361.9047851562,,, +38.2578125000,612,1360.4395751953,,, +38.2597656250,612,1356.7766113281,,, +38.2617187500,612,1355.3114013672,,, +38.2636718750,612,1354.5787353516,,, +38.2656250000,612,1352.3809814453,,, +38.2675781250,612,1350.1831054688,,, +38.2695312500,612,1348.7178955078,,, +38.2714843750,612,1345.7875976562,,, +38.2734375000,612,1344.3223876953,,, +38.2753906250,612,1342.1245117188,,, +38.2773437500,612,1340.6593017578,,, +38.2792968750,612,1338.4615478516,,, +38.2812500000,612,1335.5311279297,,, +38.2832031250,612,1335.5311279297,,, +38.2851562500,612,1332.6007080078,,, +38.2871093750,612,1330.4029541016,,, +38.2890625000,612,1328.2050781250,,, +38.2910156250,612,1326.0073242188,,, +38.2929687500,612,1323.0769042969,,, +38.2949218750,612,1320.8791503906,,, +38.2968750000,612,1320.8791503906,,, +38.2988281250,612,1318.6812744141,,, +38.3007812500,612,1315.7509765625,,, +38.3027343750,612,1313.5531005859,,, +38.3046875000,612,1313.5531005859,,, +38.3066406250,612,1311.3553466797,,, +38.3085937500,612,1309.1574707031,,, +38.3105468750,612,1308.4249267578,,, +38.3125000000,613,1307.6922607422,,, +38.3144531250,613,1304.7619628906,,, +38.3164062500,613,1303.2967529297,,, +38.3183593750,613,1301.8315429688,,, +38.3203125000,613,1299.6336669922,,, +38.3222656250,613,1299.6336669922,,, +38.3242187500,613,1297.4359130859,,, +38.3261718750,613,1295.9707031250,,, +38.3281250000,613,1295.9707031250,,, +38.3300781250,613,1293.7729492188,,, +38.3320312500,613,1293.0402832031,,, +38.3339843750,613,1290.8425292969,,, +38.3359375000,613,1287.9121093750,,, +38.3378906250,613,1288.6446533203,,, +38.3398437500,613,1286.4468994141,,, +38.3417968750,613,1284.9816894531,,, +38.3437500000,613,1284.2490234375,,, +38.3457031250,613,1282.0512695312,,, +38.3476562500,613,1281.3187255859,,, +38.3496093750,613,1280.5860595703,,, +38.3515625000,613,1279.1208496094,,, +38.3535156250,613,1279.8535156250,,, +38.3554687500,613,1279.1208496094,,, +38.3574218750,613,1278.3883056641,,, +38.3593750000,613,1278.3883056641,,, +38.3613281250,613,1277.6556396484,,, +38.3632812500,613,1277.6556396484,,, +38.3652343750,613,1277.6556396484,,, +38.3671875000,613,1276.9230957031,,, +38.3691406250,613,1277.6556396484,,, +38.3710937500,613,1278.3883056641,,, +38.3730468750,613,1278.3883056641,,, +38.3750000000,614,1279.1208496094,,, +38.3769531250,614,1279.1208496094,,, +38.3789062500,614,1280.5860595703,,, +38.3808593750,614,1280.5860595703,,, +38.3828125000,614,1281.3187255859,,, +38.3847656250,614,1282.0512695312,,, +38.3867187500,614,1282.0512695312,,, +38.3886718750,614,1284.9816894531,,, +38.3906250000,614,1285.7142333984,,, +38.3925781250,614,1287.1794433594,,, +38.3945312500,614,1288.6446533203,,, +38.3964843750,614,1288.6446533203,,, +38.3984375000,614,1291.5750732422,,, +38.4003906250,614,1293.0402832031,,, +38.4023437500,614,1293.7729492188,,, +38.4042968750,614,1294.5054931641,,, +38.4062500000,614,1295.2380371094,,, +38.4082031250,614,1298.1684570312,,, +38.4101562500,614,1298.1684570312,,, +38.4121093750,614,1298.9011230469,,, +38.4140625000,614,1299.6336669922,,, +38.4160156250,614,1299.6336669922,,, +38.4179687500,614,1301.0988769531,,, +38.4199218750,614,1301.8315429688,,, +38.4218750000,614,1302.5640869141,,, +38.4238281250,614,1302.5640869141,,, +38.4257812500,614,1301.8315429688,,, +38.4277343750,614,1302.5640869141,,, +38.4296875000,614,1303.2967529297,,, +38.4316406250,614,1304.0292968750,,, +38.4335937500,614,1304.7619628906,,, +38.4355468750,614,1304.7619628906,,, +38.4375000000,615,1306.9597167969,,, +38.4394531250,615,1306.9597167969,,, +38.4414062500,615,1306.9597167969,,, +38.4433593750,615,1308.4249267578,,, +38.4453125000,615,1306.9597167969,,, +38.4472656250,615,1308.4249267578,,, +38.4492187500,615,1308.4249267578,,, +38.4511718750,615,1309.1574707031,,, +38.4531250000,615,1309.8901367188,,, +38.4550781250,615,1308.4249267578,,, +38.4570312500,615,1308.4249267578,,, +38.4589843750,615,1309.1574707031,,, +38.4609375000,615,1308.4249267578,,, +38.4628906250,615,1308.4249267578,,, +38.4648437500,615,1307.6922607422,,, +38.4667968750,615,1307.6922607422,,, +38.4687500000,615,1307.6922607422,,, +38.4707031250,615,1307.6922607422,,, +38.4726562500,615,1308.4249267578,,, +38.4746093750,615,1307.6922607422,,, +38.4765625000,615,1306.2270507812,,, +38.4785156250,615,1306.9597167969,,, +38.4804687500,615,1306.9597167969,,, +38.4824218750,615,1304.7619628906,,, +38.4843750000,615,1305.4945068359,,, +38.4863281250,615,1303.2967529297,,, +38.4882812500,615,1302.5640869141,,, +38.4902343750,615,1302.5640869141,,, +38.4921875000,615,1301.8315429688,,, +38.4941406250,615,1301.0988769531,,, +38.4960937500,615,1301.0988769531,,, +38.4980468750,615,1299.6336669922,,, +38.5000000000,616,1300.3663330078,,, +38.5019531250,616,1299.6336669922,,, +38.5039062500,616,1298.1684570312,,, +38.5058593750,616,1298.9011230469,,, +38.5078125000,616,1298.9011230469,,, +38.5097656250,616,1299.6336669922,,, +38.5117187500,616,1298.9011230469,,, +38.5136718750,616,1298.1684570312,,, +38.5156250000,616,1298.9011230469,,, +38.5175781250,616,1297.4359130859,,, +38.5195312500,616,1297.4359130859,,, +38.5214843750,616,1298.9011230469,,, +38.5234375000,616,1298.1684570312,,, +38.5253906250,616,1298.9011230469,,, +38.5273437500,616,1298.9011230469,,, +38.5292968750,616,1298.9011230469,,, +38.5312500000,616,1300.3663330078,,, +38.5332031250,616,1300.3663330078,,, +38.5351562500,616,1300.3663330078,,, +38.5371093750,616,1300.3663330078,,, +38.5390625000,616,1301.0988769531,,, +38.5410156250,616,1303.2967529297,,, +38.5429687500,616,1302.5640869141,,, +38.5449218750,616,1302.5640869141,,, +38.5468750000,616,1303.2967529297,,, +38.5488281250,616,1302.5640869141,,, +38.5507812500,616,1303.2967529297,,, +38.5527343750,616,1303.2967529297,,, +38.5546875000,616,1304.0292968750,,, +38.5566406250,616,1305.4945068359,,, +38.5585937500,616,1304.7619628906,,, +38.5605468750,616,1305.4945068359,,, +38.5625000000,617,1306.2270507812,,, +38.5644531250,617,1306.2270507812,,, +38.5664062500,617,1306.2270507812,,, +38.5683593750,617,1307.6922607422,,, +38.5703125000,617,1306.9597167969,,, +38.5722656250,617,1306.9597167969,,, +38.5742187500,617,1306.9597167969,,, +38.5761718750,617,1306.9597167969,,, +38.5781250000,617,1307.6922607422,,, +38.5800781250,617,1306.9597167969,,, +38.5820312500,617,1306.9597167969,,, +38.5839843750,617,1306.9597167969,,, +38.5859375000,617,1306.9597167969,,, +38.5878906250,617,1306.2270507812,,, +38.5898437500,617,1306.9597167969,,, +38.5917968750,617,1305.4945068359,,, +38.5937500000,617,1306.2270507812,,, +38.5957031250,617,1305.4945068359,,, +38.5976562500,617,1306.2270507812,,, +38.5996093750,617,1304.7619628906,,, +38.6015625000,617,1304.0292968750,,, +38.6035156250,617,1304.7619628906,,, +38.6054687500,617,1304.7619628906,,, +38.6074218750,617,1304.0292968750,,, +38.6093750000,617,1303.2967529297,,, +38.6113281250,617,1303.2967529297,,, +38.6132812500,617,1301.0988769531,,, +38.6152343750,617,1301.0988769531,,, +38.6171875000,617,1301.8315429688,,, +38.6191406250,617,1300.3663330078,,, +38.6210937500,617,1299.6336669922,,, +38.6230468750,617,1299.6336669922,,, +38.6250000000,618,1299.6336669922,,, +38.6269531250,618,1299.6336669922,,, +38.6289062500,618,1299.6336669922,,, +38.6308593750,618,1298.9011230469,,, +38.6328125000,618,1298.9011230469,,, +38.6347656250,618,1298.1684570312,,, +38.6367187500,618,1297.4359130859,,, +38.6386718750,618,1298.1684570312,,, +38.6406250000,618,1297.4359130859,,, +38.6425781250,618,1297.4359130859,,, +38.6445312500,618,1297.4359130859,,, +38.6464843750,618,1296.7032470703,,, +38.6484375000,618,1297.4359130859,,, +38.6503906250,618,1295.9707031250,,, +38.6523437500,618,1297.4359130859,,, +38.6542968750,618,1298.1684570312,,, +38.6562500000,618,1298.1684570312,,, +38.6582031250,618,1298.1684570312,,, +38.6601562500,618,1298.9011230469,,, +38.6621093750,618,1300.3663330078,,, +38.6640625000,618,1301.0988769531,,, +38.6660156250,618,1301.8315429688,,, +38.6679687500,618,1301.8315429688,,, +38.6699218750,618,1302.5640869141,,, +38.6718750000,618,1304.0292968750,,, +38.6738281250,618,1304.7619628906,,, +38.6757812500,618,1306.9597167969,,, +38.6777343750,618,1306.9597167969,,, +38.6796875000,618,1308.4249267578,,, +38.6816406250,618,1309.1574707031,,, +38.6835937500,618,1309.8901367188,,, +38.6855468750,618,1309.8901367188,,, +38.6875000000,619,1311.3553466797,,, +38.6894531250,619,1312.0878906250,,, +38.6914062500,619,1312.0878906250,,, +38.6933593750,619,1313.5531005859,,, +38.6953125000,619,1312.8205566406,,, +38.6972656250,619,1312.8205566406,,, +38.6992187500,619,1312.8205566406,,, +38.7011718750,619,1312.0878906250,,, +38.7031250000,619,1312.8205566406,,, +38.7050781250,619,1310.6226806641,,, +38.7070312500,619,1310.6226806641,,, +38.7089843750,619,1309.1574707031,,, +38.7109375000,619,1308.4249267578,,, +38.7128906250,619,1307.6922607422,,, +38.7148437500,619,1306.2270507812,,, +38.7167968750,619,1304.7619628906,,, +38.7187500000,619,1304.7619628906,,, +38.7207031250,619,1304.0292968750,,, +38.7226562500,619,1302.5640869141,,, +38.7246093750,619,1302.5640869141,,, +38.7265625000,619,1301.0988769531,,, +38.7285156250,619,1301.0988769531,,, +38.7304687500,619,1300.3663330078,,, +38.7324218750,619,1299.6336669922,,, +38.7343750000,619,1300.3663330078,,, +38.7363281250,619,1298.9011230469,,, +38.7382812500,619,1296.7032470703,,, +38.7402343750,619,1297.4359130859,,, +38.7421875000,619,1295.2380371094,,, +38.7441406250,619,1293.7729492188,,, +38.7460937500,619,1293.0402832031,,, +38.7480468750,619,1293.0402832031,,, +38.7500000000,620,1291.5750732422,,, +38.7519531250,620,1291.5750732422,,, +38.7539062500,620,1290.1098632812,,, +38.7558593750,620,1289.3773193359,,, +38.7578125000,620,1290.1098632812,,, +38.7597656250,620,1288.6446533203,,, +38.7617187500,620,1287.1794433594,,, +38.7636718750,620,1287.9121093750,,, +38.7656250000,620,1287.1794433594,,, +38.7675781250,620,1286.4468994141,,, +38.7695312500,620,1287.1794433594,,, +38.7714843750,620,1286.4468994141,,, +38.7734375000,620,1287.1794433594,,, +38.7753906250,620,1287.1794433594,,, +38.7773437500,620,1287.1794433594,,, +38.7792968750,620,1288.6446533203,,, +38.7812500000,620,1287.9121093750,,, +38.7832031250,620,1288.6446533203,,, +38.7851562500,620,1290.8425292969,,, +38.7871093750,620,1291.5750732422,,, +38.7890625000,620,1294.5054931641,,, +38.7910156250,620,1295.2380371094,,, +38.7929687500,620,1297.4359130859,,, +38.7949218750,620,1299.6336669922,,, +38.7968750000,620,1301.0988769531,,, +38.7988281250,620,1304.0292968750,,, +38.8007812500,620,1306.2270507812,,, +38.8027343750,620,1308.4249267578,,, +38.8046875000,620,1312.0878906250,,, +38.8066406250,620,1315.0183105469,,, +38.8085937500,620,1318.6812744141,,, +38.8105468750,620,1321.6116943359,,, +38.8125000000,621,1328.2050781250,,, +38.8144531250,621,1333.3333740234,,, +38.8164062500,621,1339.1940917969,,, +38.8183593750,621,1345.7875976562,,, +38.8203125000,621,1352.3809814453,,, +38.8222656250,621,1361.9047851562,,, +38.8242187500,621,1369.9633789062,,, +38.8261718750,621,1380.2197265625,,, +38.8281250000,621,1390.4761962891,,, +38.8300781250,621,1400.7325439453,,, +38.8320312500,621,1412.4542236328,,, +38.8339843750,621,1424.1757812500,,, +38.8359375000,621,1436.6300048828,,, +38.8378906250,621,1449.0842285156,,, +38.8398437500,621,1462.2711181641,,, +38.8417968750,621,1477.6556396484,,, +38.8437500000,621,1492.3077392578,,, +38.8457031250,621,1506.9597167969,,, +38.8476562500,621,1521.6116943359,,, +38.8496093750,621,1536.9963378906,,, +38.8515625000,621,1553.8461914062,,, +38.8535156250,621,1569.9633789062,,, +38.8554687500,621,1586.8132324219,,, +38.8574218750,621,1602.9304199219,,, +38.8593750000,621,1602.9304199219,,, +38.8613281250,621,1619.7802734375,,, +38.8632812500,621,1638.0952148438,,, +38.8652343750,621,1654.9450683594,,, +38.8671875000,621,1671.7949218750,,, +38.8691406250,621,1687.9121093750,,, +38.8710937500,621,1704.7619628906,,, +38.8730468750,621,1723.0769042969,,, +38.8750000000,622,1739.1940917969,,, +38.8769531250,622,1756.0439453125,,, +38.8789062500,622,1769.9633789062,,, +38.8808593750,622,1784.6153564453,,, +38.8828125000,622,1800.7325439453,,, +38.8847656250,622,1814.6519775391,,, +38.8867187500,622,1829.3040771484,,, +38.8886718750,622,1841.7583007812,,, +38.8906250000,622,1853.4798583984,,, +38.8925781250,622,1865.2014160156,,, +38.8945312500,622,1876.9230957031,,, +38.8964843750,622,1887.9121093750,,, +38.8984375000,622,1895.9707031250,,, +38.9003906250,622,1904.0292968750,,, +38.9023437500,622,1912.0878906250,,, +38.9042968750,622,1919.4139404297,,, +38.9062500000,622,1925.2747802734,,, +38.9082031250,622,1928.9377441406,,, +38.9101562500,622,1933.3333740234,,, +38.9121093750,622,1936.2637939453,,, +38.9140625000,622,1938.4615478516,,, +38.9160156250,622,1942.1245117188,,, +38.9179687500,622,1942.1245117188,,, +38.9199218750,622,1942.8571777344,,, +38.9218750000,622,1941.3919677734,,, +38.9238281250,622,1939.9267578125,,, +38.9257812500,622,1937.7288818359,,, +38.9277343750,622,1934.0659179688,,, +38.9296875000,622,1930.4029541016,,, +38.9316406250,622,1926.7398681641,,, +38.9335937500,622,1921.6116943359,,, +38.9355468750,622,1916.4835205078,,, +38.9375000000,623,1909.8901367188,,, +38.9394531250,623,1903.2967529297,,, +38.9414062500,623,1895.2380371094,,, +38.9433593750,623,1887.1794433594,,, +38.9453125000,623,1879.8535156250,,, +38.9472656250,623,1869.5970458984,,, +38.9492187500,623,1860.8059082031,,, +38.9511718750,623,1850.5494384766,,, +38.9531250000,623,1840.2930908203,,, +38.9550781250,623,1829.3040771484,,, +38.9570312500,623,1818.3150634766,,, +38.9589843750,623,1808.0585937500,,, +38.9609375000,623,1794.8718261719,,, +38.9628906250,623,1783.8828125000,,, +38.9648437500,623,1770.6959228516,,, +38.9667968750,623,1758.2416992188,,, +38.9687500000,623,1746.5201416016,,, +38.9707031250,623,1731.8681640625,,, +38.9726562500,623,1719.4139404297,,, +38.9746093750,623,1704.7619628906,,, +38.9765625000,623,1690.1098632812,,, +38.9785156250,623,1678.3883056641,,, +38.9804687500,623,1663.7362060547,,, +38.9824218750,623,1649.8168945312,,, +38.9843750000,623,1636.6300048828,,, +38.9863281250,623,1621.9780273438,,, +38.9882812500,623,1610.9890136719,,, +38.9902343750,623,1597.0695800781,,, +38.9921875000,623,1584.6153564453,,, +38.9941406250,623,1572.8937988281,,, +38.9960937500,623,1560.4395751953,,, +38.9980468750,623,1550.1831054688,,, +39.0000000000,624,1537.7288818359,,, +39.0019531250,624,1527.4725341797,,, +39.0039062500,624,1517.9487304688,,, +39.0058593750,624,1506.2270507812,,, +39.0078125000,624,1497.4359130859,,, +39.0097656250,624,1487.1794433594,,, +39.0117187500,624,1478.3883056641,,, +39.0136718750,624,1470.3297119141,,, +39.0156250000,624,1461.5384521484,,, +39.0175781250,624,1454.9450683594,,, +39.0195312500,624,1446.8864746094,,, +39.0214843750,624,1439.5604248047,,, +39.0234375000,624,1434.4322509766,,, +39.0253906250,624,1426.3736572266,,, +39.0273437500,624,1419.7802734375,,, +39.0292968750,624,1414.6519775391,,, +39.0312500000,624,1409.5238037109,,, +39.0332031250,624,1405.1281738281,,, +39.0351562500,624,1400.0000000000,,, +39.0371093750,624,1395.6043701172,,, +39.0390625000,624,1391.9414062500,,, +39.0410156250,624,1387.5457763672,,, +39.0429687500,624,1383.1501464844,,, +39.0449218750,624,1379.4871826172,,, +39.0468750000,624,1376.5567626953,,, +39.0488281250,624,1376.5567626953,,, +39.0507812500,624,1374.3590087891,,, +39.0527343750,624,1371.4285888672,,, +39.0546875000,624,1369.2307128906,,, +39.0566406250,624,1367.0329589844,,, +39.0585937500,624,1364.1025390625,,, +39.0605468750,624,1363.3699951172,,, +39.0625000000,625,1361.9047851562,,, +39.0644531250,625,1360.4395751953,,, +39.0664062500,625,1358.2416992188,,, +39.0683593750,625,1356.7766113281,,, +39.0703125000,625,1356.0439453125,,, +39.0722656250,625,1354.5787353516,,, +39.0742187500,625,1353.1135253906,,, +39.0761718750,625,1351.6483154297,,, +39.0781250000,625,1351.6483154297,,, +39.0800781250,625,1350.9157714844,,, +39.0820312500,625,1350.1831054688,,, +39.0839843750,625,1350.9157714844,,, +39.0859375000,625,1350.1831054688,,, +39.0878906250,625,1349.4505615234,,, +39.0898437500,625,1350.1831054688,,, +39.0917968750,625,1350.9157714844,,, +39.0937500000,625,1352.3809814453,,, +39.0957031250,625,1352.3809814453,,, +39.0976562500,625,1352.3809814453,,, +39.0996093750,625,1353.8461914062,,, +39.1015625000,625,1353.8461914062,,, +39.1035156250,625,1354.5787353516,,, +39.1054687500,625,1353.1135253906,,, +39.1074218750,625,1353.8461914062,,, +39.1093750000,625,1354.5787353516,,, +39.1113281250,625,1353.8461914062,,, +39.1132812500,625,1356.0439453125,,, +39.1152343750,625,1356.0439453125,,, +39.1171875000,625,1356.7766113281,,, +39.1191406250,625,1358.2416992188,,, +39.1210937500,625,1358.2416992188,,, +39.1230468750,625,1358.9743652344,,, +39.1250000000,626,1358.9743652344,,, +39.1269531250,626,1360.4395751953,,, +39.1289062500,626,1361.9047851562,,, +39.1308593750,626,1363.3699951172,,, +39.1328125000,626,1364.8352050781,,, +39.1347656250,626,1366.3004150391,,, +39.1367187500,626,1365.5677490234,,, +39.1386718750,626,1368.4981689453,,, +39.1406250000,626,1369.2307128906,,, +39.1425781250,626,1369.9633789062,,, +39.1445312500,626,1372.1611328125,,, +39.1464843750,626,1372.1611328125,,, +39.1484375000,626,1375.0915527344,,, +39.1503906250,626,1376.5567626953,,, +39.1523437500,626,1378.7546386719,,, +39.1542968750,626,1380.9523925781,,, +39.1562500000,626,1382.4176025391,,, +39.1582031250,626,1385.3480224609,,, +39.1601562500,626,1386.0805664062,,, +39.1621093750,626,1387.5457763672,,, +39.1640625000,626,1389.7435302734,,, +39.1660156250,626,1389.7435302734,,, +39.1679687500,626,1391.9414062500,,, +39.1699218750,626,1392.6739501953,,, +39.1718750000,626,1394.1391601562,,, +39.1738281250,626,1395.6043701172,,, +39.1757812500,626,1395.6043701172,,, +39.1777343750,626,1398.5347900391,,, +39.1796875000,626,1398.5347900391,,, +39.1816406250,626,1400.0000000000,,, +39.1835937500,626,1401.4652099609,,, +39.1855468750,626,1402.1977539062,,, +39.1875000000,627,1404.3956298828,,, +39.1894531250,627,1405.1281738281,,, +39.1914062500,627,1405.1281738281,,, +39.1933593750,627,1405.8608398438,,, +39.1953125000,627,1405.8608398438,,, +39.1972656250,627,1406.5933837891,,, +39.1992187500,627,1406.5933837891,,, +39.2011718750,627,1405.8608398438,,, +39.2031250000,627,1405.8608398438,,, +39.2050781250,627,1405.1281738281,,, +39.2070312500,627,1405.8608398438,,, +39.2089843750,627,1403.6629638672,,, +39.2109375000,627,1403.6629638672,,, +39.2128906250,627,1401.4652099609,,, +39.2148437500,627,1400.7325439453,,, +39.2167968750,627,1400.0000000000,,, +39.2187500000,627,1397.8022460938,,, +39.2207031250,627,1395.6043701172,,, +39.2226562500,627,1393.4066162109,,, +39.2246093750,627,1391.2087402344,,, +39.2265625000,627,1389.7435302734,,, +39.2285156250,627,1386.8132324219,,, +39.2304687500,627,1384.6153564453,,, +39.2324218750,627,1382.4176025391,,, +39.2343750000,627,1379.4871826172,,, +39.2363281250,627,1377.2894287109,,, +39.2382812500,627,1373.6263427734,,, +39.2402343750,627,1370.6959228516,,, +39.2421875000,627,1367.0329589844,,, +39.2441406250,627,1363.3699951172,,, +39.2460937500,627,1361.9047851562,,, +39.2480468750,627,1358.2416992188,,, +39.2500000000,628,1356.7766113281,,, +39.2519531250,628,1353.8461914062,,, +39.2539062500,628,1351.6483154297,,, +39.2558593750,628,1348.7178955078,,, +39.2578125000,628,1345.7875976562,,, +39.2597656250,628,1344.3223876953,,, +39.2617187500,628,1342.1245117188,,, +39.2636718750,628,1340.6593017578,,, +39.2656250000,628,1337.7288818359,,, +39.2675781250,628,1335.5311279297,,, +39.2695312500,628,1334.7985839844,,, +39.2714843750,628,1331.8681640625,,, +39.2734375000,628,1331.1354980469,,, +39.2753906250,628,1328.9377441406,,, +39.2773437500,628,1326.0073242188,,, +39.2792968750,628,1323.8095703125,,, +39.2812500000,628,1320.8791503906,,, +39.2832031250,628,1320.1464843750,,, +39.2851562500,628,1317.9487304688,,, +39.2871093750,628,1315.0183105469,,, +39.2890625000,628,1312.8205566406,,, +39.2910156250,628,1310.6226806641,,, +39.2929687500,628,1308.4249267578,,, +39.2949218750,628,1306.2270507812,,, +39.2968750000,628,1304.0292968750,,, +39.2988281250,628,1302.5640869141,,, +39.3007812500,628,1301.0988769531,,, +39.3027343750,628,1298.9011230469,,, +39.3046875000,628,1298.1684570312,,, +39.3066406250,628,1295.9707031250,,, +39.3085937500,628,1293.7729492188,,, +39.3105468750,628,1291.5750732422,,, +39.3125000000,629,1290.1098632812,,, +39.3144531250,629,1288.6446533203,,, +39.3164062500,629,1287.1794433594,,, +39.3183593750,629,1286.4468994141,,, +39.3203125000,629,1284.2490234375,,, +39.3222656250,629,1283.5164794922,,, +39.3242187500,629,1280.5860595703,,, +39.3261718750,629,1279.8535156250,,, +39.3281250000,629,1278.3883056641,,, +39.3300781250,629,1276.1904296875,,, +39.3320312500,629,1275.4578857422,,, +39.3339843750,629,1272.5274658203,,, +39.3359375000,629,1271.7949218750,,, +39.3378906250,629,1268.8645019531,,, +39.3398437500,629,1266.6666259766,,, +39.3417968750,629,1265.9340820312,,, +39.3437500000,629,1263.0036621094,,, +39.3457031250,629,1263.0036621094,,, +39.3476562500,629,1261.5384521484,,, +39.3496093750,629,1261.5384521484,,, +39.3515625000,629,1260.8059082031,,, +39.3535156250,629,1260.0732421875,,, +39.3554687500,629,1261.5384521484,,, +39.3574218750,629,1260.8059082031,,, +39.3593750000,629,1261.5384521484,,, +39.3613281250,629,1262.2711181641,,, +39.3632812500,629,1262.2711181641,,, +39.3652343750,629,1263.7362060547,,, +39.3671875000,629,1263.0036621094,,, +39.3691406250,629,1263.7362060547,,, +39.3710937500,629,1263.7362060547,,, +39.3730468750,629,1264.4688720703,,, +39.3750000000,630,1264.4688720703,,, +39.3769531250,630,1265.2014160156,,, +39.3789062500,630,1266.6666259766,,, +39.3808593750,630,1265.9340820312,,, +39.3828125000,630,1267.3992919922,,, +39.3847656250,630,1268.1318359375,,, +39.3867187500,630,1269.5970458984,,, +39.3886718750,630,1270.3297119141,,, +39.3906250000,630,1271.0622558594,,, +39.3925781250,630,1273.2601318359,,, +39.3945312500,630,1273.2601318359,,, +39.3964843750,630,1274.7252197266,,, +39.3984375000,630,1276.1904296875,,, +39.4003906250,630,1276.9230957031,,, +39.4023437500,630,1278.3883056641,,, +39.4042968750,630,1279.1208496094,,, +39.4062500000,630,1280.5860595703,,, +39.4082031250,630,1282.0512695312,,, +39.4101562500,630,1282.7839355469,,, +39.4121093750,630,1285.7142333984,,, +39.4140625000,630,1285.7142333984,,, +39.4160156250,630,1287.1794433594,,, +39.4179687500,630,1290.1098632812,,, +39.4199218750,630,1289.3773193359,,, +39.4218750000,630,1291.5750732422,,, +39.4238281250,630,1293.0402832031,,, +39.4257812500,630,1293.0402832031,,, +39.4277343750,630,1295.9707031250,,, +39.4296875000,630,1295.2380371094,,, +39.4316406250,630,1295.9707031250,,, +39.4335937500,630,1297.4359130859,,, +39.4355468750,630,1297.4359130859,,, +39.4375000000,631,1298.9011230469,,, +39.4394531250,631,1297.4359130859,,, +39.4414062500,631,1297.4359130859,,, +39.4433593750,631,1298.1684570312,,, +39.4453125000,631,1297.4359130859,,, +39.4472656250,631,1296.7032470703,,, +39.4492187500,631,1295.9707031250,,, +39.4511718750,631,1295.2380371094,,, +39.4531250000,631,1295.9707031250,,, +39.4550781250,631,1294.5054931641,,, +39.4570312500,631,1295.2380371094,,, +39.4589843750,631,1294.5054931641,,, +39.4609375000,631,1294.5054931641,,, +39.4628906250,631,1294.5054931641,,, +39.4648437500,631,1294.5054931641,,, +39.4667968750,631,1294.5054931641,,, +39.4687500000,631,1295.2380371094,,, +39.4707031250,631,1294.5054931641,,, +39.4726562500,631,1295.2380371094,,, +39.4746093750,631,1296.7032470703,,, +39.4765625000,631,1297.4359130859,,, +39.4785156250,631,1296.7032470703,,, +39.4804687500,631,1298.1684570312,,, +39.4824218750,631,1297.4359130859,,, +39.4843750000,631,1297.4359130859,,, +39.4863281250,631,1298.9011230469,,, +39.4882812500,631,1298.9011230469,,, +39.4902343750,631,1298.9011230469,,, +39.4921875000,631,1301.0988769531,,, +39.4941406250,631,1302.5640869141,,, +39.4960937500,631,1303.2967529297,,, +39.4980468750,631,1304.7619628906,,, +39.5000000000,632,1304.7619628906,,, +39.5019531250,632,1305.4945068359,,, +39.5039062500,632,1306.2270507812,,, +39.5058593750,632,1306.2270507812,,, +39.5078125000,632,1308.4249267578,,, +39.5097656250,632,1309.8901367188,,, +39.5117187500,632,1310.6226806641,,, +39.5136718750,632,1311.3553466797,,, +39.5156250000,632,1312.8205566406,,, +39.5175781250,632,1314.2857666016,,, +39.5195312500,632,1315.0183105469,,, +39.5214843750,632,1315.7509765625,,, +39.5234375000,632,1315.7509765625,,, +39.5253906250,632,1316.4835205078,,, +39.5273437500,632,1317.2160644531,,, +39.5292968750,632,1317.2160644531,,, +39.5312500000,632,1317.9487304688,,, +39.5332031250,632,1318.6812744141,,, +39.5351562500,632,1318.6812744141,,, +39.5371093750,632,1321.6116943359,,, +39.5390625000,632,1322.3443603516,,, +39.5410156250,632,1323.0769042969,,, +39.5429687500,632,1324.5421142578,,, +39.5449218750,632,1326.0073242188,,, +39.5468750000,632,1327.4725341797,,, +39.5488281250,632,1328.9377441406,,, +39.5507812500,632,1329.6702880859,,, +39.5527343750,632,1330.4029541016,,, +39.5546875000,632,1331.8681640625,,, +39.5566406250,632,1331.1354980469,,, +39.5585937500,632,1330.4029541016,,, +39.5605468750,632,1331.1354980469,,, +39.5625000000,633,1329.6702880859,,, +39.5644531250,633,1327.4725341797,,, +39.5664062500,633,1326.7398681641,,, +39.5683593750,633,1325.2747802734,,, +39.5703125000,633,1322.3443603516,,, +39.5722656250,633,1321.6116943359,,, +39.5742187500,633,1320.1464843750,,, +39.5761718750,633,1317.9487304688,,, +39.5781250000,633,1317.2160644531,,, +39.5800781250,633,1315.7509765625,,, +39.5820312500,633,1313.5531005859,,, +39.5839843750,633,1311.3553466797,,, +39.5859375000,633,1310.6226806641,,, +39.5878906250,633,1308.4249267578,,, +39.5898437500,633,1307.6922607422,,, +39.5917968750,633,1306.2270507812,,, +39.5937500000,633,1304.0292968750,,, +39.5957031250,633,1303.2967529297,,, +39.5976562500,633,1303.2967529297,,, +39.5996093750,633,1301.0988769531,,, +39.6015625000,633,1300.3663330078,,, +39.6035156250,633,1301.0988769531,,, +39.6054687500,633,1299.6336669922,,, +39.6074218750,633,1298.1684570312,,, +39.6093750000,633,1298.9011230469,,, +39.6113281250,633,1298.1684570312,,, +39.6132812500,633,1297.4359130859,,, +39.6152343750,633,1298.9011230469,,, +39.6171875000,633,1298.1684570312,,, +39.6191406250,633,1297.4359130859,,, +39.6210937500,633,1298.9011230469,,, +39.6230468750,633,1298.1684570312,,, +39.6250000000,634,1298.1684570312,,, +39.6269531250,634,1299.6336669922,,, +39.6289062500,634,1298.9011230469,,, +39.6308593750,634,1298.9011230469,,, +39.6328125000,634,1301.0988769531,,, +39.6347656250,634,1301.0988769531,,, +39.6367187500,634,1301.0988769531,,, +39.6386718750,634,1302.5640869141,,, +39.6406250000,634,1303.2967529297,,, +39.6425781250,634,1301.8315429688,,, +39.6445312500,634,1302.5640869141,,, +39.6464843750,634,1304.7619628906,,, +39.6484375000,634,1304.7619628906,,, +39.6503906250,634,1305.4945068359,,, +39.6523437500,634,1305.4945068359,,, +39.6542968750,634,1305.4945068359,,, +39.6562500000,634,1305.4945068359,,, +39.6582031250,634,1306.2270507812,,, +39.6601562500,634,1304.7619628906,,, +39.6621093750,634,1304.7619628906,,, +39.6640625000,634,1304.7619628906,,, +39.6660156250,634,1304.7619628906,,, +39.6679687500,634,1303.2967529297,,, +39.6699218750,634,1303.2967529297,,, +39.6718750000,634,1304.7619628906,,, +39.6738281250,634,1304.0292968750,,, +39.6757812500,634,1303.2967529297,,, +39.6777343750,634,1304.0292968750,,, +39.6796875000,634,1304.0292968750,,, +39.6816406250,634,1302.5640869141,,, +39.6835937500,634,1302.5640869141,,, +39.6855468750,634,1303.2967529297,,, +39.6875000000,635,1303.2967529297,,, +39.6894531250,635,1303.2967529297,,, +39.6914062500,635,1302.5640869141,,, +39.6933593750,635,1303.2967529297,,, +39.6953125000,635,1302.5640869141,,, +39.6972656250,635,1304.0292968750,,, +39.6992187500,635,1304.7619628906,,, +39.7011718750,635,1303.2967529297,,, +39.7031250000,635,1304.0292968750,,, +39.7050781250,635,1304.0292968750,,, +39.7070312500,635,1303.2967529297,,, +39.7089843750,635,1304.7619628906,,, +39.7109375000,635,1304.7619628906,,, +39.7128906250,635,1304.7619628906,,, +39.7148437500,635,1304.7619628906,,, +39.7167968750,635,1303.2967529297,,, +39.7187500000,635,1303.2967529297,,, +39.7207031250,635,1304.0292968750,,, +39.7226562500,635,1301.8315429688,,, +39.7246093750,635,1301.0988769531,,, +39.7265625000,635,1301.8315429688,,, +39.7285156250,635,1301.0988769531,,, +39.7304687500,635,1299.6336669922,,, +39.7324218750,635,1299.6336669922,,, +39.7343750000,635,1298.9011230469,,, +39.7363281250,635,1298.1684570312,,, +39.7382812500,635,1298.1684570312,,, +39.7402343750,635,1296.7032470703,,, +39.7421875000,635,1296.7032470703,,, +39.7441406250,635,1296.7032470703,,, +39.7460937500,635,1296.7032470703,,, +39.7480468750,635,1296.7032470703,,, +39.7500000000,636,1295.2380371094,,, +39.7519531250,636,1295.2380371094,,, +39.7539062500,636,1295.9707031250,,, +39.7558593750,636,1295.9707031250,,, +39.7578125000,636,1295.9707031250,,, +39.7597656250,636,1295.9707031250,,, +39.7617187500,636,1295.9707031250,,, +39.7636718750,636,1296.7032470703,,, +39.7656250000,636,1296.7032470703,,, +39.7675781250,636,1297.4359130859,,, +39.7695312500,636,1297.4359130859,,, +39.7714843750,636,1297.4359130859,,, +39.7734375000,636,1297.4359130859,,, +39.7753906250,636,1298.1684570312,,, +39.7773437500,636,1299.6336669922,,, +39.7792968750,636,1299.6336669922,,, +39.7812500000,636,1300.3663330078,,, +39.7832031250,636,1301.0988769531,,, +39.7851562500,636,1303.2967529297,,, +39.7871093750,636,1303.2967529297,,, +39.7890625000,636,1304.0292968750,,, +39.7910156250,636,1305.4945068359,,, +39.7929687500,636,1306.9597167969,,, +39.7949218750,636,1310.6226806641,,, +39.7968750000,636,1311.3553466797,,, +39.7988281250,636,1314.2857666016,,, +39.8007812500,636,1316.4835205078,,, +39.8027343750,636,1319.4139404297,,, +39.8046875000,636,1323.8095703125,,, +39.8066406250,636,1326.7398681641,,, +39.8085937500,636,1332.6007080078,,, +39.8105468750,636,1336.9963378906,,, +39.8125000000,637,1342.1245117188,,, +39.8144531250,637,1348.7178955078,,, +39.8164062500,637,1353.8461914062,,, +39.8183593750,637,1361.9047851562,,, +39.8203125000,637,1367.7656250000,,, +39.8222656250,637,1375.8242187500,,, +39.8242187500,637,1383.1501464844,,, +39.8261718750,637,1391.2087402344,,, +39.8281250000,637,1401.4652099609,,, +39.8300781250,637,1410.2564697266,,, +39.8320312500,637,1421.9780273438,,, +39.8339843750,637,1432.2343750000,,, +39.8359375000,637,1443.9560546875,,, +39.8378906250,637,1456.4102783203,,, +39.8398437500,637,1469.5970458984,,, +39.8417968750,637,1484.2490234375,,, +39.8437500000,637,1497.4359130859,,, +39.8457031250,637,1514.2857666016,,, +39.8476562500,637,1528.2050781250,,, +39.8496093750,637,1544.3223876953,,, +39.8515625000,637,1561.1721191406,,, +39.8535156250,637,1576.5567626953,,, +39.8554687500,637,1594.8718261719,,, +39.8574218750,637,1610.2564697266,,, +39.8593750000,637,1625.6409912109,,, +39.8613281250,637,1641.7583007812,,, +39.8632812500,637,1657.1428222656,,, +39.8652343750,637,1675.4578857422,,, +39.8671875000,637,1690.8425292969,,, +39.8691406250,637,1707.6922607422,,, +39.8710937500,637,1723.0769042969,,, +39.8730468750,637,1739.9267578125,,, +39.8750000000,638,1754.5787353516,,, +39.8769531250,638,1769.9633789062,,, +39.8789062500,638,1786.0805664062,,, +39.8808593750,638,1799.2674560547,,, +39.8828125000,638,1815.3846435547,,, +39.8847656250,638,1829.3040771484,,, +39.8867187500,638,1842.4908447266,,, +39.8886718750,638,1854.9450683594,,, +39.8906250000,638,1867.3992919922,,, +39.8925781250,638,1879.1208496094,,, +39.8945312500,638,1890.1098632812,,, +39.8964843750,638,1899.6336669922,,, +39.8984375000,638,1909.1574707031,,, +39.9003906250,638,1917.2160644531,,, +39.9023437500,638,1923.8095703125,,, +39.9042968750,638,1928.9377441406,,, +39.9062500000,638,1933.3333740234,,, +39.9082031250,638,1936.2637939453,,, +39.9101562500,638,1940.6593017578,,, +39.9121093750,638,1942.1245117188,,, +39.9140625000,638,1943.5897216797,,, +39.9160156250,638,1943.5897216797,,, +39.9179687500,638,1942.1245117188,,, +39.9199218750,638,1941.3919677734,,, +39.9218750000,638,1939.1940917969,,, +39.9238281250,638,1936.2637939453,,, +39.9257812500,638,1930.4029541016,,, +39.9277343750,638,1926.0073242188,,, +39.9296875000,638,1921.6116943359,,, +39.9316406250,638,1915.0183105469,,, +39.9335937500,638,1909.8901367188,,, +39.9355468750,638,1901.8315429688,,, +39.9375000000,639,1894.5054931641,,, +39.9394531250,639,1884.2490234375,,, +39.9414062500,639,1876.1904296875,,, +39.9433593750,639,1865.9340820312,,, +39.9453125000,639,1856.4102783203,,, +39.9472656250,639,1846.8864746094,,, +39.9492187500,639,1835.1647949219,,, +39.9511718750,639,1824.9084472656,,, +39.9531250000,639,1811.7215576172,,, +39.9550781250,639,1798.5347900391,,, +39.9570312500,639,1785.3480224609,,, +39.9589843750,639,1771.4285888672,,, +39.9609375000,639,1758.2416992188,,, +39.9628906250,639,1743.5897216797,,, +39.9648437500,639,1730.4029541016,,, +39.9667968750,639,1715.7509765625,,, +39.9687500000,639,1701.0988769531,,, +39.9707031250,639,1687.1794433594,,, +39.9726562500,639,1673.2601318359,,, +39.9746093750,639,1660.0732421875,,, +39.9765625000,639,1646.1538085938,,, +39.9785156250,639,1632.9670410156,,, +39.9804687500,639,1618.3150634766,,, +39.9824218750,639,1604.3956298828,,, +39.9843750000,639,1591.2087402344,,, +39.9863281250,639,1578.0219726562,,, +39.9882812500,639,1567.0329589844,,, +39.9902343750,639,1553.8461914062,,, +39.9921875000,639,1541.3919677734,,, +39.9941406250,639,1530.4029541016,,, +39.9960937500,639,1518.6812744141,,, +39.9980468750,639,1508.4249267578,,, +40.0000000000,640,1498.1684570312,,, +40.0019531250,640,1487.9121093750,,, +40.0039062500,640,1477.6556396484,,, +40.0058593750,640,1468.8645019531,,, +40.0078125000,640,1459.3406982422,,, +40.0097656250,640,1450.5494384766,,, +40.0117187500,640,1442.4908447266,,, +40.0136718750,640,1433.6995849609,,, +40.0156250000,640,1427.1062011719,,, +40.0175781250,640,1419.0476074219,,, +40.0195312500,640,1411.7215576172,,, +40.0214843750,640,1405.8608398438,,, +40.0234375000,640,1398.5347900391,,, +40.0253906250,640,1391.9414062500,,, +40.0273437500,640,1386.0805664062,,, +40.0292968750,640,1380.2197265625,,, +40.0312500000,640,1375.0915527344,,, +40.0332031250,640,1369.9633789062,,, +40.0351562500,640,1365.5677490234,,, +40.0371093750,640,1361.1721191406,,, +40.0390625000,640,1357.5091552734,,, +40.0410156250,640,1353.1135253906,,, +40.0429687500,640,1349.4505615234,,, +40.0449218750,640,1345.7875976562,,, +40.0468750000,640,1342.8571777344,,, +40.0488281250,640,1337.7288818359,,, +40.0507812500,640,1336.2637939453,,, +40.0527343750,640,1333.3333740234,,, +40.0546875000,640,1331.8681640625,,, +40.0566406250,640,1329.6702880859,,, +40.0585937500,640,1326.7398681641,,, +40.0605468750,640,1326.7398681641,,, +40.0625000000,641,1323.8095703125,,, +40.0644531250,641,1323.0769042969,,, +40.0664062500,641,1320.8791503906,,, +40.0683593750,641,1320.8791503906,,, +40.0703125000,641,1319.4139404297,,, +40.0722656250,641,1318.6812744141,,, +40.0742187500,641,1319.4139404297,,, +40.0761718750,641,1318.6812744141,,, +40.0781250000,641,1318.6812744141,,, +40.0800781250,641,1317.9487304688,,, +40.0820312500,641,1317.9487304688,,, +40.0839843750,641,1320.1464843750,,, +40.0859375000,641,1318.6812744141,,, +40.0878906250,641,1320.1464843750,,, +40.0898437500,641,1320.1464843750,,, +40.0917968750,641,1320.1464843750,,, +40.0937500000,641,1320.8791503906,,, +40.0957031250,641,1321.6116943359,,, +40.0976562500,641,1323.0769042969,,, +40.0996093750,641,1323.8095703125,,, +40.1015625000,641,1324.5421142578,,, +40.1035156250,641,1326.0073242188,,, +40.1054687500,641,1326.7398681641,,, +40.1074218750,641,1328.2050781250,,, +40.1093750000,641,1331.8681640625,,, +40.1113281250,641,1333.3333740234,,, +40.1132812500,641,1334.7985839844,,, +40.1152343750,641,1337.7288818359,,, +40.1171875000,641,1339.1940917969,,, +40.1191406250,641,1342.1245117188,,, +40.1210937500,641,1342.8571777344,,, +40.1230468750,641,1345.7875976562,,, +40.1250000000,642,1349.4505615234,,, +40.1269531250,642,1351.6483154297,,, +40.1289062500,642,1353.8461914062,,, +40.1308593750,642,1358.2416992188,,, +40.1328125000,642,1360.4395751953,,, +40.1347656250,642,1363.3699951172,,, +40.1367187500,642,1367.0329589844,,, +40.1386718750,642,1369.2307128906,,, +40.1406250000,642,1371.4285888672,,, +40.1425781250,642,1375.0915527344,,, +40.1445312500,642,1377.2894287109,,, +40.1464843750,642,1379.4871826172,,, +40.1484375000,642,1383.1501464844,,, +40.1503906250,642,1384.6153564453,,, +40.1523437500,642,1386.8132324219,,, +40.1542968750,642,1391.2087402344,,, +40.1562500000,642,1393.4066162109,,, +40.1582031250,642,1394.8718261719,,, +40.1601562500,642,1397.8022460938,,, +40.1621093750,642,1399.2674560547,,, +40.1640625000,642,1401.4652099609,,, +40.1660156250,642,1404.3956298828,,, +40.1679687500,642,1405.8608398438,,, +40.1699218750,642,1408.0585937500,,, +40.1718750000,642,1408.0585937500,,, +40.1738281250,642,1410.9890136719,,, +40.1757812500,642,1412.4542236328,,, +40.1777343750,642,1413.9194335938,,, +40.1796875000,642,1416.1171875000,,, +40.1816406250,642,1417.5823974609,,, +40.1835937500,642,1419.0476074219,,, +40.1855468750,642,1420.5128173828,,, +40.1875000000,643,1419.7802734375,,, +40.1894531250,643,1421.9780273438,,, +40.1914062500,643,1421.2453613281,,, +40.1933593750,643,1421.2453613281,,, +40.1953125000,643,1421.9780273438,,, +40.1972656250,643,1419.7802734375,,, +40.1992187500,643,1419.7802734375,,, +40.2011718750,643,1419.0476074219,,, +40.2031250000,643,1417.5823974609,,, +40.2050781250,643,1416.1171875000,,, +40.2070312500,643,1416.1171875000,,, +40.2089843750,643,1413.9194335938,,, +40.2109375000,643,1413.1867675781,,, +40.2128906250,643,1410.9890136719,,, +40.2148437500,643,1408.0585937500,,, +40.2167968750,643,1407.3260498047,,, +40.2187500000,643,1405.1281738281,,, +40.2207031250,643,1402.9304199219,,, +40.2226562500,643,1402.1977539062,,, +40.2246093750,643,1398.5347900391,,, +40.2265625000,643,1397.0695800781,,, +40.2285156250,643,1393.4066162109,,, +40.2304687500,643,1389.7435302734,,, +40.2324218750,643,1389.0109863281,,, +40.2343750000,643,1384.6153564453,,, +40.2363281250,643,1381.6849365234,,, +40.2382812500,643,1378.7546386719,,, +40.2402343750,643,1375.0915527344,,, +40.2421875000,643,1372.8937988281,,, +40.2441406250,643,1369.2307128906,,, +40.2460937500,643,1366.3004150391,,, +40.2480468750,643,1364.8352050781,,, +40.2500000000,644,1360.4395751953,,, +40.2519531250,644,1358.2416992188,,, +40.2539062500,644,1354.5787353516,,, +40.2558593750,644,1350.9157714844,,, +40.2578125000,644,1348.7178955078,,, +40.2597656250,644,1345.0549316406,,, +40.2617187500,644,1342.8571777344,,, +40.2636718750,644,1339.9267578125,,, +40.2656250000,644,1337.7288818359,,, +40.2675781250,644,1334.0659179688,,, +40.2695312500,644,1331.8681640625,,, +40.2714843750,644,1328.9377441406,,, +40.2734375000,644,1326.0073242188,,, +40.2753906250,644,1324.5421142578,,, +40.2773437500,644,1320.8791503906,,, +40.2792968750,644,1318.6812744141,,, +40.2812500000,644,1316.4835205078,,, +40.2832031250,644,1314.2857666016,,, +40.2851562500,644,1312.0878906250,,, +40.2871093750,644,1310.6226806641,,, +40.2890625000,644,1309.1574707031,,, +40.2910156250,644,1306.2270507812,,, +40.2929687500,644,1305.4945068359,,, +40.2949218750,644,1304.0292968750,,, +40.2968750000,644,1302.5640869141,,, +40.2988281250,644,1300.3663330078,,, +40.3007812500,644,1299.6336669922,,, +40.3027343750,644,1297.4359130859,,, +40.3046875000,644,1295.2380371094,,, +40.3066406250,644,1294.5054931641,,, +40.3085937500,644,1293.0402832031,,, +40.3105468750,644,1291.5750732422,,, +40.3125000000,645,1290.1098632812,,, +40.3144531250,645,1287.9121093750,,, +40.3164062500,645,1287.1794433594,,, +40.3183593750,645,1285.7142333984,,, +40.3203125000,645,1284.9816894531,,, +40.3222656250,645,1282.7839355469,,, +40.3242187500,645,1280.5860595703,,, +40.3261718750,645,1277.6556396484,,, +40.3281250000,645,1276.9230957031,,, +40.3300781250,645,1276.1904296875,,, +40.3320312500,645,1273.9926757812,,, +40.3339843750,645,1274.7252197266,,, +40.3359375000,645,1273.2601318359,,, +40.3378906250,645,1273.2601318359,,, +40.3398437500,645,1273.2601318359,,, +40.3417968750,645,1272.5274658203,,, +40.3437500000,645,1274.7252197266,,, +40.3457031250,645,1273.9926757812,,, +40.3476562500,645,1274.7252197266,,, +40.3496093750,645,1275.4578857422,,, +40.3515625000,645,1275.4578857422,,, +40.3535156250,645,1275.4578857422,,, +40.3554687500,645,1276.1904296875,,, +40.3574218750,645,1277.6556396484,,, +40.3593750000,645,1276.9230957031,,, +40.3613281250,645,1277.6556396484,,, +40.3632812500,645,1278.3883056641,,, +40.3652343750,645,1279.1208496094,,, +40.3671875000,645,1280.5860595703,,, +40.3691406250,645,1280.5860595703,,, +40.3710937500,645,1282.0512695312,,, +40.3730468750,645,1284.2490234375,,, +40.3750000000,646,1286.4468994141,,, +40.3769531250,646,1286.4468994141,,, +40.3789062500,646,1289.3773193359,,, +40.3808593750,646,1290.8425292969,,, +40.3828125000,646,1291.5750732422,,, +40.3847656250,646,1293.0402832031,,, +40.3867187500,646,1294.5054931641,,, +40.3886718750,646,1296.7032470703,,, +40.3906250000,646,1297.4359130859,,, +40.3925781250,646,1299.6336669922,,, +40.3945312500,646,1300.3663330078,,, +40.3964843750,646,1301.8315429688,,, +40.3984375000,646,1301.8315429688,,, +40.4003906250,646,1304.0292968750,,, +40.4023437500,646,1304.0292968750,,, +40.4042968750,646,1303.2967529297,,, +40.4062500000,646,1303.2967529297,,, +40.4082031250,646,1303.2967529297,,, +40.4101562500,646,1304.7619628906,,, +40.4121093750,646,1304.0292968750,,, +40.4140625000,646,1305.4945068359,,, +40.4160156250,646,1305.4945068359,,, +40.4179687500,646,1306.2270507812,,, +40.4199218750,646,1304.7619628906,,, +40.4218750000,646,1304.7619628906,,, +40.4238281250,646,1304.7619628906,,, +40.4257812500,646,1303.2967529297,,, +40.4277343750,646,1303.2967529297,,, +40.4296875000,646,1304.0292968750,,, +40.4316406250,646,1301.8315429688,,, +40.4335937500,646,1302.5640869141,,, +40.4355468750,646,1301.0988769531,,, +40.4375000000,647,1300.3663330078,,, +40.4394531250,647,1299.6336669922,,, +40.4414062500,647,1298.9011230469,,, +40.4433593750,647,1298.9011230469,,, +40.4453125000,647,1298.9011230469,,, +40.4472656250,647,1298.9011230469,,, +40.4492187500,647,1298.1684570312,,, +40.4511718750,647,1298.9011230469,,, +40.4531250000,647,1298.9011230469,,, +40.4550781250,647,1298.9011230469,,, +40.4570312500,647,1300.3663330078,,, +40.4589843750,647,1301.0988769531,,, +40.4609375000,647,1302.5640869141,,, +40.4628906250,647,1304.0292968750,,, +40.4648437500,647,1305.4945068359,,, +40.4667968750,647,1306.2270507812,,, +40.4687500000,647,1307.6922607422,,, +40.4707031250,647,1308.4249267578,,, +40.4726562500,647,1309.8901367188,,, +40.4746093750,647,1311.3553466797,,, +40.4765625000,647,1312.0878906250,,, +40.4785156250,647,1313.5531005859,,, +40.4804687500,647,1313.5531005859,,, +40.4824218750,647,1315.0183105469,,, +40.4843750000,647,1315.0183105469,,, +40.4863281250,647,1316.4835205078,,, +40.4882812500,647,1316.4835205078,,, +40.4902343750,647,1316.4835205078,,, +40.4921875000,647,1317.2160644531,,, +40.4941406250,647,1318.6812744141,,, +40.4960937500,647,1319.4139404297,,, +40.4980468750,647,1320.1464843750,,, +40.5000000000,648,1322.3443603516,,, +40.5019531250,648,1320.8791503906,,, +40.5039062500,648,1323.0769042969,,, +40.5058593750,648,1322.3443603516,,, +40.5078125000,648,1322.3443603516,,, +40.5097656250,648,1322.3443603516,,, +40.5117187500,648,1321.6116943359,,, +40.5136718750,648,1323.0769042969,,, +40.5156250000,648,1322.3443603516,,, +40.5175781250,648,1322.3443603516,,, +40.5195312500,648,1321.6116943359,,, +40.5214843750,648,1322.3443603516,,, +40.5234375000,648,1322.3443603516,,, +40.5253906250,648,1322.3443603516,,, +40.5273437500,648,1323.0769042969,,, +40.5292968750,648,1321.6116943359,,, +40.5312500000,648,1323.0769042969,,, +40.5332031250,648,1321.6116943359,,, +40.5351562500,648,1321.6116943359,,, +40.5371093750,648,1321.6116943359,,, +40.5390625000,648,1320.8791503906,,, +40.5410156250,648,1321.6116943359,,, +40.5429687500,648,1320.1464843750,,, +40.5449218750,648,1320.8791503906,,, +40.5468750000,648,1319.4139404297,,, +40.5488281250,648,1318.6812744141,,, +40.5507812500,648,1317.9487304688,,, +40.5527343750,648,1317.9487304688,,, +40.5546875000,648,1317.9487304688,,, +40.5566406250,648,1317.2160644531,,, +40.5585937500,648,1317.9487304688,,, +40.5605468750,648,1317.2160644531,,, +40.5625000000,649,1317.2160644531,,, +40.5644531250,649,1317.2160644531,,, +40.5664062500,649,1315.7509765625,,, +40.5683593750,649,1315.7509765625,,, +40.5703125000,649,1314.2857666016,,, +40.5722656250,649,1315.0183105469,,, +40.5742187500,649,1313.5531005859,,, +40.5761718750,649,1313.5531005859,,, +40.5781250000,649,1312.8205566406,,, +40.5800781250,649,1312.8205566406,,, +40.5820312500,649,1311.3553466797,,, +40.5839843750,649,1310.6226806641,,, +40.5859375000,649,1309.8901367188,,, +40.5878906250,649,1309.1574707031,,, +40.5898437500,649,1309.1574707031,,, +40.5917968750,649,1309.1574707031,,, +40.5937500000,649,1309.8901367188,,, +40.5957031250,649,1309.8901367188,,, +40.5976562500,649,1310.6226806641,,, +40.5996093750,649,1310.6226806641,,, +40.6015625000,649,1312.0878906250,,, +40.6035156250,649,1312.0878906250,,, +40.6054687500,649,1313.5531005859,,, +40.6074218750,649,1312.0878906250,,, +40.6093750000,649,1312.8205566406,,, +40.6113281250,649,1312.8205566406,,, +40.6132812500,649,1312.0878906250,,, +40.6152343750,649,1312.0878906250,,, +40.6171875000,649,1312.0878906250,,, +40.6191406250,649,1311.3553466797,,, +40.6210937500,649,1311.3553466797,,, +40.6230468750,649,1312.0878906250,,, +40.6250000000,650,1312.0878906250,,, +40.6269531250,650,1312.8205566406,,, +40.6289062500,650,1312.0878906250,,, +40.6308593750,650,1314.2857666016,,, +40.6328125000,650,1314.2857666016,,, +40.6347656250,650,1315.7509765625,,, +40.6367187500,650,1315.7509765625,,, +40.6386718750,650,1317.2160644531,,, +40.6406250000,650,1316.4835205078,,, +40.6425781250,650,1318.6812744141,,, +40.6445312500,650,1318.6812744141,,, +40.6464843750,650,1319.4139404297,,, +40.6484375000,650,1319.4139404297,,, +40.6503906250,650,1320.1464843750,,, +40.6523437500,650,1320.1464843750,,, +40.6542968750,650,1320.8791503906,,, +40.6562500000,650,1320.1464843750,,, +40.6582031250,650,1320.1464843750,,, +40.6601562500,650,1320.1464843750,,, +40.6621093750,650,1319.4139404297,,, +40.6640625000,650,1320.1464843750,,, +40.6660156250,650,1318.6812744141,,, +40.6679687500,650,1319.4139404297,,, +40.6699218750,650,1317.9487304688,,, +40.6718750000,650,1316.4835205078,,, +40.6738281250,650,1314.2857666016,,, +40.6757812500,650,1314.2857666016,,, +40.6777343750,650,1312.8205566406,,, +40.6796875000,650,1312.0878906250,,, +40.6816406250,650,1310.6226806641,,, +40.6835937500,650,1310.6226806641,,, +40.6855468750,650,1309.1574707031,,, +40.6875000000,651,1307.6922607422,,, +40.6894531250,651,1306.9597167969,,, +40.6914062500,651,1305.4945068359,,, +40.6933593750,651,1304.7619628906,,, +40.6953125000,651,1303.2967529297,,, +40.6972656250,651,1301.0988769531,,, +40.6992187500,651,1301.0988769531,,, +40.7011718750,651,1300.3663330078,,, +40.7031250000,651,1299.6336669922,,, +40.7050781250,651,1298.9011230469,,, +40.7070312500,651,1297.4359130859,,, +40.7089843750,651,1298.1684570312,,, +40.7109375000,651,1296.7032470703,,, +40.7128906250,651,1295.9707031250,,, +40.7148437500,651,1296.7032470703,,, +40.7167968750,651,1297.4359130859,,, +40.7187500000,651,1298.1684570312,,, +40.7207031250,651,1298.1684570312,,, +40.7226562500,651,1298.9011230469,,, +40.7246093750,651,1300.3663330078,,, +40.7265625000,651,1303.2967529297,,, +40.7285156250,651,1306.2270507812,,, +40.7304687500,651,1308.4249267578,,, +40.7324218750,651,1311.3553466797,,, +40.7343750000,651,1315.7509765625,,, +40.7363281250,651,1319.4139404297,,, +40.7382812500,651,1325.2747802734,,, +40.7402343750,651,1330.4029541016,,, +40.7421875000,651,1336.2637939453,,, +40.7441406250,651,1342.1245117188,,, +40.7460937500,651,1348.7178955078,,, +40.7480468750,651,1356.7766113281,,, +40.7500000000,652,1364.8352050781,,, +40.7519531250,652,1374.3590087891,,, +40.7539062500,652,1383.8828125000,,, +40.7558593750,652,1394.8718261719,,, +40.7578125000,652,1405.8608398438,,, +40.7597656250,652,1416.8498535156,,, +40.7617187500,652,1429.3040771484,,, +40.7636718750,652,1442.4908447266,,, +40.7656250000,652,1456.4102783203,,, +40.7675781250,652,1469.5970458984,,, +40.7695312500,652,1483.5164794922,,, +40.7714843750,652,1498.1684570312,,, +40.7734375000,652,1512.8205566406,,, +40.7753906250,652,1529.6702880859,,, +40.7773437500,652,1544.3223876953,,, +40.7792968750,652,1561.1721191406,,, +40.7812500000,652,1577.2894287109,,, +40.7832031250,652,1593.4066162109,,, +40.7851562500,652,1611.7215576172,,, +40.7871093750,652,1627.1062011719,,, +40.7890625000,652,1643.9560546875,,, +40.7910156250,652,1660.8059082031,,, +40.7929687500,652,1677.6556396484,,, +40.7949218750,652,1693.0402832031,,, +40.7968750000,652,1708.4249267578,,, +40.7988281250,652,1725.2747802734,,, +40.8007812500,652,1741.3919677734,,, +40.8027343750,652,1757.5091552734,,, +40.8046875000,652,1771.4285888672,,, +40.8066406250,652,1786.8132324219,,, +40.8085937500,652,1800.0000000000,,, +40.8105468750,652,1813.1867675781,,, +40.8125000000,653,1826.3736572266,,, +40.8144531250,653,1837.3626708984,,, +40.8164062500,653,1849.0842285156,,, +40.8183593750,653,1860.0732421875,,, +40.8203125000,653,1871.0622558594,,, +40.8222656250,653,1879.1208496094,,, +40.8242187500,653,1887.9121093750,,, +40.8261718750,653,1895.2380371094,,, +40.8281250000,653,1902.5640869141,,, +40.8300781250,653,1906.9597167969,,, +40.8320312500,653,1912.8205566406,,, +40.8339843750,653,1917.2160644531,,, +40.8359375000,653,1920.8791503906,,, +40.8378906250,653,1924.5421142578,,, +40.8398437500,653,1924.5421142578,,, +40.8417968750,653,1926.0073242188,,, +40.8437500000,653,1925.2747802734,,, +40.8457031250,653,1923.8095703125,,, +40.8476562500,653,1920.8791503906,,, +40.8496093750,653,1917.9487304688,,, +40.8515625000,653,1913.5531005859,,, +40.8535156250,653,1908.4249267578,,, +40.8554687500,653,1903.2967529297,,, +40.8574218750,653,1896.7032470703,,, +40.8593750000,653,1890.1098632812,,, +40.8613281250,653,1882.0512695312,,, +40.8632812500,653,1873.9926757812,,, +40.8652343750,653,1863.7362060547,,, +40.8671875000,653,1853.4798583984,,, +40.8691406250,653,1843.2233886719,,, +40.8710937500,653,1832.2343750000,,, +40.8730468750,653,1821.2453613281,,, +40.8750000000,654,1808.7912597656,,, +40.8769531250,654,1798.5347900391,,, +40.8789062500,654,1785.3480224609,,, +40.8808593750,654,1772.1611328125,,, +40.8828125000,654,1759.7069091797,,, +40.8847656250,654,1745.7875976562,,, +40.8867187500,654,1733.3333740234,,, +40.8886718750,654,1720.8791503906,,, +40.8906250000,654,1707.6922607422,,, +40.8925781250,654,1693.0402832031,,, +40.8945312500,654,1680.5860595703,,, +40.8964843750,654,1665.2014160156,,, +40.8984375000,654,1652.0146484375,,, +40.9003906250,654,1637.3626708984,,, +40.9023437500,654,1623.4432373047,,, +40.9042968750,654,1610.2564697266,,, +40.9062500000,654,1597.8022460938,,, +40.9082031250,654,1585.3480224609,,, +40.9101562500,654,1573.6263427734,,, +40.9121093750,654,1561.1721191406,,, +40.9140625000,654,1550.1831054688,,, +40.9160156250,654,1538.4615478516,,, +40.9179687500,654,1528.2050781250,,, +40.9199218750,654,1517.2160644531,,, +40.9218750000,654,1507.6922607422,,, +40.9238281250,654,1498.1684570312,,, +40.9257812500,654,1488.6446533203,,, +40.9277343750,654,1478.3883056641,,, +40.9296875000,654,1468.8645019531,,, +40.9316406250,654,1458.6080322266,,, +40.9335937500,654,1449.8168945312,,, +40.9355468750,654,1441.0256347656,,, +40.9375000000,655,1432.2343750000,,, +40.9394531250,655,1425.6409912109,,, +40.9414062500,655,1416.8498535156,,, +40.9433593750,655,1410.2564697266,,, +40.9453125000,655,1402.1977539062,,, +40.9472656250,655,1396.3370361328,,, +40.9492187500,655,1388.2784423828,,, +40.9511718750,655,1382.4176025391,,, +40.9531250000,655,1375.8242187500,,, +40.9550781250,655,1369.9633789062,,, +40.9570312500,655,1364.8352050781,,, +40.9589843750,655,1358.2416992188,,, +40.9609375000,655,1353.8461914062,,, +40.9628906250,655,1347.9853515625,,, +40.9648437500,655,1344.3223876953,,, +40.9667968750,655,1339.1940917969,,, +40.9687500000,655,1334.7985839844,,, +40.9707031250,655,1331.8681640625,,, +40.9726562500,655,1328.2050781250,,, +40.9746093750,655,1325.2747802734,,, +40.9765625000,655,1322.3443603516,,, +40.9785156250,655,1320.1464843750,,, +40.9804687500,655,1316.4835205078,,, +40.9824218750,655,1315.0183105469,,, +40.9843750000,655,1312.8205566406,,, +40.9863281250,655,1311.3553466797,,, +40.9882812500,655,1311.3553466797,,, +40.9902343750,655,1309.8901367188,,, +40.9921875000,655,1309.1574707031,,, +40.9941406250,655,1308.4249267578,,, +40.9960937500,655,1307.6922607422,,, +40.9980468750,655,1307.6922607422,,, +41.0000000000,656,1306.9597167969,,, +41.0019531250,656,1307.6922607422,,, +41.0039062500,656,1306.9597167969,,, +41.0058593750,656,1306.2270507812,,, +41.0078125000,656,1306.9597167969,,, +41.0097656250,656,1306.9597167969,,, +41.0117187500,656,1307.6922607422,,, +41.0136718750,656,1307.6922607422,,, +41.0156250000,656,1309.1574707031,,, +41.0175781250,656,1309.1574707031,,, +41.0195312500,656,1309.8901367188,,, +41.0214843750,656,1309.8901367188,,, +41.0234375000,656,1311.3553466797,,, +41.0253906250,656,1313.5531005859,,, +41.0273437500,656,1315.0183105469,,, +41.0292968750,656,1317.2160644531,,, +41.0312500000,656,1318.6812744141,,, +41.0332031250,656,1320.8791503906,,, +41.0351562500,656,1323.8095703125,,, +41.0371093750,656,1326.0073242188,,, +41.0390625000,656,1328.2050781250,,, +41.0410156250,656,1331.1354980469,,, +41.0429687500,656,1333.3333740234,,, +41.0449218750,656,1336.9963378906,,, +41.0468750000,656,1339.1940917969,,, +41.0488281250,656,1341.3919677734,,, +41.0507812500,656,1343.5897216797,,, +41.0527343750,656,1346.5201416016,,, +41.0546875000,656,1349.4505615234,,, +41.0566406250,656,1352.3809814453,,, +41.0585937500,656,1355.3114013672,,, +41.0605468750,656,1357.5091552734,,, +41.0625000000,657,1361.1721191406,,, +41.0644531250,657,1363.3699951172,,, +41.0664062500,657,1365.5677490234,,, +41.0683593750,657,1369.9633789062,,, +41.0703125000,657,1371.4285888672,,, +41.0722656250,657,1374.3590087891,,, +41.0742187500,657,1378.0219726562,,, +41.0761718750,657,1380.2197265625,,, +41.0781250000,657,1383.1501464844,,, +41.0800781250,657,1384.6153564453,,, +41.0820312500,657,1386.0805664062,,, +41.0839843750,657,1389.7435302734,,, +41.0859375000,657,1390.4761962891,,, +41.0878906250,657,1391.9414062500,,, +41.0898437500,657,1394.1391601562,,, +41.0917968750,657,1394.1391601562,,, +41.0937500000,657,1395.6043701172,,, +41.0957031250,657,1396.3370361328,,, +41.0976562500,657,1397.0695800781,,, +41.0996093750,657,1397.8022460938,,, +41.1015625000,657,1397.8022460938,,, +41.1035156250,657,1396.3370361328,,, +41.1054687500,657,1397.8022460938,,, +41.1074218750,657,1397.0695800781,,, +41.1093750000,657,1397.0695800781,,, +41.1113281250,657,1396.3370361328,,, +41.1132812500,657,1396.3370361328,,, +41.1152343750,657,1396.3370361328,,, +41.1171875000,657,1395.6043701172,,, +41.1191406250,657,1396.3370361328,,, +41.1210937500,657,1394.8718261719,,, +41.1230468750,657,1394.1391601562,,, +41.1250000000,658,1393.4066162109,,, +41.1269531250,658,1390.4761962891,,, +41.1289062500,658,1390.4761962891,,, +41.1308593750,658,1389.0109863281,,, +41.1328125000,658,1388.2784423828,,, +41.1347656250,658,1386.0805664062,,, +41.1367187500,658,1383.8828125000,,, +41.1386718750,658,1382.4176025391,,, +41.1406250000,658,1380.2197265625,,, +41.1425781250,658,1379.4871826172,,, +41.1445312500,658,1377.2894287109,,, +41.1464843750,658,1375.0915527344,,, +41.1484375000,658,1370.6959228516,,, +41.1503906250,658,1368.4981689453,,, +41.1523437500,658,1366.3004150391,,, +41.1542968750,658,1363.3699951172,,, +41.1562500000,658,1361.1721191406,,, +41.1582031250,658,1356.7766113281,,, +41.1601562500,658,1355.3114013672,,, +41.1621093750,658,1352.3809814453,,, +41.1640625000,658,1350.9157714844,,, +41.1660156250,658,1346.5201416016,,, +41.1679687500,658,1345.0549316406,,, +41.1699218750,658,1343.5897216797,,, +41.1718750000,658,1339.9267578125,,, +41.1738281250,658,1338.4615478516,,, +41.1757812500,658,1335.5311279297,,, +41.1777343750,658,1334.0659179688,,, +41.1796875000,658,1332.6007080078,,, +41.1816406250,658,1331.1354980469,,, +41.1835937500,658,1330.4029541016,,, +41.1855468750,658,1328.2050781250,,, +41.1875000000,659,1326.7398681641,,, +41.1894531250,659,1325.2747802734,,, +41.1914062500,659,1323.8095703125,,, +41.1933593750,659,1323.0769042969,,, +41.1953125000,659,1321.6116943359,,, +41.1972656250,659,1320.8791503906,,, +41.1992187500,659,1318.6812744141,,, +41.2011718750,659,1317.2160644531,,, +41.2031250000,659,1315.0183105469,,, +41.2050781250,659,1312.8205566406,,, +41.2070312500,659,1312.0878906250,,, +41.2089843750,659,1309.1574707031,,, +41.2109375000,659,1306.9597167969,,, +41.2128906250,659,1306.2270507812,,, +41.2148437500,659,1304.0292968750,,, +41.2167968750,659,1302.5640869141,,, +41.2187500000,659,1300.3663330078,,, +41.2207031250,659,1298.9011230469,,, +41.2226562500,659,1297.4359130859,,, +41.2246093750,659,1296.7032470703,,, +41.2265625000,659,1295.9707031250,,, +41.2285156250,659,1296.7032470703,,, +41.2304687500,659,1295.9707031250,,, +41.2324218750,659,1295.9707031250,,, +41.2343750000,659,1295.2380371094,,, +41.2363281250,659,1295.2380371094,,, +41.2382812500,659,1293.7729492188,,, +41.2402343750,659,1294.5054931641,,, +41.2421875000,659,1292.3077392578,,, +41.2441406250,659,1293.0402832031,,, +41.2460937500,659,1290.8425292969,,, +41.2480468750,659,1290.8425292969,,, +41.2500000000,660,1289.3773193359,,, +41.2519531250,660,1288.6446533203,,, +41.2539062500,660,1287.1794433594,,, +41.2558593750,660,1287.1794433594,,, +41.2578125000,660,1284.9816894531,,, +41.2597656250,660,1284.2490234375,,, +41.2617187500,660,1282.7839355469,,, +41.2636718750,660,1282.0512695312,,, +41.2656250000,660,1280.5860595703,,, +41.2675781250,660,1279.8535156250,,, +41.2695312500,660,1279.8535156250,,, +41.2714843750,660,1278.3883056641,,, +41.2734375000,660,1279.1208496094,,, +41.2753906250,660,1278.3883056641,,, +41.2773437500,660,1279.8535156250,,, +41.2792968750,660,1279.1208496094,,, +41.2812500000,660,1279.8535156250,,, +41.2832031250,660,1279.8535156250,,, +41.2851562500,660,1280.5860595703,,, +41.2871093750,660,1279.8535156250,,, +41.2890625000,660,1280.5860595703,,, +41.2910156250,660,1281.3187255859,,, +41.2929687500,660,1281.3187255859,,, +41.2949218750,660,1281.3187255859,,, +41.2968750000,660,1281.3187255859,,, +41.2988281250,660,1282.0512695312,,, +41.3007812500,660,1282.0512695312,,, +41.3027343750,660,1282.7839355469,,, +41.3046875000,660,1282.0512695312,,, +41.3066406250,660,1284.2490234375,,, +41.3085937500,660,1284.9816894531,,, +41.3105468750,660,1286.4468994141,,, +41.3125000000,661,1287.1794433594,,, +41.3144531250,661,1288.6446533203,,, +41.3164062500,661,1289.3773193359,,, +41.3183593750,661,1291.5750732422,,, +41.3203125000,661,1292.3077392578,,, +41.3222656250,661,1293.7729492188,,, +41.3242187500,661,1295.2380371094,,, +41.3261718750,661,1295.2380371094,,, +41.3281250000,661,1296.7032470703,,, +41.3300781250,661,1297.4359130859,,, +41.3320312500,661,1298.9011230469,,, +41.3339843750,661,1298.1684570312,,, +41.3359375000,661,1299.6336669922,,, +41.3378906250,661,1299.6336669922,,, +41.3398437500,661,1301.8315429688,,, +41.3417968750,661,1301.8315429688,,, +41.3437500000,661,1302.5640869141,,, +41.3457031250,661,1301.8315429688,,, +41.3476562500,661,1302.5640869141,,, +41.3496093750,661,1303.2967529297,,, +41.3515625000,661,1303.2967529297,,, +41.3535156250,661,1304.0292968750,,, +41.3554687500,661,1303.2967529297,,, +41.3574218750,661,1304.7619628906,,, +41.3593750000,661,1304.7619628906,,, +41.3613281250,661,1305.4945068359,,, +41.3632812500,661,1304.7619628906,,, +41.3652343750,661,1304.7619628906,,, +41.3671875000,661,1306.2270507812,,, +41.3691406250,661,1306.2270507812,,, +41.3710937500,661,1308.4249267578,,, +41.3730468750,661,1308.4249267578,,, +41.3750000000,662,1309.8901367188,,, +41.3769531250,662,1309.8901367188,,, +41.3789062500,662,1310.6226806641,,, +41.3808593750,662,1311.3553466797,,, +41.3828125000,662,1311.3553466797,,, +41.3847656250,662,1310.6226806641,,, +41.3867187500,662,1311.3553466797,,, +41.3886718750,662,1312.0878906250,,, +41.3906250000,662,1312.0878906250,,, +41.3925781250,662,1313.5531005859,,, +41.3945312500,662,1312.8205566406,,, +41.3964843750,662,1313.5531005859,,, +41.3984375000,662,1314.2857666016,,, +41.4003906250,662,1313.5531005859,,, +41.4023437500,662,1315.0183105469,,, +41.4042968750,662,1315.0183105469,,, +41.4062500000,662,1315.0183105469,,, +41.4082031250,662,1315.7509765625,,, +41.4101562500,662,1316.4835205078,,, +41.4121093750,662,1317.9487304688,,, +41.4140625000,662,1317.2160644531,,, +41.4160156250,662,1318.6812744141,,, +41.4179687500,662,1320.1464843750,,, +41.4199218750,662,1320.1464843750,,, +41.4218750000,662,1321.6116943359,,, +41.4238281250,662,1322.3443603516,,, +41.4257812500,662,1322.3443603516,,, +41.4277343750,662,1324.5421142578,,, +41.4296875000,662,1324.5421142578,,, +41.4316406250,662,1324.5421142578,,, +41.4335937500,662,1325.2747802734,,, +41.4355468750,662,1325.2747802734,,, +41.4375000000,663,1323.8095703125,,, +41.4394531250,663,1323.0769042969,,, +41.4414062500,663,1323.0769042969,,, +41.4433593750,663,1323.8095703125,,, +41.4453125000,663,1323.0769042969,,, +41.4472656250,663,1323.0769042969,,, +41.4492187500,663,1323.0769042969,,, +41.4511718750,663,1323.0769042969,,, +41.4531250000,663,1322.3443603516,,, +41.4550781250,663,1323.0769042969,,, +41.4570312500,663,1322.3443603516,,, +41.4589843750,663,1323.0769042969,,, +41.4609375000,663,1322.3443603516,,, +41.4628906250,663,1320.8791503906,,, +41.4648437500,663,1320.8791503906,,, +41.4667968750,663,1318.6812744141,,, +41.4687500000,663,1317.2160644531,,, +41.4707031250,663,1315.7509765625,,, +41.4726562500,663,1314.2857666016,,, +41.4746093750,663,1314.2857666016,,, +41.4765625000,663,1312.8205566406,,, +41.4785156250,663,1311.3553466797,,, +41.4804687500,663,1310.6226806641,,, +41.4824218750,663,1309.1574707031,,, +41.4843750000,663,1307.6922607422,,, +41.4863281250,663,1306.2270507812,,, +41.4882812500,663,1304.7619628906,,, +41.4902343750,663,1303.2967529297,,, +41.4921875000,663,1301.8315429688,,, +41.4941406250,663,1300.3663330078,,, +41.4960937500,663,1298.1684570312,,, +41.4980468750,663,1298.1684570312,,, +41.5000000000,664,1295.9707031250,,, +41.5019531250,664,1296.7032470703,,, +41.5039062500,664,1295.2380371094,,, +41.5058593750,664,1295.2380371094,,, +41.5078125000,664,1294.5054931641,,, +41.5097656250,664,1293.7729492188,,, +41.5117187500,664,1293.0402832031,,, +41.5136718750,664,1293.0402832031,,, +41.5156250000,664,1293.0402832031,,, +41.5175781250,664,1293.0402832031,,, +41.5195312500,664,1293.7729492188,,, +41.5214843750,664,1292.3077392578,,, +41.5234375000,664,1292.3077392578,,, +41.5253906250,664,1292.3077392578,,, +41.5273437500,664,1293.0402832031,,, +41.5292968750,664,1294.5054931641,,, +41.5312500000,664,1294.5054931641,,, +41.5332031250,664,1296.7032470703,,, +41.5351562500,664,1296.7032470703,,, +41.5371093750,664,1297.4359130859,,, +41.5390625000,664,1298.1684570312,,, +41.5410156250,664,1298.1684570312,,, +41.5429687500,664,1298.9011230469,,, +41.5449218750,664,1298.9011230469,,, +41.5468750000,664,1300.3663330078,,, +41.5488281250,664,1299.6336669922,,, +41.5507812500,664,1300.3663330078,,, +41.5527343750,664,1299.6336669922,,, +41.5546875000,664,1301.8315429688,,, +41.5566406250,664,1301.0988769531,,, +41.5585937500,664,1302.5640869141,,, +41.5605468750,664,1301.8315429688,,, +41.5625000000,665,1301.8315429688,,, +41.5644531250,665,1301.8315429688,,, +41.5664062500,665,1302.5640869141,,, +41.5683593750,665,1301.8315429688,,, +41.5703125000,665,1301.8315429688,,, +41.5722656250,665,1301.8315429688,,, +41.5742187500,665,1301.0988769531,,, +41.5761718750,665,1301.0988769531,,, +41.5781250000,665,1300.3663330078,,, +41.5800781250,665,1301.8315429688,,, +41.5820312500,665,1300.3663330078,,, +41.5839843750,665,1301.0988769531,,, +41.5859375000,665,1301.0988769531,,, +41.5878906250,665,1300.3663330078,,, +41.5898437500,665,1299.6336669922,,, +41.5917968750,665,1298.9011230469,,, +41.5937500000,665,1298.1684570312,,, +41.5957031250,665,1298.1684570312,,, +41.5976562500,665,1298.9011230469,,, +41.5996093750,665,1298.1684570312,,, +41.6015625000,665,1298.1684570312,,, +41.6035156250,665,1296.7032470703,,, +41.6054687500,665,1297.4359130859,,, +41.6074218750,665,1295.9707031250,,, +41.6093750000,665,1296.7032470703,,, +41.6113281250,665,1295.9707031250,,, +41.6132812500,665,1295.9707031250,,, +41.6152343750,665,1295.9707031250,,, +41.6171875000,665,1295.9707031250,,, +41.6191406250,665,1296.7032470703,,, +41.6210937500,665,1295.9707031250,,, +41.6230468750,665,1297.4359130859,,, +41.6250000000,666,1295.9707031250,,, +41.6269531250,666,1297.4359130859,,, +41.6289062500,666,1297.4359130859,,, +41.6308593750,666,1298.1684570312,,, +41.6328125000,666,1297.4359130859,,, +41.6347656250,666,1298.1684570312,,, +41.6367187500,666,1298.1684570312,,, +41.6386718750,666,1298.1684570312,,, +41.6406250000,666,1297.4359130859,,, +41.6425781250,666,1298.1684570312,,, +41.6445312500,666,1298.1684570312,,, +41.6464843750,666,1298.9011230469,,, +41.6484375000,666,1299.6336669922,,, +41.6503906250,666,1300.3663330078,,, +41.6523437500,666,1301.8315429688,,, +41.6542968750,666,1302.5640869141,,, +41.6562500000,666,1304.0292968750,,, +41.6582031250,666,1304.7619628906,,, +41.6601562500,666,1306.2270507812,,, +41.6621093750,666,1307.6922607422,,, +41.6640625000,666,1309.8901367188,,, +41.6660156250,666,1311.3553466797,,, +41.6679687500,666,1313.5531005859,,, +41.6699218750,666,1317.2160644531,,, +41.6718750000,666,1320.1464843750,,, +41.6738281250,666,1324.5421142578,,, +41.6757812500,666,1328.2050781250,,, +41.6777343750,666,1334.0659179688,,, +41.6796875000,666,1339.1940917969,,, +41.6816406250,666,1345.7875976562,,, +41.6835937500,666,1351.6483154297,,, +41.6855468750,666,1359.7069091797,,, +41.6875000000,667,1367.7656250000,,, +41.6894531250,667,1376.5567626953,,, +41.6914062500,667,1386.0805664062,,, +41.6933593750,667,1395.6043701172,,, +41.6953125000,667,1407.3260498047,,, +41.6972656250,667,1419.7802734375,,, +41.6992187500,667,1432.2343750000,,, +41.7011718750,667,1444.6885986328,,, +41.7031250000,667,1460.0732421875,,, +41.7050781250,667,1475.4578857422,,, +41.7070312500,667,1491.5750732422,,, +41.7089843750,667,1506.2270507812,,, +41.7109375000,667,1525.2747802734,,, +41.7128906250,667,1541.3919677734,,, +41.7148437500,667,1558.2416992188,,, +41.7167968750,667,1575.0915527344,,, +41.7187500000,667,1592.6739501953,,, +41.7207031250,667,1610.2564697266,,, +41.7226562500,667,1627.8388671875,,, +41.7246093750,667,1644.6885986328,,, +41.7265625000,667,1663.0036621094,,, +41.7285156250,667,1680.5860595703,,, +41.7304687500,667,1698.1684570312,,, +41.7324218750,667,1717.2160644531,,, +41.7343750000,667,1734.0659179688,,, +41.7363281250,667,1734.0659179688,,, +41.7382812500,667,1753.1135253906,,, +41.7402343750,667,1770.6959228516,,, +41.7421875000,667,1788.2784423828,,, +41.7441406250,667,1805.1281738281,,, +41.7460937500,667,1822.7105712891,,, +41.7480468750,667,1838.8278808594,,, +41.7500000000,668,1854.2124023438,,, +41.7519531250,668,1868.1318359375,,, +41.7539062500,668,1883.5164794922,,, +41.7558593750,668,1895.9707031250,,, +41.7578125000,668,1908.4249267578,,, +41.7597656250,668,1918.6812744141,,, +41.7617187500,668,1930.4029541016,,, +41.7636718750,668,1939.9267578125,,, +41.7656250000,668,1948.7178955078,,, +41.7675781250,668,1956.7766113281,,, +41.7695312500,668,1963.3699951172,,, +41.7714843750,668,1969.9633789062,,, +41.7734375000,668,1975.0915527344,,, +41.7753906250,668,1980.9523925781,,, +41.7773437500,668,1983.8828125000,,, +41.7792968750,668,1987.5457763672,,, +41.7812500000,668,1989.0109863281,,, +41.7832031250,668,1990.4761962891,,, +41.7851562500,668,1989.7435302734,,, +41.7871093750,668,1989.0109863281,,, +41.7890625000,668,1986.8132324219,,, +41.7910156250,668,1984.6153564453,,, +41.7929687500,668,1980.2197265625,,, +41.7949218750,668,1976.5567626953,,, +41.7968750000,668,1970.6959228516,,, +41.7988281250,668,1964.8352050781,,, +41.8007812500,668,1956.7766113281,,, +41.8027343750,668,1948.7178955078,,, +41.8046875000,668,1939.1940917969,,, +41.8066406250,668,1930.4029541016,,, +41.8085937500,668,1919.4139404297,,, +41.8105468750,668,1909.1574707031,,, +41.8125000000,669,1898.9011230469,,, +41.8144531250,669,1887.9121093750,,, +41.8164062500,669,1876.1904296875,,, +41.8183593750,669,1863.7362060547,,, +41.8203125000,669,1852.0146484375,,, +41.8222656250,669,1840.2930908203,,, +41.8242187500,669,1828.5714111328,,, +41.8261718750,669,1813.9194335938,,, +41.8281250000,669,1802.1977539062,,, +41.8300781250,669,1788.2784423828,,, +41.8320312500,669,1774.3590087891,,, +41.8339843750,669,1760.4395751953,,, +41.8359375000,669,1746.5201416016,,, +41.8378906250,669,1733.3333740234,,, +41.8398437500,669,1720.1464843750,,, +41.8417968750,669,1706.2270507812,,, +41.8437500000,669,1693.0402832031,,, +41.8457031250,669,1680.5860595703,,, +41.8476562500,669,1665.9340820312,,, +41.8496093750,669,1652.7471923828,,, +41.8515625000,669,1639.5604248047,,, +41.8535156250,669,1627.1062011719,,, +41.8554687500,669,1614.6519775391,,, +41.8574218750,669,1602.1977539062,,, +41.8593750000,669,1590.4761962891,,, +41.8613281250,669,1578.0219726562,,, +41.8632812500,669,1566.3004150391,,, +41.8652343750,669,1554.5787353516,,, +41.8671875000,669,1543.5897216797,,, +41.8691406250,669,1532.6007080078,,, +41.8710937500,669,1522.3443603516,,, +41.8730468750,669,1512.8205566406,,, +41.8750000000,670,1503.2967529297,,, +41.8769531250,670,1495.2380371094,,, +41.8789062500,670,1484.9816894531,,, +41.8808593750,670,1476.9230957031,,, +41.8828125000,670,1469.5970458984,,, +41.8847656250,670,1462.2711181641,,, +41.8867187500,670,1454.2124023438,,, +41.8886718750,670,1447.6190185547,,, +41.8906250000,670,1441.0256347656,,, +41.8925781250,670,1433.6995849609,,, +41.8945312500,670,1427.1062011719,,, +41.8964843750,670,1421.2453613281,,, +41.8984375000,670,1415.3846435547,,, +41.9003906250,670,1409.5238037109,,, +41.9023437500,670,1405.1281738281,,, +41.9042968750,670,1398.5347900391,,, +41.9062500000,670,1395.6043701172,,, +41.9082031250,670,1390.4761962891,,, +41.9101562500,670,1386.8132324219,,, +41.9121093750,670,1382.4176025391,,, +41.9140625000,670,1378.7546386719,,, +41.9160156250,670,1375.8242187500,,, +41.9179687500,670,1372.8937988281,,, +41.9199218750,670,1369.2307128906,,, +41.9218750000,670,1367.0329589844,,, +41.9238281250,670,1364.8352050781,,, +41.9257812500,670,1362.6373291016,,, +41.9277343750,670,1360.4395751953,,, +41.9296875000,670,1357.5091552734,,, +41.9316406250,670,1356.0439453125,,, +41.9335937500,670,1353.1135253906,,, +41.9355468750,670,1350.9157714844,,, +41.9375000000,671,1347.2528076172,,, +41.9394531250,671,1344.3223876953,,, +41.9414062500,671,1341.3919677734,,, +41.9433593750,671,1339.1940917969,,, +41.9453125000,671,1336.9963378906,,, +41.9472656250,671,1333.3333740234,,, +41.9492187500,671,1333.3333740234,,, +41.9511718750,671,1331.1354980469,,, +41.9531250000,671,1330.4029541016,,, +41.9550781250,671,1328.9377441406,,, +41.9570312500,671,1327.4725341797,,, +41.9589843750,671,1327.4725341797,,, +41.9609375000,671,1327.4725341797,,, +41.9628906250,671,1327.4725341797,,, +41.9648437500,671,1327.4725341797,,, +41.9667968750,671,1328.2050781250,,, +41.9687500000,671,1329.6702880859,,, +41.9707031250,671,1330.4029541016,,, +41.9726562500,671,1331.1354980469,,, +41.9746093750,671,1332.6007080078,,, +41.9765625000,671,1333.3333740234,,, +41.9785156250,671,1334.0659179688,,, +41.9804687500,671,1335.5311279297,,, +41.9824218750,671,1336.9963378906,,, +41.9843750000,671,1338.4615478516,,, +41.9863281250,671,1338.4615478516,,, +41.9882812500,671,1340.6593017578,,, +41.9902343750,671,1340.6593017578,,, +41.9921875000,671,1342.8571777344,,, +41.9941406250,671,1343.5897216797,,, +41.9960937500,671,1345.7875976562,,, +41.9980468750,671,1347.2528076172,,, +42.0000000000,672,1349.4505615234,,, +42.0019531250,672,1349.4505615234,,, +42.0039062500,672,1350.9157714844,,, +42.0058593750,672,1352.3809814453,,, +42.0078125000,672,1353.1135253906,,, +42.0097656250,672,1354.5787353516,,, +42.0117187500,672,1356.0439453125,,, +42.0136718750,672,1358.9743652344,,, +42.0156250000,672,1359.7069091797,,, +42.0175781250,672,1361.1721191406,,, +42.0195312500,672,1362.6373291016,,, +42.0214843750,672,1364.8352050781,,, +42.0234375000,672,1365.5677490234,,, +42.0253906250,672,1368.4981689453,,, +42.0273437500,672,1369.9633789062,,, +42.0292968750,672,1370.6959228516,,, +42.0312500000,672,1371.4285888672,,, +42.0332031250,672,1372.8937988281,,, +42.0351562500,672,1374.3590087891,,, +42.0371093750,672,1375.0915527344,,, +42.0390625000,672,1375.8242187500,,, +42.0410156250,672,1376.5567626953,,, +42.0429687500,672,1378.0219726562,,, +42.0449218750,672,1378.0219726562,,, +42.0468750000,672,1380.2197265625,,, +42.0488281250,672,1380.2197265625,,, +42.0507812500,672,1380.2197265625,,, +42.0527343750,672,1380.2197265625,,, +42.0546875000,672,1383.1501464844,,, +42.0566406250,672,1383.8828125000,,, +42.0585937500,672,1385.3480224609,,, +42.0605468750,672,1386.0805664062,,, +42.0625000000,673,1387.5457763672,,, +42.0644531250,673,1387.5457763672,,, +42.0664062500,673,1388.2784423828,,, +42.0683593750,673,1389.0109863281,,, +42.0703125000,673,1388.2784423828,,, +42.0722656250,673,1389.7435302734,,, +42.0742187500,673,1388.2784423828,,, +42.0761718750,673,1388.2784423828,,, +42.0781250000,673,1386.8132324219,,, +42.0800781250,673,1386.8132324219,,, +42.0820312500,673,1385.3480224609,,, +42.0839843750,673,1386.0805664062,,, +42.0859375000,673,1382.4176025391,,, +42.0878906250,673,1382.4176025391,,, +42.0898437500,673,1380.9523925781,,, +42.0917968750,673,1379.4871826172,,, +42.0937500000,673,1377.2894287109,,, +42.0957031250,673,1375.8242187500,,, +42.0976562500,673,1372.8937988281,,, +42.0996093750,673,1371.4285888672,,, +42.1015625000,673,1370.6959228516,,, +42.1035156250,673,1367.7656250000,,, +42.1054687500,673,1366.3004150391,,, +42.1074218750,673,1363.3699951172,,, +42.1093750000,673,1360.4395751953,,, +42.1113281250,673,1356.7766113281,,, +42.1132812500,673,1353.8461914062,,, +42.1152343750,673,1350.1831054688,,, +42.1171875000,673,1347.2528076172,,, +42.1191406250,673,1344.3223876953,,, +42.1210937500,673,1339.9267578125,,, +42.1230468750,673,1337.7288818359,,, +42.1250000000,674,1334.0659179688,,, +42.1269531250,674,1331.8681640625,,, +42.1289062500,674,1327.4725341797,,, +42.1308593750,674,1325.2747802734,,, +42.1328125000,674,1322.3443603516,,, +42.1347656250,674,1319.4139404297,,, +42.1367187500,674,1315.7509765625,,, +42.1386718750,674,1313.5531005859,,, +42.1406250000,674,1310.6226806641,,, +42.1425781250,674,1308.4249267578,,, +42.1445312500,674,1305.4945068359,,, +42.1464843750,674,1303.2967529297,,, +42.1484375000,674,1301.8315429688,,, +42.1503906250,674,1299.6336669922,,, +42.1523437500,674,1298.1684570312,,, +42.1542968750,674,1295.9707031250,,, +42.1562500000,674,1293.7729492188,,, +42.1582031250,674,1292.3077392578,,, +42.1601562500,674,1290.8425292969,,, +42.1621093750,674,1288.6446533203,,, +42.1640625000,674,1287.1794433594,,, +42.1660156250,674,1284.9816894531,,, +42.1679687500,674,1284.2490234375,,, +42.1699218750,674,1282.0512695312,,, +42.1718750000,674,1281.3187255859,,, +42.1738281250,674,1279.8535156250,,, +42.1757812500,674,1280.5860595703,,, +42.1777343750,674,1279.1208496094,,, +42.1796875000,674,1279.1208496094,,, +42.1816406250,674,1276.9230957031,,, +42.1835937500,674,1276.9230957031,,, +42.1855468750,674,1275.4578857422,,, +42.1875000000,675,1275.4578857422,,, +42.1894531250,675,1273.9926757812,,, +42.1914062500,675,1273.2601318359,,, +42.1933593750,675,1271.7949218750,,, +42.1953125000,675,1271.0622558594,,, +42.1972656250,675,1271.0622558594,,, +42.1992187500,675,1269.5970458984,,, +42.2011718750,675,1269.5970458984,,, +42.2031250000,675,1267.3992919922,,, +42.2050781250,675,1267.3992919922,,, +42.2070312500,675,1266.6666259766,,, +42.2089843750,675,1266.6666259766,,, +42.2109375000,675,1265.9340820312,,, +42.2128906250,675,1266.6666259766,,, +42.2148437500,675,1266.6666259766,,, +42.2167968750,675,1266.6666259766,,, +42.2187500000,675,1265.9340820312,,, +42.2207031250,675,1266.6666259766,,, +42.2226562500,675,1266.6666259766,,, +42.2246093750,675,1266.6666259766,,, +42.2265625000,675,1266.6666259766,,, +42.2285156250,675,1268.1318359375,,, +42.2304687500,675,1267.3992919922,,, +42.2324218750,675,1268.8645019531,,, +42.2343750000,675,1268.8645019531,,, +42.2363281250,675,1271.0622558594,,, +42.2382812500,675,1271.7949218750,,, +42.2402343750,675,1273.9926757812,,, +42.2421875000,675,1273.9926757812,,, +42.2441406250,675,1276.1904296875,,, +42.2460937500,675,1276.1904296875,,, +42.2480468750,675,1278.3883056641,,, +42.2500000000,676,1279.1208496094,,, +42.2519531250,676,1280.5860595703,,, +42.2539062500,676,1281.3187255859,,, +42.2558593750,676,1282.7839355469,,, +42.2578125000,676,1284.2490234375,,, +42.2597656250,676,1285.7142333984,,, +42.2617187500,676,1285.7142333984,,, +42.2636718750,676,1287.1794433594,,, +42.2656250000,676,1287.9121093750,,, +42.2675781250,676,1288.6446533203,,, +42.2695312500,676,1289.3773193359,,, +42.2714843750,676,1289.3773193359,,, +42.2734375000,676,1290.8425292969,,, +42.2753906250,676,1291.5750732422,,, +42.2773437500,676,1291.5750732422,,, +42.2792968750,676,1291.5750732422,,, +42.2812500000,676,1292.3077392578,,, +42.2832031250,676,1291.5750732422,,, +42.2851562500,676,1293.0402832031,,, +42.2871093750,676,1293.7729492188,,, +42.2890625000,676,1294.5054931641,,, +42.2910156250,676,1293.7729492188,,, +42.2929687500,676,1294.5054931641,,, +42.2949218750,676,1295.2380371094,,, +42.2968750000,676,1295.2380371094,,, +42.2988281250,676,1295.9707031250,,, +42.3007812500,676,1296.7032470703,,, +42.3027343750,676,1297.4359130859,,, +42.3046875000,676,1297.4359130859,,, +42.3066406250,676,1298.9011230469,,, +42.3085937500,676,1299.6336669922,,, +42.3105468750,676,1301.0988769531,,, +42.3125000000,677,1301.0988769531,,, +42.3144531250,677,1302.5640869141,,, +42.3164062500,677,1302.5640869141,,, +42.3183593750,677,1302.5640869141,,, +42.3203125000,677,1302.5640869141,,, +42.3222656250,677,1303.2967529297,,, +42.3242187500,677,1302.5640869141,,, +42.3261718750,677,1303.2967529297,,, +42.3281250000,677,1303.2967529297,,, +42.3300781250,677,1302.5640869141,,, +42.3320312500,677,1302.5640869141,,, +42.3339843750,677,1301.8315429688,,, +42.3359375000,677,1302.5640869141,,, +42.3378906250,677,1301.8315429688,,, +42.3398437500,677,1303.2967529297,,, +42.3417968750,677,1303.2967529297,,, +42.3437500000,677,1304.0292968750,,, +42.3457031250,677,1304.0292968750,,, +42.3476562500,677,1304.0292968750,,, +42.3496093750,677,1304.0292968750,,, +42.3515625000,677,1304.7619628906,,, +42.3535156250,677,1304.7619628906,,, +42.3554687500,677,1305.4945068359,,, +42.3574218750,677,1306.2270507812,,, +42.3593750000,677,1306.9597167969,,, +42.3613281250,677,1306.9597167969,,, +42.3632812500,677,1306.9597167969,,, +42.3652343750,677,1306.9597167969,,, +42.3671875000,677,1306.9597167969,,, +42.3691406250,677,1307.6922607422,,, +42.3710937500,677,1309.8901367188,,, +42.3730468750,677,1310.6226806641,,, +42.3750000000,678,1310.6226806641,,, +42.3769531250,678,1310.6226806641,,, +42.3789062500,678,1310.6226806641,,, +42.3808593750,678,1312.0878906250,,, +42.3828125000,678,1312.0878906250,,, +42.3847656250,678,1311.3553466797,,, +42.3867187500,678,1311.3553466797,,, +42.3886718750,678,1309.8901367188,,, +42.3906250000,678,1310.6226806641,,, +42.3925781250,678,1309.8901367188,,, +42.3945312500,678,1309.1574707031,,, +42.3964843750,678,1308.4249267578,,, +42.3984375000,678,1308.4249267578,,, +42.4003906250,678,1308.4249267578,,, +42.4023437500,678,1307.6922607422,,, +42.4042968750,678,1308.4249267578,,, +42.4062500000,678,1308.4249267578,,, +42.4082031250,678,1308.4249267578,,, +42.4101562500,678,1307.6922607422,,, +42.4121093750,678,1308.4249267578,,, +42.4140625000,678,1307.6922607422,,, +42.4160156250,678,1306.9597167969,,, +42.4179687500,678,1305.4945068359,,, +42.4199218750,678,1305.4945068359,,, +42.4218750000,678,1304.0292968750,,, +42.4238281250,678,1301.8315429688,,, +42.4257812500,678,1301.8315429688,,, +42.4277343750,678,1300.3663330078,,, +42.4296875000,678,1300.3663330078,,, +42.4316406250,678,1298.1684570312,,, +42.4335937500,678,1298.9011230469,,, +42.4355468750,678,1297.4359130859,,, +42.4375000000,679,1296.7032470703,,, +42.4394531250,679,1295.9707031250,,, +42.4414062500,679,1295.2380371094,,, +42.4433593750,679,1294.5054931641,,, +42.4453125000,679,1295.2380371094,,, +42.4472656250,679,1294.5054931641,,, +42.4492187500,679,1295.2380371094,,, +42.4511718750,679,1295.9707031250,,, +42.4531250000,679,1295.9707031250,,, +42.4550781250,679,1295.9707031250,,, +42.4570312500,679,1295.9707031250,,, +42.4589843750,679,1295.9707031250,,, +42.4609375000,679,1295.9707031250,,, +42.4628906250,679,1295.9707031250,,, +42.4648437500,679,1293.7729492188,,, +42.4667968750,679,1293.0402832031,,, +42.4687500000,679,1291.5750732422,,, +42.4707031250,679,1290.8425292969,,, +42.4726562500,679,1290.1098632812,,, +42.4746093750,679,1290.1098632812,,, +42.4765625000,679,1290.1098632812,,, +42.4785156250,679,1289.3773193359,,, +42.4804687500,679,1289.3773193359,,, +42.4824218750,679,1287.9121093750,,, +42.4843750000,679,1287.9121093750,,, +42.4863281250,679,1285.7142333984,,, +42.4882812500,679,1286.4468994141,,, +42.4902343750,679,1284.9816894531,,, +42.4921875000,679,1286.4468994141,,, +42.4941406250,679,1285.7142333984,,, +42.4960937500,679,1286.4468994141,,, +42.4980468750,679,1285.7142333984,,, +42.5000000000,680,1287.9121093750,,, +42.5019531250,680,1287.1794433594,,, +42.5039062500,680,1287.1794433594,,, +42.5058593750,680,1287.1794433594,,, +42.5078125000,680,1287.1794433594,,, +42.5097656250,680,1287.1794433594,,, +42.5117187500,680,1287.9121093750,,, +42.5136718750,680,1289.3773193359,,, +42.5156250000,680,1288.6446533203,,, +42.5175781250,680,1289.3773193359,,, +42.5195312500,680,1289.3773193359,,, +42.5214843750,680,1289.3773193359,,, +42.5234375000,680,1288.6446533203,,, +42.5253906250,680,1289.3773193359,,, +42.5273437500,680,1289.3773193359,,, +42.5292968750,680,1289.3773193359,,, +42.5312500000,680,1288.6446533203,,, +42.5332031250,680,1290.1098632812,,, +42.5351562500,680,1289.3773193359,,, +42.5371093750,680,1290.8425292969,,, +42.5390625000,680,1290.8425292969,,, +42.5410156250,680,1291.5750732422,,, +42.5429687500,680,1292.3077392578,,, +42.5449218750,680,1293.0402832031,,, +42.5468750000,680,1292.3077392578,,, +42.5488281250,680,1293.0402832031,,, +42.5507812500,680,1293.0402832031,,, +42.5527343750,680,1293.7729492188,,, +42.5546875000,680,1291.5750732422,,, +42.5566406250,680,1293.0402832031,,, +42.5585937500,680,1292.3077392578,,, +42.5605468750,680,1292.3077392578,,, +42.5625000000,681,1291.5750732422,,, +42.5644531250,681,1291.5750732422,,, +42.5664062500,681,1291.5750732422,,, +42.5683593750,681,1290.8425292969,,, +42.5703125000,681,1289.3773193359,,, +42.5722656250,681,1288.6446533203,,, +42.5742187500,681,1288.6446533203,,, +42.5761718750,681,1287.9121093750,,, +42.5781250000,681,1287.9121093750,,, +42.5800781250,681,1287.9121093750,,, +42.5820312500,681,1287.1794433594,,, +42.5839843750,681,1287.1794433594,,, +42.5859375000,681,1287.1794433594,,, +42.5878906250,681,1287.9121093750,,, +42.5898437500,681,1288.6446533203,,, +42.5917968750,681,1288.6446533203,,, +42.5937500000,681,1289.3773193359,,, +42.5957031250,681,1290.1098632812,,, +42.5976562500,681,1291.5750732422,,, +42.5996093750,681,1293.7729492188,,, +42.6015625000,681,1295.2380371094,,, +42.6035156250,681,1295.9707031250,,, +42.6054687500,681,1298.9011230469,,, +42.6074218750,681,1301.0988769531,,, +42.6093750000,681,1304.7619628906,,, +42.6113281250,681,1307.6922607422,,, +42.6132812500,681,1312.8205566406,,, +42.6152343750,681,1324.5421142578,,, +42.6171875000,681,1330.4029541016,,, +42.6191406250,681,1337.7288818359,,, +42.6210937500,681,1345.0549316406,,, +42.6230468750,681,1354.5787353516,,, +42.6250000000,682,1363.3699951172,,, +42.6269531250,682,1373.6263427734,,, +42.6289062500,682,1384.6153564453,,, +42.6308593750,682,1396.3370361328,,, +42.6328125000,682,1409.5238037109,,, +42.6347656250,682,1423.4432373047,,, +42.6367187500,682,1438.0952148438,,, +42.6386718750,682,1452.7471923828,,, +42.6406250000,682,1468.1318359375,,, +42.6425781250,682,1484.9816894531,,, +42.6445312500,682,1502.5640869141,,, +42.6464843750,682,1520.1464843750,,, +42.6484375000,682,1537.7288818359,,, +42.6503906250,682,1555.3114013672,,, +42.6523437500,682,1574.3590087891,,, +42.6542968750,682,1591.9414062500,,, +42.6562500000,682,1612.4542236328,,, +42.6582031250,682,1630.7692871094,,, +42.6601562500,682,1650.5494384766,,, +42.6621093750,682,1669.5970458984,,, +42.6640625000,682,1689.3773193359,,, +42.6660156250,682,1707.6922607422,,, +42.6679687500,682,1727.4725341797,,, +42.6699218750,682,1746.5201416016,,, +42.6718750000,682,1764.1025390625,,, +42.6738281250,682,1780.9523925781,,, +42.6757812500,682,1797.8022460938,,, +42.6777343750,682,1813.9194335938,,, +42.6796875000,682,1830.7692871094,,, +42.6816406250,682,1845.4212646484,,, +42.6835937500,682,1860.0732421875,,, +42.6855468750,682,1874.7252197266,,, +42.6875000000,683,1887.9121093750,,, +42.6894531250,683,1901.8315429688,,, +42.6914062500,683,1912.8205566406,,, +42.6933593750,683,1925.2747802734,,, +42.6953125000,683,1935.5311279297,,, +42.6972656250,683,1944.3223876953,,, +42.6992187500,683,1954.5787353516,,, +42.7011718750,683,1962.6373291016,,, +42.7031250000,683,1968.4981689453,,, +42.7050781250,683,1975.8242187500,,, +42.7070312500,683,1980.2197265625,,, +42.7089843750,683,1984.6153564453,,, +42.7109375000,683,1988.2784423828,,, +42.7128906250,683,1990.4761962891,,, +42.7148437500,683,1991.9414062500,,, +42.7167968750,683,1992.6739501953,,, +42.7187500000,683,1993.4066162109,,, +42.7207031250,683,1993.4066162109,,, +42.7226562500,683,1991.2087402344,,, +42.7246093750,683,1988.2784423828,,, +42.7265625000,683,1984.6153564453,,, +42.7285156250,683,1980.2197265625,,, +42.7304687500,683,1973.6263427734,,, +42.7324218750,683,1967.7656250000,,, +42.7343750000,683,1960.4395751953,,, +42.7363281250,683,1953.1135253906,,, +42.7382812500,683,1944.3223876953,,, +42.7402343750,683,1934.7985839844,,, +42.7421875000,683,1923.8095703125,,, +42.7441406250,683,1913.5531005859,,, +42.7460937500,683,1901.0988769531,,, +42.7480468750,683,1889.3773193359,,, +42.7500000000,684,1875.4578857422,,, +42.7519531250,684,1863.0036621094,,, +42.7539062500,684,1848.3516845703,,, +42.7558593750,684,1835.1647949219,,, +42.7578125000,684,1819.7802734375,,, +42.7597656250,684,1805.8608398438,,, +42.7617187500,684,1791.2087402344,,, +42.7636718750,684,1776.5567626953,,, +42.7656250000,684,1761.1721191406,,, +42.7675781250,684,1746.5201416016,,, +42.7695312500,684,1731.1354980469,,, +42.7714843750,684,1717.2160644531,,, +42.7734375000,684,1701.8315429688,,, +42.7753906250,684,1687.9121093750,,, +42.7773437500,684,1672.5274658203,,, +42.7792968750,684,1658.6080322266,,, +42.7812500000,684,1644.6885986328,,, +42.7832031250,684,1630.7692871094,,, +42.7851562500,684,1616.8498535156,,, +42.7871093750,684,1604.3956298828,,, +42.7890625000,684,1591.2087402344,,, +42.7910156250,684,1579.4871826172,,, +42.7929687500,684,1567.7656250000,,, +42.7949218750,684,1557.5091552734,,, +42.7968750000,684,1545.7875976562,,, +42.7988281250,684,1535.5311279297,,, +42.8007812500,684,1523.8095703125,,, +42.8027343750,684,1514.2857666016,,, +42.8046875000,684,1504.7619628906,,, +42.8066406250,684,1495.9707031250,,, +42.8085937500,684,1486.4468994141,,, +42.8105468750,684,1478.3883056641,,, +42.8125000000,685,1468.8645019531,,, +42.8144531250,685,1460.8059082031,,, +42.8164062500,685,1452.7471923828,,, +42.8183593750,685,1446.1538085938,,, +42.8203125000,685,1437.3626708984,,, +42.8222656250,685,1431.5018310547,,, +42.8242187500,685,1423.4432373047,,, +42.8261718750,685,1418.3150634766,,, +42.8281250000,685,1412.4542236328,,, +42.8300781250,685,1407.3260498047,,, +42.8320312500,685,1402.1977539062,,, +42.8339843750,685,1397.0695800781,,, +42.8359375000,685,1391.9414062500,,, +42.8378906250,685,1387.5457763672,,, +42.8398437500,685,1383.1501464844,,, +42.8417968750,685,1379.4871826172,,, +42.8437500000,685,1375.0915527344,,, +42.8457031250,685,1371.4285888672,,, +42.8476562500,685,1368.4981689453,,, +42.8496093750,685,1364.1025390625,,, +42.8515625000,685,1361.9047851562,,, +42.8535156250,685,1358.2416992188,,, +42.8554687500,685,1356.0439453125,,, +42.8574218750,685,1353.8461914062,,, +42.8593750000,685,1350.9157714844,,, +42.8613281250,685,1349.4505615234,,, +42.8632812500,685,1347.9853515625,,, +42.8652343750,685,1345.7875976562,,, +42.8671875000,685,1343.5897216797,,, +42.8691406250,685,1342.1245117188,,, +42.8710937500,685,1340.6593017578,,, +42.8730468750,685,1339.9267578125,,, +42.8750000000,686,1339.1940917969,,, +42.8769531250,686,1337.7288818359,,, +42.8789062500,686,1336.9963378906,,, +42.8808593750,686,1335.5311279297,,, +42.8828125000,686,1334.7985839844,,, +42.8847656250,686,1332.6007080078,,, +42.8867187500,686,1332.6007080078,,, +42.8886718750,686,1330.4029541016,,, +42.8906250000,686,1330.4029541016,,, +42.8925781250,686,1327.4725341797,,, +42.8945312500,686,1326.7398681641,,, +42.8964843750,686,1326.0073242188,,, +42.8984375000,686,1325.2747802734,,, +42.9003906250,686,1324.5421142578,,, +42.9023437500,686,1324.5421142578,,, +42.9042968750,686,1323.8095703125,,, +42.9062500000,686,1324.5421142578,,, +42.9082031250,686,1325.2747802734,,, +42.9101562500,686,1324.5421142578,,, +42.9121093750,686,1326.0073242188,,, +42.9140625000,686,1326.7398681641,,, +42.9160156250,686,1328.9377441406,,, +42.9179687500,686,1331.1354980469,,, +42.9199218750,686,1333.3333740234,,, +42.9218750000,686,1335.5311279297,,, +42.9238281250,686,1337.7288818359,,, +42.9257812500,686,1339.1940917969,,, +42.9277343750,686,1341.3919677734,,, +42.9296875000,686,1342.1245117188,,, +42.9316406250,686,1344.3223876953,,, +42.9335937500,686,1345.7875976562,,, +42.9355468750,686,1346.5201416016,,, +42.9375000000,687,1347.2528076172,,, +42.9394531250,687,1347.9853515625,,, +42.9414062500,687,1348.7178955078,,, +42.9433593750,687,1347.9853515625,,, +42.9453125000,687,1348.7178955078,,, +42.9472656250,687,1350.1831054688,,, +42.9492187500,687,1351.6483154297,,, +42.9511718750,687,1353.1135253906,,, +42.9531250000,687,1355.3114013672,,, +42.9550781250,687,1356.7766113281,,, +42.9570312500,687,1358.2416992188,,, +42.9589843750,687,1358.9743652344,,, +42.9609375000,687,1361.9047851562,,, +42.9628906250,687,1362.6373291016,,, +42.9648437500,687,1364.8352050781,,, +42.9667968750,687,1365.5677490234,,, +42.9687500000,687,1367.7656250000,,, +42.9707031250,687,1369.2307128906,,, +42.9726562500,687,1370.6959228516,,, +42.9746093750,687,1371.4285888672,,, +42.9765625000,687,1373.6263427734,,, +42.9785156250,687,1375.0915527344,,, +42.9804687500,687,1376.5567626953,,, +42.9824218750,687,1378.0219726562,,, +42.9843750000,687,1380.2197265625,,, +42.9863281250,687,1380.9523925781,,, +42.9882812500,687,1381.6849365234,,, +42.9902343750,687,1383.1501464844,,, +42.9921875000,687,1384.6153564453,,, +42.9941406250,687,1385.3480224609,,, +42.9960937500,687,1386.0805664062,,, +42.9980468750,687,1386.8132324219,,, +43.0000000000,688,1387.5457763672,,, +43.0019531250,688,1388.2784423828,,, +43.0039062500,688,1388.2784423828,,, +43.0058593750,688,1390.4761962891,,, +43.0078125000,688,1390.4761962891,,, +43.0097656250,688,1391.2087402344,,, +43.0117187500,688,1390.4761962891,,, +43.0136718750,688,1391.9414062500,,, +43.0156250000,688,1391.9414062500,,, +43.0175781250,688,1391.9414062500,,, +43.0195312500,688,1390.4761962891,,, +43.0214843750,688,1390.4761962891,,, +43.0234375000,688,1389.7435302734,,, +43.0253906250,688,1389.0109863281,,, +43.0273437500,688,1386.8132324219,,, +43.0292968750,688,1386.8132324219,,, +43.0312500000,688,1384.6153564453,,, +43.0332031250,688,1382.4176025391,,, +43.0351562500,688,1380.2197265625,,, +43.0371093750,688,1378.7546386719,,, +43.0390625000,688,1376.5567626953,,, +43.0410156250,688,1374.3590087891,,, +43.0429687500,688,1371.4285888672,,, +43.0449218750,688,1368.4981689453,,, +43.0468750000,688,1366.3004150391,,, +43.0488281250,688,1362.6373291016,,, +43.0507812500,688,1356.7766113281,,, +43.0527343750,688,1353.8461914062,,, +43.0546875000,688,1350.9157714844,,, +43.0566406250,688,1347.9853515625,,, +43.0585937500,688,1345.7875976562,,, +43.0605468750,688,1342.1245117188,,, +43.0625000000,689,1339.1940917969,,, +43.0644531250,689,1335.5311279297,,, +43.0664062500,689,1333.3333740234,,, +43.0683593750,689,1329.6702880859,,, +43.0703125000,689,1326.0073242188,,, +43.0722656250,689,1323.0769042969,,, +43.0742187500,689,1319.4139404297,,, +43.0761718750,689,1316.4835205078,,, +43.0781250000,689,1312.0878906250,,, +43.0800781250,689,1309.8901367188,,, +43.0820312500,689,1306.9597167969,,, +43.0839843750,689,1304.0292968750,,, +43.0859375000,689,1301.0988769531,,, +43.0878906250,689,1298.9011230469,,, +43.0898437500,689,1296.7032470703,,, +43.0917968750,689,1294.5054931641,,, +43.0937500000,689,1292.3077392578,,, +43.0957031250,689,1290.1098632812,,, +43.0976562500,689,1288.6446533203,,, +43.0996093750,689,1286.4468994141,,, +43.1015625000,689,1284.9816894531,,, +43.1035156250,689,1283.5164794922,,, +43.1054687500,689,1283.5164794922,,, +43.1074218750,689,1282.0512695312,,, +43.1093750000,689,1282.0512695312,,, +43.1113281250,689,1280.5860595703,,, +43.1132812500,689,1280.5860595703,,, +43.1152343750,689,1279.1208496094,,, +43.1171875000,689,1280.5860595703,,, +43.1191406250,689,1280.5860595703,,, +43.1210937500,689,1281.3187255859,,, +43.1230468750,689,1280.5860595703,,, +43.1250000000,690,1282.7839355469,,, +43.1269531250,690,1282.0512695312,,, +43.1289062500,690,1282.7839355469,,, +43.1308593750,690,1282.7839355469,,, +43.1328125000,690,1284.2490234375,,, +43.1347656250,690,1284.9816894531,,, +43.1367187500,690,1285.7142333984,,, +43.1386718750,690,1286.4468994141,,, +43.1406250000,690,1287.1794433594,,, +43.1425781250,690,1287.1794433594,,, +43.1445312500,690,1287.9121093750,,, +43.1464843750,690,1287.9121093750,,, +43.1484375000,690,1287.9121093750,,, +43.1503906250,690,1287.9121093750,,, +43.1523437500,690,1287.9121093750,,, +43.1542968750,690,1289.3773193359,,, +43.1562500000,690,1288.6446533203,,, +43.1582031250,690,1289.3773193359,,, +43.1601562500,690,1288.6446533203,,, +43.1621093750,690,1290.1098632812,,, +43.1640625000,690,1290.1098632812,,, +43.1660156250,690,1290.8425292969,,, +43.1679687500,690,1290.1098632812,,, +43.1699218750,690,1291.5750732422,,, +43.1718750000,690,1291.5750732422,,, +43.1738281250,690,1293.0402832031,,, +43.1757812500,690,1292.3077392578,,, +43.1777343750,690,1293.7729492188,,, +43.1796875000,690,1293.7729492188,,, +43.1816406250,690,1293.7729492188,,, +43.1835937500,690,1293.0402832031,,, +43.1855468750,690,1293.7729492188,,, +43.1875000000,691,1293.7729492188,,, +43.1894531250,691,1293.7729492188,,, +43.1914062500,691,1293.7729492188,,, +43.1933593750,691,1293.7729492188,,, +43.1953125000,691,1293.7729492188,,, +43.1972656250,691,1294.5054931641,,, +43.1992187500,691,1294.5054931641,,, +43.2011718750,691,1295.2380371094,,, +43.2031250000,691,1296.7032470703,,, +43.2050781250,691,1296.7032470703,,, +43.2070312500,691,1298.1684570312,,, +43.2089843750,691,1298.9011230469,,, +43.2109375000,691,1298.1684570312,,, +43.2128906250,691,1299.6336669922,,, +43.2148437500,691,1299.6336669922,,, +43.2167968750,691,1300.3663330078,,, +43.2187500000,691,1301.0988769531,,, +43.2207031250,691,1302.5640869141,,, +43.2226562500,691,1303.2967529297,,, +43.2246093750,691,1304.0292968750,,, +43.2265625000,691,1304.0292968750,,, +43.2285156250,691,1304.7619628906,,, +43.2304687500,691,1304.7619628906,,, +43.2324218750,691,1304.7619628906,,, +43.2343750000,691,1306.2270507812,,, +43.2363281250,691,1306.2270507812,,, +43.2382812500,691,1306.2270507812,,, +43.2402343750,691,1307.6922607422,,, +43.2421875000,691,1307.6922607422,,, +43.2441406250,691,1307.6922607422,,, +43.2460937500,691,1307.6922607422,,, +43.2480468750,691,1307.6922607422,,, +43.2500000000,692,1306.2270507812,,, +43.2519531250,692,1306.2270507812,,, +43.2539062500,692,1305.4945068359,,, +43.2558593750,692,1304.7619628906,,, +43.2578125000,692,1304.0292968750,,, +43.2597656250,692,1302.5640869141,,, +43.2617187500,692,1302.5640869141,,, +43.2636718750,692,1301.0988769531,,, +43.2656250000,692,1301.0988769531,,, +43.2675781250,692,1301.0988769531,,, +43.2695312500,692,1299.6336669922,,, +43.2714843750,692,1299.6336669922,,, +43.2734375000,692,1298.9011230469,,, +43.2753906250,692,1298.1684570312,,, +43.2773437500,692,1296.7032470703,,, +43.2792968750,692,1297.4359130859,,, +43.2812500000,692,1297.4359130859,,, +43.2832031250,692,1297.4359130859,,, +43.2851562500,692,1295.9707031250,,, +43.2871093750,692,1295.2380371094,,, +43.2890625000,692,1295.2380371094,,, +43.2910156250,692,1295.2380371094,,, +43.2929687500,692,1294.5054931641,,, +43.2949218750,692,1294.5054931641,,, +43.2968750000,692,1294.5054931641,,, +43.2988281250,692,1293.7729492188,,, +43.3007812500,692,1293.7729492188,,, +43.3027343750,692,1293.0402832031,,, +43.3046875000,692,1293.7729492188,,, +43.3066406250,692,1293.0402832031,,, +43.3085937500,692,1293.7729492188,,, +43.3105468750,692,1293.7729492188,,, +43.3125000000,693,1295.2380371094,,, +43.3144531250,693,1295.2380371094,,, +43.3164062500,693,1296.7032470703,,, +43.3183593750,693,1296.7032470703,,, +43.3203125000,693,1298.1684570312,,, +43.3222656250,693,1298.9011230469,,, +43.3242187500,693,1299.6336669922,,, +43.3261718750,693,1300.3663330078,,, +43.3281250000,693,1301.0988769531,,, +43.3300781250,693,1300.3663330078,,, +43.3320312500,693,1300.3663330078,,, +43.3339843750,693,1300.3663330078,,, +43.3359375000,693,1298.9011230469,,, +43.3378906250,693,1298.1684570312,,, +43.3398437500,693,1297.4359130859,,, +43.3417968750,693,1296.7032470703,,, +43.3437500000,693,1296.7032470703,,, +43.3457031250,693,1296.7032470703,,, +43.3476562500,693,1296.7032470703,,, +43.3496093750,693,1295.9707031250,,, +43.3515625000,693,1295.9707031250,,, +43.3535156250,693,1296.7032470703,,, +43.3554687500,693,1296.7032470703,,, +43.3574218750,693,1297.4359130859,,, +43.3593750000,693,1297.4359130859,,, +43.3613281250,693,1298.9011230469,,, +43.3632812500,693,1299.6336669922,,, +43.3652343750,693,1301.0988769531,,, +43.3671875000,693,1301.0988769531,,, +43.3691406250,693,1303.2967529297,,, +43.3710937500,693,1304.0292968750,,, +43.3730468750,693,1305.4945068359,,, +43.3750000000,694,1305.4945068359,,, +43.3769531250,694,1306.9597167969,,, +43.3789062500,694,1307.6922607422,,, +43.3808593750,694,1308.4249267578,,, +43.3828125000,694,1307.6922607422,,, +43.3847656250,694,1307.6922607422,,, +43.3867187500,694,1306.9597167969,,, +43.3886718750,694,1305.4945068359,,, +43.3906250000,694,1305.4945068359,,, +43.3925781250,694,1305.4945068359,,, +43.3945312500,694,1306.9597167969,,, +43.3964843750,694,1305.4945068359,,, +43.3984375000,694,1306.9597167969,,, +43.4003906250,694,1306.9597167969,,, +43.4023437500,694,1306.2270507812,,, +43.4042968750,694,1305.4945068359,,, +43.4062500000,694,1305.4945068359,,, +43.4082031250,694,1304.7619628906,,, +43.4101562500,694,1304.0292968750,,, +43.4121093750,694,1302.5640869141,,, +43.4140625000,694,1301.8315429688,,, +43.4160156250,694,1301.8315429688,,, +43.4179687500,694,1301.8315429688,,, +43.4199218750,694,1301.8315429688,,, +43.4218750000,694,1301.0988769531,,, +43.4238281250,694,1301.0988769531,,, +43.4257812500,694,1300.3663330078,,, +43.4277343750,694,1300.3663330078,,, +43.4296875000,694,1298.1684570312,,, +43.4316406250,694,1298.1684570312,,, +43.4335937500,694,1298.1684570312,,, +43.4355468750,694,1295.9707031250,,, +43.4375000000,695,1295.2380371094,,, +43.4394531250,695,1293.0402832031,,, +43.4414062500,695,1293.7729492188,,, +43.4433593750,695,1292.3077392578,,, +43.4453125000,695,1291.5750732422,,, +43.4472656250,695,1289.3773193359,,, +43.4492187500,695,1289.3773193359,,, +43.4511718750,695,1287.1794433594,,, +43.4531250000,695,1287.9121093750,,, +43.4550781250,695,1285.7142333984,,, +43.4570312500,695,1284.9816894531,,, +43.4589843750,695,1283.5164794922,,, +43.4609375000,695,1283.5164794922,,, +43.4628906250,695,1282.0512695312,,, +43.4648437500,695,1280.5860595703,,, +43.4667968750,695,1280.5860595703,,, +43.4687500000,695,1279.8535156250,,, +43.4707031250,695,1280.5860595703,,, +43.4726562500,695,1280.5860595703,,, +43.4746093750,695,1281.3187255859,,, +43.4765625000,695,1281.3187255859,,, +43.4785156250,695,1283.5164794922,,, +43.4804687500,695,1283.5164794922,,, +43.4824218750,695,1284.9816894531,,, +43.4843750000,695,1284.9816894531,,, +43.4863281250,695,1286.4468994141,,, +43.4882812500,695,1287.1794433594,,, +43.4902343750,695,1289.3773193359,,, +43.4921875000,695,1289.3773193359,,, +43.4941406250,695,1290.8425292969,,, +43.4960937500,695,1290.8425292969,,, +43.4980468750,695,1292.3077392578,,, +43.5000000000,696,1291.5750732422,,, +43.5019531250,696,1293.0402832031,,, +43.5039062500,696,1292.3077392578,,, +43.5058593750,696,1293.0402832031,,, +43.5078125000,696,1293.0402832031,,, +43.5097656250,696,1293.7729492188,,, +43.5117187500,696,1293.7729492188,,, +43.5136718750,696,1294.5054931641,,, +43.5156250000,696,1294.5054931641,,, +43.5175781250,696,1295.2380371094,,, +43.5195312500,696,1294.5054931641,,, +43.5214843750,696,1295.2380371094,,, +43.5234375000,696,1293.7729492188,,, +43.5253906250,696,1292.3077392578,,, +43.5273437500,696,1290.8425292969,,, +43.5292968750,696,1290.1098632812,,, +43.5312500000,696,1289.3773193359,,, +43.5332031250,696,1287.9121093750,,, +43.5351562500,696,1287.1794433594,,, +43.5371093750,696,1285.7142333984,,, +43.5390625000,696,1285.7142333984,,, +43.5410156250,696,1284.2490234375,,, +43.5429687500,696,1283.5164794922,,, +43.5449218750,696,1282.7839355469,,, +43.5468750000,696,1283.5164794922,,, +43.5488281250,696,1282.7839355469,,, +43.5507812500,696,1283.5164794922,,, +43.5527343750,696,1284.2490234375,,, +43.5546875000,696,1286.4468994141,,, +43.5566406250,696,1287.9121093750,,, +43.5585937500,696,1290.1098632812,,, +43.5605468750,696,1292.3077392578,,, +43.5625000000,697,1295.9707031250,,, +43.5644531250,697,1298.9011230469,,, +43.5664062500,697,1303.2967529297,,, +43.5683593750,697,1306.9597167969,,, +43.5703125000,697,1312.8205566406,,, +43.5722656250,697,1319.4139404297,,, +43.5742187500,697,1326.0073242188,,, +43.5761718750,697,1333.3333740234,,, +43.5781250000,697,1342.8571777344,,, +43.5800781250,697,1351.6483154297,,, +43.5820312500,697,1361.9047851562,,, +43.5839843750,697,1371.4285888672,,, +43.5859375000,697,1383.8828125000,,, +43.5878906250,697,1395.6043701172,,, +43.5898437500,697,1408.0585937500,,, +43.5917968750,697,1422.7105712891,,, +43.5937500000,697,1438.0952148438,,, +43.5957031250,697,1453.4798583984,,, +43.5976562500,697,1470.3297119141,,, +43.5996093750,697,1485.7142333984,,, +43.6015625000,697,1501.0988769531,,, +43.6035156250,697,1517.9487304688,,, +43.6054687500,697,1534.0659179688,,, +43.6074218750,697,1550.9157714844,,, +43.6093750000,697,1568.4981689453,,, +43.6113281250,697,1587.5457763672,,, +43.6132812500,697,1605.8608398438,,, +43.6152343750,697,1624.1757812500,,, +43.6171875000,697,1645.4212646484,,, +43.6191406250,697,1665.9340820312,,, +43.6210937500,697,1687.1794433594,,, +43.6230468750,697,1706.2270507812,,, +43.6250000000,698,1727.4725341797,,, +43.6269531250,698,1746.5201416016,,, +43.6289062500,698,1766.3004150391,,, +43.6308593750,698,1785.3480224609,,, +43.6328125000,698,1803.6629638672,,, +43.6347656250,698,1823.4432373047,,, +43.6367187500,698,1841.0256347656,,, +43.6386718750,698,1860.8059082031,,, +43.6406250000,698,1876.9230957031,,, +43.6425781250,698,1895.2380371094,,, +43.6445312500,698,1910.6226806641,,, +43.6464843750,698,1925.2747802734,,, +43.6484375000,698,1939.9267578125,,, +43.6503906250,698,1952.3809814453,,, +43.6523437500,698,1965.5677490234,,, +43.6542968750,698,1977.2894287109,,, +43.6562500000,698,1988.2784423828,,, +43.6582031250,698,1997.0695800781,,, +43.6601562500,698,2005.1281738281,,, +43.6621093750,698,2010.9890136719,,, +43.6640625000,698,2016.1171875000,,, +43.6660156250,698,2021.2453613281,,, +43.6679687500,698,2023.4432373047,,, +43.6699218750,698,2026.3736572266,,, +43.6718750000,698,2025.6409912109,,, +43.6738281250,698,2025.6409912109,,, +43.6757812500,698,2024.1757812500,,, +43.6777343750,698,2021.9780273438,,, +43.6796875000,698,2018.3150634766,,, +43.6816406250,698,2013.9194335938,,, +43.6835937500,698,2009.5238037109,,, +43.6855468750,698,2002.9304199219,,, +43.6875000000,699,1996.3370361328,,, +43.6894531250,699,1988.2784423828,,, +43.6914062500,699,1979.4871826172,,, +43.6933593750,699,1968.4981689453,,, +43.6953125000,699,1958.9743652344,,, +43.6972656250,699,1947.2528076172,,, +43.6992187500,699,1935.5311279297,,, +43.7011718750,699,1924.5421142578,,, +43.7031250000,699,1910.6226806641,,, +43.7050781250,699,1898.1684570312,,, +43.7070312500,699,1884.2490234375,,, +43.7089843750,699,1870.3297119141,,, +43.7109375000,699,1855.6776123047,,, +43.7128906250,699,1841.7583007812,,, +43.7148437500,699,1826.3736572266,,, +43.7167968750,699,1810.9890136719,,, +43.7187500000,699,1795.6043701172,,, +43.7207031250,699,1780.2197265625,,, +43.7226562500,699,1766.3004150391,,, +43.7246093750,699,1750.1831054688,,, +43.7265625000,699,1735.5311279297,,, +43.7285156250,699,1719.4139404297,,, +43.7304687500,699,1704.7619628906,,, +43.7324218750,699,1689.3773193359,,, +43.7343750000,699,1674.7252197266,,, +43.7363281250,699,1660.0732421875,,, +43.7382812500,699,1646.1538085938,,, +43.7402343750,699,1630.7692871094,,, +43.7421875000,699,1616.8498535156,,, +43.7441406250,699,1602.9304199219,,, +43.7460937500,699,1589.7435302734,,, +43.7480468750,699,1576.5567626953,,, +43.7500000000,700,1564.1025390625,,, +43.7519531250,700,1552.3809814453,,, +43.7539062500,700,1539.1940917969,,, +43.7558593750,700,1527.4725341797,,, +43.7578125000,700,1515.0183105469,,, +43.7597656250,700,1504.0292968750,,, +43.7617187500,700,1492.3077392578,,, +43.7636718750,700,1480.5860595703,,, +43.7656250000,700,1469.5970458984,,, +43.7675781250,700,1460.0732421875,,, +43.7695312500,700,1450.5494384766,,, +43.7714843750,700,1440.2930908203,,, +43.7734375000,700,1431.5018310547,,, +43.7753906250,700,1421.9780273438,,, +43.7773437500,700,1415.3846435547,,, +43.7792968750,700,1407.3260498047,,, +43.7812500000,700,1400.7325439453,,, +43.7832031250,700,1394.8718261719,,, +43.7851562500,700,1389.0109863281,,, +43.7871093750,700,1384.6153564453,,, +43.7890625000,700,1378.7546386719,,, +43.7910156250,700,1374.3590087891,,, +43.7929687500,700,1369.2307128906,,, +43.7949218750,700,1365.5677490234,,, +43.7968750000,700,1361.9047851562,,, +43.7988281250,700,1358.9743652344,,, +43.8007812500,700,1355.3114013672,,, +43.8027343750,700,1351.6483154297,,, +43.8046875000,700,1347.9853515625,,, +43.8066406250,700,1344.3223876953,,, +43.8085937500,700,1340.6593017578,,, +43.8105468750,700,1338.4615478516,,, +43.8125000000,701,1334.0659179688,,, +43.8144531250,701,1331.1354980469,,, +43.8164062500,701,1327.4725341797,,, +43.8183593750,701,1325.2747802734,,, +43.8203125000,701,1322.3443603516,,, +43.8222656250,701,1319.4139404297,,, +43.8242187500,701,1317.2160644531,,, +43.8261718750,701,1315.7509765625,,, +43.8281250000,701,1313.5531005859,,, +43.8300781250,701,1311.3553466797,,, +43.8320312500,701,1310.6226806641,,, +43.8339843750,701,1309.1574707031,,, +43.8359375000,701,1308.4249267578,,, +43.8378906250,701,1307.6922607422,,, +43.8398437500,701,1308.4249267578,,, +43.8417968750,701,1308.4249267578,,, +43.8437500000,701,1308.4249267578,,, +43.8457031250,701,1309.1574707031,,, +43.8476562500,701,1309.8901367188,,, +43.8496093750,701,1312.0878906250,,, +43.8515625000,701,1311.3553466797,,, +43.8535156250,701,1312.8205566406,,, +43.8554687500,701,1314.2857666016,,, +43.8574218750,701,1315.0183105469,,, +43.8593750000,701,1315.7509765625,,, +43.8613281250,701,1317.9487304688,,, +43.8632812500,701,1319.4139404297,,, +43.8652343750,701,1320.8791503906,,, +43.8671875000,701,1323.8095703125,,, +43.8691406250,701,1323.8095703125,,, +43.8710937500,701,1326.0073242188,,, +43.8730468750,701,1327.4725341797,,, +43.8750000000,702,1330.4029541016,,, +43.8769531250,702,1331.1354980469,,, +43.8789062500,702,1332.6007080078,,, +43.8808593750,702,1334.0659179688,,, +43.8828125000,702,1335.5311279297,,, +43.8847656250,702,1337.7288818359,,, +43.8867187500,702,1339.1940917969,,, +43.8886718750,702,1342.1245117188,,, +43.8906250000,702,1343.5897216797,,, +43.8925781250,702,1346.5201416016,,, +43.8945312500,702,1347.9853515625,,, +43.8964843750,702,1351.6483154297,,, +43.8984375000,702,1353.8461914062,,, +43.9003906250,702,1357.5091552734,,, +43.9023437500,702,1359.7069091797,,, +43.9042968750,702,1362.6373291016,,, +43.9062500000,702,1365.5677490234,,, +43.9082031250,702,1368.4981689453,,, +43.9101562500,702,1369.9633789062,,, +43.9121093750,702,1372.8937988281,,, +43.9140625000,702,1375.8242187500,,, +43.9160156250,702,1378.7546386719,,, +43.9179687500,702,1380.9523925781,,, +43.9199218750,702,1383.1501464844,,, +43.9218750000,702,1386.0805664062,,, +43.9238281250,702,1388.2784423828,,, +43.9257812500,702,1391.9414062500,,, +43.9277343750,702,1391.9414062500,,, +43.9296875000,702,1394.1391601562,,, +43.9316406250,702,1396.3370361328,,, +43.9335937500,702,1397.8022460938,,, +43.9355468750,702,1397.8022460938,,, +43.9375000000,703,1400.0000000000,,, +43.9394531250,703,1399.2674560547,,, +43.9414062500,703,1400.7325439453,,, +43.9433593750,703,1400.7325439453,,, +43.9453125000,703,1400.7325439453,,, +43.9472656250,703,1400.0000000000,,, +43.9492187500,703,1400.0000000000,,, +43.9511718750,703,1399.2674560547,,, +43.9531250000,703,1398.5347900391,,, +43.9550781250,703,1398.5347900391,,, +43.9570312500,703,1397.0695800781,,, +43.9589843750,703,1397.8022460938,,, +43.9609375000,703,1396.3370361328,,, +43.9628906250,703,1395.6043701172,,, +43.9648437500,703,1394.1391601562,,, +43.9667968750,703,1391.9414062500,,, +43.9687500000,703,1391.2087402344,,, +43.9707031250,703,1389.0109863281,,, +43.9726562500,703,1387.5457763672,,, +43.9746093750,703,1384.6153564453,,, +43.9765625000,703,1383.1501464844,,, +43.9785156250,703,1381.6849365234,,, +43.9804687500,703,1378.0219726562,,, +43.9824218750,703,1376.5567626953,,, +43.9843750000,703,1372.8937988281,,, +43.9863281250,703,1370.6959228516,,, +43.9882812500,703,1367.7656250000,,, +43.9902343750,703,1365.5677490234,,, +43.9921875000,703,1362.6373291016,,, +43.9941406250,703,1361.1721191406,,, +43.9960937500,703,1357.5091552734,,, +43.9980468750,703,1355.3114013672,,, +44.0000000000,704,1352.3809814453,,, +44.0019531250,704,1350.1831054688,,, +44.0039062500,704,1347.9853515625,,, +44.0058593750,704,1345.0549316406,,, +44.0078125000,704,1342.1245117188,,, +44.0097656250,704,1339.9267578125,,, +44.0117187500,704,1336.9963378906,,, +44.0136718750,704,1334.7985839844,,, +44.0156250000,704,1332.6007080078,,, +44.0175781250,704,1330.4029541016,,, +44.0195312500,704,1328.2050781250,,, +44.0214843750,704,1324.5421142578,,, +44.0234375000,704,1323.8095703125,,, +44.0253906250,704,1321.6116943359,,, +44.0273437500,704,1319.4139404297,,, +44.0292968750,704,1317.2160644531,,, +44.0312500000,704,1315.0183105469,,, +44.0332031250,704,1314.2857666016,,, +44.0351562500,704,1312.0878906250,,, +44.0371093750,704,1312.0878906250,,, +44.0390625000,704,1311.3553466797,,, +44.0410156250,704,1310.6226806641,,, +44.0429687500,704,1310.6226806641,,, +44.0449218750,704,1309.8901367188,,, +44.0468750000,704,1310.6226806641,,, +44.0488281250,704,1309.1574707031,,, +44.0507812500,704,1309.8901367188,,, +44.0527343750,704,1309.1574707031,,, +44.0546875000,704,1309.8901367188,,, +44.0566406250,704,1309.8901367188,,, +44.0585937500,704,1309.8901367188,,, +44.0605468750,704,1309.8901367188,,, +44.0625000000,705,1309.1574707031,,, +44.0644531250,705,1309.8901367188,,, +44.0664062500,705,1309.8901367188,,, +44.0683593750,705,1309.8901367188,,, +44.0703125000,705,1308.4249267578,,, +44.0722656250,705,1308.4249267578,,, +44.0742187500,705,1306.9597167969,,, +44.0761718750,705,1305.4945068359,,, +44.0781250000,705,1304.0292968750,,, +44.0800781250,705,1303.2967529297,,, +44.0820312500,705,1303.2967529297,,, +44.0839843750,705,1301.0988769531,,, +44.0859375000,705,1301.0988769531,,, +44.0878906250,705,1299.6336669922,,, +44.0898437500,705,1299.6336669922,,, +44.0917968750,705,1300.3663330078,,, +44.0937500000,705,1299.6336669922,,, +44.0957031250,705,1300.3663330078,,, +44.0976562500,705,1299.6336669922,,, +44.0996093750,705,1300.3663330078,,, +44.1015625000,705,1300.3663330078,,, +44.1035156250,705,1300.3663330078,,, +44.1054687500,705,1299.6336669922,,, +44.1074218750,705,1298.9011230469,,, +44.1093750000,705,1298.9011230469,,, +44.1113281250,705,1298.1684570312,,, +44.1132812500,705,1298.9011230469,,, +44.1152343750,705,1300.3663330078,,, +44.1171875000,705,1298.9011230469,,, +44.1191406250,705,1298.9011230469,,, +44.1210937500,705,1298.9011230469,,, +44.1230468750,705,1297.4359130859,,, +44.1250000000,706,1297.4359130859,,, +44.1269531250,706,1295.9707031250,,, +44.1289062500,706,1295.9707031250,,, +44.1308593750,706,1295.2380371094,,, +44.1328125000,706,1294.5054931641,,, +44.1347656250,706,1293.7729492188,,, +44.1367187500,706,1293.0402832031,,, +44.1386718750,706,1293.0402832031,,, +44.1406250000,706,1293.0402832031,,, +44.1425781250,706,1293.7729492188,,, +44.1445312500,706,1293.0402832031,,, +44.1464843750,706,1293.0402832031,,, +44.1484375000,706,1293.0402832031,,, +44.1503906250,706,1293.7729492188,,, +44.1523437500,706,1293.7729492188,,, +44.1542968750,706,1293.7729492188,,, +44.1562500000,706,1293.7729492188,,, +44.1582031250,706,1294.5054931641,,, +44.1601562500,706,1295.9707031250,,, +44.1621093750,706,1295.9707031250,,, +44.1640625000,706,1296.7032470703,,, +44.1660156250,706,1297.4359130859,,, +44.1679687500,706,1297.4359130859,,, +44.1699218750,706,1296.7032470703,,, +44.1718750000,706,1296.7032470703,,, +44.1738281250,706,1297.4359130859,,, +44.1757812500,706,1298.9011230469,,, +44.1777343750,706,1298.9011230469,,, +44.1796875000,706,1299.6336669922,,, +44.1816406250,706,1301.0988769531,,, +44.1835937500,706,1301.0988769531,,, +44.1855468750,706,1301.8315429688,,, +44.1875000000,707,1301.8315429688,,, +44.1894531250,707,1304.0292968750,,, +44.1914062500,707,1304.7619628906,,, +44.1933593750,707,1306.2270507812,,, +44.1953125000,707,1306.9597167969,,, +44.1972656250,707,1306.9597167969,,, +44.1992187500,707,1308.4249267578,,, +44.2011718750,707,1308.4249267578,,, +44.2031250000,707,1308.4249267578,,, +44.2050781250,707,1308.4249267578,,, +44.2070312500,707,1309.8901367188,,, +44.2089843750,707,1309.8901367188,,, +44.2109375000,707,1310.6226806641,,, +44.2128906250,707,1309.8901367188,,, +44.2148437500,707,1309.1574707031,,, +44.2167968750,707,1309.1574707031,,, +44.2187500000,707,1308.4249267578,,, +44.2207031250,707,1309.1574707031,,, +44.2226562500,707,1308.4249267578,,, +44.2246093750,707,1309.1574707031,,, +44.2265625000,707,1309.1574707031,,, +44.2285156250,707,1309.8901367188,,, +44.2304687500,707,1310.6226806641,,, +44.2324218750,707,1311.3553466797,,, +44.2343750000,707,1311.3553466797,,, +44.2363281250,707,1311.3553466797,,, +44.2382812500,707,1312.0878906250,,, +44.2402343750,707,1312.0878906250,,, +44.2421875000,707,1312.0878906250,,, +44.2441406250,707,1312.0878906250,,, +44.2460937500,707,1312.0878906250,,, +44.2480468750,707,1312.0878906250,,, +44.2500000000,708,1312.0878906250,,, +44.2519531250,708,1312.0878906250,,, +44.2539062500,708,1311.3553466797,,, +44.2558593750,708,1311.3553466797,,, +44.2578125000,708,1309.8901367188,,, +44.2597656250,708,1307.6922607422,,, +44.2617187500,708,1306.9597167969,,, +44.2636718750,708,1306.2270507812,,, +44.2656250000,708,1305.4945068359,,, +44.2675781250,708,1305.4945068359,,, +44.2695312500,708,1304.7619628906,,, +44.2714843750,708,1305.4945068359,,, +44.2734375000,708,1305.4945068359,,, +44.2753906250,708,1306.9597167969,,, +44.2773437500,708,1306.2270507812,,, +44.2792968750,708,1306.2270507812,,, +44.2812500000,708,1306.2270507812,,, +44.2832031250,708,1306.9597167969,,, +44.2851562500,708,1306.9597167969,,, +44.2871093750,708,1308.4249267578,,, +44.2890625000,708,1308.4249267578,,, +44.2910156250,708,1309.1574707031,,, +44.2929687500,708,1309.8901367188,,, +44.2949218750,708,1311.3553466797,,, +44.2968750000,708,1311.3553466797,,, +44.2988281250,708,1312.0878906250,,, +44.3007812500,708,1312.0878906250,,, +44.3027343750,708,1312.0878906250,,, +44.3046875000,708,1310.6226806641,,, +44.3066406250,708,1311.3553466797,,, +44.3085937500,708,1310.6226806641,,, +44.3105468750,708,1311.3553466797,,, +44.3125000000,709,1311.3553466797,,, +44.3144531250,709,1312.0878906250,,, +44.3164062500,709,1312.0878906250,,, +44.3183593750,709,1312.0878906250,,, +44.3203125000,709,1312.0878906250,,, +44.3222656250,709,1313.5531005859,,, +44.3242187500,709,1313.5531005859,,, +44.3261718750,709,1314.2857666016,,, +44.3281250000,709,1314.2857666016,,, +44.3300781250,709,1314.2857666016,,, +44.3320312500,709,1314.2857666016,,, +44.3339843750,709,1315.0183105469,,, +44.3359375000,709,1315.7509765625,,, +44.3378906250,709,1315.7509765625,,, +44.3398437500,709,1315.7509765625,,, +44.3417968750,709,1315.7509765625,,, +44.3437500000,709,1317.2160644531,,, +44.3457031250,709,1315.0183105469,,, +44.3476562500,709,1315.7509765625,,, +44.3496093750,709,1315.0183105469,,, +44.3515625000,709,1314.2857666016,,, +44.3535156250,709,1313.5531005859,,, +44.3554687500,709,1312.8205566406,,, +44.3574218750,709,1312.8205566406,,, +44.3593750000,709,1309.8901367188,,, +44.3613281250,709,1309.1574707031,,, +44.3632812500,709,1307.6922607422,,, +44.3652343750,709,1306.9597167969,,, +44.3671875000,709,1305.4945068359,,, +44.3691406250,709,1303.2967529297,,, +44.3710937500,709,1302.5640869141,,, +44.3730468750,709,1301.0988769531,,, +44.3750000000,710,1299.6336669922,,, +44.3769531250,710,1299.6336669922,,, +44.3789062500,710,1298.1684570312,,, +44.3808593750,710,1298.1684570312,,, +44.3828125000,710,1297.4359130859,,, +44.3847656250,710,1295.9707031250,,, +44.3867187500,710,1295.9707031250,,, +44.3886718750,710,1295.2380371094,,, +44.3906250000,710,1295.9707031250,,, +44.3925781250,710,1294.5054931641,,, +44.3945312500,710,1294.5054931641,,, +44.3964843750,710,1293.7729492188,,, +44.3984375000,710,1293.7729492188,,, +44.4003906250,710,1292.3077392578,,, +44.4023437500,710,1292.3077392578,,, +44.4042968750,710,1293.0402832031,,, +44.4062500000,710,1292.3077392578,,, +44.4082031250,710,1292.3077392578,,, +44.4101562500,710,1292.3077392578,,, +44.4121093750,710,1292.3077392578,,, +44.4140625000,710,1292.3077392578,,, +44.4160156250,710,1292.3077392578,,, +44.4179687500,710,1292.3077392578,,, +44.4199218750,710,1293.7729492188,,, +44.4218750000,710,1293.7729492188,,, +44.4238281250,710,1294.5054931641,,, +44.4257812500,710,1295.9707031250,,, +44.4277343750,710,1296.7032470703,,, +44.4296875000,710,1296.7032470703,,, +44.4316406250,710,1298.1684570312,,, +44.4335937500,710,1298.9011230469,,, +44.4355468750,710,1299.6336669922,,, +44.4375000000,711,1298.9011230469,,, +44.4394531250,711,1299.6336669922,,, +44.4414062500,711,1298.9011230469,,, +44.4433593750,711,1299.6336669922,,, +44.4453125000,711,1299.6336669922,,, +44.4472656250,711,1298.1684570312,,, +44.4492187500,711,1298.9011230469,,, +44.4511718750,711,1298.9011230469,,, +44.4531250000,711,1300.3663330078,,, +44.4550781250,711,1300.3663330078,,, +44.4570312500,711,1300.3663330078,,, +44.4589843750,711,1301.0988769531,,, +44.4609375000,711,1301.8315429688,,, +44.4628906250,711,1303.2967529297,,, +44.4648437500,711,1304.0292968750,,, +44.4667968750,711,1304.0292968750,,, +44.4687500000,711,1304.0292968750,,, +44.4707031250,711,1305.4945068359,,, +44.4726562500,711,1304.7619628906,,, +44.4746093750,711,1305.4945068359,,, +44.4765625000,711,1304.7619628906,,, +44.4785156250,711,1305.4945068359,,, +44.4804687500,711,1304.7619628906,,, +44.4824218750,711,1304.0292968750,,, +44.4843750000,711,1302.5640869141,,, +44.4863281250,711,1303.2967529297,,, +44.4882812500,711,1302.5640869141,,, +44.4902343750,711,1302.5640869141,,, +44.4921875000,711,1301.8315429688,,, +44.4941406250,711,1301.0988769531,,, +44.4960937500,711,1300.3663330078,,, +44.4980468750,711,1300.3663330078,,, +44.5000000000,712,1300.3663330078,,, +44.5019531250,712,1300.3663330078,,, +44.5039062500,712,1301.0988769531,,, +44.5058593750,712,1301.8315429688,,, +44.5078125000,712,1302.5640869141,,, +44.5097656250,712,1304.7619628906,,, +44.5117187500,712,1306.9597167969,,, +44.5136718750,712,1309.1574707031,,, +44.5156250000,712,1312.0878906250,,, +44.5175781250,712,1315.7509765625,,, +44.5195312500,712,1319.4139404297,,, +44.5214843750,712,1323.8095703125,,, +44.5234375000,712,1329.6702880859,,, +44.5253906250,712,1335.5311279297,,, +44.5273437500,712,1342.8571777344,,, +44.5292968750,712,1350.1831054688,,, +44.5312500000,712,1358.2416992188,,, +44.5332031250,712,1367.7656250000,,, +44.5351562500,712,1378.7546386719,,, +44.5371093750,712,1389.7435302734,,, +44.5390625000,712,1402.9304199219,,, +44.5410156250,712,1415.3846435547,,, +44.5429687500,712,1429.3040771484,,, +44.5449218750,712,1443.9560546875,,, +44.5468750000,712,1459.3406982422,,, +44.5488281250,712,1475.4578857422,,, +44.5507812500,712,1492.3077392578,,, +44.5527343750,712,1509.1574707031,,, +44.5546875000,712,1526.7398681641,,, +44.5566406250,712,1545.0549316406,,, +44.5585937500,712,1562.6373291016,,, +44.5605468750,712,1582.4176025391,,, +44.5625000000,713,1600.7325439453,,, +44.5644531250,713,1620.5128173828,,, +44.5664062500,713,1639.5604248047,,, +44.5683593750,713,1660.8059082031,,, +44.5703125000,713,1680.5860595703,,, +44.5722656250,713,1700.3663330078,,, +44.5742187500,713,1719.4139404297,,, +44.5761718750,713,1738.4615478516,,, +44.5781250000,713,1757.5091552734,,, +44.5800781250,713,1775.8242187500,,, +44.5820312500,713,1795.6043701172,,, +44.5839843750,713,1813.9194335938,,, +44.5859375000,713,1832.9670410156,,, +44.5878906250,713,1849.0842285156,,, +44.5898437500,713,1866.6666259766,,, +44.5917968750,713,1881.3187255859,,, +44.5937500000,713,1897.4359130859,,, +44.5957031250,713,1911.3553466797,,, +44.5976562500,713,1924.5421142578,,, +44.5996093750,713,1936.2637939453,,, +44.6015625000,713,1947.2528076172,,, +44.6035156250,713,1956.0439453125,,, +44.6054687500,713,1966.3004150391,,, +44.6074218750,713,1972.8937988281,,, +44.6093750000,713,1980.9523925781,,, +44.6113281250,713,1986.8132324219,,, +44.6132812500,713,1991.9414062500,,, +44.6152343750,713,1995.6043701172,,, +44.6171875000,713,1998.5347900391,,, +44.6191406250,713,2000.0000000000,,, +44.6210937500,713,2002.9304199219,,, +44.6230468750,713,2002.1977539062,,, +44.6250000000,714,2002.1977539062,,, +44.6269531250,714,2001.4652099609,,, +44.6289062500,714,1998.5347900391,,, +44.6308593750,714,1995.6043701172,,, +44.6328125000,714,1989.7435302734,,, +44.6347656250,714,1985.3480224609,,, +44.6367187500,714,1978.7546386719,,, +44.6386718750,714,1972.8937988281,,, +44.6406250000,714,1964.8352050781,,, +44.6425781250,714,1958.2416992188,,, +44.6445312500,714,1949.4505615234,,, +44.6464843750,714,1939.9267578125,,, +44.6484375000,714,1929.6702880859,,, +44.6503906250,714,1918.6812744141,,, +44.6523437500,714,1907.6922607422,,, +44.6542968750,714,1895.9707031250,,, +44.6562500000,714,1883.5164794922,,, +44.6582031250,714,1871.0622558594,,, +44.6601562500,714,1857.1428222656,,, +44.6621093750,714,1843.2233886719,,, +44.6640625000,714,1827.8388671875,,, +44.6660156250,714,1813.9194335938,,, +44.6679687500,714,1797.8022460938,,, +44.6699218750,714,1783.8828125000,,, +44.6718750000,714,1767.7656250000,,, +44.6738281250,714,1753.1135253906,,, +44.6757812500,714,1736.2637939453,,, +44.6777343750,714,1721.6116943359,,, +44.6796875000,714,1706.2270507812,,, +44.6816406250,714,1690.1098632812,,, +44.6835937500,714,1675.4578857422,,, +44.6855468750,714,1660.0732421875,,, +44.6875000000,715,1646.1538085938,,, +44.6894531250,715,1631.5018310547,,, +44.6914062500,715,1618.3150634766,,, +44.6933593750,715,1603.6629638672,,, +44.6953125000,715,1590.4761962891,,, +44.6972656250,715,1577.2894287109,,, +44.6992187500,715,1564.8352050781,,, +44.7011718750,715,1550.9157714844,,, +44.7031250000,715,1538.4615478516,,, +44.7050781250,715,1526.0073242188,,, +44.7070312500,715,1515.0183105469,,, +44.7089843750,715,1504.0292968750,,, +44.7109375000,715,1493.0402832031,,, +44.7128906250,715,1483.5164794922,,, +44.7148437500,715,1472.5274658203,,, +44.7167968750,715,1463.7362060547,,, +44.7187500000,715,1454.2124023438,,, +44.7207031250,715,1445.4212646484,,, +44.7226562500,715,1437.3626708984,,, +44.7246093750,715,1430.0366210938,,, +44.7265625000,715,1420.5128173828,,, +44.7285156250,715,1413.9194335938,,, +44.7304687500,715,1406.5933837891,,, +44.7324218750,715,1399.2674560547,,, +44.7343750000,715,1392.6739501953,,, +44.7363281250,715,1386.8132324219,,, +44.7382812500,715,1380.9523925781,,, +44.7402343750,715,1373.6263427734,,, +44.7421875000,715,1369.2307128906,,, +44.7441406250,715,1363.3699951172,,, +44.7460937500,715,1359.7069091797,,, +44.7480468750,715,1353.8461914062,,, +44.7500000000,716,1350.9157714844,,, +44.7519531250,716,1346.5201416016,,, +44.7539062500,716,1342.8571777344,,, +44.7558593750,716,1340.6593017578,,, +44.7578125000,716,1336.9963378906,,, +44.7597656250,716,1334.0659179688,,, +44.7617187500,716,1331.1354980469,,, +44.7636718750,716,1329.6702880859,,, +44.7656250000,716,1326.7398681641,,, +44.7675781250,716,1326.0073242188,,, +44.7695312500,716,1323.8095703125,,, +44.7714843750,716,1322.3443603516,,, +44.7734375000,716,1320.8791503906,,, +44.7753906250,716,1319.4139404297,,, +44.7773437500,716,1320.1464843750,,, +44.7792968750,716,1318.6812744141,,, +44.7812500000,716,1318.6812744141,,, +44.7832031250,716,1317.9487304688,,, +44.7851562500,716,1318.6812744141,,, +44.7871093750,716,1318.6812744141,,, +44.7890625000,716,1317.9487304688,,, +44.7910156250,716,1318.6812744141,,, +44.7929687500,716,1319.4139404297,,, +44.7949218750,716,1319.4139404297,,, +44.7968750000,716,1319.4139404297,,, +44.7988281250,716,1320.8791503906,,, +44.8007812500,716,1321.6116943359,,, +44.8027343750,716,1322.3443603516,,, +44.8046875000,716,1323.8095703125,,, +44.8066406250,716,1323.8095703125,,, +44.8085937500,716,1325.2747802734,,, +44.8105468750,716,1325.2747802734,,, +44.8125000000,717,1326.7398681641,,, +44.8144531250,717,1326.7398681641,,, +44.8164062500,717,1328.2050781250,,, +44.8183593750,717,1328.9377441406,,, +44.8203125000,717,1331.1354980469,,, +44.8222656250,717,1331.8681640625,,, +44.8242187500,717,1334.0659179688,,, +44.8261718750,717,1334.7985839844,,, +44.8281250000,717,1336.9963378906,,, +44.8300781250,717,1338.4615478516,,, +44.8320312500,717,1339.9267578125,,, +44.8339843750,717,1340.6593017578,,, +44.8359375000,717,1342.8571777344,,, +44.8378906250,717,1344.3223876953,,, +44.8398437500,717,1345.7875976562,,, +44.8417968750,717,1346.5201416016,,, +44.8437500000,717,1347.9853515625,,, +44.8457031250,717,1349.4505615234,,, +44.8476562500,717,1350.9157714844,,, +44.8496093750,717,1353.1135253906,,, +44.8515625000,717,1354.5787353516,,, +44.8535156250,717,1357.5091552734,,, +44.8554687500,717,1359.7069091797,,, +44.8574218750,717,1361.9047851562,,, +44.8593750000,717,1364.1025390625,,, +44.8613281250,717,1366.3004150391,,, +44.8632812500,717,1368.4981689453,,, +44.8652343750,717,1370.6959228516,,, +44.8671875000,717,1372.8937988281,,, +44.8691406250,717,1375.0915527344,,, +44.8710937500,717,1377.2894287109,,, +44.8730468750,717,1380.2197265625,,, +44.8750000000,718,1382.4176025391,,, +44.8769531250,718,1384.6153564453,,, +44.8789062500,718,1387.5457763672,,, +44.8808593750,718,1389.7435302734,,, +44.8828125000,718,1391.9414062500,,, +44.8847656250,718,1393.4066162109,,, +44.8867187500,718,1396.3370361328,,, +44.8886718750,718,1397.8022460938,,, +44.8906250000,718,1399.2674560547,,, +44.8925781250,718,1399.2674560547,,, +44.8945312500,718,1402.1977539062,,, +44.8964843750,718,1402.1977539062,,, +44.8984375000,718,1404.3956298828,,, +44.9003906250,718,1405.1281738281,,, +44.9023437500,718,1406.5933837891,,, +44.9042968750,718,1405.8608398438,,, +44.9062500000,718,1407.3260498047,,, +44.9082031250,718,1406.5933837891,,, +44.9101562500,718,1408.0585937500,,, +44.9121093750,718,1406.5933837891,,, +44.9140625000,718,1405.8608398438,,, +44.9160156250,718,1405.1281738281,,, +44.9179687500,718,1403.6629638672,,, +44.9199218750,718,1402.1977539062,,, +44.9218750000,718,1401.4652099609,,, +44.9238281250,718,1399.2674560547,,, +44.9257812500,718,1398.5347900391,,, +44.9277343750,718,1397.0695800781,,, +44.9296875000,718,1397.0695800781,,, +44.9316406250,718,1394.8718261719,,, +44.9335937500,718,1393.4066162109,,, +44.9355468750,718,1391.9414062500,,, +44.9375000000,719,1390.4761962891,,, +44.9394531250,719,1388.2784423828,,, +44.9414062500,719,1386.8132324219,,, +44.9433593750,719,1385.3480224609,,, +44.9453125000,719,1383.8828125000,,, +44.9472656250,719,1382.4176025391,,, +44.9492187500,719,1380.2197265625,,, +44.9511718750,719,1378.7546386719,,, +44.9531250000,719,1376.5567626953,,, +44.9550781250,719,1375.0915527344,,, +44.9570312500,719,1372.1611328125,,, +44.9589843750,719,1370.6959228516,,, +44.9609375000,719,1367.7656250000,,, +44.9628906250,719,1366.3004150391,,, +44.9648437500,719,1362.6373291016,,, +44.9667968750,719,1360.4395751953,,, +44.9687500000,719,1357.5091552734,,, +44.9707031250,719,1354.5787353516,,, +44.9726562500,719,1351.6483154297,,, +44.9746093750,719,1347.9853515625,,, +44.9765625000,719,1345.0549316406,,, +44.9785156250,719,1342.1245117188,,, +44.9804687500,719,1340.6593017578,,, +44.9824218750,719,1337.7288818359,,, +44.9843750000,719,1334.7985839844,,, +44.9863281250,719,1332.6007080078,,, +44.9882812500,719,1331.8681640625,,, +44.9902343750,719,1328.9377441406,,, +44.9921875000,719,1327.4725341797,,, +44.9941406250,719,1322.3443603516,,, +44.9960937500,719,1320.8791503906,,, +44.9980468750,719,1317.9487304688,,, +45.0000000000,720,1315.0183105469,,, +45.0019531250,720,1312.0878906250,,, +45.0039062500,720,1310.6226806641,,, +45.0058593750,720,1308.4249267578,,, +45.0078125000,720,1306.9597167969,,, +45.0097656250,720,1304.0292968750,,, +45.0117187500,720,1303.2967529297,,, +45.0136718750,720,1301.0988769531,,, +45.0156250000,720,1300.3663330078,,, +45.0175781250,720,1298.1684570312,,, +45.0195312500,720,1298.1684570312,,, +45.0214843750,720,1296.7032470703,,, +45.0234375000,720,1297.4359130859,,, +45.0253906250,720,1295.9707031250,,, +45.0273437500,720,1296.7032470703,,, +45.0292968750,720,1295.9707031250,,, +45.0312500000,720,1295.2380371094,,, +45.0332031250,720,1294.5054931641,,, +45.0351562500,720,1293.7729492188,,, +45.0371093750,720,1293.0402832031,,, +45.0390625000,720,1293.0402832031,,, +45.0410156250,720,1291.5750732422,,, +45.0429687500,720,1290.8425292969,,, +45.0449218750,720,1289.3773193359,,, +45.0468750000,720,1287.9121093750,,, +45.0488281250,720,1286.4468994141,,, +45.0507812500,720,1284.9816894531,,, +45.0527343750,720,1284.2490234375,,, +45.0546875000,720,1282.7839355469,,, +45.0566406250,720,1281.3187255859,,, +45.0585937500,720,1280.5860595703,,, +45.0605468750,720,1278.3883056641,,, +45.0625000000,721,1277.6556396484,,, +45.0644531250,721,1276.9230957031,,, +45.0664062500,721,1275.4578857422,,, +45.0683593750,721,1275.4578857422,,, +45.0703125000,721,1276.1904296875,,, +45.0722656250,721,1274.7252197266,,, +45.0742187500,721,1275.4578857422,,, +45.0761718750,721,1275.4578857422,,, +45.0781250000,721,1276.1904296875,,, +45.0800781250,721,1276.1904296875,,, +45.0820312500,721,1276.1904296875,,, +45.0839843750,721,1278.3883056641,,, +45.0859375000,721,1278.3883056641,,, +45.0878906250,721,1279.8535156250,,, +45.0898437500,721,1280.5860595703,,, +45.0917968750,721,1282.0512695312,,, +45.0937500000,721,1282.0512695312,,, +45.0957031250,721,1283.5164794922,,, +45.0976562500,721,1284.2490234375,,, +45.0996093750,721,1286.4468994141,,, +45.1015625000,721,1287.9121093750,,, +45.1035156250,721,1290.1098632812,,, +45.1054687500,721,1292.3077392578,,, +45.1074218750,721,1293.7729492188,,, +45.1093750000,721,1296.7032470703,,, +45.1113281250,721,1298.1684570312,,, +45.1132812500,721,1299.6336669922,,, +45.1152343750,721,1303.2967529297,,, +45.1171875000,721,1304.7619628906,,, +45.1191406250,721,1306.9597167969,,, +45.1210937500,721,1309.1574707031,,, +45.1230468750,721,1311.3553466797,,, +45.1250000000,722,1312.8205566406,,, +45.1269531250,722,1315.7509765625,,, +45.1289062500,722,1316.4835205078,,, +45.1308593750,722,1319.4139404297,,, +45.1328125000,722,1320.1464843750,,, +45.1347656250,722,1321.6116943359,,, +45.1367187500,722,1322.3443603516,,, +45.1386718750,722,1323.8095703125,,, +45.1406250000,722,1323.8095703125,,, +45.1425781250,722,1325.2747802734,,, +45.1445312500,722,1325.2747802734,,, +45.1464843750,722,1326.0073242188,,, +45.1484375000,722,1326.0073242188,,, +45.1503906250,722,1327.4725341797,,, +45.1523437500,722,1328.9377441406,,, +45.1542968750,722,1330.4029541016,,, +45.1562500000,722,1329.6702880859,,, +45.1582031250,722,1329.6702880859,,, +45.1601562500,722,1329.6702880859,,, +45.1621093750,722,1329.6702880859,,, +45.1640625000,722,1330.4029541016,,, +45.1660156250,722,1331.1354980469,,, +45.1679687500,722,1332.6007080078,,, +45.1699218750,722,1331.8681640625,,, +45.1718750000,722,1332.6007080078,,, +45.1738281250,722,1332.6007080078,,, +45.1757812500,722,1332.6007080078,,, +45.1777343750,722,1332.6007080078,,, +45.1796875000,722,1331.8681640625,,, +45.1816406250,722,1333.3333740234,,, +45.1835937500,722,1333.3333740234,,, +45.1855468750,722,1333.3333740234,,, +45.1875000000,723,1334.0659179688,,, +45.1894531250,723,1333.3333740234,,, +45.1914062500,723,1334.7985839844,,, +45.1933593750,723,1334.7985839844,,, +45.1953125000,723,1335.5311279297,,, +45.1972656250,723,1335.5311279297,,, +45.1992187500,723,1337.7288818359,,, +45.2011718750,723,1338.4615478516,,, +45.2031250000,723,1339.9267578125,,, +45.2050781250,723,1340.6593017578,,, +45.2070312500,723,1340.6593017578,,, +45.2089843750,723,1342.1245117188,,, +45.2109375000,723,1342.1245117188,,, +45.2128906250,723,1343.5897216797,,, +45.2148437500,723,1343.5897216797,,, +45.2167968750,723,1344.3223876953,,, +45.2187500000,723,1344.3223876953,,, +45.2207031250,723,1345.0549316406,,, +45.2226562500,723,1344.3223876953,,, +45.2246093750,723,1344.3223876953,,, +45.2265625000,723,1345.0549316406,,, +45.2285156250,723,1345.0549316406,,, +45.2304687500,723,1345.7875976562,,, +45.2324218750,723,1345.7875976562,,, +45.2343750000,723,1345.7875976562,,, +45.2363281250,723,1345.7875976562,,, +45.2382812500,723,1345.0549316406,,, +45.2402343750,723,1345.7875976562,,, +45.2421875000,723,1346.5201416016,,, +45.2441406250,723,1345.7875976562,,, +45.2460937500,723,1345.0549316406,,, +45.2480468750,723,1345.0549316406,,, +45.2500000000,724,1345.0549316406,,, +45.2519531250,724,1344.3223876953,,, +45.2539062500,724,1343.5897216797,,, +45.2558593750,724,1345.0549316406,,, +45.2578125000,724,1344.3223876953,,, +45.2597656250,724,1344.3223876953,,, +45.2617187500,724,1342.8571777344,,, +45.2636718750,724,1342.1245117188,,, +45.2656250000,724,1342.1245117188,,, +45.2675781250,724,1340.6593017578,,, +45.2695312500,724,1340.6593017578,,, +45.2714843750,724,1339.1940917969,,, +45.2734375000,724,1338.4615478516,,, +45.2753906250,724,1336.9963378906,,, +45.2773437500,724,1336.2637939453,,, +45.2792968750,724,1334.7985839844,,, +45.2812500000,724,1334.0659179688,,, +45.2832031250,724,1334.0659179688,,, +45.2851562500,724,1333.3333740234,,, +45.2871093750,724,1333.3333740234,,, +45.2890625000,724,1331.1354980469,,, +45.2910156250,724,1331.1354980469,,, +45.2929687500,724,1330.4029541016,,, +45.2949218750,724,1328.9377441406,,, +45.2968750000,724,1328.9377441406,,, +45.2988281250,724,1328.9377441406,,, +45.3007812500,724,1328.2050781250,,, +45.3027343750,724,1327.4725341797,,, +45.3046875000,724,1326.0073242188,,, +45.3066406250,724,1324.5421142578,,, +45.3085937500,724,1323.0769042969,,, +45.3105468750,724,1321.6116943359,,, +45.3125000000,725,1320.1464843750,,, +45.3144531250,725,1317.9487304688,,, +45.3164062500,725,1317.2160644531,,, +45.3183593750,725,1315.0183105469,,, +45.3203125000,725,1312.8205566406,,, +45.3222656250,725,1310.6226806641,,, +45.3242187500,725,1308.4249267578,,, +45.3261718750,725,1306.2270507812,,, +45.3281250000,725,1304.7619628906,,, +45.3300781250,725,1302.5640869141,,, +45.3320312500,725,1301.0988769531,,, +45.3339843750,725,1298.9011230469,,, +45.3359375000,725,1298.1684570312,,, +45.3378906250,725,1295.9707031250,,, +45.3398437500,725,1294.5054931641,,, +45.3417968750,725,1293.0402832031,,, +45.3437500000,725,1292.3077392578,,, +45.3457031250,725,1292.3077392578,,, +45.3476562500,725,1291.5750732422,,, +45.3496093750,725,1290.8425292969,,, +45.3515625000,725,1290.8425292969,,, +45.3535156250,725,1290.1098632812,,, +45.3554687500,725,1289.3773193359,,, +45.3574218750,725,1287.9121093750,,, +45.3593750000,725,1286.4468994141,,, +45.3613281250,725,1284.9816894531,,, +45.3632812500,725,1284.2490234375,,, +45.3652343750,725,1283.5164794922,,, +45.3671875000,725,1282.0512695312,,, +45.3691406250,725,1281.3187255859,,, +45.3710937500,725,1279.8535156250,,, +45.3730468750,725,1277.6556396484,,, +45.3750000000,726,1276.9230957031,,, +45.3769531250,726,1274.7252197266,,, +45.3789062500,726,1274.7252197266,,, +45.3808593750,726,1274.7252197266,,, +45.3828125000,726,1273.9926757812,,, +45.3847656250,726,1275.4578857422,,, +45.3867187500,726,1276.1904296875,,, +45.3886718750,726,1276.9230957031,,, +45.3906250000,726,1278.3883056641,,, +45.3925781250,726,1280.5860595703,,, +45.3945312500,726,1283.5164794922,,, +45.3964843750,726,1288.6446533203,,, +45.3984375000,726,1292.3077392578,,, +45.4003906250,726,1297.4359130859,,, +45.4023437500,726,1303.2967529297,,, +45.4042968750,726,1309.1574707031,,, +45.4062500000,726,1315.0183105469,,, +45.4082031250,726,1323.0769042969,,, +45.4101562500,726,1331.8681640625,,, +45.4121093750,726,1342.1245117188,,, +45.4140625000,726,1351.6483154297,,, +45.4160156250,726,1363.3699951172,,, +45.4179687500,726,1375.8242187500,,, +45.4199218750,726,1388.2784423828,,, +45.4218750000,726,1401.4652099609,,, +45.4238281250,726,1413.9194335938,,, +45.4257812500,726,1428.5714111328,,, +45.4277343750,726,1443.2233886719,,, +45.4296875000,726,1460.0732421875,,, +45.4316406250,726,1475.4578857422,,, +45.4335937500,726,1491.5750732422,,, +45.4355468750,726,1508.4249267578,,, +45.4375000000,727,1525.2747802734,,, +45.4394531250,727,1542.8571777344,,, +45.4414062500,727,1561.1721191406,,, +45.4433593750,727,1579.4871826172,,, +45.4453125000,727,1596.3370361328,,, +45.4472656250,727,1615.3846435547,,, +45.4492187500,727,1632.2343750000,,, +45.4511718750,727,1649.8168945312,,, +45.4531250000,727,1666.6666259766,,, +45.4550781250,727,1684.9816894531,,, +45.4570312500,727,1701.8315429688,,, +45.4589843750,727,1718.6812744141,,, +45.4609375000,727,1734.7985839844,,, +45.4628906250,727,1751.6483154297,,, +45.4648437500,727,1767.0329589844,,, +45.4667968750,727,1783.8828125000,,, +45.4687500000,727,1799.2674560547,,, +45.4707031250,727,1814.6519775391,,, +45.4726562500,727,1828.5714111328,,, +45.4746093750,727,1841.7583007812,,, +45.4765625000,727,1854.2124023438,,, +45.4785156250,727,1865.9340820312,,, +45.4804687500,727,1876.9230957031,,, +45.4824218750,727,1887.1794433594,,, +45.4843750000,727,1896.7032470703,,, +45.4863281250,727,1896.7032470703,,, +45.4882812500,727,1905.4945068359,,, +45.4902343750,727,1912.8205566406,,, +45.4921875000,727,1919.4139404297,,, +45.4941406250,727,1924.5421142578,,, +45.4960937500,727,1929.6702880859,,, +45.4980468750,727,1931.8681640625,,, +45.5000000000,728,1934.7985839844,,, +45.5019531250,728,1934.7985839844,,, +45.5039062500,728,1935.5311279297,,, +45.5058593750,728,1935.5311279297,,, +45.5078125000,728,1933.3333740234,,, +45.5097656250,728,1932.6007080078,,, +45.5117187500,728,1928.2050781250,,, +45.5136718750,728,1924.5421142578,,, +45.5156250000,728,1919.4139404297,,, +45.5175781250,728,1912.0878906250,,, +45.5195312500,728,1906.9597167969,,, +45.5214843750,728,1899.6336669922,,, +45.5234375000,728,1892.3077392578,,, +45.5253906250,728,1882.7839355469,,, +45.5273437500,728,1873.2601318359,,, +45.5292968750,728,1864.4688720703,,, +45.5312500000,728,1852.7471923828,,, +45.5332031250,728,1841.7583007812,,, +45.5351562500,728,1830.0366210938,,, +45.5371093750,728,1816.8498535156,,, +45.5390625000,728,1804.3956298828,,, +45.5410156250,728,1790.4761962891,,, +45.5429687500,728,1775.8242187500,,, +45.5449218750,728,1761.9047851562,,, +45.5468750000,728,1746.5201416016,,, +45.5488281250,728,1732.6007080078,,, +45.5507812500,728,1717.9487304688,,, +45.5527343750,728,1703.2967529297,,, +45.5546875000,728,1688.6446533203,,, +45.5566406250,728,1673.9926757812,,, +45.5585937500,728,1659.3406982422,,, +45.5605468750,728,1646.1538085938,,, +45.5625000000,729,1632.2343750000,,, +45.5644531250,729,1617.5823974609,,, +45.5664062500,729,1603.6629638672,,, +45.5683593750,729,1590.4761962891,,, +45.5703125000,729,1577.2894287109,,, +45.5722656250,729,1563.3699951172,,, +45.5742187500,729,1550.1831054688,,, +45.5761718750,729,1538.4615478516,,, +45.5781250000,729,1525.2747802734,,, +45.5800781250,729,1513.5531005859,,, +45.5820312500,729,1501.0988769531,,, +45.5839843750,729,1489.3773193359,,, +45.5859375000,729,1477.6556396484,,, +45.5878906250,729,1467.3992919922,,, +45.5898437500,729,1455.6776123047,,, +45.5917968750,729,1446.8864746094,,, +45.5937500000,729,1436.6300048828,,, +45.5957031250,729,1427.1062011719,,, +45.5976562500,729,1416.8498535156,,, +45.5996093750,729,1408.7912597656,,, +45.6015625000,729,1399.2674560547,,, +45.6035156250,729,1391.9414062500,,, +45.6054687500,729,1383.1501464844,,, +45.6074218750,729,1375.8242187500,,, +45.6093750000,729,1368.4981689453,,, +45.6113281250,729,1361.1721191406,,, +45.6132812500,729,1354.5787353516,,, +45.6152343750,729,1347.2528076172,,, +45.6171875000,729,1342.1245117188,,, +45.6191406250,729,1336.9963378906,,, +45.6210937500,729,1332.6007080078,,, +45.6230468750,729,1326.7398681641,,, +45.6250000000,730,1322.3443603516,,, +45.6269531250,730,1317.9487304688,,, +45.6289062500,730,1314.2857666016,,, +45.6308593750,730,1310.6226806641,,, +45.6328125000,730,1306.9597167969,,, +45.6347656250,730,1303.2967529297,,, +45.6367187500,730,1300.3663330078,,, +45.6386718750,730,1297.4359130859,,, +45.6406250000,730,1293.7729492188,,, +45.6425781250,730,1292.3077392578,,, +45.6445312500,730,1290.1098632812,,, +45.6464843750,730,1289.3773193359,,, +45.6484375000,730,1287.9121093750,,, +45.6503906250,730,1286.4468994141,,, +45.6523437500,730,1284.9816894531,,, +45.6542968750,730,1282.7839355469,,, +45.6562500000,730,1281.3187255859,,, +45.6582031250,730,1280.5860595703,,, +45.6601562500,730,1279.8535156250,,, +45.6621093750,730,1278.3883056641,,, +45.6640625000,730,1279.1208496094,,, +45.6660156250,730,1276.9230957031,,, +45.6679687500,730,1276.9230957031,,, +45.6699218750,730,1276.9230957031,,, +45.6718750000,730,1276.1904296875,,, +45.6738281250,730,1276.9230957031,,, +45.6757812500,730,1276.9230957031,,, +45.6777343750,730,1276.1904296875,,, +45.6796875000,730,1276.9230957031,,, +45.6816406250,730,1277.6556396484,,, +45.6835937500,730,1277.6556396484,,, +45.6855468750,730,1279.1208496094,,, +45.6875000000,731,1280.5860595703,,, +45.6894531250,731,1282.0512695312,,, +45.6914062500,731,1284.9816894531,,, +45.6933593750,731,1286.4468994141,,, +45.6953125000,731,1290.1098632812,,, +45.6972656250,731,1293.0402832031,,, +45.6992187500,731,1295.2380371094,,, +45.7011718750,731,1299.6336669922,,, +45.7031250000,731,1303.2967529297,,, +45.7050781250,731,1307.6922607422,,, +45.7070312500,731,1312.0878906250,,, +45.7089843750,731,1315.7509765625,,, +45.7109375000,731,1320.8791503906,,, +45.7128906250,731,1323.8095703125,,, +45.7148437500,731,1329.6702880859,,, +45.7167968750,731,1333.3333740234,,, +45.7187500000,731,1336.9963378906,,, +45.7207031250,731,1341.3919677734,,, +45.7226562500,731,1345.7875976562,,, +45.7246093750,731,1350.9157714844,,, +45.7265625000,731,1353.8461914062,,, +45.7285156250,731,1359.7069091797,,, +45.7304687500,731,1364.1025390625,,, +45.7324218750,731,1368.4981689453,,, +45.7343750000,731,1373.6263427734,,, +45.7363281250,731,1378.0219726562,,, +45.7382812500,731,1382.4176025391,,, +45.7402343750,731,1387.5457763672,,, +45.7421875000,731,1391.2087402344,,, +45.7441406250,731,1396.3370361328,,, +45.7460937500,731,1399.2674560547,,, +45.7480468750,731,1403.6629638672,,, +45.7500000000,732,1406.5933837891,,, +45.7519531250,732,1410.2564697266,,, +45.7539062500,732,1413.9194335938,,, +45.7558593750,732,1416.1171875000,,, +45.7578125000,732,1419.0476074219,,, +45.7597656250,732,1420.5128173828,,, +45.7617187500,732,1423.4432373047,,, +45.7636718750,732,1424.1757812500,,, +45.7656250000,732,1427.1062011719,,, +45.7675781250,732,1427.8388671875,,, +45.7695312500,732,1429.3040771484,,, +45.7714843750,732,1430.0366210938,,, +45.7734375000,732,1431.5018310547,,, +45.7753906250,732,1430.7692871094,,, +45.7773437500,732,1432.2343750000,,, +45.7792968750,732,1431.5018310547,,, +45.7812500000,732,1431.5018310547,,, +45.7832031250,732,1431.5018310547,,, +45.7851562500,732,1430.0366210938,,, +45.7871093750,732,1429.3040771484,,, +45.7890625000,732,1427.1062011719,,, +45.7910156250,732,1427.8388671875,,, +45.7929687500,732,1426.3736572266,,, +45.7949218750,732,1425.6409912109,,, +45.7968750000,732,1424.1757812500,,, +45.7988281250,732,1421.9780273438,,, +45.8007812500,732,1420.5128173828,,, +45.8027343750,732,1417.5823974609,,, +45.8046875000,732,1416.1171875000,,, +45.8066406250,732,1413.9194335938,,, +45.8085937500,732,1411.7215576172,,, +45.8105468750,732,1408.0585937500,,, +45.8125000000,733,1405.8608398438,,, +45.8144531250,733,1404.3956298828,,, +45.8164062500,733,1401.4652099609,,, +45.8183593750,733,1399.2674560547,,, +45.8203125000,733,1394.8718261719,,, +45.8222656250,733,1391.9414062500,,, +45.8242187500,733,1391.2087402344,,, +45.8261718750,733,1387.5457763672,,, +45.8281250000,733,1385.3480224609,,, +45.8300781250,733,1382.4176025391,,, +45.8320312500,733,1378.7546386719,,, +45.8339843750,733,1377.2894287109,,, +45.8359375000,733,1372.8937988281,,, +45.8378906250,733,1369.9633789062,,, +45.8398437500,733,1367.0329589844,,, +45.8417968750,733,1363.3699951172,,, +45.8437500000,733,1361.1721191406,,, +45.8457031250,733,1357.5091552734,,, +45.8476562500,733,1354.5787353516,,, +45.8496093750,733,1352.3809814453,,, +45.8515625000,733,1348.7178955078,,, +45.8535156250,733,1347.2528076172,,, +45.8554687500,733,1344.3223876953,,, +45.8574218750,733,1341.3919677734,,, +45.8593750000,733,1339.1940917969,,, +45.8613281250,733,1335.5311279297,,, +45.8632812500,733,1334.7985839844,,, +45.8652343750,733,1331.8681640625,,, +45.8671875000,733,1328.2050781250,,, +45.8691406250,733,1326.0073242188,,, +45.8710937500,733,1323.8095703125,,, +45.8730468750,733,1322.3443603516,,, +45.8750000000,734,1318.6812744141,,, +45.8769531250,734,1317.2160644531,,, +45.8789062500,734,1314.2857666016,,, +45.8808593750,734,1311.3553466797,,, +45.8828125000,734,1309.8901367188,,, +45.8847656250,734,1306.9597167969,,, +45.8867187500,734,1304.0292968750,,, +45.8886718750,734,1301.0988769531,,, +45.8906250000,734,1297.4359130859,,, +45.8925781250,734,1296.7032470703,,, +45.8945312500,734,1293.7729492188,,, +45.8964843750,734,1293.0402832031,,, +45.8984375000,734,1292.3077392578,,, +45.9003906250,734,1290.8425292969,,, +45.9023437500,734,1290.1098632812,,, +45.9042968750,734,1289.3773193359,,, +45.9062500000,734,1289.3773193359,,, +45.9082031250,734,1288.6446533203,,, +45.9101562500,734,1287.9121093750,,, +45.9121093750,734,1286.4468994141,,, +45.9140625000,734,1286.4468994141,,, +45.9160156250,734,1286.4468994141,,, +45.9179687500,734,1285.7142333984,,, +45.9199218750,734,1286.4468994141,,, +45.9218750000,734,1285.7142333984,,, +45.9238281250,734,1284.2490234375,,, +45.9257812500,734,1284.2490234375,,, +45.9277343750,734,1283.5164794922,,, +45.9296875000,734,1284.9816894531,,, +45.9316406250,734,1284.9816894531,,, +45.9335937500,734,1285.7142333984,,, +45.9355468750,734,1286.4468994141,,, +45.9375000000,735,1285.7142333984,,, +45.9394531250,735,1286.4468994141,,, +45.9414062500,735,1287.1794433594,,, +45.9433593750,735,1287.1794433594,,, +45.9453125000,735,1286.4468994141,,, +45.9472656250,735,1285.7142333984,,, +45.9492187500,735,1286.4468994141,,, +45.9511718750,735,1286.4468994141,,, +45.9531250000,735,1287.9121093750,,, +45.9550781250,735,1287.1794433594,,, +45.9570312500,735,1287.9121093750,,, +45.9589843750,735,1287.9121093750,,, +45.9609375000,735,1287.1794433594,,, +45.9628906250,735,1287.9121093750,,, +45.9648437500,735,1287.1794433594,,, +45.9667968750,735,1287.1794433594,,, +45.9687500000,735,1287.1794433594,,, +45.9707031250,735,1287.1794433594,,, +45.9726562500,735,1287.9121093750,,, +45.9746093750,735,1287.9121093750,,, +45.9765625000,735,1289.3773193359,,, +45.9785156250,735,1289.3773193359,,, +45.9804687500,735,1290.1098632812,,, +45.9824218750,735,1290.1098632812,,, +45.9843750000,735,1289.3773193359,,, +45.9863281250,735,1290.1098632812,,, +45.9882812500,735,1289.3773193359,,, +45.9902343750,735,1290.1098632812,,, +45.9921875000,735,1289.3773193359,,, +45.9941406250,735,1290.1098632812,,, +45.9960937500,735,1290.1098632812,,, +45.9980468750,735,1289.3773193359,,, +46.0000000000,736,1290.1098632812,,, +46.0019531250,736,1288.6446533203,,, +46.0039062500,736,1290.1098632812,,, +46.0058593750,736,1290.1098632812,,, +46.0078125000,736,1290.8425292969,,, +46.0097656250,736,1290.8425292969,,, +46.0117187500,736,1291.5750732422,,, +46.0136718750,736,1291.5750732422,,, +46.0156250000,736,1292.3077392578,,, +46.0175781250,736,1293.7729492188,,, +46.0195312500,736,1293.0402832031,,, +46.0214843750,736,1293.7729492188,,, +46.0234375000,736,1294.5054931641,,, +46.0253906250,736,1294.5054931641,,, +46.0273437500,736,1295.9707031250,,, +46.0292968750,736,1294.5054931641,,, +46.0312500000,736,1296.7032470703,,, +46.0332031250,736,1296.7032470703,,, +46.0351562500,736,1295.9707031250,,, +46.0371093750,736,1297.4359130859,,, +46.0390625000,736,1296.7032470703,,, +46.0410156250,736,1298.9011230469,,, +46.0429687500,736,1298.1684570312,,, +46.0449218750,736,1299.6336669922,,, +46.0468750000,736,1299.6336669922,,, +46.0488281250,736,1299.6336669922,,, +46.0507812500,736,1299.6336669922,,, +46.0527343750,736,1299.6336669922,,, +46.0546875000,736,1300.3663330078,,, +46.0566406250,736,1301.0988769531,,, +46.0585937500,736,1302.5640869141,,, +46.0605468750,736,1302.5640869141,,, +46.0625000000,737,1302.5640869141,,, +46.0644531250,737,1304.0292968750,,, +46.0664062500,737,1304.0292968750,,, +46.0683593750,737,1304.0292968750,,, +46.0703125000,737,1303.2967529297,,, +46.0722656250,737,1301.8315429688,,, +46.0742187500,737,1302.5640869141,,, +46.0761718750,737,1300.3663330078,,, +46.0781250000,737,1301.0988769531,,, +46.0800781250,737,1300.3663330078,,, +46.0820312500,737,1299.6336669922,,, +46.0839843750,737,1299.6336669922,,, +46.0859375000,737,1298.1684570312,,, +46.0878906250,737,1298.9011230469,,, +46.0898437500,737,1297.4359130859,,, +46.0917968750,737,1297.4359130859,,, +46.0937500000,737,1296.7032470703,,, +46.0957031250,737,1295.9707031250,,, +46.0976562500,737,1295.9707031250,,, +46.0996093750,737,1295.2380371094,,, +46.1015625000,737,1295.2380371094,,, +46.1035156250,737,1295.2380371094,,, +46.1054687500,737,1294.5054931641,,, +46.1074218750,737,1294.5054931641,,, +46.1093750000,737,1293.7729492188,,, +46.1113281250,737,1294.5054931641,,, +46.1132812500,737,1294.5054931641,,, +46.1152343750,737,1294.5054931641,,, +46.1171875000,737,1293.7729492188,,, +46.1191406250,737,1293.7729492188,,, +46.1210937500,737,1292.3077392578,,, +46.1230468750,737,1292.3077392578,,, +46.1250000000,738,1290.1098632812,,, +46.1269531250,738,1290.1098632812,,, +46.1289062500,738,1288.6446533203,,, +46.1308593750,738,1287.9121093750,,, +46.1328125000,738,1288.6446533203,,, +46.1347656250,738,1288.6446533203,,, +46.1367187500,738,1289.3773193359,,, +46.1386718750,738,1287.9121093750,,, +46.1406250000,738,1290.1098632812,,, +46.1425781250,738,1289.3773193359,,, +46.1445312500,738,1290.1098632812,,, +46.1464843750,738,1289.3773193359,,, +46.1484375000,738,1288.6446533203,,, +46.1503906250,738,1287.9121093750,,, +46.1523437500,738,1286.4468994141,,, +46.1542968750,738,1287.9121093750,,, +46.1562500000,738,1287.1794433594,,, +46.1582031250,738,1287.9121093750,,, +46.1601562500,738,1287.1794433594,,, +46.1621093750,738,1286.4468994141,,, +46.1640625000,738,1287.1794433594,,, +46.1660156250,738,1286.4468994141,,, +46.1679687500,738,1287.1794433594,,, +46.1699218750,738,1287.1794433594,,, +46.1718750000,738,1287.1794433594,,, +46.1738281250,738,1287.9121093750,,, +46.1757812500,738,1288.6446533203,,, +46.1777343750,738,1289.3773193359,,, +46.1796875000,738,1288.6446533203,,, +46.1816406250,738,1289.3773193359,,, +46.1835937500,738,1289.3773193359,,, +46.1855468750,738,1288.6446533203,,, +46.1875000000,739,1287.9121093750,,, +46.1894531250,739,1287.9121093750,,, +46.1914062500,739,1287.9121093750,,, +46.1933593750,739,1286.4468994141,,, +46.1953125000,739,1286.4468994141,,, +46.1972656250,739,1286.4468994141,,, +46.1992187500,739,1285.7142333984,,, +46.2011718750,739,1286.4468994141,,, +46.2031250000,739,1287.1794433594,,, +46.2050781250,739,1287.1794433594,,, +46.2070312500,739,1287.9121093750,,, +46.2089843750,739,1287.9121093750,,, +46.2109375000,739,1287.1794433594,,, +46.2128906250,739,1287.9121093750,,, +46.2148437500,739,1288.6446533203,,, +46.2167968750,739,1290.1098632812,,, +46.2187500000,739,1290.1098632812,,, +46.2207031250,739,1290.1098632812,,, +46.2226562500,739,1290.8425292969,,, +46.2246093750,739,1290.8425292969,,, +46.2265625000,739,1291.5750732422,,, +46.2285156250,739,1290.8425292969,,, +46.2304687500,739,1291.5750732422,,, +46.2324218750,739,1290.8425292969,,, +46.2343750000,739,1289.3773193359,,, +46.2363281250,739,1290.1098632812,,, +46.2382812500,739,1287.9121093750,,, +46.2402343750,739,1287.9121093750,,, +46.2421875000,739,1287.1794433594,,, +46.2441406250,739,1285.7142333984,,, +46.2460937500,739,1285.7142333984,,, +46.2480468750,739,1284.9816894531,,, +46.2500000000,740,1283.5164794922,,, +46.2519531250,740,1281.3187255859,,, +46.2539062500,740,1280.5860595703,,, +46.2558593750,740,1281.3187255859,,, +46.2578125000,740,1280.5860595703,,, +46.2597656250,740,1279.8535156250,,, +46.2617187500,740,1279.8535156250,,, +46.2636718750,740,1278.3883056641,,, +46.2656250000,740,1278.3883056641,,, +46.2675781250,740,1278.3883056641,,, +46.2695312500,740,1278.3883056641,,, +46.2714843750,740,1279.1208496094,,, +46.2734375000,740,1281.3187255859,,, +46.2753906250,740,1282.7839355469,,, +46.2773437500,740,1285.7142333984,,, +46.2792968750,740,1287.9121093750,,, +46.2812500000,740,1292.3077392578,,, +46.2832031250,740,1295.9707031250,,, +46.2851562500,740,1299.6336669922,,, +46.2871093750,740,1305.4945068359,,, +46.2890625000,740,1311.3553466797,,, +46.2910156250,740,1317.9487304688,,, +46.2929687500,740,1325.2747802734,,, +46.2949218750,740,1334.0659179688,,, +46.2968750000,740,1343.5897216797,,, +46.2988281250,740,1353.8461914062,,, +46.3007812500,740,1364.1025390625,,, +46.3027343750,740,1389.7435302734,,, +46.3046875000,740,1402.9304199219,,, +46.3066406250,740,1416.8498535156,,, +46.3085937500,740,1430.7692871094,,, +46.3105468750,740,1446.8864746094,,, +46.3125000000,741,1461.5384521484,,, +46.3144531250,741,1478.3883056641,,, +46.3164062500,741,1494.5054931641,,, +46.3183593750,741,1512.0878906250,,, +46.3203125000,741,1531.1354980469,,, +46.3222656250,741,1550.1831054688,,, +46.3242187500,741,1568.4981689453,,, +46.3261718750,741,1588.2784423828,,, +46.3281250000,741,1608.0585937500,,, +46.3300781250,741,1627.8388671875,,, +46.3320312500,741,1646.1538085938,,, +46.3339843750,741,1665.2014160156,,, +46.3359375000,741,1684.2490234375,,, +46.3378906250,741,1701.8315429688,,, +46.3398437500,741,1720.8791503906,,, +46.3417968750,741,1739.1940917969,,, +46.3437500000,741,1756.7766113281,,, +46.3457031250,741,1775.8242187500,,, +46.3476562500,741,1792.6739501953,,, +46.3496093750,741,1809.5238037109,,, +46.3515625000,741,1826.3736572266,,, +46.3535156250,741,1842.4908447266,,, +46.3554687500,741,1859.3406982422,,, +46.3574218750,741,1873.9926757812,,, +46.3593750000,741,1887.9121093750,,, +46.3613281250,741,1901.0988769531,,, +46.3632812500,741,1912.8205566406,,, +46.3652343750,741,1923.8095703125,,, +46.3671875000,741,1934.7985839844,,, +46.3691406250,741,1944.3223876953,,, +46.3710937500,741,1953.8461914062,,, +46.3730468750,741,1961.1721191406,,, +46.3750000000,742,1967.7656250000,,, +46.3769531250,742,1974.3590087891,,, +46.3789062500,742,1978.7546386719,,, +46.3808593750,742,1983.8828125000,,, +46.3828125000,742,1986.0805664062,,, +46.3847656250,742,1986.8132324219,,, +46.3867187500,742,1987.5457763672,,, +46.3886718750,742,1986.0805664062,,, +46.3906250000,742,1985.3480224609,,, +46.3925781250,742,1981.6849365234,,, +46.3945312500,742,1978.0219726562,,, +46.3964843750,742,1973.6263427734,,, +46.3984375000,742,1967.7656250000,,, +46.4003906250,742,1961.9047851562,,, +46.4023437500,742,1953.8461914062,,, +46.4042968750,742,1944.3223876953,,, +46.4062500000,742,1936.2637939453,,, +46.4082031250,742,1926.0073242188,,, +46.4101562500,742,1916.4835205078,,, +46.4121093750,742,1906.2270507812,,, +46.4140625000,742,1893.7729492188,,, +46.4160156250,742,1882.7839355469,,, +46.4179687500,742,1870.3297119141,,, +46.4199218750,742,1856.4102783203,,, +46.4218750000,742,1843.2233886719,,, +46.4238281250,742,1829.3040771484,,, +46.4257812500,742,1816.1171875000,,, +46.4277343750,742,1800.7325439453,,, +46.4296875000,742,1786.8132324219,,, +46.4316406250,742,1773.6263427734,,, +46.4335937500,742,1757.5091552734,,, +46.4355468750,742,1742.8571777344,,, +46.4375000000,743,1727.4725341797,,, +46.4394531250,743,1711.3553466797,,, +46.4414062500,743,1697.4359130859,,, +46.4433593750,743,1682.0512695312,,, +46.4453125000,743,1667.3992919922,,, +46.4472656250,743,1653.4798583984,,, +46.4492187500,743,1638.8278808594,,, +46.4511718750,743,1624.1757812500,,, +46.4531250000,743,1610.2564697266,,, +46.4550781250,743,1596.3370361328,,, +46.4570312500,743,1582.4176025391,,, +46.4589843750,743,1567.7656250000,,, +46.4609375000,743,1553.8461914062,,, +46.4628906250,743,1541.3919677734,,, +46.4648437500,743,1528.2050781250,,, +46.4667968750,743,1516.4835205078,,, +46.4687500000,743,1503.2967529297,,, +46.4707031250,743,1491.5750732422,,, +46.4726562500,743,1481.3187255859,,, +46.4746093750,743,1468.8645019531,,, +46.4765625000,743,1457.8754882812,,, +46.4785156250,743,1447.6190185547,,, +46.4804687500,743,1437.3626708984,,, +46.4824218750,743,1429.3040771484,,, +46.4843750000,743,1419.0476074219,,, +46.4863281250,743,1410.2564697266,,, +46.4882812500,743,1403.6629638672,,, +46.4902343750,743,1394.1391601562,,, +46.4921875000,743,1387.5457763672,,, +46.4941406250,743,1380.9523925781,,, +46.4960937500,743,1375.0915527344,,, +46.4980468750,743,1370.6959228516,,, +46.5000000000,744,1364.8352050781,,, +46.5019531250,744,1359.7069091797,,, +46.5039062500,744,1355.3114013672,,, +46.5058593750,744,1350.1831054688,,, +46.5078125000,744,1346.5201416016,,, +46.5097656250,744,1342.8571777344,,, +46.5117187500,744,1338.4615478516,,, +46.5136718750,744,1335.5311279297,,, +46.5156250000,744,1331.1354980469,,, +46.5175781250,744,1328.9377441406,,, +46.5195312500,744,1325.2747802734,,, +46.5214843750,744,1323.0769042969,,, +46.5234375000,744,1320.8791503906,,, +46.5253906250,744,1318.6812744141,,, +46.5273437500,744,1317.2160644531,,, +46.5292968750,744,1315.7509765625,,, +46.5312500000,744,1313.5531005859,,, +46.5332031250,744,1312.0878906250,,, +46.5351562500,744,1310.6226806641,,, +46.5371093750,744,1309.1574707031,,, +46.5390625000,744,1307.6922607422,,, +46.5410156250,744,1306.2270507812,,, +46.5429687500,744,1304.7619628906,,, +46.5449218750,744,1303.2967529297,,, +46.5468750000,744,1301.8315429688,,, +46.5488281250,744,1301.8315429688,,, +46.5507812500,744,1299.6336669922,,, +46.5527343750,744,1298.9011230469,,, +46.5546875000,744,1298.9011230469,,, +46.5566406250,744,1298.9011230469,,, +46.5585937500,744,1298.9011230469,,, +46.5605468750,744,1298.1684570312,,, +46.5625000000,745,1297.4359130859,,, +46.5644531250,745,1298.1684570312,,, +46.5664062500,745,1297.4359130859,,, +46.5683593750,745,1297.4359130859,,, +46.5703125000,745,1297.4359130859,,, +46.5722656250,745,1297.4359130859,,, +46.5742187500,745,1298.1684570312,,, +46.5761718750,745,1298.1684570312,,, +46.5781250000,745,1298.9011230469,,, +46.5800781250,745,1300.3663330078,,, +46.5820312500,745,1300.3663330078,,, +46.5839843750,745,1300.3663330078,,, +46.5859375000,745,1302.5640869141,,, +46.5878906250,745,1303.2967529297,,, +46.5898437500,745,1306.2270507812,,, +46.5917968750,745,1307.6922607422,,, +46.5937500000,745,1309.8901367188,,, +46.5957031250,745,1312.0878906250,,, +46.5976562500,745,1314.2857666016,,, +46.5996093750,745,1316.4835205078,,, +46.6015625000,745,1318.6812744141,,, +46.6035156250,745,1320.1464843750,,, +46.6054687500,745,1322.3443603516,,, +46.6074218750,745,1323.8095703125,,, +46.6093750000,745,1326.0073242188,,, +46.6113281250,745,1328.9377441406,,, +46.6132812500,745,1331.1354980469,,, +46.6152343750,745,1334.0659179688,,, +46.6171875000,745,1337.7288818359,,, +46.6191406250,745,1339.9267578125,,, +46.6210937500,745,1342.8571777344,,, +46.6230468750,745,1345.0549316406,,, +46.6250000000,746,1347.9853515625,,, +46.6269531250,746,1350.9157714844,,, +46.6289062500,746,1353.8461914062,,, +46.6308593750,746,1356.7766113281,,, +46.6328125000,746,1361.1721191406,,, +46.6347656250,746,1364.8352050781,,, +46.6367187500,746,1367.0329589844,,, +46.6386718750,746,1371.4285888672,,, +46.6406250000,746,1371.4285888672,,, +46.6425781250,746,1375.8242187500,,, +46.6445312500,746,1378.0219726562,,, +46.6464843750,746,1380.2197265625,,, +46.6484375000,746,1383.8828125000,,, +46.6503906250,746,1385.3480224609,,, +46.6523437500,746,1386.8132324219,,, +46.6542968750,746,1389.7435302734,,, +46.6562500000,746,1390.4761962891,,, +46.6582031250,746,1391.2087402344,,, +46.6601562500,746,1393.4066162109,,, +46.6621093750,746,1394.1391601562,,, +46.6640625000,746,1394.8718261719,,, +46.6660156250,746,1395.6043701172,,, +46.6679687500,746,1395.6043701172,,, +46.6699218750,746,1397.0695800781,,, +46.6718750000,746,1397.0695800781,,, +46.6738281250,746,1396.3370361328,,, +46.6757812500,746,1396.3370361328,,, +46.6777343750,746,1394.8718261719,,, +46.6796875000,746,1394.1391601562,,, +46.6816406250,746,1392.6739501953,,, +46.6835937500,746,1389.7435302734,,, +46.6855468750,746,1389.0109863281,,, +46.6875000000,747,1387.5457763672,,, +46.6894531250,747,1385.3480224609,,, +46.6914062500,747,1382.4176025391,,, +46.6933593750,747,1380.2197265625,,, +46.6953125000,747,1378.0219726562,,, +46.6972656250,747,1375.8242187500,,, +46.6992187500,747,1372.8937988281,,, +46.7011718750,747,1370.6959228516,,, +46.7031250000,747,1368.4981689453,,, +46.7050781250,747,1367.0329589844,,, +46.7070312500,747,1364.8352050781,,, +46.7089843750,747,1361.9047851562,,, +46.7109375000,747,1361.1721191406,,, +46.7128906250,747,1359.7069091797,,, +46.7148437500,747,1357.5091552734,,, +46.7167968750,747,1355.3114013672,,, +46.7187500000,747,1353.1135253906,,, +46.7207031250,747,1350.9157714844,,, +46.7226562500,747,1349.4505615234,,, +46.7246093750,747,1346.5201416016,,, +46.7265625000,747,1343.5897216797,,, +46.7285156250,747,1340.6593017578,,, +46.7304687500,747,1337.7288818359,,, +46.7324218750,747,1334.7985839844,,, +46.7343750000,747,1331.1354980469,,, +46.7363281250,747,1327.4725341797,,, +46.7382812500,747,1325.2747802734,,, +46.7402343750,747,1321.6116943359,,, +46.7421875000,747,1319.4139404297,,, +46.7441406250,747,1315.7509765625,,, +46.7460937500,747,1312.0878906250,,, +46.7480468750,747,1309.8901367188,,, +46.7500000000,748,1306.2270507812,,, +46.7519531250,748,1304.7619628906,,, +46.7539062500,748,1301.0988769531,,, +46.7558593750,748,1298.9011230469,,, +46.7578125000,748,1296.7032470703,,, +46.7597656250,748,1293.7729492188,,, +46.7617187500,748,1293.0402832031,,, +46.7636718750,748,1290.8425292969,,, +46.7656250000,748,1289.3773193359,,, +46.7675781250,748,1288.6446533203,,, +46.7695312500,748,1285.7142333984,,, +46.7714843750,748,1284.9816894531,,, +46.7734375000,748,1283.5164794922,,, +46.7753906250,748,1282.0512695312,,, +46.7773437500,748,1280.5860595703,,, +46.7792968750,748,1279.8535156250,,, +46.7812500000,748,1279.1208496094,,, +46.7832031250,748,1277.6556396484,,, +46.7851562500,748,1276.9230957031,,, +46.7871093750,748,1275.4578857422,,, +46.7890625000,748,1273.9926757812,,, +46.7910156250,748,1273.9926757812,,, +46.7929687500,748,1272.5274658203,,, +46.7949218750,748,1272.5274658203,,, +46.7968750000,748,1271.7949218750,,, +46.7988281250,748,1270.3297119141,,, +46.8007812500,748,1271.0622558594,,, +46.8027343750,748,1270.3297119141,,, +46.8046875000,748,1270.3297119141,,, +46.8066406250,748,1269.5970458984,,, +46.8085937500,748,1269.5970458984,,, +46.8105468750,748,1270.3297119141,,, +46.8125000000,749,1269.5970458984,,, +46.8144531250,749,1270.3297119141,,, +46.8164062500,749,1269.5970458984,,, +46.8183593750,749,1270.3297119141,,, +46.8203125000,749,1271.7949218750,,, +46.8222656250,749,1271.7949218750,,, +46.8242187500,749,1273.2601318359,,, +46.8261718750,749,1273.2601318359,,, +46.8281250000,749,1273.2601318359,,, +46.8300781250,749,1273.9926757812,,, +46.8320312500,749,1273.9926757812,,, +46.8339843750,749,1276.1904296875,,, +46.8359375000,749,1276.9230957031,,, +46.8378906250,749,1277.6556396484,,, +46.8398437500,749,1279.8535156250,,, +46.8417968750,749,1279.8535156250,,, +46.8437500000,749,1282.0512695312,,, +46.8457031250,749,1283.5164794922,,, +46.8476562500,749,1284.2490234375,,, +46.8496093750,749,1284.9816894531,,, +46.8515625000,749,1284.9816894531,,, +46.8535156250,749,1285.7142333984,,, +46.8554687500,749,1286.4468994141,,, +46.8574218750,749,1285.7142333984,,, +46.8593750000,749,1286.4468994141,,, +46.8613281250,749,1287.1794433594,,, +46.8632812500,749,1287.9121093750,,, +46.8652343750,749,1287.1794433594,,, +46.8671875000,749,1287.1794433594,,, +46.8691406250,749,1288.6446533203,,, +46.8710937500,749,1287.1794433594,,, +46.8730468750,749,1286.4468994141,,, +46.8750000000,750,1286.4468994141,,, +46.8769531250,750,1285.7142333984,,, +46.8789062500,750,1286.4468994141,,, +46.8808593750,750,1284.2490234375,,, +46.8828125000,750,1283.5164794922,,, +46.8847656250,750,1283.5164794922,,, +46.8867187500,750,1282.7839355469,,, +46.8886718750,750,1283.5164794922,,, +46.8906250000,750,1282.7839355469,,, +46.8925781250,750,1282.0512695312,,, +46.8945312500,750,1282.0512695312,,, +46.8964843750,750,1282.7839355469,,, +46.8984375000,750,1280.5860595703,,, +46.9003906250,750,1281.3187255859,,, +46.9023437500,750,1280.5860595703,,, +46.9042968750,750,1281.3187255859,,, +46.9062500000,750,1280.5860595703,,, +46.9082031250,750,1281.3187255859,,, +46.9101562500,750,1281.3187255859,,, +46.9121093750,750,1280.5860595703,,, +46.9140625000,750,1281.3187255859,,, +46.9160156250,750,1281.3187255859,,, +46.9179687500,750,1281.3187255859,,, +46.9199218750,750,1281.3187255859,,, +46.9218750000,750,1280.5860595703,,, +46.9238281250,750,1281.3187255859,,, +46.9257812500,750,1279.8535156250,,, +46.9277343750,750,1279.8535156250,,, +46.9296875000,750,1279.1208496094,,, +46.9316406250,750,1279.8535156250,,, +46.9335937500,750,1279.1208496094,,, +46.9355468750,750,1279.1208496094,,, +46.9375000000,751,1278.3883056641,,, +46.9394531250,751,1279.1208496094,,, +46.9414062500,751,1277.6556396484,,, +46.9433593750,751,1278.3883056641,,, +46.9453125000,751,1277.6556396484,,, +46.9472656250,751,1278.3883056641,,, +46.9492187500,751,1278.3883056641,,, +46.9511718750,751,1279.8535156250,,, +46.9531250000,751,1279.8535156250,,, +46.9550781250,751,1281.3187255859,,, +46.9570312500,751,1282.0512695312,,, +46.9589843750,751,1282.7839355469,,, +46.9609375000,751,1282.7839355469,,, +46.9628906250,751,1283.5164794922,,, +46.9648437500,751,1284.2490234375,,, +46.9667968750,751,1284.9816894531,,, +46.9687500000,751,1284.9816894531,,, +46.9707031250,751,1286.4468994141,,, +46.9726562500,751,1286.4468994141,,, +46.9746093750,751,1287.1794433594,,, +46.9765625000,751,1286.4468994141,,, +46.9785156250,751,1286.4468994141,,, +46.9804687500,751,1286.4468994141,,, +46.9824218750,751,1285.7142333984,,, +46.9843750000,751,1286.4468994141,,, +46.9863281250,751,1285.7142333984,,, +46.9882812500,751,1284.9816894531,,, +46.9902343750,751,1284.2490234375,,, +46.9921875000,751,1283.5164794922,,, +46.9941406250,751,1284.2490234375,,, +46.9960937500,751,1283.5164794922,,, +46.9980468750,751,1282.7839355469,,, +47.0000000000,752,1282.7839355469,,, +47.0019531250,752,1282.0512695312,,, +47.0039062500,752,1282.0512695312,,, +47.0058593750,752,1282.0512695312,,, +47.0078125000,752,1282.7839355469,,, +47.0097656250,752,1282.7839355469,,, +47.0117187500,752,1282.0512695312,,, +47.0136718750,752,1282.0512695312,,, +47.0156250000,752,1282.0512695312,,, +47.0175781250,752,1283.5164794922,,, +47.0195312500,752,1283.5164794922,,, +47.0214843750,752,1283.5164794922,,, +47.0234375000,752,1282.7839355469,,, +47.0253906250,752,1282.7839355469,,, +47.0273437500,752,1283.5164794922,,, +47.0292968750,752,1282.7839355469,,, +47.0312500000,752,1283.5164794922,,, +47.0332031250,752,1283.5164794922,,, +47.0351562500,752,1282.0512695312,,, +47.0371093750,752,1282.7839355469,,, +47.0390625000,752,1281.3187255859,,, +47.0410156250,752,1282.7839355469,,, +47.0429687500,752,1282.0512695312,,, +47.0449218750,752,1282.0512695312,,, +47.0468750000,752,1282.7839355469,,, +47.0488281250,752,1283.5164794922,,, +47.0507812500,752,1283.5164794922,,, +47.0527343750,752,1284.9816894531,,, +47.0546875000,752,1284.9816894531,,, +47.0566406250,752,1285.7142333984,,, +47.0585937500,752,1284.2490234375,,, +47.0605468750,752,1284.9816894531,,, +47.0625000000,753,1284.9816894531,,, +47.0644531250,753,1283.5164794922,,, +47.0664062500,753,1284.2490234375,,, +47.0683593750,753,1284.9816894531,,, +47.0703125000,753,1285.7142333984,,, +47.0722656250,753,1284.2490234375,,, +47.0742187500,753,1285.7142333984,,, +47.0761718750,753,1285.7142333984,,, +47.0781250000,753,1285.7142333984,,, +47.0800781250,753,1284.9816894531,,, +47.0820312500,753,1286.4468994141,,, +47.0839843750,753,1286.4468994141,,, +47.0859375000,753,1287.1794433594,,, +47.0878906250,753,1285.7142333984,,, +47.0898437500,753,1287.1794433594,,, +47.0917968750,753,1287.1794433594,,, +47.0937500000,753,1287.9121093750,,, +47.0957031250,753,1287.1794433594,,, +47.0976562500,753,1287.1794433594,,, +47.0996093750,753,1287.9121093750,,, +47.1015625000,753,1287.1794433594,,, +47.1035156250,753,1288.6446533203,,, +47.1054687500,753,1287.1794433594,,, +47.1074218750,753,1288.6446533203,,, +47.1093750000,753,1288.6446533203,,, +47.1113281250,753,1288.6446533203,,, +47.1132812500,753,1289.3773193359,,, +47.1152343750,753,1288.6446533203,,, +47.1171875000,753,1290.1098632812,,, +47.1191406250,753,1290.8425292969,,, +47.1210937500,753,1290.8425292969,,, +47.1230468750,753,1293.0402832031,,, +47.1250000000,754,1293.0402832031,,, +47.1269531250,754,1294.5054931641,,, +47.1289062500,754,1294.5054931641,,, +47.1308593750,754,1293.7729492188,,, +47.1328125000,754,1295.2380371094,,, +47.1347656250,754,1294.5054931641,,, +47.1367187500,754,1296.7032470703,,, +47.1386718750,754,1297.4359130859,,, +47.1406250000,754,1297.4359130859,,, +47.1425781250,754,1297.4359130859,,, +47.1445312500,754,1297.4359130859,,, +47.1464843750,754,1298.1684570312,,, +47.1484375000,754,1297.4359130859,,, +47.1503906250,754,1298.1684570312,,, +47.1523437500,754,1297.4359130859,,, +47.1542968750,754,1296.7032470703,,, +47.1562500000,754,1296.7032470703,,, +47.1582031250,754,1295.9707031250,,, +47.1601562500,754,1295.9707031250,,, +47.1621093750,754,1295.2380371094,,, +47.1640625000,754,1293.7729492188,,, +47.1660156250,754,1293.0402832031,,, +47.1679687500,754,1291.5750732422,,, +47.1699218750,754,1291.5750732422,,, +47.1718750000,754,1290.1098632812,,, +47.1738281250,754,1289.3773193359,,, +47.1757812500,754,1288.6446533203,,, +47.1777343750,754,1287.9121093750,,, +47.1796875000,754,1287.9121093750,,, +47.1816406250,754,1287.1794433594,,, +47.1835937500,754,1286.4468994141,,, +47.1855468750,754,1287.1794433594,,, +47.1875000000,755,1286.4468994141,,, +47.1894531250,755,1286.4468994141,,, +47.1914062500,755,1287.1794433594,,, +47.1933593750,755,1287.9121093750,,, +47.1953125000,755,1291.5750732422,,, +47.1972656250,755,1293.7729492188,,, +47.1992187500,755,1298.1684570312,,, +47.2011718750,755,1303.2967529297,,, +47.2031250000,755,1308.4249267578,,, +47.2050781250,755,1314.2857666016,,, +47.2070312500,755,1323.0769042969,,, +47.2089843750,755,1330.4029541016,,, +47.2109375000,755,1339.9267578125,,, +47.2128906250,755,1349.4505615234,,, +47.2148437500,755,1358.9743652344,,, +47.2167968750,755,1369.9633789062,,, +47.2187500000,755,1381.6849365234,,, +47.2207031250,755,1392.6739501953,,, +47.2226562500,755,1406.5933837891,,, +47.2246093750,755,1419.0476074219,,, +47.2265625000,755,1433.6995849609,,, +47.2285156250,755,1449.0842285156,,, +47.2304687500,755,1464.4688720703,,, +47.2324218750,755,1481.3187255859,,, +47.2343750000,755,1498.1684570312,,, +47.2363281250,755,1498.1684570312,,, +47.2382812500,755,1515.0183105469,,, +47.2402343750,755,1534.0659179688,,, +47.2421875000,755,1551.6483154297,,, +47.2441406250,755,1570.6959228516,,, +47.2460937500,755,1590.4761962891,,, +47.2480468750,755,1609.5238037109,,, +47.2500000000,756,1628.5714111328,,, +47.2519531250,756,1646.8864746094,,, +47.2539062500,756,1665.9340820312,,, +47.2558593750,756,1684.9816894531,,, +47.2578125000,756,1702.5640869141,,, +47.2597656250,756,1719.4139404297,,, +47.2617187500,756,1736.9963378906,,, +47.2636718750,756,1753.8461914062,,, +47.2656250000,756,1770.6959228516,,, +47.2675781250,756,1786.8132324219,,, +47.2695312500,756,1802.1977539062,,, +47.2714843750,756,1817.5823974609,,, +47.2734375000,756,1832.9670410156,,, +47.2753906250,756,1846.1538085938,,, +47.2773437500,756,1859.3406982422,,, +47.2792968750,756,1870.3297119141,,, +47.2812500000,756,1882.0512695312,,, +47.2832031250,756,1892.3077392578,,, +47.2851562500,756,1901.0988769531,,, +47.2871093750,756,1909.8901367188,,, +47.2890625000,756,1916.4835205078,,, +47.2910156250,756,1923.0769042969,,, +47.2929687500,756,1928.9377441406,,, +47.2949218750,756,1934.0659179688,,, +47.2968750000,756,1937.7288818359,,, +47.2988281250,756,1941.3919677734,,, +47.3007812500,756,1943.5897216797,,, +47.3027343750,756,1945.0549316406,,, +47.3046875000,756,1944.3223876953,,, +47.3066406250,756,1942.8571777344,,, +47.3085937500,756,1941.3919677734,,, +47.3105468750,756,1938.4615478516,,, +47.3125000000,757,1934.0659179688,,, +47.3144531250,757,1929.6702880859,,, +47.3164062500,757,1924.5421142578,,, +47.3183593750,757,1918.6812744141,,, +47.3203125000,757,1912.0878906250,,, +47.3222656250,757,1904.0292968750,,, +47.3242187500,757,1895.2380371094,,, +47.3261718750,757,1886.4468994141,,, +47.3281250000,757,1875.4578857422,,, +47.3300781250,757,1865.2014160156,,, +47.3320312500,757,1853.4798583984,,, +47.3339843750,757,1841.7583007812,,, +47.3359375000,757,1830.0366210938,,, +47.3378906250,757,1817.5823974609,,, +47.3398437500,757,1804.3956298828,,, +47.3417968750,757,1792.6739501953,,, +47.3437500000,757,1777.2894287109,,, +47.3457031250,757,1764.1025390625,,, +47.3476562500,757,1749.4505615234,,, +47.3496093750,757,1734.7985839844,,, +47.3515625000,757,1720.1464843750,,, +47.3535156250,757,1704.7619628906,,, +47.3554687500,757,1689.3773193359,,, +47.3574218750,757,1673.9926757812,,, +47.3593750000,757,1660.0732421875,,, +47.3613281250,757,1644.6885986328,,, +47.3632812500,757,1630.7692871094,,, +47.3652343750,757,1615.3846435547,,, +47.3671875000,757,1602.1977539062,,, +47.3691406250,757,1588.2784423828,,, +47.3710937500,757,1575.0915527344,,, +47.3730468750,757,1561.9047851562,,, +47.3750000000,758,1549.4505615234,,, +47.3769531250,758,1536.9963378906,,, +47.3789062500,758,1525.2747802734,,, +47.3808593750,758,1514.2857666016,,, +47.3828125000,758,1503.2967529297,,, +47.3847656250,758,1493.0402832031,,, +47.3867187500,758,1481.3187255859,,, +47.3886718750,758,1472.5274658203,,, +47.3906250000,758,1461.5384521484,,, +47.3925781250,758,1452.7471923828,,, +47.3945312500,758,1444.6885986328,,, +47.3964843750,758,1435.8974609375,,, +47.3984375000,758,1428.5714111328,,, +47.4003906250,758,1419.0476074219,,, +47.4023437500,758,1412.4542236328,,, +47.4042968750,758,1405.1281738281,,, +47.4062500000,758,1398.5347900391,,, +47.4082031250,758,1391.9414062500,,, +47.4101562500,758,1385.3480224609,,, +47.4121093750,758,1378.7546386719,,, +47.4140625000,758,1372.8937988281,,, +47.4160156250,758,1366.3004150391,,, +47.4179687500,758,1361.9047851562,,, +47.4199218750,758,1356.0439453125,,, +47.4218750000,758,1352.3809814453,,, +47.4238281250,758,1347.2528076172,,, +47.4257812500,758,1342.1245117188,,, +47.4277343750,758,1339.1940917969,,, +47.4296875000,758,1334.7985839844,,, +47.4316406250,758,1331.8681640625,,, +47.4335937500,758,1328.9377441406,,, +47.4355468750,758,1325.2747802734,,, +47.4375000000,759,1323.8095703125,,, +47.4394531250,759,1321.6116943359,,, +47.4414062500,759,1319.4139404297,,, +47.4433593750,759,1317.9487304688,,, +47.4453125000,759,1315.0183105469,,, +47.4472656250,759,1314.2857666016,,, +47.4492187500,759,1312.8205566406,,, +47.4511718750,759,1311.3553466797,,, +47.4531250000,759,1309.1574707031,,, +47.4550781250,759,1307.6922607422,,, +47.4570312500,759,1306.2270507812,,, +47.4589843750,759,1305.4945068359,,, +47.4609375000,759,1304.0292968750,,, +47.4628906250,759,1303.2967529297,,, +47.4648437500,759,1303.2967529297,,, +47.4667968750,759,1301.8315429688,,, +47.4687500000,759,1300.3663330078,,, +47.4707031250,759,1299.6336669922,,, +47.4726562500,759,1298.1684570312,,, +47.4746093750,759,1297.4359130859,,, +47.4765625000,759,1297.4359130859,,, +47.4785156250,759,1295.9707031250,,, +47.4804687500,759,1296.7032470703,,, +47.4824218750,759,1296.7032470703,,, +47.4843750000,759,1296.7032470703,,, +47.4863281250,759,1296.7032470703,,, +47.4882812500,759,1296.7032470703,,, +47.4902343750,759,1295.2380371094,,, +47.4921875000,759,1296.7032470703,,, +47.4941406250,759,1295.9707031250,,, +47.4960937500,759,1295.9707031250,,, +47.4980468750,759,1295.9707031250,,, +47.5000000000,760,1295.9707031250,,, +47.5019531250,760,1297.4359130859,,, +47.5039062500,760,1297.4359130859,,, +47.5058593750,760,1297.4359130859,,, +47.5078125000,760,1299.6336669922,,, +47.5097656250,760,1300.3663330078,,, +47.5117187500,760,1301.8315429688,,, +47.5136718750,760,1304.0292968750,,, +47.5156250000,760,1304.0292968750,,, +47.5175781250,760,1305.4945068359,,, +47.5195312500,760,1307.6922607422,,, +47.5214843750,760,1309.1574707031,,, +47.5234375000,760,1312.0878906250,,, +47.5253906250,760,1313.5531005859,,, +47.5273437500,760,1315.7509765625,,, +47.5292968750,760,1319.4139404297,,, +47.5312500000,760,1322.3443603516,,, +47.5332031250,760,1325.2747802734,,, +47.5351562500,760,1327.4725341797,,, +47.5371093750,760,1330.4029541016,,, +47.5390625000,760,1332.6007080078,,, +47.5410156250,760,1334.7985839844,,, +47.5429687500,760,1336.9963378906,,, +47.5449218750,760,1339.9267578125,,, +47.5468750000,760,1342.1245117188,,, +47.5488281250,760,1343.5897216797,,, +47.5507812500,760,1346.5201416016,,, +47.5527343750,760,1347.2528076172,,, +47.5546875000,760,1348.7178955078,,, +47.5566406250,760,1351.6483154297,,, +47.5585937500,760,1353.1135253906,,, +47.5605468750,760,1354.5787353516,,, +47.5625000000,761,1356.7766113281,,, +47.5644531250,761,1358.9743652344,,, +47.5664062500,761,1361.1721191406,,, +47.5683593750,761,1362.6373291016,,, +47.5703125000,761,1364.1025390625,,, +47.5722656250,761,1367.0329589844,,, +47.5742187500,761,1369.2307128906,,, +47.5761718750,761,1369.9633789062,,, +47.5781250000,761,1372.1611328125,,, +47.5800781250,761,1373.6263427734,,, +47.5820312500,761,1374.3590087891,,, +47.5839843750,761,1376.5567626953,,, +47.5859375000,761,1376.5567626953,,, +47.5878906250,761,1375.8242187500,,, +47.5898437500,761,1376.5567626953,,, +47.5917968750,761,1376.5567626953,,, +47.5937500000,761,1375.0915527344,,, +47.5957031250,761,1374.3590087891,,, +47.5976562500,761,1373.6263427734,,, +47.5996093750,761,1372.8937988281,,, +47.6015625000,761,1372.1611328125,,, +47.6035156250,761,1369.9633789062,,, +47.6054687500,761,1367.7656250000,,, +47.6074218750,761,1364.8352050781,,, +47.6093750000,761,1361.9047851562,,, +47.6113281250,761,1359.7069091797,,, +47.6132812500,761,1356.7766113281,,, +47.6152343750,761,1354.5787353516,,, +47.6171875000,761,1352.3809814453,,, +47.6191406250,761,1349.4505615234,,, +47.6210937500,761,1346.5201416016,,, +47.6230468750,761,1342.8571777344,,, +47.6250000000,762,1338.4615478516,,, +47.6269531250,762,1335.5311279297,,, +47.6289062500,762,1332.6007080078,,, +47.6308593750,762,1329.6702880859,,, +47.6328125000,762,1326.7398681641,,, +47.6347656250,762,1323.0769042969,,, +47.6367187500,762,1320.8791503906,,, +47.6386718750,762,1317.2160644531,,, +47.6406250000,762,1313.5531005859,,, +47.6425781250,762,1311.3553466797,,, +47.6445312500,762,1308.4249267578,,, +47.6464843750,762,1306.2270507812,,, +47.6484375000,762,1304.0292968750,,, +47.6503906250,762,1301.0988769531,,, +47.6523437500,762,1298.9011230469,,, +47.6542968750,762,1295.9707031250,,, +47.6562500000,762,1293.7729492188,,, +47.6582031250,762,1290.1098632812,,, +47.6601562500,762,1287.9121093750,,, +47.6621093750,762,1285.7142333984,,, +47.6640625000,762,1282.7839355469,,, +47.6660156250,762,1280.5860595703,,, +47.6679687500,762,1279.1208496094,,, +47.6699218750,762,1276.9230957031,,, +47.6718750000,762,1274.7252197266,,, +47.6738281250,762,1273.2601318359,,, +47.6757812500,762,1271.0622558594,,, +47.6777343750,762,1268.8645019531,,, +47.6796875000,762,1268.1318359375,,, +47.6816406250,762,1266.6666259766,,, +47.6835937500,762,1265.2014160156,,, +47.6855468750,762,1265.2014160156,,, +47.6875000000,763,1264.4688720703,,, +47.6894531250,763,1264.4688720703,,, +47.6914062500,763,1263.7362060547,,, +47.6933593750,763,1263.0036621094,,, +47.6953125000,763,1263.7362060547,,, +47.6972656250,763,1262.2711181641,,, +47.6992187500,763,1264.4688720703,,, +47.7011718750,763,1263.7362060547,,, +47.7031250000,763,1263.7362060547,,, +47.7050781250,763,1264.4688720703,,, +47.7070312500,763,1263.7362060547,,, +47.7089843750,763,1264.4688720703,,, +47.7109375000,763,1263.0036621094,,, +47.7128906250,763,1263.7362060547,,, +47.7148437500,763,1263.7362060547,,, +47.7167968750,763,1263.0036621094,,, +47.7187500000,763,1263.0036621094,,, +47.7207031250,763,1263.0036621094,,, +47.7226562500,763,1263.0036621094,,, +47.7246093750,763,1261.5384521484,,, +47.7265625000,763,1261.5384521484,,, +47.7285156250,763,1260.8059082031,,, +47.7304687500,763,1259.3406982422,,, +47.7324218750,763,1259.3406982422,,, +47.7343750000,763,1259.3406982422,,, +47.7363281250,763,1259.3406982422,,, +47.7382812500,763,1257.8754882812,,, +47.7402343750,763,1257.8754882812,,, +47.7421875000,763,1257.1428222656,,, +47.7441406250,763,1257.8754882812,,, +47.7460937500,763,1257.1428222656,,, +47.7480468750,763,1256.4102783203,,, +47.7500000000,764,1256.4102783203,,, +47.7519531250,764,1256.4102783203,,, +47.7539062500,764,1256.4102783203,,, +47.7558593750,764,1256.4102783203,,, +47.7578125000,764,1255.6776123047,,, +47.7597656250,764,1255.6776123047,,, +47.7617187500,764,1255.6776123047,,, +47.7636718750,764,1255.6776123047,,, +47.7656250000,764,1255.6776123047,,, +47.7675781250,764,1254.9450683594,,, +47.7695312500,764,1254.2124023438,,, +47.7714843750,764,1254.2124023438,,, +47.7734375000,764,1255.6776123047,,, +47.7753906250,764,1255.6776123047,,, +47.7773437500,764,1254.9450683594,,, +47.7792968750,764,1255.6776123047,,, +47.7812500000,764,1255.6776123047,,, +47.7832031250,764,1257.1428222656,,, +47.7851562500,764,1257.8754882812,,, +47.7871093750,764,1258.6080322266,,, +47.7890625000,764,1259.3406982422,,, +47.7910156250,764,1260.0732421875,,, +47.7929687500,764,1260.8059082031,,, +47.7949218750,764,1261.5384521484,,, +47.7968750000,764,1261.5384521484,,, +47.7988281250,764,1262.2711181641,,, +47.8007812500,764,1263.0036621094,,, +47.8027343750,764,1263.0036621094,,, +47.8046875000,764,1264.4688720703,,, +47.8066406250,764,1264.4688720703,,, +47.8085937500,764,1265.9340820312,,, +47.8105468750,764,1266.6666259766,,, +47.8125000000,765,1268.8645019531,,, +47.8144531250,765,1268.8645019531,,, +47.8164062500,765,1270.3297119141,,, +47.8183593750,765,1270.3297119141,,, +47.8203125000,765,1271.7949218750,,, +47.8222656250,765,1272.5274658203,,, +47.8242187500,765,1272.5274658203,,, +47.8261718750,765,1273.9926757812,,, +47.8281250000,765,1274.7252197266,,, +47.8300781250,765,1274.7252197266,,, +47.8320312500,765,1276.9230957031,,, +47.8339843750,765,1276.9230957031,,, +47.8359375000,765,1278.3883056641,,, +47.8378906250,765,1279.8535156250,,, +47.8398437500,765,1281.3187255859,,, +47.8417968750,765,1282.7839355469,,, +47.8437500000,765,1283.5164794922,,, +47.8457031250,765,1284.2490234375,,, +47.8476562500,765,1284.9816894531,,, +47.8496093750,765,1285.7142333984,,, +47.8515625000,765,1285.7142333984,,, +47.8535156250,765,1285.7142333984,,, +47.8554687500,765,1285.7142333984,,, +47.8574218750,765,1285.7142333984,,, +47.8593750000,765,1284.2490234375,,, +47.8613281250,765,1283.5164794922,,, +47.8632812500,765,1283.5164794922,,, +47.8652343750,765,1282.7839355469,,, +47.8671875000,765,1283.5164794922,,, +47.8691406250,765,1283.5164794922,,, +47.8710937500,765,1282.7839355469,,, +47.8730468750,765,1282.7839355469,,, +47.8750000000,766,1283.5164794922,,, +47.8769531250,766,1284.2490234375,,, +47.8789062500,766,1283.5164794922,,, +47.8808593750,766,1283.5164794922,,, +47.8828125000,766,1282.7839355469,,, +47.8847656250,766,1282.0512695312,,, +47.8867187500,766,1282.7839355469,,, +47.8886718750,766,1282.7839355469,,, +47.8906250000,766,1282.7839355469,,, +47.8925781250,766,1282.7839355469,,, +47.8945312500,766,1282.7839355469,,, +47.8964843750,766,1282.7839355469,,, +47.8984375000,766,1282.7839355469,,, +47.9003906250,766,1283.5164794922,,, +47.9023437500,766,1284.2490234375,,, +47.9042968750,766,1283.5164794922,,, +47.9062500000,766,1283.5164794922,,, +47.9082031250,766,1284.9816894531,,, +47.9101562500,766,1284.2490234375,,, +47.9121093750,766,1286.4468994141,,, +47.9140625000,766,1287.1794433594,,, +47.9160156250,766,1287.9121093750,,, +47.9179687500,766,1288.6446533203,,, +47.9199218750,766,1289.3773193359,,, +47.9218750000,766,1290.8425292969,,, +47.9238281250,766,1290.8425292969,,, +47.9257812500,766,1292.3077392578,,, +47.9277343750,766,1292.3077392578,,, +47.9296875000,766,1292.3077392578,,, +47.9316406250,766,1293.7729492188,,, +47.9335937500,766,1293.7729492188,,, +47.9355468750,766,1293.7729492188,,, +47.9375000000,767,1293.7729492188,,, +47.9394531250,767,1293.0402832031,,, +47.9414062500,767,1293.7729492188,,, +47.9433593750,767,1293.0402832031,,, +47.9453125000,767,1292.3077392578,,, +47.9472656250,767,1293.7729492188,,, +47.9492187500,767,1291.5750732422,,, +47.9511718750,767,1290.8425292969,,, +47.9531250000,767,1291.5750732422,,, +47.9550781250,767,1290.8425292969,,, +47.9570312500,767,1290.1098632812,,, +47.9589843750,767,1289.3773193359,,, +47.9609375000,767,1287.9121093750,,, +47.9628906250,767,1287.9121093750,,, +47.9648437500,767,1286.4468994141,,, +47.9667968750,767,1286.4468994141,,, +47.9687500000,767,1287.1794433594,,, +47.9707031250,767,1285.7142333984,,, +47.9726562500,767,1286.4468994141,,, +47.9746093750,767,1286.4468994141,,, +47.9765625000,767,1287.1794433594,,, +47.9785156250,767,1287.9121093750,,, +47.9804687500,767,1287.1794433594,,, +47.9824218750,767,1287.1794433594,,, +47.9843750000,767,1287.1794433594,,, +47.9863281250,767,1285.7142333984,,, +47.9882812500,767,1285.7142333984,,, +47.9902343750,767,1285.7142333984,,, +47.9921875000,767,1284.9816894531,,, +47.9941406250,767,1285.7142333984,,, +47.9960937500,767,1284.2490234375,,, +47.9980468750,767,1284.2490234375,,, +48.0000000000,768,1284.9816894531,,, +48.0019531250,768,1284.2490234375,,, +48.0039062500,768,1284.2490234375,,, +48.0058593750,768,1283.5164794922,,, +48.0078125000,768,1283.5164794922,,, +48.0097656250,768,1282.7839355469,,, +48.0117187500,768,1282.0512695312,,, +48.0136718750,768,1282.7839355469,,, +48.0156250000,768,1282.0512695312,,, +48.0175781250,768,1282.0512695312,,, +48.0195312500,768,1282.0512695312,,, +48.0214843750,768,1282.0512695312,,, +48.0234375000,768,1281.3187255859,,, +48.0253906250,768,1282.7839355469,,, +48.0273437500,768,1282.0512695312,,, +48.0292968750,768,1282.7839355469,,, +48.0312500000,768,1283.5164794922,,, +48.0332031250,768,1284.2490234375,,, +48.0351562500,768,1285.7142333984,,, +48.0371093750,768,1284.9816894531,,, +48.0390625000,768,1284.2490234375,,, +48.0410156250,768,1284.9816894531,,, +48.0429687500,768,1284.2490234375,,, +48.0449218750,768,1284.2490234375,,, +48.0468750000,768,1284.2490234375,,, +48.0488281250,768,1283.5164794922,,, +48.0507812500,768,1284.2490234375,,, +48.0527343750,768,1283.5164794922,,, +48.0546875000,768,1282.7839355469,,, +48.0566406250,768,1284.2490234375,,, +48.0585937500,768,1283.5164794922,,, +48.0605468750,768,1282.0512695312,,, +48.0625000000,769,1282.7839355469,,, +48.0644531250,769,1282.0512695312,,, +48.0664062500,769,1282.0512695312,,, +48.0683593750,769,1282.0512695312,,, +48.0703125000,769,1281.3187255859,,, +48.0722656250,769,1282.0512695312,,, +48.0742187500,769,1281.3187255859,,, +48.0761718750,769,1282.0512695312,,, +48.0781250000,769,1282.0512695312,,, +48.0800781250,769,1280.5860595703,,, +48.0820312500,769,1280.5860595703,,, +48.0839843750,769,1280.5860595703,,, +48.0859375000,769,1279.8535156250,,, +48.0878906250,769,1280.5860595703,,, +48.0898437500,769,1280.5860595703,,, +48.0917968750,769,1281.3187255859,,, +48.0937500000,769,1282.0512695312,,, +48.0957031250,769,1282.0512695312,,, +48.0976562500,769,1283.5164794922,,, +48.0996093750,769,1283.5164794922,,, +48.1015625000,769,1284.2490234375,,, +48.1035156250,769,1285.7142333984,,, +48.1054687500,769,1285.7142333984,,, +48.1074218750,769,1284.9816894531,,, +48.1093750000,769,1285.7142333984,,, +48.1113281250,769,1284.2490234375,,, +48.1132812500,769,1284.9816894531,,, +48.1152343750,769,1284.2490234375,,, +48.1171875000,769,1283.5164794922,,, +48.1191406250,769,1283.5164794922,,, +48.1210937500,769,1283.5164794922,,, +48.1230468750,769,1283.5164794922,,, +48.1250000000,770,1283.5164794922,,, +48.1269531250,770,1282.7839355469,,, +48.1289062500,770,1284.2490234375,,, +48.1308593750,770,1284.2490234375,,, +48.1328125000,770,1283.5164794922,,, +48.1347656250,770,1282.7839355469,,, +48.1367187500,770,1282.7839355469,,, +48.1386718750,770,1282.7839355469,,, +48.1406250000,770,1282.7839355469,,, +48.1425781250,770,1282.0512695312,,, +48.1445312500,770,1283.5164794922,,, +48.1464843750,770,1283.5164794922,,, +48.1484375000,770,1283.5164794922,,, +48.1503906250,770,1285.7142333984,,, +48.1523437500,770,1286.4468994141,,, +48.1542968750,770,1287.9121093750,,, +48.1562500000,770,1290.8425292969,,, +48.1582031250,770,1293.0402832031,,, +48.1601562500,770,1296.7032470703,,, +48.1621093750,770,1299.6336669922,,, +48.1640625000,770,1303.2967529297,,, +48.1660156250,770,1308.4249267578,,, +48.1679687500,770,1312.8205566406,,, +48.1699218750,770,1319.4139404297,,, +48.1718750000,770,1326.0073242188,,, +48.1738281250,770,1342.8571777344,,, +48.1757812500,770,1351.6483154297,,, +48.1777343750,770,1361.9047851562,,, +48.1796875000,770,1372.8937988281,,, +48.1816406250,770,1384.6153564453,,, +48.1835937500,770,1397.8022460938,,, +48.1855468750,770,1411.7215576172,,, +48.1875000000,771,1424.9084472656,,, +48.1894531250,771,1439.5604248047,,, +48.1914062500,771,1454.2124023438,,, +48.1933593750,771,1471.0622558594,,, +48.1953125000,771,1487.1794433594,,, +48.1972656250,771,1504.0292968750,,, +48.1992187500,771,1523.0769042969,,, +48.2011718750,771,1540.6593017578,,, +48.2031250000,771,1558.2416992188,,, +48.2050781250,771,1577.2894287109,,, +48.2070312500,771,1595.6043701172,,, +48.2089843750,771,1614.6519775391,,, +48.2109375000,771,1633.6995849609,,, +48.2128906250,771,1653.4798583984,,, +48.2148437500,771,1672.5274658203,,, +48.2167968750,771,1690.8425292969,,, +48.2187500000,771,1709.1574707031,,, +48.2207031250,771,1728.2050781250,,, +48.2226562500,771,1746.5201416016,,, +48.2246093750,771,1764.1025390625,,, +48.2265625000,771,1780.9523925781,,, +48.2285156250,771,1797.0695800781,,, +48.2304687500,771,1813.1867675781,,, +48.2324218750,771,1828.5714111328,,, +48.2343750000,771,1843.2233886719,,, +48.2363281250,771,1855.6776123047,,, +48.2382812500,771,1868.8645019531,,, +48.2402343750,771,1881.3187255859,,, +48.2421875000,771,1892.3077392578,,, +48.2441406250,771,1902.5640869141,,, +48.2460937500,771,1912.0878906250,,, +48.2480468750,771,1920.1464843750,,, +48.2500000000,772,1926.7398681641,,, +48.2519531250,772,1931.8681640625,,, +48.2539062500,772,1935.5311279297,,, +48.2558593750,772,1939.9267578125,,, +48.2578125000,772,1942.1245117188,,, +48.2597656250,772,1943.5897216797,,, +48.2617187500,772,1942.8571777344,,, +48.2636718750,772,1942.8571777344,,, +48.2656250000,772,1941.3919677734,,, +48.2675781250,772,1938.4615478516,,, +48.2695312500,772,1935.5311279297,,, +48.2714843750,772,1931.8681640625,,, +48.2734375000,772,1925.2747802734,,, +48.2753906250,772,1919.4139404297,,, +48.2773437500,772,1911.3553466797,,, +48.2792968750,772,1903.2967529297,,, +48.2812500000,772,1895.2380371094,,, +48.2832031250,772,1886.4468994141,,, +48.2851562500,772,1875.4578857422,,, +48.2871093750,772,1865.9340820312,,, +48.2890625000,772,1854.2124023438,,, +48.2910156250,772,1842.4908447266,,, +48.2929687500,772,1832.2343750000,,, +48.2949218750,772,1819.7802734375,,, +48.2968750000,772,1807.3260498047,,, +48.2988281250,772,1794.1391601562,,, +48.3007812500,772,1780.9523925781,,, +48.3027343750,772,1768.4981689453,,, +48.3046875000,772,1753.8461914062,,, +48.3066406250,772,1740.6593017578,,, +48.3085937500,772,1727.4725341797,,, +48.3105468750,772,1712.8205566406,,, +48.3125000000,773,1701.0988769531,,, +48.3144531250,773,1687.9121093750,,, +48.3164062500,773,1673.2601318359,,, +48.3183593750,773,1660.8059082031,,, +48.3203125000,773,1647.6190185547,,, +48.3222656250,773,1632.9670410156,,, +48.3242187500,773,1620.5128173828,,, +48.3261718750,773,1606.5933837891,,, +48.3281250000,773,1594.1391601562,,, +48.3300781250,773,1580.9523925781,,, +48.3320312500,773,1567.7656250000,,, +48.3339843750,773,1556.0439453125,,, +48.3359375000,773,1542.8571777344,,, +48.3378906250,773,1531.1354980469,,, +48.3398437500,773,1520.1464843750,,, +48.3417968750,773,1507.6922607422,,, +48.3437500000,773,1495.9707031250,,, +48.3457031250,773,1485.7142333984,,, +48.3476562500,773,1474.7252197266,,, +48.3496093750,773,1464.4688720703,,, +48.3515625000,773,1454.9450683594,,, +48.3535156250,773,1443.9560546875,,, +48.3554687500,773,1435.1647949219,,, +48.3574218750,773,1427.8388671875,,, +48.3593750000,773,1418.3150634766,,, +48.3613281250,773,1410.2564697266,,, +48.3632812500,773,1403.6629638672,,, +48.3652343750,773,1395.6043701172,,, +48.3671875000,773,1389.0109863281,,, +48.3691406250,773,1383.8828125000,,, +48.3710937500,773,1376.5567626953,,, +48.3730468750,773,1370.6959228516,,, +48.3750000000,774,1366.3004150391,,, +48.3769531250,774,1361.1721191406,,, +48.3789062500,774,1356.0439453125,,, +48.3808593750,774,1351.6483154297,,, +48.3828125000,774,1347.9853515625,,, +48.3847656250,774,1343.5897216797,,, +48.3867187500,774,1340.6593017578,,, +48.3886718750,774,1336.2637939453,,, +48.3906250000,774,1331.8681640625,,, +48.3925781250,774,1329.6702880859,,, +48.3945312500,774,1325.2747802734,,, +48.3964843750,774,1321.6116943359,,, +48.3984375000,774,1319.4139404297,,, +48.4003906250,774,1317.2160644531,,, +48.4023437500,774,1313.5531005859,,, +48.4042968750,774,1311.3553466797,,, +48.4062500000,774,1308.4249267578,,, +48.4082031250,774,1306.2270507812,,, +48.4101562500,774,1304.7619628906,,, +48.4121093750,774,1303.2967529297,,, +48.4140625000,774,1301.0988769531,,, +48.4160156250,774,1300.3663330078,,, +48.4179687500,774,1298.9011230469,,, +48.4199218750,774,1298.1684570312,,, +48.4218750000,774,1297.4359130859,,, +48.4238281250,774,1296.7032470703,,, +48.4257812500,774,1295.9707031250,,, +48.4277343750,774,1294.5054931641,,, +48.4296875000,774,1293.7729492188,,, +48.4316406250,774,1293.0402832031,,, +48.4335937500,774,1292.3077392578,,, +48.4355468750,774,1290.8425292969,,, +48.4375000000,775,1290.8425292969,,, +48.4394531250,775,1290.1098632812,,, +48.4414062500,775,1289.3773193359,,, +48.4433593750,775,1290.1098632812,,, +48.4453125000,775,1289.3773193359,,, +48.4472656250,775,1288.6446533203,,, +48.4492187500,775,1289.3773193359,,, +48.4511718750,775,1290.1098632812,,, +48.4531250000,775,1289.3773193359,,, +48.4550781250,775,1291.5750732422,,, +48.4570312500,775,1293.0402832031,,, +48.4589843750,775,1293.7729492188,,, +48.4609375000,775,1295.2380371094,,, +48.4628906250,775,1297.4359130859,,, +48.4648437500,775,1298.1684570312,,, +48.4667968750,775,1300.3663330078,,, +48.4687500000,775,1302.5640869141,,, +48.4707031250,775,1303.2967529297,,, +48.4726562500,775,1306.9597167969,,, +48.4746093750,775,1308.4249267578,,, +48.4765625000,775,1311.3553466797,,, +48.4785156250,775,1314.2857666016,,, +48.4804687500,775,1317.9487304688,,, +48.4824218750,775,1320.1464843750,,, +48.4843750000,775,1323.0769042969,,, +48.4863281250,775,1324.5421142578,,, +48.4882812500,775,1328.2050781250,,, +48.4902343750,775,1330.4029541016,,, +48.4921875000,775,1333.3333740234,,, +48.4941406250,775,1336.2637939453,,, +48.4960937500,775,1338.4615478516,,, +48.4980468750,775,1340.6593017578,,, +48.5000000000,776,1344.3223876953,,, +48.5019531250,776,1346.5201416016,,, +48.5039062500,776,1347.2528076172,,, +48.5058593750,776,1350.1831054688,,, +48.5078125000,776,1351.6483154297,,, +48.5097656250,776,1353.8461914062,,, +48.5117187500,776,1356.0439453125,,, +48.5136718750,776,1358.2416992188,,, +48.5156250000,776,1360.4395751953,,, +48.5175781250,776,1361.9047851562,,, +48.5195312500,776,1364.1025390625,,, +48.5214843750,776,1366.3004150391,,, +48.5234375000,776,1367.7656250000,,, +48.5253906250,776,1368.4981689453,,, +48.5273437500,776,1369.9633789062,,, +48.5292968750,776,1370.6959228516,,, +48.5312500000,776,1371.4285888672,,, +48.5332031250,776,1373.6263427734,,, +48.5351562500,776,1373.6263427734,,, +48.5371093750,776,1373.6263427734,,, +48.5390625000,776,1374.3590087891,,, +48.5410156250,776,1373.6263427734,,, +48.5429687500,776,1374.3590087891,,, +48.5449218750,776,1374.3590087891,,, +48.5468750000,776,1373.6263427734,,, +48.5488281250,776,1373.6263427734,,, +48.5507812500,776,1372.8937988281,,, +48.5527343750,776,1371.4285888672,,, +48.5546875000,776,1370.6959228516,,, +48.5566406250,776,1369.9633789062,,, +48.5585937500,776,1369.2307128906,,, +48.5605468750,776,1367.0329589844,,, +48.5625000000,777,1366.3004150391,,, +48.5644531250,777,1364.8352050781,,, +48.5664062500,777,1363.3699951172,,, +48.5683593750,777,1361.9047851562,,, +48.5703125000,777,1360.4395751953,,, +48.5722656250,777,1360.4395751953,,, +48.5742187500,777,1358.2416992188,,, +48.5761718750,777,1356.0439453125,,, +48.5781250000,777,1353.8461914062,,, +48.5800781250,777,1351.6483154297,,, +48.5820312500,777,1350.9157714844,,, +48.5839843750,777,1347.9853515625,,, +48.5859375000,777,1345.0549316406,,, +48.5878906250,777,1342.8571777344,,, +48.5898437500,777,1339.9267578125,,, +48.5917968750,777,1337.7288818359,,, +48.5937500000,777,1335.5311279297,,, +48.5957031250,777,1331.8681640625,,, +48.5976562500,777,1329.6702880859,,, +48.5996093750,777,1326.7398681641,,, +48.6015625000,777,1324.5421142578,,, +48.6035156250,777,1323.0769042969,,, +48.6054687500,777,1320.1464843750,,, +48.6074218750,777,1317.9487304688,,, +48.6093750000,777,1317.2160644531,,, +48.6113281250,777,1317.2160644531,,, +48.6132812500,777,1315.7509765625,,, +48.6152343750,777,1314.2857666016,,, +48.6171875000,777,1312.0878906250,,, +48.6191406250,777,1310.6226806641,,, +48.6210937500,777,1308.4249267578,,, +48.6230468750,777,1306.2270507812,,, +48.6250000000,778,1305.4945068359,,, +48.6269531250,778,1303.2967529297,,, +48.6289062500,778,1301.8315429688,,, +48.6308593750,778,1300.3663330078,,, +48.6328125000,778,1298.9011230469,,, +48.6347656250,778,1298.1684570312,,, +48.6367187500,778,1295.9707031250,,, +48.6386718750,778,1294.5054931641,,, +48.6406250000,778,1293.0402832031,,, +48.6425781250,778,1291.5750732422,,, +48.6445312500,778,1290.1098632812,,, +48.6464843750,778,1287.9121093750,,, +48.6484375000,778,1287.1794433594,,, +48.6503906250,778,1284.2490234375,,, +48.6523437500,778,1282.7839355469,,, +48.6542968750,778,1280.5860595703,,, +48.6562500000,778,1278.3883056641,,, +48.6582031250,778,1276.1904296875,,, +48.6601562500,778,1273.2601318359,,, +48.6621093750,778,1271.7949218750,,, +48.6640625000,778,1268.8645019531,,, +48.6660156250,778,1268.8645019531,,, +48.6679687500,778,1267.3992919922,,, +48.6699218750,778,1265.2014160156,,, +48.6718750000,778,1265.2014160156,,, +48.6738281250,778,1263.7362060547,,, +48.6757812500,778,1263.7362060547,,, +48.6777343750,778,1262.2711181641,,, +48.6796875000,778,1260.8059082031,,, +48.6816406250,778,1260.0732421875,,, +48.6835937500,778,1259.3406982422,,, +48.6855468750,778,1258.6080322266,,, +48.6875000000,779,1257.1428222656,,, +48.6894531250,779,1257.1428222656,,, +48.6914062500,779,1255.6776123047,,, +48.6933593750,779,1254.9450683594,,, +48.6953125000,779,1254.2124023438,,, +48.6972656250,779,1252.7471923828,,, +48.6992187500,779,1251.2821044922,,, +48.7011718750,779,1250.5494384766,,, +48.7031250000,779,1250.5494384766,,, +48.7050781250,779,1249.0842285156,,, +48.7070312500,779,1249.0842285156,,, +48.7089843750,779,1248.3516845703,,, +48.7109375000,779,1248.3516845703,,, +48.7128906250,779,1247.6190185547,,, +48.7148437500,779,1246.8864746094,,, +48.7167968750,779,1247.6190185547,,, +48.7187500000,779,1246.1538085938,,, +48.7207031250,779,1246.8864746094,,, +48.7226562500,779,1246.1538085938,,, +48.7246093750,779,1246.8864746094,,, +48.7265625000,779,1246.8864746094,,, +48.7285156250,779,1246.8864746094,,, +48.7304687500,779,1248.3516845703,,, +48.7324218750,779,1248.3516845703,,, +48.7343750000,779,1249.8168945312,,, +48.7363281250,779,1250.5494384766,,, +48.7382812500,779,1252.7471923828,,, +48.7402343750,779,1252.7471923828,,, +48.7421875000,779,1254.2124023438,,, +48.7441406250,779,1256.4102783203,,, +48.7460937500,779,1257.8754882812,,, +48.7480468750,779,1260.8059082031,,, +48.7500000000,780,1261.5384521484,,, +48.7519531250,780,1263.7362060547,,, +48.7539062500,780,1265.9340820312,,, +48.7558593750,780,1267.3992919922,,, +48.7578125000,780,1268.1318359375,,, +48.7597656250,780,1268.1318359375,,, +48.7617187500,780,1269.5970458984,,, +48.7636718750,780,1270.3297119141,,, +48.7656250000,780,1271.0622558594,,, +48.7675781250,780,1272.5274658203,,, +48.7695312500,780,1273.2601318359,,, +48.7714843750,780,1274.7252197266,,, +48.7734375000,780,1274.7252197266,,, +48.7753906250,780,1276.1904296875,,, +48.7773437500,780,1276.9230957031,,, +48.7792968750,780,1276.9230957031,,, +48.7812500000,780,1278.3883056641,,, +48.7832031250,780,1277.6556396484,,, +48.7851562500,780,1277.6556396484,,, +48.7871093750,780,1278.3883056641,,, +48.7890625000,780,1278.3883056641,,, +48.7910156250,780,1279.1208496094,,, +48.7929687500,780,1279.8535156250,,, +48.7949218750,780,1279.1208496094,,, +48.7968750000,780,1279.1208496094,,, +48.7988281250,780,1279.8535156250,,, +48.8007812500,780,1279.8535156250,,, +48.8027343750,780,1279.8535156250,,, +48.8046875000,780,1279.8535156250,,, +48.8066406250,780,1279.8535156250,,, +48.8085937500,780,1279.8535156250,,, +48.8105468750,780,1279.8535156250,,, +48.8125000000,781,1279.8535156250,,, +48.8144531250,781,1280.5860595703,,, +48.8164062500,781,1280.5860595703,,, +48.8183593750,781,1280.5860595703,,, +48.8203125000,781,1282.7839355469,,, +48.8222656250,781,1282.0512695312,,, +48.8242187500,781,1281.3187255859,,, +48.8261718750,781,1282.7839355469,,, +48.8281250000,781,1282.0512695312,,, +48.8300781250,781,1281.3187255859,,, +48.8320312500,781,1282.7839355469,,, +48.8339843750,781,1282.0512695312,,, +48.8359375000,781,1282.0512695312,,, +48.8378906250,781,1282.0512695312,,, +48.8398437500,781,1281.3187255859,,, +48.8417968750,781,1282.0512695312,,, +48.8437500000,781,1282.0512695312,,, +48.8457031250,781,1282.0512695312,,, +48.8476562500,781,1282.7839355469,,, +48.8496093750,781,1281.3187255859,,, +48.8515625000,781,1282.7839355469,,, +48.8535156250,781,1283.5164794922,,, +48.8554687500,781,1282.7839355469,,, +48.8574218750,781,1284.2490234375,,, +48.8593750000,781,1283.5164794922,,, +48.8613281250,781,1284.9816894531,,, +48.8632812500,781,1285.7142333984,,, +48.8652343750,781,1286.4468994141,,, +48.8671875000,781,1287.1794433594,,, +48.8691406250,781,1288.6446533203,,, +48.8710937500,781,1290.1098632812,,, +48.8730468750,781,1290.1098632812,,, +48.8750000000,782,1289.3773193359,,, +48.8769531250,782,1289.3773193359,,, +48.8789062500,782,1289.3773193359,,, +48.8808593750,782,1289.3773193359,,, +48.8828125000,782,1288.6446533203,,, +48.8847656250,782,1287.9121093750,,, +48.8867187500,782,1287.9121093750,,, +48.8886718750,782,1287.9121093750,,, +48.8906250000,782,1287.9121093750,,, +48.8925781250,782,1287.1794433594,,, +48.8945312500,782,1287.1794433594,,, +48.8964843750,782,1285.7142333984,,, +48.8984375000,782,1284.9816894531,,, +48.9003906250,782,1284.2490234375,,, +48.9023437500,782,1282.0512695312,,, +48.9042968750,782,1282.0512695312,,, +48.9062500000,782,1280.5860595703,,, +48.9082031250,782,1279.1208496094,,, +48.9101562500,782,1279.1208496094,,, +48.9121093750,782,1277.6556396484,,, +48.9140625000,782,1276.1904296875,,, +48.9160156250,782,1275.4578857422,,, +48.9179687500,782,1273.9926757812,,, +48.9199218750,782,1272.5274658203,,, +48.9218750000,782,1271.0622558594,,, +48.9238281250,782,1269.5970458984,,, +48.9257812500,782,1268.1318359375,,, +48.9277343750,782,1267.3992919922,,, +48.9296875000,782,1266.6666259766,,, +48.9316406250,782,1265.9340820312,,, +48.9335937500,782,1265.9340820312,,, +48.9355468750,782,1265.9340820312,,, +48.9375000000,783,1265.9340820312,,, +48.9394531250,783,1265.9340820312,,, +48.9414062500,783,1265.9340820312,,, +48.9433593750,783,1267.3992919922,,, +48.9453125000,783,1267.3992919922,,, +48.9472656250,783,1266.6666259766,,, +48.9492187500,783,1268.1318359375,,, +48.9511718750,783,1268.1318359375,,, +48.9531250000,783,1268.1318359375,,, +48.9550781250,783,1268.8645019531,,, +48.9570312500,783,1268.1318359375,,, +48.9589843750,783,1269.5970458984,,, +48.9609375000,783,1269.5970458984,,, +48.9628906250,783,1271.0622558594,,, +48.9648437500,783,1272.5274658203,,, +48.9667968750,783,1273.2601318359,,, +48.9687500000,783,1273.9926757812,,, +48.9707031250,783,1275.4578857422,,, +48.9726562500,783,1276.9230957031,,, +48.9746093750,783,1277.6556396484,,, +48.9765625000,783,1279.1208496094,,, +48.9785156250,783,1279.1208496094,,, +48.9804687500,783,1279.1208496094,,, +48.9824218750,783,1280.5860595703,,, +48.9843750000,783,1281.3187255859,,, +48.9863281250,783,1281.3187255859,,, +48.9882812500,783,1282.0512695312,,, +48.9902343750,783,1282.7839355469,,, +48.9921875000,783,1282.0512695312,,, +48.9941406250,783,1282.0512695312,,, +48.9960937500,783,1282.7839355469,,, +48.9980468750,783,1283.5164794922,,, +49.0000000000,784,1283.5164794922,,, +49.0019531250,784,1284.2490234375,,, +49.0039062500,784,1284.2490234375,,, +49.0058593750,784,1284.2490234375,,, +49.0078125000,784,1285.7142333984,,, +49.0097656250,784,1287.1794433594,,, +49.0117187500,784,1287.1794433594,,, +49.0136718750,784,1286.4468994141,,, +49.0156250000,784,1287.1794433594,,, +49.0175781250,784,1287.1794433594,,, +49.0195312500,784,1287.1794433594,,, +49.0214843750,784,1287.9121093750,,, +49.0234375000,784,1287.1794433594,,, +49.0253906250,784,1285.7142333984,,, +49.0273437500,784,1286.4468994141,,, +49.0292968750,784,1285.7142333984,,, +49.0312500000,784,1284.9816894531,,, +49.0332031250,784,1284.2490234375,,, +49.0351562500,784,1283.5164794922,,, +49.0371093750,784,1283.5164794922,,, +49.0390625000,784,1282.7839355469,,, +49.0410156250,784,1282.0512695312,,, +49.0429687500,784,1282.0512695312,,, +49.0449218750,784,1280.5860595703,,, +49.0468750000,784,1279.1208496094,,, +49.0488281250,784,1279.1208496094,,, +49.0507812500,784,1277.6556396484,,, +49.0527343750,784,1277.6556396484,,, +49.0546875000,784,1276.1904296875,,, +49.0566406250,784,1275.4578857422,,, +49.0585937500,784,1275.4578857422,,, +49.0605468750,784,1274.7252197266,,, +49.0625000000,785,1273.9926757812,,, +49.0644531250,785,1273.9926757812,,, +49.0664062500,785,1273.2601318359,,, +49.0683593750,785,1272.5274658203,,, +49.0703125000,785,1272.5274658203,,, +49.0722656250,785,1271.0622558594,,, +49.0742187500,785,1270.3297119141,,, +49.0761718750,785,1271.0622558594,,, +49.0781250000,785,1270.3297119141,,, +49.0800781250,785,1268.8645019531,,, +49.0820312500,785,1268.8645019531,,, +49.0839843750,785,1267.3992919922,,, +49.0859375000,785,1267.3992919922,,, +49.0878906250,785,1265.9340820312,,, +49.0898437500,785,1266.6666259766,,, +49.0917968750,785,1266.6666259766,,, +49.0937500000,785,1265.9340820312,,, +49.0957031250,785,1266.6666259766,,, +49.0976562500,785,1266.6666259766,,, +49.0996093750,785,1266.6666259766,,, +49.1015625000,785,1268.1318359375,,, +49.1035156250,785,1269.5970458984,,, +49.1054687500,785,1271.0622558594,,, +49.1074218750,785,1273.9926757812,,, +49.1093750000,785,1274.7252197266,,, +49.1113281250,785,1277.6556396484,,, +49.1132812500,785,1280.5860595703,,, +49.1152343750,785,1282.7839355469,,, +49.1171875000,785,1287.9121093750,,, +49.1191406250,785,1290.8425292969,,, +49.1210937500,785,1295.9707031250,,, +49.1230468750,785,1301.8315429688,,, +49.1250000000,786,1307.6922607422,,, +49.1269531250,786,1314.2857666016,,, +49.1289062500,786,1322.3443603516,,, +49.1308593750,786,1330.4029541016,,, +49.1328125000,786,1339.1940917969,,, +49.1347656250,786,1349.4505615234,,, +49.1367187500,786,1359.7069091797,,, +49.1386718750,786,1370.6959228516,,, +49.1406250000,786,1383.1501464844,,, +49.1425781250,786,1394.8718261719,,, +49.1445312500,786,1408.0585937500,,, +49.1464843750,786,1421.2453613281,,, +49.1484375000,786,1434.4322509766,,, +49.1503906250,786,1449.8168945312,,, +49.1523437500,786,1465.2014160156,,, +49.1542968750,786,1480.5860595703,,, +49.1562500000,786,1498.1684570312,,, +49.1582031250,786,1515.0183105469,,, +49.1601562500,786,1533.3333740234,,, +49.1621093750,786,1551.6483154297,,, +49.1640625000,786,1570.6959228516,,, +49.1660156250,786,1589.0109863281,,, +49.1679687500,786,1607.3260498047,,, +49.1699218750,786,1627.1062011719,,, +49.1718750000,786,1646.1538085938,,, +49.1738281250,786,1665.2014160156,,, +49.1757812500,786,1682.7839355469,,, +49.1777343750,786,1701.0988769531,,, +49.1796875000,786,1717.9487304688,,, +49.1816406250,786,1734.7985839844,,, +49.1835937500,786,1751.6483154297,,, +49.1855468750,786,1766.3004150391,,, +49.1875000000,787,1783.1501464844,,, +49.1894531250,787,1799.2674560547,,, +49.1914062500,787,1813.9194335938,,, +49.1933593750,787,1827.8388671875,,, +49.1953125000,787,1841.0256347656,,, +49.1972656250,787,1853.4798583984,,, +49.1992187500,787,1865.2014160156,,, +49.2011718750,787,1876.1904296875,,, +49.2031250000,787,1887.1794433594,,, +49.2050781250,787,1895.2380371094,,, +49.2070312500,787,1904.0292968750,,, +49.2089843750,787,1912.0878906250,,, +49.2109375000,787,1918.6812744141,,, +49.2128906250,787,1925.2747802734,,, +49.2148437500,787,1930.4029541016,,, +49.2167968750,787,1934.0659179688,,, +49.2187500000,787,1936.9963378906,,, +49.2207031250,787,1938.4615478516,,, +49.2226562500,787,1938.4615478516,,, +49.2246093750,787,1938.4615478516,,, +49.2265625000,787,1936.9963378906,,, +49.2285156250,787,1934.7985839844,,, +49.2304687500,787,1931.8681640625,,, +49.2324218750,787,1927.4725341797,,, +49.2343750000,787,1921.6116943359,,, +49.2363281250,787,1915.7509765625,,, +49.2382812500,787,1909.1574707031,,, +49.2402343750,787,1900.3663330078,,, +49.2421875000,787,1892.3077392578,,, +49.2441406250,787,1883.5164794922,,, +49.2460937500,787,1873.2601318359,,, +49.2480468750,787,1863.0036621094,,, +49.2500000000,788,1852.0146484375,,, +49.2519531250,788,1838.8278808594,,, +49.2539062500,788,1827.1062011719,,, +49.2558593750,788,1813.9194335938,,, +49.2578125000,788,1800.0000000000,,, +49.2597656250,788,1786.8132324219,,, +49.2617187500,788,1773.6263427734,,, +49.2636718750,788,1758.9743652344,,, +49.2656250000,788,1744.3223876953,,, +49.2675781250,788,1731.1354980469,,, +49.2695312500,788,1715.7509765625,,, +49.2714843750,788,1701.8315429688,,, +49.2734375000,788,1687.9121093750,,, +49.2753906250,788,1673.2601318359,,, +49.2773437500,788,1657.8754882812,,, +49.2792968750,788,1643.9560546875,,, +49.2812500000,788,1628.5714111328,,, +49.2832031250,788,1613.9194335938,,, +49.2851562500,788,1600.0000000000,,, +49.2871093750,788,1585.3480224609,,, +49.2890625000,788,1572.1611328125,,, +49.2910156250,788,1559.7069091797,,, +49.2929687500,788,1545.7875976562,,, +49.2949218750,788,1533.3333740234,,, +49.2968750000,788,1520.8791503906,,, +49.2988281250,788,1509.1574707031,,, +49.3007812500,788,1497.4359130859,,, +49.3027343750,788,1485.7142333984,,, +49.3046875000,788,1473.9926757812,,, +49.3066406250,788,1463.7362060547,,, +49.3085937500,788,1454.2124023438,,, +49.3105468750,788,1443.2233886719,,, +49.3125000000,789,1435.1647949219,,, +49.3144531250,789,1425.6409912109,,, +49.3164062500,789,1417.5823974609,,, +49.3183593750,789,1409.5238037109,,, +49.3203125000,789,1401.4652099609,,, +49.3222656250,789,1395.6043701172,,, +49.3242187500,789,1388.2784423828,,, +49.3261718750,789,1381.6849365234,,, +49.3281250000,789,1376.5567626953,,, +49.3300781250,789,1369.9633789062,,, +49.3320312500,789,1365.5677490234,,, +49.3339843750,789,1359.7069091797,,, +49.3359375000,789,1355.3114013672,,, +49.3378906250,789,1350.9157714844,,, +49.3398437500,789,1345.7875976562,,, +49.3417968750,789,1341.3919677734,,, +49.3437500000,789,1337.7288818359,,, +49.3457031250,789,1334.0659179688,,, +49.3476562500,789,1329.6702880859,,, +49.3496093750,789,1326.7398681641,,, +49.3515625000,789,1323.0769042969,,, +49.3535156250,789,1319.4139404297,,, +49.3554687500,789,1317.2160644531,,, +49.3574218750,789,1313.5531005859,,, +49.3593750000,789,1309.8901367188,,, +49.3613281250,789,1308.4249267578,,, +49.3632812500,789,1304.7619628906,,, +49.3652343750,789,1301.8315429688,,, +49.3671875000,789,1301.0988769531,,, +49.3691406250,789,1298.1684570312,,, +49.3710937500,789,1297.4359130859,,, +49.3730468750,789,1295.2380371094,,, +49.3750000000,790,1293.7729492188,,, +49.3769531250,790,1293.0402832031,,, +49.3789062500,790,1291.5750732422,,, +49.3808593750,790,1290.1098632812,,, +49.3828125000,790,1289.3773193359,,, +49.3847656250,790,1288.6446533203,,, +49.3867187500,790,1286.4468994141,,, +49.3886718750,790,1286.4468994141,,, +49.3906250000,790,1285.7142333984,,, +49.3925781250,790,1284.2490234375,,, +49.3945312500,790,1284.2490234375,,, +49.3964843750,790,1284.2490234375,,, +49.3984375000,790,1284.2490234375,,, +49.4003906250,790,1284.9816894531,,, +49.4023437500,790,1284.9816894531,,, +49.4042968750,790,1284.2490234375,,, +49.4062500000,790,1286.4468994141,,, +49.4082031250,790,1286.4468994141,,, +49.4101562500,790,1287.1794433594,,, +49.4121093750,790,1288.6446533203,,, +49.4140625000,790,1289.3773193359,,, +49.4160156250,790,1290.8425292969,,, +49.4179687500,790,1293.0402832031,,, +49.4199218750,790,1293.7729492188,,, +49.4218750000,790,1293.7729492188,,, +49.4238281250,790,1295.9707031250,,, +49.4257812500,790,1298.9011230469,,, +49.4277343750,790,1301.0988769531,,, +49.4296875000,790,1303.2967529297,,, +49.4316406250,790,1305.4945068359,,, +49.4335937500,790,1307.6922607422,,, +49.4355468750,790,1309.8901367188,,, +49.4375000000,791,1312.8205566406,,, +49.4394531250,791,1315.7509765625,,, +49.4414062500,791,1317.9487304688,,, +49.4433593750,791,1320.8791503906,,, +49.4453125000,791,1323.0769042969,,, +49.4472656250,791,1325.2747802734,,, +49.4492187500,791,1328.9377441406,,, +49.4511718750,791,1331.1354980469,,, +49.4531250000,791,1333.3333740234,,, +49.4550781250,791,1337.7288818359,,, +49.4570312500,791,1339.1940917969,,, +49.4589843750,791,1342.1245117188,,, +49.4609375000,791,1345.0549316406,,, +49.4628906250,791,1346.5201416016,,, +49.4648437500,791,1348.7178955078,,, +49.4667968750,791,1352.3809814453,,, +49.4687500000,791,1354.5787353516,,, +49.4707031250,791,1356.7766113281,,, +49.4726562500,791,1358.9743652344,,, +49.4746093750,791,1361.1721191406,,, +49.4765625000,791,1364.8352050781,,, +49.4785156250,791,1367.0329589844,,, +49.4804687500,791,1368.4981689453,,, +49.4824218750,791,1371.4285888672,,, +49.4843750000,791,1372.8937988281,,, +49.4863281250,791,1375.8242187500,,, +49.4882812500,791,1376.5567626953,,, +49.4902343750,791,1377.2894287109,,, +49.4921875000,791,1379.4871826172,,, +49.4941406250,791,1380.2197265625,,, +49.4960937500,791,1380.9523925781,,, +49.4980468750,791,1380.9523925781,,, +49.5000000000,792,1380.9523925781,,, +49.5019531250,792,1380.9523925781,,, +49.5039062500,792,1380.9523925781,,, +49.5058593750,792,1380.2197265625,,, +49.5078125000,792,1380.2197265625,,, +49.5097656250,792,1379.4871826172,,, +49.5117187500,792,1380.2197265625,,, +49.5136718750,792,1380.2197265625,,, +49.5156250000,792,1378.0219726562,,, +49.5175781250,792,1377.2894287109,,, +49.5195312500,792,1375.8242187500,,, +49.5214843750,792,1375.8242187500,,, +49.5234375000,792,1374.3590087891,,, +49.5253906250,792,1372.8937988281,,, +49.5273437500,792,1371.4285888672,,, +49.5292968750,792,1369.9633789062,,, +49.5312500000,792,1367.7656250000,,, +49.5332031250,792,1366.3004150391,,, +49.5351562500,792,1363.3699951172,,, +49.5371093750,792,1361.9047851562,,, +49.5390625000,792,1358.9743652344,,, +49.5410156250,792,1356.0439453125,,, +49.5429687500,792,1354.5787353516,,, +49.5449218750,792,1350.9157714844,,, +49.5468750000,792,1348.7178955078,,, +49.5488281250,792,1345.7875976562,,, +49.5507812500,792,1342.8571777344,,, +49.5527343750,792,1339.1940917969,,, +49.5546875000,792,1335.5311279297,,, +49.5566406250,792,1332.6007080078,,, +49.5585937500,792,1329.6702880859,,, +49.5605468750,792,1326.0073242188,,, +49.5625000000,793,1323.0769042969,,, +49.5644531250,793,1320.1464843750,,, +49.5664062500,793,1317.2160644531,,, +49.5683593750,793,1315.0183105469,,, +49.5703125000,793,1311.3553466797,,, +49.5722656250,793,1309.8901367188,,, +49.5742187500,793,1306.2270507812,,, +49.5761718750,793,1304.0292968750,,, +49.5781250000,793,1301.8315429688,,, +49.5800781250,793,1298.1684570312,,, +49.5820312500,793,1295.9707031250,,, +49.5839843750,793,1293.7729492188,,, +49.5859375000,793,1290.8425292969,,, +49.5878906250,793,1287.9121093750,,, +49.5898437500,793,1284.2490234375,,, +49.5917968750,793,1282.0512695312,,, +49.5937500000,793,1278.3883056641,,, +49.5957031250,793,1276.1904296875,,, +49.5976562500,793,1273.2601318359,,, +49.5996093750,793,1270.3297119141,,, +49.6015625000,793,1268.8645019531,,, +49.6035156250,793,1265.9340820312,,, +49.6054687500,793,1263.0036621094,,, +49.6074218750,793,1261.5384521484,,, +49.6093750000,793,1257.1428222656,,, +49.6113281250,793,1255.6776123047,,, +49.6132812500,793,1253.4798583984,,, +49.6152343750,793,1252.7471923828,,, +49.6171875000,793,1252.0146484375,,, +49.6191406250,793,1250.5494384766,,, +49.6210937500,793,1249.0842285156,,, +49.6230468750,793,1248.3516845703,,, +49.6250000000,794,1247.6190185547,,, +49.6269531250,794,1246.8864746094,,, +49.6289062500,794,1246.1538085938,,, +49.6308593750,794,1245.4212646484,,, +49.6328125000,794,1243.9560546875,,, +49.6347656250,794,1243.9560546875,,, +49.6367187500,794,1243.9560546875,,, +49.6386718750,794,1242.4908447266,,, +49.6406250000,794,1242.4908447266,,, +49.6425781250,794,1243.2233886719,,, +49.6445312500,794,1242.4908447266,,, +49.6464843750,794,1242.4908447266,,, +49.6484375000,794,1243.9560546875,,, +49.6503906250,794,1244.6885986328,,, +49.6523437500,794,1244.6885986328,,, +49.6542968750,794,1246.1538085938,,, +49.6562500000,794,1248.3516845703,,, +49.6582031250,794,1248.3516845703,,, +49.6601562500,794,1249.8168945312,,, +49.6621093750,794,1251.2821044922,,, +49.6640625000,794,1251.2821044922,,, +49.6660156250,794,1254.2124023438,,, +49.6679687500,794,1255.6776123047,,, +49.6699218750,794,1257.1428222656,,, +49.6718750000,794,1258.6080322266,,, +49.6738281250,794,1260.8059082031,,, +49.6757812500,794,1262.2711181641,,, +49.6777343750,794,1263.0036621094,,, +49.6796875000,794,1265.9340820312,,, +49.6816406250,794,1266.6666259766,,, +49.6835937500,794,1267.3992919922,,, +49.6855468750,794,1269.5970458984,,, +49.6875000000,795,1270.3297119141,,, +49.6894531250,795,1271.0622558594,,, +49.6914062500,795,1272.5274658203,,, +49.6933593750,795,1272.5274658203,,, +49.6953125000,795,1273.2601318359,,, +49.6972656250,795,1274.7252197266,,, +49.6992187500,795,1275.4578857422,,, +49.7011718750,795,1276.1904296875,,, +49.7031250000,795,1277.6556396484,,, +49.7050781250,795,1278.3883056641,,, +49.7070312500,795,1277.6556396484,,, +49.7089843750,795,1279.8535156250,,, +49.7109375000,795,1279.8535156250,,, +49.7128906250,795,1279.1208496094,,, +49.7148437500,795,1279.8535156250,,, +49.7167968750,795,1279.8535156250,,, +49.7187500000,795,1279.8535156250,,, +49.7207031250,795,1280.5860595703,,, +49.7226562500,795,1281.3187255859,,, +49.7246093750,795,1281.3187255859,,, +49.7265625000,795,1283.5164794922,,, +49.7285156250,795,1283.5164794922,,, +49.7304687500,795,1283.5164794922,,, +49.7324218750,795,1285.7142333984,,, +49.7343750000,795,1285.7142333984,,, +49.7363281250,795,1286.4468994141,,, +49.7382812500,795,1287.9121093750,,, +49.7402343750,795,1289.3773193359,,, +49.7421875000,795,1290.1098632812,,, +49.7441406250,795,1291.5750732422,,, +49.7460937500,795,1293.0402832031,,, +49.7480468750,795,1293.7729492188,,, +49.7500000000,796,1295.2380371094,,, +49.7519531250,796,1295.2380371094,,, +49.7539062500,796,1295.9707031250,,, +49.7558593750,796,1296.7032470703,,, +49.7578125000,796,1296.7032470703,,, +49.7597656250,796,1297.4359130859,,, +49.7617187500,796,1298.1684570312,,, +49.7636718750,796,1298.9011230469,,, +49.7656250000,796,1299.6336669922,,, +49.7675781250,796,1299.6336669922,,, +49.7695312500,796,1301.0988769531,,, +49.7714843750,796,1300.3663330078,,, +49.7734375000,796,1301.0988769531,,, +49.7753906250,796,1301.0988769531,,, +49.7773437500,796,1300.3663330078,,, +49.7792968750,796,1300.3663330078,,, +49.7812500000,796,1300.3663330078,,, +49.7832031250,796,1299.6336669922,,, +49.7851562500,796,1299.6336669922,,, +49.7871093750,796,1298.1684570312,,, +49.7890625000,796,1298.9011230469,,, +49.7910156250,796,1297.4359130859,,, +49.7929687500,796,1296.7032470703,,, +49.7949218750,796,1295.2380371094,,, +49.7968750000,796,1295.2380371094,,, +49.7988281250,796,1293.7729492188,,, +49.8007812500,796,1294.5054931641,,, +49.8027343750,796,1293.0402832031,,, +49.8046875000,796,1292.3077392578,,, +49.8066406250,796,1292.3077392578,,, +49.8085937500,796,1291.5750732422,,, +49.8105468750,796,1290.8425292969,,, +49.8125000000,797,1291.5750732422,,, +49.8144531250,797,1290.8425292969,,, +49.8164062500,797,1290.8425292969,,, +49.8183593750,797,1290.8425292969,,, +49.8203125000,797,1289.3773193359,,, +49.8222656250,797,1288.6446533203,,, +49.8242187500,797,1287.1794433594,,, +49.8261718750,797,1287.9121093750,,, +49.8281250000,797,1286.4468994141,,, +49.8300781250,797,1285.7142333984,,, +49.8320312500,797,1286.4468994141,,, +49.8339843750,797,1284.9816894531,,, +49.8359375000,797,1284.2490234375,,, +49.8378906250,797,1284.2490234375,,, +49.8398437500,797,1283.5164794922,,, +49.8417968750,797,1282.7839355469,,, +49.8437500000,797,1282.0512695312,,, +49.8457031250,797,1281.3187255859,,, +49.8476562500,797,1281.3187255859,,, +49.8496093750,797,1280.5860595703,,, +49.8515625000,797,1281.3187255859,,, +49.8535156250,797,1281.3187255859,,, +49.8554687500,797,1280.5860595703,,, +49.8574218750,797,1281.3187255859,,, +49.8593750000,797,1282.0512695312,,, +49.8613281250,797,1281.3187255859,,, +49.8632812500,797,1280.5860595703,,, +49.8652343750,797,1281.3187255859,,, +49.8671875000,797,1280.5860595703,,, +49.8691406250,797,1281.3187255859,,, +49.8710937500,797,1280.5860595703,,, +49.8730468750,797,1279.1208496094,,, +49.8750000000,798,1279.1208496094,,, +49.8769531250,798,1278.3883056641,,, +49.8789062500,798,1278.3883056641,,, +49.8808593750,798,1279.1208496094,,, +49.8828125000,798,1278.3883056641,,, +49.8847656250,798,1280.5860595703,,, +49.8867187500,798,1280.5860595703,,, +49.8886718750,798,1281.3187255859,,, +49.8906250000,798,1282.7839355469,,, +49.8925781250,798,1282.7839355469,,, +49.8945312500,798,1285.7142333984,,, +49.8964843750,798,1286.4468994141,,, +49.8984375000,798,1287.1794433594,,, +49.9003906250,798,1289.3773193359,,, +49.9023437500,798,1290.1098632812,,, +49.9042968750,798,1291.5750732422,,, +49.9062500000,798,1293.0402832031,,, +49.9082031250,798,1293.7729492188,,, +49.9101562500,798,1295.9707031250,,, +49.9121093750,798,1296.7032470703,,, +49.9140625000,798,1298.1684570312,,, +49.9160156250,798,1299.6336669922,,, +49.9179687500,798,1299.6336669922,,, +49.9199218750,798,1301.0988769531,,, +49.9218750000,798,1301.0988769531,,, +49.9238281250,798,1301.8315429688,,, +49.9257812500,798,1304.0292968750,,, +49.9277343750,798,1304.7619628906,,, +49.9296875000,798,1304.7619628906,,, +49.9316406250,798,1306.2270507812,,, +49.9335937500,798,1306.9597167969,,, +49.9355468750,798,1306.9597167969,,, +49.9375000000,799,1306.9597167969,,, +49.9394531250,799,1306.2270507812,,, +49.9414062500,799,1305.4945068359,,, +49.9433593750,799,1304.7619628906,,, +49.9453125000,799,1304.7619628906,,, +49.9472656250,799,1304.0292968750,,, +49.9492187500,799,1303.2967529297,,, +49.9511718750,799,1301.8315429688,,, +49.9531250000,799,1299.6336669922,,, +49.9550781250,799,1298.1684570312,,, +49.9570312500,799,1297.4359130859,,, +49.9589843750,799,1296.7032470703,,, +49.9609375000,799,1295.2380371094,,, +49.9628906250,799,1294.5054931641,,, +49.9648437500,799,1293.0402832031,,, +49.9667968750,799,1292.3077392578,,, +49.9687500000,799,1290.8425292969,,, +49.9707031250,799,1289.3773193359,,, +49.9726562500,799,1289.3773193359,,, +49.9746093750,799,1288.6446533203,,, +49.9765625000,799,1287.1794433594,,, +49.9785156250,799,1286.4468994141,,, +49.9804687500,799,1285.7142333984,,, +49.9824218750,799,1283.5164794922,,, +49.9843750000,799,1282.7839355469,,, +49.9863281250,799,1280.5860595703,,, +49.9882812500,799,1281.3187255859,,, +49.9902343750,799,1281.3187255859,,, +49.9921875000,799,1280.5860595703,,, +49.9941406250,799,1280.5860595703,,, +49.9960937500,799,1279.1208496094,,, +49.9980468750,799,1279.1208496094,,, +50.0000000000,800,1279.8535156250,,, +50.0019531250,800,1279.8535156250,,, +50.0039062500,800,1278.3883056641,,, +50.0058593750,800,1276.9230957031,,, +50.0078125000,800,1277.6556396484,,, +50.0097656250,800,1277.6556396484,,, +50.0117187500,800,1275.4578857422,,, +50.0136718750,800,1275.4578857422,,, +50.0156250000,800,1274.7252197266,,, +50.0175781250,800,1274.7252197266,,, +50.0195312500,800,1273.9926757812,,, +50.0214843750,800,1274.7252197266,,, +50.0234375000,800,1274.7252197266,,, +50.0253906250,800,1274.7252197266,,, +50.0273437500,800,1277.6556396484,,, +50.0292968750,800,1278.3883056641,,, +50.0312500000,800,1279.8535156250,,, +50.0332031250,800,1282.0512695312,,, +50.0351562500,800,1284.9816894531,,, +50.0371093750,800,1287.9121093750,,, +50.0390625000,800,1291.5750732422,,, +50.0410156250,800,1296.7032470703,,, +50.0429687500,800,1301.0988769531,,, +50.0449218750,800,1306.9597167969,,, +50.0468750000,800,1315.0183105469,,, +50.0488281250,800,1322.3443603516,,, +50.0507812500,800,1329.6702880859,,, +50.0527343750,800,1339.9267578125,,, +50.0546875000,800,1348.7178955078,,, +50.0566406250,800,1359.7069091797,,, +50.0585937500,800,1371.4285888672,,, +50.0605468750,800,1383.1501464844,,, +50.0625000000,801,1394.1391601562,,, +50.0644531250,801,1407.3260498047,,, +50.0664062500,801,1420.5128173828,,, +50.0683593750,801,1433.6995849609,,, +50.0703125000,801,1448.3516845703,,, +50.0722656250,801,1463.7362060547,,, +50.0742187500,801,1476.9230957031,,, +50.0761718750,801,1493.0402832031,,, +50.0781250000,801,1509.1574707031,,, +50.0800781250,801,1525.2747802734,,, +50.0820312500,801,1541.3919677734,,, +50.0839843750,801,1558.9743652344,,, +50.0859375000,801,1575.0915527344,,, +50.0878906250,801,1592.6739501953,,, +50.0898437500,801,1610.2564697266,,, +50.0917968750,801,1627.8388671875,,, +50.0937500000,801,1645.4212646484,,, +50.0957031250,801,1663.0036621094,,, +50.0976562500,801,1679.8535156250,,, +50.0996093750,801,1695.9707031250,,, +50.1015625000,801,1713.5531005859,,, +50.1035156250,801,1731.1354980469,,, +50.1054687500,801,1746.5201416016,,, +50.1074218750,801,1761.1721191406,,, +50.1093750000,801,1776.5567626953,,, +50.1113281250,801,1789.7435302734,,, +50.1132812500,801,1802.1977539062,,, +50.1152343750,801,1815.3846435547,,, +50.1171875000,801,1825.6409912109,,, +50.1191406250,801,1835.1647949219,,, +50.1210937500,801,1846.1538085938,,, +50.1230468750,801,1854.9450683594,,, +50.1250000000,802,1863.0036621094,,, +50.1269531250,802,1871.7949218750,,, +50.1289062500,802,1877.6556396484,,, +50.1308593750,802,1883.5164794922,,, +50.1328125000,802,1887.9121093750,,, +50.1347656250,802,1892.3077392578,,, +50.1367187500,802,1895.2380371094,,, +50.1386718750,802,1897.4359130859,,, +50.1406250000,802,1898.9011230469,,, +50.1425781250,802,1898.9011230469,,, +50.1445312500,802,1898.1684570312,,, +50.1464843750,802,1897.4359130859,,, +50.1484375000,802,1895.2380371094,,, +50.1503906250,802,1892.3077392578,,, +50.1523437500,802,1888.6446533203,,, +50.1542968750,802,1884.9816894531,,, +50.1562500000,802,1881.3187255859,,, +50.1582031250,802,1875.4578857422,,, +50.1601562500,802,1868.8645019531,,, +50.1621093750,802,1861.5384521484,,, +50.1640625000,802,1853.4798583984,,, +50.1660156250,802,1846.1538085938,,, +50.1679687500,802,1837.3626708984,,, +50.1699218750,802,1827.8388671875,,, +50.1718750000,802,1819.0476074219,,, +50.1738281250,802,1808.0585937500,,, +50.1757812500,802,1797.0695800781,,, +50.1777343750,802,1786.0805664062,,, +50.1796875000,802,1774.3590087891,,, +50.1816406250,802,1761.9047851562,,, +50.1835937500,802,1749.4505615234,,, +50.1855468750,802,1736.2637939453,,, +50.1875000000,803,1723.0769042969,,, +50.1894531250,803,1709.8901367188,,, +50.1914062500,803,1695.9707031250,,, +50.1933593750,803,1682.7839355469,,, +50.1953125000,803,1668.8645019531,,, +50.1972656250,803,1654.9450683594,,, +50.1992187500,803,1641.0256347656,,, +50.2011718750,803,1626.3736572266,,, +50.2031250000,803,1613.1867675781,,, +50.2050781250,803,1598.5347900391,,, +50.2070312500,803,1584.6153564453,,, +50.2089843750,803,1571.4285888672,,, +50.2109375000,803,1557.5091552734,,, +50.2128906250,803,1544.3223876953,,, +50.2148437500,803,1531.1354980469,,, +50.2167968750,803,1516.4835205078,,, +50.2187500000,803,1504.0292968750,,, +50.2207031250,803,1491.5750732422,,, +50.2226562500,803,1479.1208496094,,, +50.2246093750,803,1467.3992919922,,, +50.2265625000,803,1454.9450683594,,, +50.2285156250,803,1443.9560546875,,, +50.2304687500,803,1433.6995849609,,, +50.2324218750,803,1423.4432373047,,, +50.2343750000,803,1413.1867675781,,, +50.2363281250,803,1404.3956298828,,, +50.2382812500,803,1394.8718261719,,, +50.2402343750,803,1385.3480224609,,, +50.2421875000,803,1378.0219726562,,, +50.2441406250,803,1369.2307128906,,, +50.2460937500,803,1360.4395751953,,, +50.2480468750,803,1353.8461914062,,, +50.2500000000,804,1346.5201416016,,, +50.2519531250,804,1338.4615478516,,, +50.2539062500,804,1332.6007080078,,, +50.2558593750,804,1326.7398681641,,, +50.2578125000,804,1320.8791503906,,, +50.2597656250,804,1316.4835205078,,, +50.2617187500,804,1311.3553466797,,, +50.2636718750,804,1306.9597167969,,, +50.2656250000,804,1302.5640869141,,, +50.2675781250,804,1299.6336669922,,, +50.2695312500,804,1296.7032470703,,, +50.2714843750,804,1293.7729492188,,, +50.2734375000,804,1290.1098632812,,, +50.2753906250,804,1288.6446533203,,, +50.2773437500,804,1287.1794433594,,, +50.2792968750,804,1284.2490234375,,, +50.2812500000,804,1282.7839355469,,, +50.2832031250,804,1281.3187255859,,, +50.2851562500,804,1279.1208496094,,, +50.2871093750,804,1278.3883056641,,, +50.2890625000,804,1276.9230957031,,, +50.2910156250,804,1276.1904296875,,, +50.2929687500,804,1276.1904296875,,, +50.2949218750,804,1274.7252197266,,, +50.2968750000,804,1274.7252197266,,, +50.2988281250,804,1274.7252197266,,, +50.3007812500,804,1273.2601318359,,, +50.3027343750,804,1273.2601318359,,, +50.3046875000,804,1273.9926757812,,, +50.3066406250,804,1275.4578857422,,, +50.3085937500,804,1275.4578857422,,, +50.3105468750,804,1276.9230957031,,, +50.3125000000,805,1279.1208496094,,, +50.3144531250,805,1279.8535156250,,, +50.3164062500,805,1282.7839355469,,, +50.3183593750,805,1284.2490234375,,, +50.3203125000,805,1284.9816894531,,, +50.3222656250,805,1287.9121093750,,, +50.3242187500,805,1289.3773193359,,, +50.3261718750,805,1291.5750732422,,, +50.3281250000,805,1294.5054931641,,, +50.3300781250,805,1295.9707031250,,, +50.3320312500,805,1298.1684570312,,, +50.3339843750,805,1301.0988769531,,, +50.3359375000,805,1304.0292968750,,, +50.3378906250,805,1307.6922607422,,, +50.3398437500,805,1309.8901367188,,, +50.3417968750,805,1313.5531005859,,, +50.3437500000,805,1315.7509765625,,, +50.3457031250,805,1320.1464843750,,, +50.3476562500,805,1323.0769042969,,, +50.3496093750,805,1326.0073242188,,, +50.3515625000,805,1330.4029541016,,, +50.3535156250,805,1332.6007080078,,, +50.3554687500,805,1336.2637939453,,, +50.3574218750,805,1339.9267578125,,, +50.3593750000,805,1342.8571777344,,, +50.3613281250,805,1347.2528076172,,, +50.3632812500,805,1350.1831054688,,, +50.3652343750,805,1353.8461914062,,, +50.3671875000,805,1357.5091552734,,, +50.3691406250,805,1361.1721191406,,, +50.3710937500,805,1364.1025390625,,, +50.3730468750,805,1367.7656250000,,, +50.3750000000,806,1371.4285888672,,, +50.3769531250,806,1373.6263427734,,, +50.3789062500,806,1375.8242187500,,, +50.3808593750,806,1380.2197265625,,, +50.3828125000,806,1381.6849365234,,, +50.3847656250,806,1383.8828125000,,, +50.3867187500,806,1386.0805664062,,, +50.3886718750,806,1387.5457763672,,, +50.3906250000,806,1389.0109863281,,, +50.3925781250,806,1391.2087402344,,, +50.3945312500,806,1391.9414062500,,, +50.3964843750,806,1393.4066162109,,, +50.3984375000,806,1394.1391601562,,, +50.4003906250,806,1395.6043701172,,, +50.4023437500,806,1397.0695800781,,, +50.4042968750,806,1397.8022460938,,, +50.4062500000,806,1398.5347900391,,, +50.4082031250,806,1399.2674560547,,, +50.4101562500,806,1400.0000000000,,, +50.4121093750,806,1400.7325439453,,, +50.4140625000,806,1400.0000000000,,, +50.4160156250,806,1401.4652099609,,, +50.4179687500,806,1401.4652099609,,, +50.4199218750,806,1402.1977539062,,, +50.4218750000,806,1402.9304199219,,, +50.4238281250,806,1402.9304199219,,, +50.4257812500,806,1402.9304199219,,, +50.4277343750,806,1402.9304199219,,, +50.4296875000,806,1401.4652099609,,, +50.4316406250,806,1400.7325439453,,, +50.4335937500,806,1400.0000000000,,, +50.4355468750,806,1400.0000000000,,, +50.4375000000,807,1397.8022460938,,, +50.4394531250,807,1397.0695800781,,, +50.4414062500,807,1396.3370361328,,, +50.4433593750,807,1395.6043701172,,, +50.4453125000,807,1394.1391601562,,, +50.4472656250,807,1393.4066162109,,, +50.4492187500,807,1391.9414062500,,, +50.4511718750,807,1389.0109863281,,, +50.4531250000,807,1388.2784423828,,, +50.4550781250,807,1386.8132324219,,, +50.4570312500,807,1384.6153564453,,, +50.4589843750,807,1381.6849365234,,, +50.4609375000,807,1380.9523925781,,, +50.4628906250,807,1377.2894287109,,, +50.4648437500,807,1375.0915527344,,, +50.4667968750,807,1373.6263427734,,, +50.4687500000,807,1370.6959228516,,, +50.4707031250,807,1367.0329589844,,, +50.4726562500,807,1364.8352050781,,, +50.4746093750,807,1361.9047851562,,, +50.4765625000,807,1357.5091552734,,, +50.4785156250,807,1353.8461914062,,, +50.4804687500,807,1350.9157714844,,, +50.4824218750,807,1347.2528076172,,, +50.4843750000,807,1344.3223876953,,, +50.4863281250,807,1341.3919677734,,, +50.4882812500,807,1337.7288818359,,, +50.4902343750,807,1334.0659179688,,, +50.4921875000,807,1330.4029541016,,, +50.4941406250,807,1326.7398681641,,, +50.4960937500,807,1321.6116943359,,, +50.4980468750,807,1318.6812744141,,, +50.5000000000,808,1315.0183105469,,, +50.5019531250,808,1310.6226806641,,, +50.5039062500,808,1306.2270507812,,, +50.5058593750,808,1303.2967529297,,, +50.5078125000,808,1299.6336669922,,, +50.5097656250,808,1295.9707031250,,, +50.5117187500,808,1293.7729492188,,, +50.5136718750,808,1290.8425292969,,, +50.5156250000,808,1287.1794433594,,, +50.5175781250,808,1285.7142333984,,, +50.5195312500,808,1282.7839355469,,, +50.5214843750,808,1280.5860595703,,, +50.5234375000,808,1279.1208496094,,, +50.5253906250,808,1277.6556396484,,, +50.5273437500,808,1276.1904296875,,, +50.5292968750,808,1275.4578857422,,, +50.5312500000,808,1273.2601318359,,, +50.5332031250,808,1271.7949218750,,, +50.5351562500,808,1271.0622558594,,, +50.5371093750,808,1270.3297119141,,, +50.5390625000,808,1268.8645019531,,, +50.5410156250,808,1267.3992919922,,, +50.5429687500,808,1267.3992919922,,, +50.5449218750,808,1265.2014160156,,, +50.5468750000,808,1264.4688720703,,, +50.5488281250,808,1263.7362060547,,, +50.5507812500,808,1262.2711181641,,, +50.5527343750,808,1261.5384521484,,, +50.5546875000,808,1261.5384521484,,, +50.5566406250,808,1261.5384521484,,, +50.5585937500,808,1260.0732421875,,, +50.5605468750,808,1258.6080322266,,, +50.5625000000,809,1258.6080322266,,, +50.5644531250,809,1257.1428222656,,, +50.5664062500,809,1256.4102783203,,, +50.5683593750,809,1255.6776123047,,, +50.5703125000,809,1254.9450683594,,, +50.5722656250,809,1254.9450683594,,, +50.5742187500,809,1254.2124023438,,, +50.5761718750,809,1254.2124023438,,, +50.5781250000,809,1254.2124023438,,, +50.5800781250,809,1254.9450683594,,, +50.5820312500,809,1254.9450683594,,, +50.5839843750,809,1255.6776123047,,, +50.5859375000,809,1254.9450683594,,, +50.5878906250,809,1257.1428222656,,, +50.5898437500,809,1257.1428222656,,, +50.5917968750,809,1257.8754882812,,, +50.5937500000,809,1259.3406982422,,, +50.5957031250,809,1260.0732421875,,, +50.5976562500,809,1261.5384521484,,, +50.5996093750,809,1262.2711181641,,, +50.6015625000,809,1263.7362060547,,, +50.6035156250,809,1264.4688720703,,, +50.6054687500,809,1265.2014160156,,, +50.6074218750,809,1266.6666259766,,, +50.6093750000,809,1266.6666259766,,, +50.6113281250,809,1267.3992919922,,, +50.6132812500,809,1269.5970458984,,, +50.6152343750,809,1270.3297119141,,, +50.6171875000,809,1271.7949218750,,, +50.6191406250,809,1273.2601318359,,, +50.6210937500,809,1274.7252197266,,, +50.6230468750,809,1275.4578857422,,, +50.6250000000,810,1276.1904296875,,, +50.6269531250,810,1278.3883056641,,, +50.6289062500,810,1279.1208496094,,, +50.6308593750,810,1279.8535156250,,, +50.6328125000,810,1282.0512695312,,, +50.6347656250,810,1282.0512695312,,, +50.6367187500,810,1282.7839355469,,, +50.6386718750,810,1284.9816894531,,, +50.6406250000,810,1284.9816894531,,, +50.6425781250,810,1284.9816894531,,, +50.6445312500,810,1286.4468994141,,, +50.6464843750,810,1287.1794433594,,, +50.6484375000,810,1288.6446533203,,, +50.6503906250,810,1291.5750732422,,, +50.6523437500,810,1293.0402832031,,, +50.6542968750,810,1293.7729492188,,, +50.6562500000,810,1295.2380371094,,, +50.6582031250,810,1297.4359130859,,, +50.6601562500,810,1298.9011230469,,, +50.6621093750,810,1299.6336669922,,, +50.6640625000,810,1301.0988769531,,, +50.6660156250,810,1301.8315429688,,, +50.6679687500,810,1302.5640869141,,, +50.6699218750,810,1303.2967529297,,, +50.6718750000,810,1303.2967529297,,, +50.6738281250,810,1302.5640869141,,, +50.6757812500,810,1304.0292968750,,, +50.6777343750,810,1304.0292968750,,, +50.6796875000,810,1304.0292968750,,, +50.6816406250,810,1304.7619628906,,, +50.6835937500,810,1304.7619628906,,, +50.6855468750,810,1304.7619628906,,, +50.6875000000,811,1306.2270507812,,, +50.6894531250,811,1306.9597167969,,, +50.6914062500,811,1306.9597167969,,, +50.6933593750,811,1307.6922607422,,, +50.6953125000,811,1307.6922607422,,, +50.6972656250,811,1308.4249267578,,, +50.6992187500,811,1309.1574707031,,, +50.7011718750,811,1307.6922607422,,, +50.7031250000,811,1309.1574707031,,, +50.7050781250,811,1309.1574707031,,, +50.7070312500,811,1308.4249267578,,, +50.7089843750,811,1307.6922607422,,, +50.7109375000,811,1307.6922607422,,, +50.7128906250,811,1306.9597167969,,, +50.7148437500,811,1306.9597167969,,, +50.7167968750,811,1307.6922607422,,, +50.7187500000,811,1306.2270507812,,, +50.7207031250,811,1306.2270507812,,, +50.7226562500,811,1306.2270507812,,, +50.7246093750,811,1305.4945068359,,, +50.7265625000,811,1304.7619628906,,, +50.7285156250,811,1304.7619628906,,, +50.7304687500,811,1303.2967529297,,, +50.7324218750,811,1304.0292968750,,, +50.7343750000,811,1305.4945068359,,, +50.7363281250,811,1304.7619628906,,, +50.7382812500,811,1304.7619628906,,, +50.7402343750,811,1306.2270507812,,, +50.7421875000,811,1306.9597167969,,, +50.7441406250,811,1306.2270507812,,, +50.7460937500,811,1307.6922607422,,, +50.7480468750,811,1307.6922607422,,, +50.7500000000,812,1307.6922607422,,, +50.7519531250,812,1309.1574707031,,, +50.7539062500,812,1308.4249267578,,, +50.7558593750,812,1307.6922607422,,, +50.7578125000,812,1309.1574707031,,, +50.7597656250,812,1308.4249267578,,, +50.7617187500,812,1307.6922607422,,, +50.7636718750,812,1307.6922607422,,, +50.7656250000,812,1306.2270507812,,, +50.7675781250,812,1306.2270507812,,, +50.7695312500,812,1305.4945068359,,, +50.7714843750,812,1304.0292968750,,, +50.7734375000,812,1304.0292968750,,, +50.7753906250,812,1303.2967529297,,, +50.7773437500,812,1303.2967529297,,, +50.7792968750,812,1302.5640869141,,, +50.7812500000,812,1301.8315429688,,, +50.7832031250,812,1301.0988769531,,, +50.7851562500,812,1301.0988769531,,, +50.7871093750,812,1300.3663330078,,, +50.7890625000,812,1298.9011230469,,, +50.7910156250,812,1300.3663330078,,, +50.7929687500,812,1299.6336669922,,, +50.7949218750,812,1298.1684570312,,, +50.7968750000,812,1298.1684570312,,, +50.7988281250,812,1298.1684570312,,, +50.8007812500,812,1298.1684570312,,, +50.8027343750,812,1296.7032470703,,, +50.8046875000,812,1296.7032470703,,, +50.8066406250,812,1298.1684570312,,, +50.8085937500,812,1297.4359130859,,, +50.8105468750,812,1296.7032470703,,, +50.8125000000,813,1297.4359130859,,, +50.8144531250,813,1297.4359130859,,, +50.8164062500,813,1296.7032470703,,, +50.8183593750,813,1296.7032470703,,, +50.8203125000,813,1297.4359130859,,, +50.8222656250,813,1296.7032470703,,, +50.8242187500,813,1296.7032470703,,, +50.8261718750,813,1296.7032470703,,, +50.8281250000,813,1295.9707031250,,, +50.8300781250,813,1295.2380371094,,, +50.8320312500,813,1294.5054931641,,, +50.8339843750,813,1294.5054931641,,, +50.8359375000,813,1293.7729492188,,, +50.8378906250,813,1291.5750732422,,, +50.8398437500,813,1290.8425292969,,, +50.8417968750,813,1290.1098632812,,, +50.8437500000,813,1287.9121093750,,, +50.8457031250,813,1286.4468994141,,, +50.8476562500,813,1285.7142333984,,, +50.8496093750,813,1284.2490234375,,, +50.8515625000,813,1282.0512695312,,, +50.8535156250,813,1281.3187255859,,, +50.8554687500,813,1279.8535156250,,, +50.8574218750,813,1277.6556396484,,, +50.8593750000,813,1277.6556396484,,, +50.8613281250,813,1276.9230957031,,, +50.8632812500,813,1276.1904296875,,, +50.8652343750,813,1276.1904296875,,, +50.8671875000,813,1277.6556396484,,, +50.8691406250,813,1279.1208496094,,, +50.8710937500,813,1280.5860595703,,, +50.8730468750,813,1282.0512695312,,, +50.8750000000,814,1283.5164794922,,, +50.8769531250,814,1284.2490234375,,, +50.8789062500,814,1286.4468994141,,, +50.8808593750,814,1289.3773193359,,, +50.8828125000,814,1291.5750732422,,, +50.8847656250,814,1294.5054931641,,, +50.8867187500,814,1298.9011230469,,, +50.8886718750,814,1304.7619628906,,, +50.8906250000,814,1309.8901367188,,, +50.8925781250,814,1315.0183105469,,, +50.8945312500,814,1322.3443603516,,, +50.8964843750,814,1328.9377441406,,, +50.8984375000,814,1336.9963378906,,, +50.9003906250,814,1345.0549316406,,, +50.9023437500,814,1355.3114013672,,, +50.9042968750,814,1365.5677490234,,, +50.9062500000,814,1375.8242187500,,, +50.9082031250,814,1388.2784423828,,, +50.9101562500,814,1400.0000000000,,, +50.9121093750,814,1412.4542236328,,, +50.9140625000,814,1426.3736572266,,, +50.9160156250,814,1440.2930908203,,, +50.9179687500,814,1454.2124023438,,, +50.9199218750,814,1469.5970458984,,, +50.9218750000,814,1484.2490234375,,, +50.9238281250,814,1500.3663330078,,, +50.9257812500,814,1515.7509765625,,, +50.9277343750,814,1531.8681640625,,, +50.9296875000,814,1548.7178955078,,, +50.9316406250,814,1565.5677490234,,, +50.9335937500,814,1581.6849365234,,, +50.9355468750,814,1598.5347900391,,, +50.9375000000,815,1615.3846435547,,, +50.9394531250,815,1631.5018310547,,, +50.9414062500,815,1648.3516845703,,, +50.9433593750,815,1665.2014160156,,, +50.9453125000,815,1680.5860595703,,, +50.9472656250,815,1696.7032470703,,, +50.9492187500,815,1712.0878906250,,, +50.9511718750,815,1728.9377441406,,, +50.9531250000,815,1742.8571777344,,, +50.9550781250,815,1756.7766113281,,, +50.9570312500,815,1769.9633789062,,, +50.9589843750,815,1783.8828125000,,, +50.9609375000,815,1795.6043701172,,, +50.9628906250,815,1807.3260498047,,, +50.9648437500,815,1819.0476074219,,, +50.9667968750,815,1829.3040771484,,, +50.9687500000,815,1838.0952148438,,, +50.9707031250,815,1846.8864746094,,, +50.9726562500,815,1854.9450683594,,, +50.9746093750,815,1860.8059082031,,, +50.9765625000,815,1865.9340820312,,, +50.9785156250,815,1870.3297119141,,, +50.9804687500,815,1873.9926757812,,, +50.9824218750,815,1876.1904296875,,, +50.9843750000,815,1877.6556396484,,, +50.9863281250,815,1877.6556396484,,, +50.9882812500,815,1876.9230957031,,, +50.9902343750,815,1874.7252197266,,, +50.9921875000,815,1873.2601318359,,, +50.9941406250,815,1871.0622558594,,, +50.9960937500,815,1866.6666259766,,, +50.9980468750,815,1860.8059082031,,, +51.0000000000,816,1855.6776123047,,, +51.0019531250,816,1849.8168945312,,, +51.0039062500,816,1843.2233886719,,, +51.0058593750,816,1837.3626708984,,, +51.0078125000,816,1827.8388671875,,, +51.0097656250,816,1820.5128173828,,, +51.0117187500,816,1811.7215576172,,, +51.0136718750,816,1801.4652099609,,, +51.0156250000,816,1792.6739501953,,, +51.0175781250,816,1780.9523925781,,, +51.0195312500,816,1768.4981689453,,, +51.0214843750,816,1757.5091552734,,, +51.0234375000,816,1745.7875976562,,, +51.0253906250,816,1733.3333740234,,, +51.0273437500,816,1720.1464843750,,, +51.0292968750,816,1707.6922607422,,, +51.0312500000,816,1694.5054931641,,, +51.0332031250,816,1681.3187255859,,, +51.0351562500,816,1668.1318359375,,, +51.0371093750,816,1654.2124023438,,, +51.0390625000,816,1640.2930908203,,, +51.0410156250,816,1626.3736572266,,, +51.0429687500,816,1612.4542236328,,, +51.0449218750,816,1600.0000000000,,, +51.0468750000,816,1586.8132324219,,, +51.0488281250,816,1574.3590087891,,, +51.0507812500,816,1560.4395751953,,, +51.0527343750,816,1548.7178955078,,, +51.0546875000,816,1536.2637939453,,, +51.0566406250,816,1524.5421142578,,, +51.0585937500,816,1512.0878906250,,, +51.0605468750,816,1501.0988769531,,, +51.0625000000,817,1490.1098632812,,, +51.0644531250,817,1477.6556396484,,, +51.0664062500,817,1466.6666259766,,, +51.0683593750,817,1456.4102783203,,, +51.0703125000,817,1446.8864746094,,, +51.0722656250,817,1436.6300048828,,, +51.0742187500,817,1428.5714111328,,, +51.0761718750,817,1419.0476074219,,, +51.0781250000,817,1410.2564697266,,, +51.0800781250,817,1402.9304199219,,, +51.0820312500,817,1394.8718261719,,, +51.0839843750,817,1386.0805664062,,, +51.0859375000,817,1378.7546386719,,, +51.0878906250,817,1372.1611328125,,, +51.0898437500,817,1364.8352050781,,, +51.0917968750,817,1358.9743652344,,, +51.0937500000,817,1353.1135253906,,, +51.0957031250,817,1347.2528076172,,, +51.0976562500,817,1341.3919677734,,, +51.0996093750,817,1334.7985839844,,, +51.1015625000,817,1331.1354980469,,, +51.1035156250,817,1325.2747802734,,, +51.1054687500,817,1319.4139404297,,, +51.1074218750,817,1315.7509765625,,, +51.1093750000,817,1310.6226806641,,, +51.1113281250,817,1306.9597167969,,, +51.1132812500,817,1302.5640869141,,, +51.1152343750,817,1299.6336669922,,, +51.1171875000,817,1295.9707031250,,, +51.1191406250,817,1292.3077392578,,, +51.1210937500,817,1290.1098632812,,, +51.1230468750,817,1287.1794433594,,, +51.1250000000,818,1284.2490234375,,, +51.1269531250,818,1282.0512695312,,, +51.1289062500,818,1279.8535156250,,, +51.1308593750,818,1278.3883056641,,, +51.1328125000,818,1276.1904296875,,, +51.1347656250,818,1274.7252197266,,, +51.1367187500,818,1273.9926757812,,, +51.1386718750,818,1271.7949218750,,, +51.1406250000,818,1271.7949218750,,, +51.1425781250,818,1272.5274658203,,, +51.1445312500,818,1271.7949218750,,, +51.1464843750,818,1271.7949218750,,, +51.1484375000,818,1271.7949218750,,, +51.1503906250,818,1272.5274658203,,, +51.1523437500,818,1272.5274658203,,, +51.1542968750,818,1272.5274658203,,, +51.1562500000,818,1274.7252197266,,, +51.1582031250,818,1273.9926757812,,, +51.1601562500,818,1276.1904296875,,, +51.1621093750,818,1276.9230957031,,, +51.1640625000,818,1277.6556396484,,, +51.1660156250,818,1277.6556396484,,, +51.1679687500,818,1279.1208496094,,, +51.1699218750,818,1281.3187255859,,, +51.1718750000,818,1282.0512695312,,, +51.1738281250,818,1284.2490234375,,, +51.1757812500,818,1286.4468994141,,, +51.1777343750,818,1287.9121093750,,, +51.1796875000,818,1290.8425292969,,, +51.1816406250,818,1294.5054931641,,, +51.1835937500,818,1296.7032470703,,, +51.1855468750,818,1299.6336669922,,, +51.1875000000,819,1302.5640869141,,, +51.1894531250,819,1305.4945068359,,, +51.1914062500,819,1308.4249267578,,, +51.1933593750,819,1311.3553466797,,, +51.1953125000,819,1315.0183105469,,, +51.1972656250,819,1318.6812744141,,, +51.1992187500,819,1322.3443603516,,, +51.2011718750,819,1326.7398681641,,, +51.2031250000,819,1330.4029541016,,, +51.2050781250,819,1334.0659179688,,, +51.2070312500,819,1338.4615478516,,, +51.2089843750,819,1342.8571777344,,, +51.2109375000,819,1345.7875976562,,, +51.2128906250,819,1349.4505615234,,, +51.2148437500,819,1352.3809814453,,, +51.2167968750,819,1355.3114013672,,, +51.2187500000,819,1358.9743652344,,, +51.2207031250,819,1361.9047851562,,, +51.2226562500,819,1364.1025390625,,, +51.2246093750,819,1367.7656250000,,, +51.2265625000,819,1369.2307128906,,, +51.2285156250,819,1372.1611328125,,, +51.2304687500,819,1375.0915527344,,, +51.2324218750,819,1378.0219726562,,, +51.2343750000,819,1380.2197265625,,, +51.2363281250,819,1382.4176025391,,, +51.2382812500,819,1384.6153564453,,, +51.2402343750,819,1386.8132324219,,, +51.2421875000,819,1387.5457763672,,, +51.2441406250,819,1388.2784423828,,, +51.2460937500,819,1389.7435302734,,, +51.2480468750,819,1391.9414062500,,, +51.2500000000,820,1391.9414062500,,, +51.2519531250,820,1393.4066162109,,, +51.2539062500,820,1394.1391601562,,, +51.2558593750,820,1394.1391601562,,, +51.2578125000,820,1394.8718261719,,, +51.2597656250,820,1394.8718261719,,, +51.2617187500,820,1393.4066162109,,, +51.2636718750,820,1393.4066162109,,, +51.2656250000,820,1393.4066162109,,, +51.2675781250,820,1392.6739501953,,, +51.2695312500,820,1391.9414062500,,, +51.2714843750,820,1391.9414062500,,, +51.2734375000,820,1391.9414062500,,, +51.2753906250,820,1390.4761962891,,, +51.2773437500,820,1390.4761962891,,, +51.2792968750,820,1389.7435302734,,, +51.2812500000,820,1388.2784423828,,, +51.2832031250,820,1387.5457763672,,, +51.2851562500,820,1386.0805664062,,, +51.2871093750,820,1383.8828125000,,, +51.2890625000,820,1381.6849365234,,, +51.2910156250,820,1380.9523925781,,, +51.2929687500,820,1379.4871826172,,, +51.2949218750,820,1376.5567626953,,, +51.2968750000,820,1373.6263427734,,, +51.2988281250,820,1370.6959228516,,, +51.3007812500,820,1369.2307128906,,, +51.3027343750,820,1367.0329589844,,, +51.3046875000,820,1364.8352050781,,, +51.3066406250,820,1362.6373291016,,, +51.3085937500,820,1361.9047851562,,, +51.3105468750,820,1359.7069091797,,, +51.3125000000,821,1356.7766113281,,, +51.3144531250,821,1356.0439453125,,, +51.3164062500,821,1353.1135253906,,, +51.3183593750,821,1350.1831054688,,, +51.3203125000,821,1347.9853515625,,, +51.3222656250,821,1345.0549316406,,, +51.3242187500,821,1341.3919677734,,, +51.3261718750,821,1339.1940917969,,, +51.3281250000,821,1336.9963378906,,, +51.3300781250,821,1333.3333740234,,, +51.3320312500,821,1330.4029541016,,, +51.3339843750,821,1328.9377441406,,, +51.3359375000,821,1326.0073242188,,, +51.3378906250,821,1322.3443603516,,, +51.3398437500,821,1320.1464843750,,, +51.3417968750,821,1316.4835205078,,, +51.3437500000,821,1312.8205566406,,, +51.3457031250,821,1310.6226806641,,, +51.3476562500,821,1307.6922607422,,, +51.3496093750,821,1304.0292968750,,, +51.3515625000,821,1302.5640869141,,, +51.3535156250,821,1299.6336669922,,, +51.3554687500,821,1297.4359130859,,, +51.3574218750,821,1295.2380371094,,, +51.3593750000,821,1293.0402832031,,, +51.3613281250,821,1290.1098632812,,, +51.3632812500,821,1287.9121093750,,, +51.3652343750,821,1286.4468994141,,, +51.3671875000,821,1284.2490234375,,, +51.3691406250,821,1282.0512695312,,, +51.3710937500,821,1282.0512695312,,, +51.3730468750,821,1280.5860595703,,, +51.3750000000,822,1279.1208496094,,, +51.3769531250,822,1277.6556396484,,, +51.3789062500,822,1277.6556396484,,, +51.3808593750,822,1276.1904296875,,, +51.3828125000,822,1274.7252197266,,, +51.3847656250,822,1273.9926757812,,, +51.3867187500,822,1273.2601318359,,, +51.3886718750,822,1271.7949218750,,, +51.3906250000,822,1271.7949218750,,, +51.3925781250,822,1271.0622558594,,, +51.3945312500,822,1269.5970458984,,, +51.3964843750,822,1268.1318359375,,, +51.3984375000,822,1268.1318359375,,, +51.4003906250,822,1266.6666259766,,, +51.4023437500,822,1265.2014160156,,, +51.4042968750,822,1263.7362060547,,, +51.4062500000,822,1263.7362060547,,, +51.4082031250,822,1262.2711181641,,, +51.4101562500,822,1261.5384521484,,, +51.4121093750,822,1261.5384521484,,, +51.4140625000,822,1260.0732421875,,, +51.4160156250,822,1259.3406982422,,, +51.4179687500,822,1259.3406982422,,, +51.4199218750,822,1259.3406982422,,, +51.4218750000,822,1259.3406982422,,, +51.4238281250,822,1259.3406982422,,, +51.4257812500,822,1258.6080322266,,, +51.4277343750,822,1259.3406982422,,, +51.4296875000,822,1258.6080322266,,, +51.4316406250,822,1259.3406982422,,, +51.4335937500,822,1258.6080322266,,, +51.4355468750,822,1258.6080322266,,, +51.4375000000,823,1259.3406982422,,, +51.4394531250,823,1258.6080322266,,, +51.4414062500,823,1258.6080322266,,, +51.4433593750,823,1257.8754882812,,, +51.4453125000,823,1258.6080322266,,, +51.4472656250,823,1258.6080322266,,, +51.4492187500,823,1259.3406982422,,, +51.4511718750,823,1259.3406982422,,, +51.4531250000,823,1259.3406982422,,, +51.4550781250,823,1259.3406982422,,, +51.4570312500,823,1261.5384521484,,, +51.4589843750,823,1263.0036621094,,, +51.4609375000,823,1263.7362060547,,, +51.4628906250,823,1265.2014160156,,, +51.4648437500,823,1265.9340820312,,, +51.4667968750,823,1266.6666259766,,, +51.4687500000,823,1268.1318359375,,, +51.4707031250,823,1269.5970458984,,, +51.4726562500,823,1271.0622558594,,, +51.4746093750,823,1271.7949218750,,, +51.4765625000,823,1273.2601318359,,, +51.4785156250,823,1273.9926757812,,, +51.4804687500,823,1274.7252197266,,, +51.4824218750,823,1276.9230957031,,, +51.4843750000,823,1277.6556396484,,, +51.4863281250,823,1279.1208496094,,, +51.4882812500,823,1280.5860595703,,, +51.4902343750,823,1282.0512695312,,, +51.4921875000,823,1282.7839355469,,, +51.4941406250,823,1284.2490234375,,, +51.4960937500,823,1286.4468994141,,, +51.4980468750,823,1287.9121093750,,, +51.5000000000,824,1289.3773193359,,, +51.5019531250,824,1289.3773193359,,, +51.5039062500,824,1290.8425292969,,, +51.5058593750,824,1291.5750732422,,, +51.5078125000,824,1291.5750732422,,, +51.5097656250,824,1293.7729492188,,, +51.5117187500,824,1293.7729492188,,, +51.5136718750,824,1294.5054931641,,, +51.5156250000,824,1295.9707031250,,, +51.5175781250,824,1295.9707031250,,, +51.5195312500,824,1295.2380371094,,, +51.5214843750,824,1295.9707031250,,, +51.5234375000,824,1296.7032470703,,, +51.5253906250,824,1295.2380371094,,, +51.5273437500,824,1295.2380371094,,, +51.5292968750,824,1296.7032470703,,, +51.5312500000,824,1296.7032470703,,, +51.5332031250,824,1295.9707031250,,, +51.5351562500,824,1295.2380371094,,, +51.5371093750,824,1295.2380371094,,, +51.5390625000,824,1295.2380371094,,, +51.5410156250,824,1294.5054931641,,, +51.5429687500,824,1294.5054931641,,, +51.5449218750,824,1294.5054931641,,, +51.5468750000,824,1293.7729492188,,, +51.5488281250,824,1293.7729492188,,, +51.5507812500,824,1293.7729492188,,, +51.5527343750,824,1293.7729492188,,, +51.5546875000,824,1293.7729492188,,, +51.5566406250,824,1293.7729492188,,, +51.5585937500,824,1294.5054931641,,, +51.5605468750,824,1295.9707031250,,, +51.5625000000,825,1296.7032470703,,, +51.5644531250,825,1296.7032470703,,, +51.5664062500,825,1298.1684570312,,, +51.5683593750,825,1299.6336669922,,, +51.5703125000,825,1300.3663330078,,, +51.5722656250,825,1302.5640869141,,, +51.5742187500,825,1304.7619628906,,, +51.5761718750,825,1306.2270507812,,, +51.5781250000,825,1306.9597167969,,, +51.5800781250,825,1308.4249267578,,, +51.5820312500,825,1310.6226806641,,, +51.5839843750,825,1310.6226806641,,, +51.5859375000,825,1310.6226806641,,, +51.5878906250,825,1312.8205566406,,, +51.5898437500,825,1312.8205566406,,, +51.5917968750,825,1312.8205566406,,, +51.5937500000,825,1313.5531005859,,, +51.5957031250,825,1314.2857666016,,, +51.5976562500,825,1313.5531005859,,, +51.5996093750,825,1313.5531005859,,, +51.6015625000,825,1313.5531005859,,, +51.6035156250,825,1315.0183105469,,, +51.6054687500,825,1315.0183105469,,, +51.6074218750,825,1315.0183105469,,, +51.6093750000,825,1315.0183105469,,, +51.6113281250,825,1315.0183105469,,, +51.6132812500,825,1314.2857666016,,, +51.6152343750,825,1313.5531005859,,, +51.6171875000,825,1314.2857666016,,, +51.6191406250,825,1313.5531005859,,, +51.6210937500,825,1312.8205566406,,, +51.6230468750,825,1312.0878906250,,, +51.6250000000,826,1311.3553466797,,, +51.6269531250,826,1310.6226806641,,, +51.6289062500,826,1309.8901367188,,, +51.6308593750,826,1309.1574707031,,, +51.6328125000,826,1307.6922607422,,, +51.6347656250,826,1306.9597167969,,, +51.6367187500,826,1305.4945068359,,, +51.6386718750,826,1303.2967529297,,, +51.6406250000,826,1302.5640869141,,, +51.6425781250,826,1300.3663330078,,, +51.6445312500,826,1300.3663330078,,, +51.6464843750,826,1298.9011230469,,, +51.6484375000,826,1298.1684570312,,, +51.6503906250,826,1298.1684570312,,, +51.6523437500,826,1296.7032470703,,, +51.6542968750,826,1295.2380371094,,, +51.6562500000,826,1295.9707031250,,, +51.6582031250,826,1295.2380371094,,, +51.6601562500,826,1294.5054931641,,, +51.6621093750,826,1293.7729492188,,, +51.6640625000,826,1293.7729492188,,, +51.6660156250,826,1292.3077392578,,, +51.6679687500,826,1292.3077392578,,, +51.6699218750,826,1292.3077392578,,, +51.6718750000,826,1290.8425292969,,, +51.6738281250,826,1290.1098632812,,, +51.6757812500,826,1289.3773193359,,, +51.6777343750,826,1288.6446533203,,, +51.6796875000,826,1287.1794433594,,, +51.6816406250,826,1285.7142333984,,, +51.6835937500,826,1285.7142333984,,, +51.6855468750,826,1284.2490234375,,, +51.6875000000,827,1282.7839355469,,, +51.6894531250,827,1282.0512695312,,, +51.6914062500,827,1282.0512695312,,, +51.6933593750,827,1281.3187255859,,, +51.6953125000,827,1280.5860595703,,, +51.6972656250,827,1280.5860595703,,, +51.6992187500,827,1281.3187255859,,, +51.7011718750,827,1280.5860595703,,, +51.7031250000,827,1280.5860595703,,, +51.7050781250,827,1280.5860595703,,, +51.7070312500,827,1280.5860595703,,, +51.7089843750,827,1278.3883056641,,, +51.7109375000,827,1277.6556396484,,, +51.7128906250,827,1279.1208496094,,, +51.7148437500,827,1277.6556396484,,, +51.7167968750,827,1278.3883056641,,, +51.7187500000,827,1278.3883056641,,, +51.7207031250,827,1279.1208496094,,, +51.7226562500,827,1279.1208496094,,, +51.7246093750,827,1278.3883056641,,, +51.7265625000,827,1279.8535156250,,, +51.7285156250,827,1280.5860595703,,, +51.7304687500,827,1281.3187255859,,, +51.7324218750,827,1282.0512695312,,, +51.7343750000,827,1284.2490234375,,, +51.7363281250,827,1285.7142333984,,, +51.7382812500,827,1287.9121093750,,, +51.7402343750,827,1290.8425292969,,, +51.7421875000,827,1295.2380371094,,, +51.7441406250,827,1299.6336669922,,, +51.7460937500,827,1304.0292968750,,, +51.7480468750,827,1308.4249267578,,, +51.7500000000,828,1315.0183105469,,, +51.7519531250,828,1321.6116943359,,, +51.7539062500,828,1328.9377441406,,, +51.7558593750,828,1336.2637939453,,, +51.7578125000,828,1345.0549316406,,, +51.7597656250,828,1354.5787353516,,, +51.7617187500,828,1364.8352050781,,, +51.7636718750,828,1375.0915527344,,, +51.7656250000,828,1387.5457763672,,, +51.7675781250,828,1397.8022460938,,, +51.7695312500,828,1410.2564697266,,, +51.7714843750,828,1424.9084472656,,, +51.7734375000,828,1438.8278808594,,, +51.7753906250,828,1453.4798583984,,, +51.7773437500,828,1468.8645019531,,, +51.7792968750,828,1485.7142333984,,, +51.7812500000,828,1501.8315429688,,, +51.7832031250,828,1520.1464843750,,, +51.7851562500,828,1538.4615478516,,, +51.7871093750,828,1556.0439453125,,, +51.7890625000,828,1575.0915527344,,, +51.7910156250,828,1593.4066162109,,, +51.7929687500,828,1612.4542236328,,, +51.7949218750,828,1630.0366210938,,, +51.7968750000,828,1648.3516845703,,, +51.7988281250,828,1667.3992919922,,, +51.8007812500,828,1685.7142333984,,, +51.8027343750,828,1703.2967529297,,, +51.8046875000,828,1721.6116943359,,, +51.8066406250,828,1739.9267578125,,, +51.8085937500,828,1756.7766113281,,, +51.8105468750,828,1773.6263427734,,, +51.8125000000,829,1790.4761962891,,, +51.8144531250,829,1806.5933837891,,, +51.8164062500,829,1821.2453613281,,, +51.8183593750,829,1835.8974609375,,, +51.8203125000,829,1849.0842285156,,, +51.8222656250,829,1862.2711181641,,, +51.8242187500,829,1873.9926757812,,, +51.8261718750,829,1885.7142333984,,, +51.8281250000,829,1897.4359130859,,, +51.8300781250,829,1906.9597167969,,, +51.8320312500,829,1915.0183105469,,, +51.8339843750,829,1923.0769042969,,, +51.8359375000,829,1929.6702880859,,, +51.8378906250,829,1934.7985839844,,, +51.8398437500,829,1939.1940917969,,, +51.8417968750,829,1942.8571777344,,, +51.8437500000,829,1945.0549316406,,, +51.8457031250,829,1947.2528076172,,, +51.8476562500,829,1947.9853515625,,, +51.8496093750,829,1948.7178955078,,, +51.8515625000,829,1947.2528076172,,, +51.8535156250,829,1945.7875976562,,, +51.8554687500,829,1942.1245117188,,, +51.8574218750,829,1939.9267578125,,, +51.8593750000,829,1935.5311279297,,, +51.8613281250,829,1930.4029541016,,, +51.8632812500,829,1924.5421142578,,, +51.8652343750,829,1918.6812744141,,, +51.8671875000,829,1912.8205566406,,, +51.8691406250,829,1904.7619628906,,, +51.8710937500,829,1895.9707031250,,, +51.8730468750,829,1887.9121093750,,, +51.8750000000,830,1879.1208496094,,, +51.8769531250,830,1869.5970458984,,, +51.8789062500,830,1857.8754882812,,, +51.8808593750,830,1847.6190185547,,, +51.8828125000,830,1837.3626708984,,, +51.8847656250,830,1824.1757812500,,, +51.8867187500,830,1811.7215576172,,, +51.8886718750,830,1800.0000000000,,, +51.8906250000,830,1788.2784423828,,, +51.8925781250,830,1775.8242187500,,, +51.8945312500,830,1761.9047851562,,, +51.8964843750,830,1749.4505615234,,, +51.8984375000,830,1735.5311279297,,, +51.9003906250,830,1721.6116943359,,, +51.9023437500,830,1708.4249267578,,, +51.9042968750,830,1694.5054931641,,, +51.9062500000,830,1680.5860595703,,, +51.9082031250,830,1666.6666259766,,, +51.9101562500,830,1652.7471923828,,, +51.9121093750,830,1640.2930908203,,, +51.9140625000,830,1627.1062011719,,, +51.9160156250,830,1613.9194335938,,, +51.9179687500,830,1602.1977539062,,, +51.9199218750,830,1589.0109863281,,, +51.9218750000,830,1576.5567626953,,, +51.9238281250,830,1565.5677490234,,, +51.9257812500,830,1553.1135253906,,, +51.9277343750,830,1540.6593017578,,, +51.9296875000,830,1529.6702880859,,, +51.9316406250,830,1519.4139404297,,, +51.9335937500,830,1508.4249267578,,, +51.9355468750,830,1498.1684570312,,, +51.9375000000,831,1488.6446533203,,, +51.9394531250,831,1480.5860595703,,, +51.9414062500,831,1471.7949218750,,, +51.9433593750,831,1464.4688720703,,, +51.9453125000,831,1456.4102783203,,, +51.9472656250,831,1449.8168945312,,, +51.9492187500,831,1443.9560546875,,, +51.9511718750,831,1439.5604248047,,, +51.9531250000,831,1432.9670410156,,, +51.9550781250,831,1427.8388671875,,, +51.9570312500,831,1423.4432373047,,, +51.9589843750,831,1418.3150634766,,, +51.9609375000,831,1412.4542236328,,, +51.9628906250,831,1408.7912597656,,, +51.9648437500,831,1404.3956298828,,, +51.9667968750,831,1400.0000000000,,, +51.9687500000,831,1396.3370361328,,, +51.9707031250,831,1392.6739501953,,, +51.9726562500,831,1389.0109863281,,, +51.9746093750,831,1386.8132324219,,, +51.9765625000,831,1383.8828125000,,, +51.9785156250,831,1381.6849365234,,, +51.9804687500,831,1378.7546386719,,, +51.9824218750,831,1376.5567626953,,, +51.9843750000,831,1374.3590087891,,, +51.9863281250,831,1372.1611328125,,, +51.9882812500,831,1369.2307128906,,, +51.9902343750,831,1367.0329589844,,, +51.9921875000,831,1365.5677490234,,, +51.9941406250,831,1363.3699951172,,, +51.9960937500,831,1361.1721191406,,, +51.9980468750,831,1360.4395751953,,, +52.0000000000,832,1357.5091552734,,, +52.0019531250,832,1354.5787353516,,, +52.0039062500,832,1353.1135253906,,, +52.0058593750,832,1351.6483154297,,, +52.0078125000,832,1349.4505615234,,, +52.0097656250,832,1347.9853515625,,, +52.0117187500,832,1347.2528076172,,, +52.0136718750,832,1346.5201416016,,, +52.0156250000,832,1344.3223876953,,, +52.0175781250,832,1344.3223876953,,, +52.0195312500,832,1342.8571777344,,, +52.0214843750,832,1342.1245117188,,, +52.0234375000,832,1341.3919677734,,, +52.0253906250,832,1340.6593017578,,, +52.0273437500,832,1340.6593017578,,, +52.0292968750,832,1339.9267578125,,, +52.0312500000,832,1339.1940917969,,, +52.0332031250,832,1339.9267578125,,, +52.0351562500,832,1339.1940917969,,, +52.0371093750,832,1338.4615478516,,, +52.0390625000,832,1338.4615478516,,, +52.0410156250,832,1338.4615478516,,, +52.0429687500,832,1338.4615478516,,, +52.0449218750,832,1338.4615478516,,, +52.0468750000,832,1339.1940917969,,, +52.0488281250,832,1339.9267578125,,, +52.0507812500,832,1341.3919677734,,, +52.0527343750,832,1342.1245117188,,, +52.0546875000,832,1343.5897216797,,, +52.0566406250,832,1344.3223876953,,, +52.0585937500,832,1345.7875976562,,, +52.0605468750,832,1347.2528076172,,, +52.0625000000,833,1347.9853515625,,, +52.0644531250,833,1350.1831054688,,, +52.0664062500,833,1352.3809814453,,, +52.0683593750,833,1353.8461914062,,, +52.0703125000,833,1356.7766113281,,, +52.0722656250,833,1358.2416992188,,, +52.0742187500,833,1360.4395751953,,, +52.0761718750,833,1361.9047851562,,, +52.0781250000,833,1363.3699951172,,, +52.0800781250,833,1364.8352050781,,, +52.0820312500,833,1366.3004150391,,, +52.0839843750,833,1367.7656250000,,, +52.0859375000,833,1369.9633789062,,, +52.0878906250,833,1369.9633789062,,, +52.0898437500,833,1372.1611328125,,, +52.0917968750,833,1374.3590087891,,, +52.0937500000,833,1375.0915527344,,, +52.0957031250,833,1377.2894287109,,, +52.0976562500,833,1378.0219726562,,, +52.0996093750,833,1379.4871826172,,, +52.1015625000,833,1380.9523925781,,, +52.1035156250,833,1382.4176025391,,, +52.1054687500,833,1382.4176025391,,, +52.1074218750,833,1384.6153564453,,, +52.1093750000,833,1386.0805664062,,, +52.1113281250,833,1387.5457763672,,, +52.1132812500,833,1389.0109863281,,, +52.1152343750,833,1391.2087402344,,, +52.1171875000,833,1391.9414062500,,, +52.1191406250,833,1393.4066162109,,, +52.1210937500,833,1393.4066162109,,, +52.1230468750,833,1394.1391601562,,, +52.1250000000,834,1396.3370361328,,, +52.1269531250,834,1396.3370361328,,, +52.1289062500,834,1397.0695800781,,, +52.1308593750,834,1396.3370361328,,, +52.1328125000,834,1396.3370361328,,, +52.1347656250,834,1397.0695800781,,, +52.1367187500,834,1396.3370361328,,, +52.1386718750,834,1393.4066162109,,, +52.1406250000,834,1393.4066162109,,, +52.1425781250,834,1391.2087402344,,, +52.1445312500,834,1388.2784423828,,, +52.1464843750,834,1386.0805664062,,, +52.1484375000,834,1383.8828125000,,, +52.1503906250,834,1380.9523925781,,, +52.1523437500,834,1378.7546386719,,, +52.1542968750,834,1375.0915527344,,, +52.1562500000,834,1371.4285888672,,, +52.1582031250,834,1369.2307128906,,, +52.1601562500,834,1366.3004150391,,, +52.1621093750,834,1363.3699951172,,, +52.1640625000,834,1360.4395751953,,, +52.1660156250,834,1356.7766113281,,, +52.1679687500,834,1354.5787353516,,, +52.1699218750,834,1351.6483154297,,, +52.1718750000,834,1348.7178955078,,, +52.1738281250,834,1347.2528076172,,, +52.1757812500,834,1345.0549316406,,, +52.1777343750,834,1342.1245117188,,, +52.1796875000,834,1339.9267578125,,, +52.1816406250,834,1336.9963378906,,, +52.1835937500,834,1335.5311279297,,, +52.1855468750,834,1332.6007080078,,, +52.1875000000,835,1330.4029541016,,, +52.1894531250,835,1328.9377441406,,, +52.1914062500,835,1326.7398681641,,, +52.1933593750,835,1325.2747802734,,, +52.1953125000,835,1323.8095703125,,, +52.1972656250,835,1320.8791503906,,, +52.1992187500,835,1319.4139404297,,, +52.2011718750,835,1317.9487304688,,, +52.2031250000,835,1316.4835205078,,, +52.2050781250,835,1315.0183105469,,, +52.2070312500,835,1313.5531005859,,, +52.2089843750,835,1312.8205566406,,, +52.2109375000,835,1311.3553466797,,, +52.2128906250,835,1312.0878906250,,, +52.2148437500,835,1310.6226806641,,, +52.2167968750,835,1309.8901367188,,, +52.2187500000,835,1309.1574707031,,, +52.2207031250,835,1307.6922607422,,, +52.2226562500,835,1305.4945068359,,, +52.2246093750,835,1304.7619628906,,, +52.2265625000,835,1304.7619628906,,, +52.2285156250,835,1303.2967529297,,, +52.2304687500,835,1301.0988769531,,, +52.2324218750,835,1299.6336669922,,, +52.2343750000,835,1298.9011230469,,, +52.2363281250,835,1297.4359130859,,, +52.2382812500,835,1295.9707031250,,, +52.2402343750,835,1294.5054931641,,, +52.2421875000,835,1293.7729492188,,, +52.2441406250,835,1291.5750732422,,, +52.2460937500,835,1290.1098632812,,, +52.2480468750,835,1289.3773193359,,, +52.2500000000,836,1287.9121093750,,, +52.2519531250,836,1286.4468994141,,, +52.2539062500,836,1284.9816894531,,, +52.2558593750,836,1284.9816894531,,, +52.2578125000,836,1284.2490234375,,, +52.2597656250,836,1283.5164794922,,, +52.2617187500,836,1283.5164794922,,, +52.2636718750,836,1282.0512695312,,, +52.2656250000,836,1281.3187255859,,, +52.2675781250,836,1279.8535156250,,, +52.2695312500,836,1280.5860595703,,, +52.2714843750,836,1279.8535156250,,, +52.2734375000,836,1278.3883056641,,, +52.2753906250,836,1277.6556396484,,, +52.2773437500,836,1276.1904296875,,, +52.2792968750,836,1276.9230957031,,, +52.2812500000,836,1276.1904296875,,, +52.2832031250,836,1275.4578857422,,, +52.2851562500,836,1276.1904296875,,, +52.2871093750,836,1275.4578857422,,, +52.2890625000,836,1276.1904296875,,, +52.2910156250,836,1276.9230957031,,, +52.2929687500,836,1276.9230957031,,, +52.2949218750,836,1276.1904296875,,, +52.2968750000,836,1275.4578857422,,, +52.2988281250,836,1277.6556396484,,, +52.3007812500,836,1277.6556396484,,, +52.3027343750,836,1276.9230957031,,, +52.3046875000,836,1276.1904296875,,, +52.3066406250,836,1276.1904296875,,, +52.3085937500,836,1276.9230957031,,, +52.3105468750,836,1277.6556396484,,, +52.3125000000,837,1277.6556396484,,, +52.3144531250,837,1279.8535156250,,, +52.3164062500,837,1280.5860595703,,, +52.3183593750,837,1280.5860595703,,, +52.3203125000,837,1281.3187255859,,, +52.3222656250,837,1282.7839355469,,, +52.3242187500,837,1283.5164794922,,, +52.3261718750,837,1283.5164794922,,, +52.3281250000,837,1284.2490234375,,, +52.3300781250,837,1285.7142333984,,, +52.3320312500,837,1286.4468994141,,, +52.3339843750,837,1287.1794433594,,, +52.3359375000,837,1287.1794433594,,, +52.3378906250,837,1287.1794433594,,, +52.3398437500,837,1285.7142333984,,, +52.3417968750,837,1285.7142333984,,, +52.3437500000,837,1286.4468994141,,, +52.3457031250,837,1284.9816894531,,, +52.3476562500,837,1285.7142333984,,, +52.3496093750,837,1285.7142333984,,, +52.3515625000,837,1286.4468994141,,, +52.3535156250,837,1285.7142333984,,, +52.3554687500,837,1286.4468994141,,, +52.3574218750,837,1286.4468994141,,, +52.3593750000,837,1287.9121093750,,, +52.3613281250,837,1288.6446533203,,, +52.3632812500,837,1289.3773193359,,, +52.3652343750,837,1289.3773193359,,, +52.3671875000,837,1290.1098632812,,, +52.3691406250,837,1290.8425292969,,, +52.3710937500,837,1290.1098632812,,, +52.3730468750,837,1291.5750732422,,, +52.3750000000,838,1293.0402832031,,, +52.3769531250,838,1293.7729492188,,, +52.3789062500,838,1293.0402832031,,, +52.3808593750,838,1293.7729492188,,, +52.3828125000,838,1295.2380371094,,, +52.3847656250,838,1296.7032470703,,, +52.3867187500,838,1297.4359130859,,, +52.3886718750,838,1298.9011230469,,, +52.3906250000,838,1299.6336669922,,, +52.3925781250,838,1301.0988769531,,, +52.3945312500,838,1302.5640869141,,, +52.3964843750,838,1305.4945068359,,, +52.3984375000,838,1306.2270507812,,, +52.4003906250,838,1307.6922607422,,, +52.4023437500,838,1308.4249267578,,, +52.4042968750,838,1310.6226806641,,, +52.4062500000,838,1310.6226806641,,, +52.4082031250,838,1311.3553466797,,, +52.4101562500,838,1312.0878906250,,, +52.4121093750,838,1312.0878906250,,, +52.4140625000,838,1314.2857666016,,, +52.4160156250,838,1314.2857666016,,, +52.4179687500,838,1313.5531005859,,, +52.4199218750,838,1313.5531005859,,, +52.4218750000,838,1312.8205566406,,, +52.4238281250,838,1312.8205566406,,, +52.4257812500,838,1312.8205566406,,, +52.4277343750,838,1312.0878906250,,, +52.4296875000,838,1312.8205566406,,, +52.4316406250,838,1312.8205566406,,, +52.4335937500,838,1312.8205566406,,, +52.4355468750,838,1313.5531005859,,, +52.4375000000,839,1313.5531005859,,, +52.4394531250,839,1315.0183105469,,, +52.4414062500,839,1315.0183105469,,, +52.4433593750,839,1315.0183105469,,, +52.4453125000,839,1315.0183105469,,, +52.4472656250,839,1315.0183105469,,, +52.4492187500,839,1315.0183105469,,, +52.4511718750,839,1315.7509765625,,, +52.4531250000,839,1315.7509765625,,, +52.4550781250,839,1315.0183105469,,, +52.4570312500,839,1316.4835205078,,, +52.4589843750,839,1315.7509765625,,, +52.4609375000,839,1315.7509765625,,, +52.4628906250,839,1315.0183105469,,, +52.4648437500,839,1314.2857666016,,, +52.4667968750,839,1315.0183105469,,, +52.4687500000,839,1313.5531005859,,, +52.4707031250,839,1312.0878906250,,, +52.4726562500,839,1312.8205566406,,, +52.4746093750,839,1311.3553466797,,, +52.4765625000,839,1312.0878906250,,, +52.4785156250,839,1310.6226806641,,, +52.4804687500,839,1309.1574707031,,, +52.4824218750,839,1309.1574707031,,, +52.4843750000,839,1308.4249267578,,, +52.4863281250,839,1306.9597167969,,, +52.4882812500,839,1306.9597167969,,, +52.4902343750,839,1305.4945068359,,, +52.4921875000,839,1305.4945068359,,, +52.4941406250,839,1304.0292968750,,, +52.4960937500,839,1303.2967529297,,, +52.4980468750,839,1302.5640869141,,, +52.5000000000,840,1301.0988769531,,, +52.5019531250,840,1300.3663330078,,, +52.5039062500,840,1300.3663330078,,, +52.5058593750,840,1299.6336669922,,, +52.5078125000,840,1298.9011230469,,, +52.5097656250,840,1298.9011230469,,, +52.5117187500,840,1298.1684570312,,, +52.5136718750,840,1296.7032470703,,, +52.5156250000,840,1297.4359130859,,, +52.5175781250,840,1295.9707031250,,, +52.5195312500,840,1295.9707031250,,, +52.5214843750,840,1295.9707031250,,, +52.5234375000,840,1295.2380371094,,, +52.5253906250,840,1295.2380371094,,, +52.5273437500,840,1295.2380371094,,, +52.5292968750,840,1293.7729492188,,, +52.5312500000,840,1294.5054931641,,, +52.5332031250,840,1293.7729492188,,, +52.5351562500,840,1293.0402832031,,, +52.5371093750,840,1293.0402832031,,, +52.5390625000,840,1293.7729492188,,, +52.5410156250,840,1293.0402832031,,, +52.5429687500,840,1293.7729492188,,, +52.5449218750,840,1294.5054931641,,, +52.5468750000,840,1293.7729492188,,, +52.5488281250,840,1293.7729492188,,, +52.5507812500,840,1295.2380371094,,, +52.5527343750,840,1295.9707031250,,, +52.5546875000,840,1297.4359130859,,, +52.5566406250,840,1296.7032470703,,, +52.5585937500,840,1297.4359130859,,, +52.5605468750,840,1296.7032470703,,, +52.5625000000,841,1295.9707031250,,, +52.5644531250,841,1295.2380371094,,, +52.5664062500,841,1295.9707031250,,, +52.5683593750,841,1295.2380371094,,, +52.5703125000,841,1293.7729492188,,, +52.5722656250,841,1293.7729492188,,, +52.5742187500,841,1294.5054931641,,, +52.5761718750,841,1293.7729492188,,, +52.5781250000,841,1293.0402832031,,, +52.5800781250,841,1293.0402832031,,, +52.5820312500,841,1294.5054931641,,, +52.5839843750,841,1295.2380371094,,, +52.5859375000,841,1295.2380371094,,, +52.5878906250,841,1295.9707031250,,, +52.5898437500,841,1297.4359130859,,, +52.5917968750,841,1297.4359130859,,, +52.5937500000,841,1297.4359130859,,, +52.5957031250,841,1298.1684570312,,, +52.5976562500,841,1299.6336669922,,, +52.5996093750,841,1299.6336669922,,, +52.6015625000,841,1299.6336669922,,, +52.6035156250,841,1300.3663330078,,, +52.6054687500,841,1301.0988769531,,, +52.6074218750,841,1301.8315429688,,, +52.6093750000,841,1301.0988769531,,, +52.6113281250,841,1301.8315429688,,, +52.6132812500,841,1301.8315429688,,, +52.6152343750,841,1301.8315429688,,, +52.6171875000,841,1303.2967529297,,, +52.6191406250,841,1302.5640869141,,, +52.6210937500,841,1301.0988769531,,, +52.6230468750,841,1300.3663330078,,, +52.6250000000,842,1300.3663330078,,, +52.6269531250,842,1300.3663330078,,, +52.6289062500,842,1298.9011230469,,, +52.6308593750,842,1298.1684570312,,, +52.6328125000,842,1298.1684570312,,, +52.6347656250,842,1297.4359130859,,, +52.6367187500,842,1295.9707031250,,, +52.6386718750,842,1295.9707031250,,, +52.6406250000,842,1295.9707031250,,, +52.6425781250,842,1295.9707031250,,, +52.6445312500,842,1295.2380371094,,, +52.6464843750,842,1294.5054931641,,, +52.6484375000,842,1295.2380371094,,, +52.6503906250,842,1293.7729492188,,, +52.6523437500,842,1293.7729492188,,, +52.6542968750,842,1293.7729492188,,, +52.6562500000,842,1293.7729492188,,, +52.6582031250,842,1293.7729492188,,, +52.6601562500,842,1293.7729492188,,, +52.6621093750,842,1293.7729492188,,, +52.6640625000,842,1294.5054931641,,, +52.6660156250,842,1294.5054931641,,, +52.6679687500,842,1294.5054931641,,, +52.6699218750,842,1295.2380371094,,, +52.6718750000,842,1296.7032470703,,, +52.6738281250,842,1297.4359130859,,, +52.6757812500,842,1297.4359130859,,, +52.6777343750,842,1299.6336669922,,, +52.6796875000,842,1302.5640869141,,, +52.6816406250,842,1304.0292968750,,, +52.6835937500,842,1306.2270507812,,, +52.6855468750,842,1309.1574707031,,, +52.6875000000,843,1312.8205566406,,, +52.6894531250,843,1316.4835205078,,, +52.6914062500,843,1321.6116943359,,, +52.6933593750,843,1327.4725341797,,, +52.6953125000,843,1334.0659179688,,, +52.6972656250,843,1341.3919677734,,, +52.6992187500,843,1347.9853515625,,, +52.7011718750,843,1357.5091552734,,, +52.7031250000,843,1366.3004150391,,, +52.7050781250,843,1374.3590087891,,, +52.7070312500,843,1384.6153564453,,, +52.7089843750,843,1395.6043701172,,, +52.7109375000,843,1406.5933837891,,, +52.7128906250,843,1418.3150634766,,, +52.7148437500,843,1431.5018310547,,, +52.7167968750,843,1444.6885986328,,, +52.7187500000,843,1457.8754882812,,, +52.7207031250,843,1472.5274658203,,, +52.7226562500,843,1488.6446533203,,, +52.7246093750,843,1504.7619628906,,, +52.7265625000,843,1520.8791503906,,, +52.7285156250,843,1538.4615478516,,, +52.7304687500,843,1556.7766113281,,, +52.7324218750,843,1574.3590087891,,, +52.7343750000,843,1591.9414062500,,, +52.7363281250,843,1610.2564697266,,, +52.7382812500,843,1628.5714111328,,, +52.7402343750,843,1646.1538085938,,, +52.7421875000,843,1663.7362060547,,, +52.7441406250,843,1682.7839355469,,, +52.7460937500,843,1701.8315429688,,, +52.7480468750,843,1720.1464843750,,, +52.7500000000,844,1737.7288818359,,, +52.7519531250,844,1755.3114013672,,, +52.7539062500,844,1774.3590087891,,, +52.7558593750,844,1791.2087402344,,, +52.7578125000,844,1807.3260498047,,, +52.7597656250,844,1824.1757812500,,, +52.7617187500,844,1839.5604248047,,, +52.7636718750,844,1854.9450683594,,, +52.7656250000,844,1868.8645019531,,, +52.7675781250,844,1882.0512695312,,, +52.7695312500,844,1895.9707031250,,, +52.7714843750,844,1908.4249267578,,, +52.7734375000,844,1918.6812744141,,, +52.7753906250,844,1929.6702880859,,, +52.7773437500,844,1938.4615478516,,, +52.7792968750,844,1946.5201416016,,, +52.7812500000,844,1953.1135253906,,, +52.7832031250,844,1959.7069091797,,, +52.7851562500,844,1964.8352050781,,, +52.7871093750,844,1969.2307128906,,, +52.7890625000,844,1972.1611328125,,, +52.7910156250,844,1975.0915527344,,, +52.7929687500,844,1976.5567626953,,, +52.7949218750,844,1976.5567626953,,, +52.7968750000,844,1976.5567626953,,, +52.7988281250,844,1975.0915527344,,, +52.8007812500,844,1972.8937988281,,, +52.8027343750,844,1970.6959228516,,, +52.8046875000,844,1967.0329589844,,, +52.8066406250,844,1963.3699951172,,, +52.8085937500,844,1958.2416992188,,, +52.8105468750,844,1951.6483154297,,, +52.8125000000,845,1945.0549316406,,, +52.8144531250,845,1938.4615478516,,, +52.8164062500,845,1930.4029541016,,, +52.8183593750,845,1922.3443603516,,, +52.8203125000,845,1914.2857666016,,, +52.8222656250,845,1904.0292968750,,, +52.8242187500,845,1893.0402832031,,, +52.8261718750,845,1882.7839355469,,, +52.8281250000,845,1872.5274658203,,, +52.8300781250,845,1860.0732421875,,, +52.8320312500,845,1848.3516845703,,, +52.8339843750,845,1835.1647949219,,, +52.8359375000,845,1821.9780273438,,, +52.8378906250,845,1809.5238037109,,, +52.8398437500,845,1796.3370361328,,, +52.8417968750,845,1782.4176025391,,, +52.8437500000,845,1769.2307128906,,, +52.8457031250,845,1755.3114013672,,, +52.8476562500,845,1742.1245117188,,, +52.8496093750,845,1728.2050781250,,, +52.8515625000,845,1713.5531005859,,, +52.8535156250,845,1698.9011230469,,, +52.8554687500,845,1686.4468994141,,, +52.8574218750,845,1672.5274658203,,, +52.8593750000,845,1657.8754882812,,, +52.8613281250,845,1645.4212646484,,, +52.8632812500,845,1631.5018310547,,, +52.8652343750,845,1619.0476074219,,, +52.8671875000,845,1607.3260498047,,, +52.8691406250,845,1594.8718261719,,, +52.8710937500,845,1580.9523925781,,, +52.8730468750,845,1569.2307128906,,, +52.8750000000,846,1558.9743652344,,, +52.8769531250,846,1547.2528076172,,, +52.8789062500,846,1536.2637939453,,, +52.8808593750,846,1526.0073242188,,, +52.8828125000,846,1516.4835205078,,, +52.8847656250,846,1506.2270507812,,, +52.8867187500,846,1497.4359130859,,, +52.8886718750,846,1487.9121093750,,, +52.8906250000,846,1479.8535156250,,, +52.8925781250,846,1471.0622558594,,, +52.8945312500,846,1463.7362060547,,, +52.8964843750,846,1457.8754882812,,, +52.8984375000,846,1451.2821044922,,, +52.9003906250,846,1443.9560546875,,, +52.9023437500,846,1438.0952148438,,, +52.9042968750,846,1432.9670410156,,, +52.9062500000,846,1427.8388671875,,, +52.9082031250,846,1421.9780273438,,, +52.9101562500,846,1417.5823974609,,, +52.9121093750,846,1411.7215576172,,, +52.9140625000,846,1406.5933837891,,, +52.9160156250,846,1401.4652099609,,, +52.9179687500,846,1397.8022460938,,, +52.9199218750,846,1393.4066162109,,, +52.9218750000,846,1389.0109863281,,, +52.9238281250,846,1385.3480224609,,, +52.9257812500,846,1382.4176025391,,, +52.9277343750,846,1373.6263427734,,, +52.9296875000,846,1370.6959228516,,, +52.9316406250,846,1368.4981689453,,, +52.9335937500,846,1365.5677490234,,, +52.9355468750,846,1362.6373291016,,, +52.9375000000,847,1358.9743652344,,, +52.9394531250,847,1356.7766113281,,, +52.9414062500,847,1354.5787353516,,, +52.9433593750,847,1351.6483154297,,, +52.9453125000,847,1350.1831054688,,, +52.9472656250,847,1347.2528076172,,, +52.9492187500,847,1346.5201416016,,, +52.9511718750,847,1345.0549316406,,, +52.9531250000,847,1342.8571777344,,, +52.9550781250,847,1341.3919677734,,, +52.9570312500,847,1340.6593017578,,, +52.9589843750,847,1339.1940917969,,, +52.9609375000,847,1339.1940917969,,, +52.9628906250,847,1337.7288818359,,, +52.9648437500,847,1335.5311279297,,, +52.9667968750,847,1334.0659179688,,, +52.9687500000,847,1334.0659179688,,, +52.9707031250,847,1333.3333740234,,, +52.9726562500,847,1332.6007080078,,, +52.9746093750,847,1332.6007080078,,, +52.9765625000,847,1332.6007080078,,, +52.9785156250,847,1333.3333740234,,, +52.9804687500,847,1333.3333740234,,, +52.9824218750,847,1333.3333740234,,, +52.9843750000,847,1334.7985839844,,, +52.9863281250,847,1335.5311279297,,, +52.9882812500,847,1335.5311279297,,, +52.9902343750,847,1334.7985839844,,, +52.9921875000,847,1335.5311279297,,, +52.9941406250,847,1336.2637939453,,, +52.9960937500,847,1337.7288818359,,, +52.9980468750,847,1339.1940917969,,, +53.0000000000,848,1339.9267578125,,, +53.0019531250,848,1342.8571777344,,, +53.0039062500,848,1345.0549316406,,, +53.0058593750,848,1347.9853515625,,, +53.0078125000,848,1350.1831054688,,, +53.0097656250,848,1352.3809814453,,, +53.0117187500,848,1356.7766113281,,, +53.0136718750,848,1358.2416992188,,, +53.0156250000,848,1359.7069091797,,, +53.0175781250,848,1361.9047851562,,, +53.0195312500,848,1364.1025390625,,, +53.0214843750,848,1368.4981689453,,, +53.0234375000,848,1369.9633789062,,, +53.0253906250,848,1372.8937988281,,, +53.0273437500,848,1375.8242187500,,, +53.0292968750,848,1379.4871826172,,, +53.0312500000,848,1381.6849365234,,, +53.0332031250,848,1383.1501464844,,, +53.0351562500,848,1385.3480224609,,, +53.0371093750,848,1387.5457763672,,, +53.0390625000,848,1389.0109863281,,, +53.0410156250,848,1390.4761962891,,, +53.0429687500,848,1390.4761962891,,, +53.0449218750,848,1393.4066162109,,, +53.0468750000,848,1394.8718261719,,, +53.0488281250,848,1395.6043701172,,, +53.0507812500,848,1397.0695800781,,, +53.0527343750,848,1397.8022460938,,, +53.0546875000,848,1400.7325439453,,, +53.0566406250,848,1401.4652099609,,, +53.0585937500,848,1402.1977539062,,, +53.0605468750,848,1402.1977539062,,, +53.0625000000,849,1404.3956298828,,, +53.0644531250,849,1405.8608398438,,, +53.0664062500,849,1405.8608398438,,, +53.0683593750,849,1406.5933837891,,, +53.0703125000,849,1407.3260498047,,, +53.0722656250,849,1408.0585937500,,, +53.0742187500,849,1408.0585937500,,, +53.0761718750,849,1408.0585937500,,, +53.0781250000,849,1409.5238037109,,, +53.0800781250,849,1408.7912597656,,, +53.0820312500,849,1408.0585937500,,, +53.0839843750,849,1408.7912597656,,, +53.0859375000,849,1407.3260498047,,, +53.0878906250,849,1406.5933837891,,, +53.0898437500,849,1405.8608398438,,, +53.0917968750,849,1405.1281738281,,, +53.0937500000,849,1403.6629638672,,, +53.0957031250,849,1402.1977539062,,, +53.0976562500,849,1402.1977539062,,, +53.0996093750,849,1400.0000000000,,, +53.1015625000,849,1398.5347900391,,, +53.1035156250,849,1397.8022460938,,, +53.1054687500,849,1396.3370361328,,, +53.1074218750,849,1394.8718261719,,, +53.1093750000,849,1392.6739501953,,, +53.1113281250,849,1390.4761962891,,, +53.1132812500,849,1388.2784423828,,, +53.1152343750,849,1386.0805664062,,, +53.1171875000,849,1383.8828125000,,, +53.1191406250,849,1381.6849365234,,, +53.1210937500,849,1378.7546386719,,, +53.1230468750,849,1376.5567626953,,, +53.1250000000,850,1372.8937988281,,, +53.1269531250,850,1367.7656250000,,, +53.1289062500,850,1364.8352050781,,, +53.1308593750,850,1360.4395751953,,, +53.1328125000,850,1356.0439453125,,, +53.1347656250,850,1351.6483154297,,, +53.1367187500,850,1347.2528076172,,, +53.1386718750,850,1342.1245117188,,, +53.1406250000,850,1338.4615478516,,, +53.1425781250,850,1334.7985839844,,, +53.1445312500,850,1330.4029541016,,, +53.1464843750,850,1326.7398681641,,, +53.1484375000,850,1321.6116943359,,, +53.1503906250,850,1319.4139404297,,, +53.1523437500,850,1315.7509765625,,, +53.1542968750,850,1312.0878906250,,, +53.1562500000,850,1309.8901367188,,, +53.1582031250,850,1305.4945068359,,, +53.1601562500,850,1302.5640869141,,, +53.1621093750,850,1298.9011230469,,, +53.1640625000,850,1297.4359130859,,, +53.1660156250,850,1295.2380371094,,, +53.1679687500,850,1292.3077392578,,, +53.1699218750,850,1290.1098632812,,, +53.1718750000,850,1288.6446533203,,, +53.1738281250,850,1286.4468994141,,, +53.1757812500,850,1284.2490234375,,, +53.1777343750,850,1283.5164794922,,, +53.1796875000,850,1282.0512695312,,, +53.1816406250,850,1280.5860595703,,, +53.1835937500,850,1279.1208496094,,, +53.1855468750,850,1278.3883056641,,, +53.1875000000,851,1276.1904296875,,, +53.1894531250,851,1275.4578857422,,, +53.1914062500,851,1274.7252197266,,, +53.1933593750,851,1275.4578857422,,, +53.1953125000,851,1273.9926757812,,, +53.1972656250,851,1272.5274658203,,, +53.1992187500,851,1273.2601318359,,, +53.2011718750,851,1273.2601318359,,, +53.2031250000,851,1272.5274658203,,, +53.2050781250,851,1271.7949218750,,, +53.2070312500,851,1272.5274658203,,, +53.2089843750,851,1272.5274658203,,, +53.2109375000,851,1272.5274658203,,, +53.2128906250,851,1273.2601318359,,, +53.2148437500,851,1273.9926757812,,, +53.2167968750,851,1273.9926757812,,, +53.2187500000,851,1273.9926757812,,, +53.2207031250,851,1274.7252197266,,, +53.2226562500,851,1275.4578857422,,, +53.2246093750,851,1275.4578857422,,, +53.2265625000,851,1276.1904296875,,, +53.2285156250,851,1276.9230957031,,, +53.2304687500,851,1277.6556396484,,, +53.2324218750,851,1279.1208496094,,, +53.2343750000,851,1279.8535156250,,, +53.2363281250,851,1282.7839355469,,, +53.2382812500,851,1283.5164794922,,, +53.2402343750,851,1284.2490234375,,, +53.2421875000,851,1285.7142333984,,, +53.2441406250,851,1287.1794433594,,, +53.2460937500,851,1287.9121093750,,, +53.2480468750,851,1289.3773193359,,, +53.2500000000,852,1291.5750732422,,, +53.2519531250,852,1292.3077392578,,, +53.2539062500,852,1294.5054931641,,, +53.2558593750,852,1295.9707031250,,, +53.2578125000,852,1298.1684570312,,, +53.2597656250,852,1298.9011230469,,, +53.2617187500,852,1299.6336669922,,, +53.2636718750,852,1301.0988769531,,, +53.2656250000,852,1301.8315429688,,, +53.2675781250,852,1301.8315429688,,, +53.2695312500,852,1301.8315429688,,, +53.2714843750,852,1304.0292968750,,, +53.2734375000,852,1304.7619628906,,, +53.2753906250,852,1306.2270507812,,, +53.2773437500,852,1306.9597167969,,, +53.2792968750,852,1309.1574707031,,, +53.2812500000,852,1309.8901367188,,, +53.2832031250,852,1309.8901367188,,, +53.2851562500,852,1311.3553466797,,, +53.2871093750,852,1312.0878906250,,, +53.2890625000,852,1311.3553466797,,, +53.2910156250,852,1312.0878906250,,, +53.2929687500,852,1312.0878906250,,, +53.2949218750,852,1312.0878906250,,, +53.2968750000,852,1312.0878906250,,, +53.2988281250,852,1311.3553466797,,, +53.3007812500,852,1312.0878906250,,, +53.3027343750,852,1312.0878906250,,, +53.3046875000,852,1311.3553466797,,, +53.3066406250,852,1310.6226806641,,, +53.3085937500,852,1311.3553466797,,, +53.3105468750,852,1310.6226806641,,, +53.3125000000,853,1309.8901367188,,, +53.3144531250,853,1310.6226806641,,, +53.3164062500,853,1310.6226806641,,, +53.3183593750,853,1310.6226806641,,, +53.3203125000,853,1309.8901367188,,, +53.3222656250,853,1309.8901367188,,, +53.3242187500,853,1309.1574707031,,, +53.3261718750,853,1308.4249267578,,, +53.3281250000,853,1307.6922607422,,, +53.3300781250,853,1308.4249267578,,, +53.3320312500,853,1307.6922607422,,, +53.3339843750,853,1307.6922607422,,, +53.3359375000,853,1307.6922607422,,, +53.3378906250,853,1308.4249267578,,, +53.3398437500,853,1307.6922607422,,, +53.3417968750,853,1307.6922607422,,, +53.3437500000,853,1307.6922607422,,, +53.3457031250,853,1307.6922607422,,, +53.3476562500,853,1307.6922607422,,, +53.3496093750,853,1307.6922607422,,, +53.3515625000,853,1308.4249267578,,, +53.3535156250,853,1308.4249267578,,, +53.3554687500,853,1308.4249267578,,, +53.3574218750,853,1307.6922607422,,, +53.3593750000,853,1308.4249267578,,, +53.3613281250,853,1308.4249267578,,, +53.3632812500,853,1309.1574707031,,, +53.3652343750,853,1308.4249267578,,, +53.3671875000,853,1309.8901367188,,, +53.3691406250,853,1309.8901367188,,, +53.3710937500,853,1309.8901367188,,, +53.3730468750,853,1309.8901367188,,, +53.3750000000,854,1311.3553466797,,, +53.3769531250,854,1311.3553466797,,, +53.3789062500,854,1311.3553466797,,, +53.3808593750,854,1311.3553466797,,, +53.3828125000,854,1312.0878906250,,, +53.3847656250,854,1310.6226806641,,, +53.3867187500,854,1309.1574707031,,, +53.3886718750,854,1309.1574707031,,, +53.3906250000,854,1308.4249267578,,, +53.3925781250,854,1306.9597167969,,, +53.3945312500,854,1305.4945068359,,, +53.3964843750,854,1304.0292968750,,, +53.3984375000,854,1301.8315429688,,, +53.4003906250,854,1301.0988769531,,, +53.4023437500,854,1299.6336669922,,, +53.4042968750,854,1298.9011230469,,, +53.4062500000,854,1296.7032470703,,, +53.4082031250,854,1295.2380371094,,, +53.4101562500,854,1296.7032470703,,, +53.4121093750,854,1295.9707031250,,, +53.4140625000,854,1295.2380371094,,, +53.4160156250,854,1295.2380371094,,, +53.4179687500,854,1295.2380371094,,, +53.4199218750,854,1295.2380371094,,, +53.4218750000,854,1295.2380371094,,, +53.4238281250,854,1295.2380371094,,, +53.4257812500,854,1295.2380371094,,, +53.4277343750,854,1295.9707031250,,, +53.4296875000,854,1295.9707031250,,, +53.4316406250,854,1295.2380371094,,, +53.4335937500,854,1295.9707031250,,, +53.4355468750,854,1295.2380371094,,, +53.4375000000,855,1294.5054931641,,, +53.4394531250,855,1295.2380371094,,, +53.4414062500,855,1294.5054931641,,, +53.4433593750,855,1294.5054931641,,, +53.4453125000,855,1295.9707031250,,, +53.4472656250,855,1295.2380371094,,, +53.4492187500,855,1294.5054931641,,, +53.4511718750,855,1295.2380371094,,, +53.4531250000,855,1294.5054931641,,, +53.4550781250,855,1294.5054931641,,, +53.4570312500,855,1295.2380371094,,, +53.4589843750,855,1295.2380371094,,, +53.4609375000,855,1294.5054931641,,, +53.4628906250,855,1295.9707031250,,, +53.4648437500,855,1295.9707031250,,, +53.4667968750,855,1296.7032470703,,, +53.4687500000,855,1298.1684570312,,, +53.4707031250,855,1298.1684570312,,, +53.4726562500,855,1298.1684570312,,, +53.4746093750,855,1299.6336669922,,, +53.4765625000,855,1298.9011230469,,, +53.4785156250,855,1299.6336669922,,, +53.4804687500,855,1300.3663330078,,, +53.4824218750,855,1300.3663330078,,, +53.4843750000,855,1301.0988769531,,, +53.4863281250,855,1301.0988769531,,, +53.4882812500,855,1301.8315429688,,, +53.4902343750,855,1301.0988769531,,, +53.4921875000,855,1302.5640869141,,, +53.4941406250,855,1302.5640869141,,, +53.4960937500,855,1302.5640869141,,, +53.4980468750,855,1304.0292968750,,, +53.5000000000,856,1304.0292968750,,, +53.5019531250,856,1304.0292968750,,, +53.5039062500,856,1305.4945068359,,, +53.5058593750,856,1306.2270507812,,, +53.5078125000,856,1304.7619628906,,, +53.5097656250,856,1306.2270507812,,, +53.5117187500,856,1305.4945068359,,, +53.5136718750,856,1304.7619628906,,, +53.5156250000,856,1305.4945068359,,, +53.5175781250,856,1305.4945068359,,, +53.5195312500,856,1304.0292968750,,, +53.5214843750,856,1303.2967529297,,, +53.5234375000,856,1301.8315429688,,, +53.5253906250,856,1299.6336669922,,, +53.5273437500,856,1298.1684570312,,, +53.5292968750,856,1296.7032470703,,, +53.5312500000,856,1295.2380371094,,, +53.5332031250,856,1293.0402832031,,, +53.5351562500,856,1292.3077392578,,, +53.5371093750,856,1291.5750732422,,, +53.5390625000,856,1290.1098632812,,, +53.5410156250,856,1288.6446533203,,, +53.5429687500,856,1287.9121093750,,, +53.5449218750,856,1287.1794433594,,, +53.5468750000,856,1286.4468994141,,, +53.5488281250,856,1285.7142333984,,, +53.5507812500,856,1284.2490234375,,, +53.5527343750,856,1284.2490234375,,, +53.5546875000,856,1284.2490234375,,, +53.5566406250,856,1284.2490234375,,, +53.5585937500,856,1283.5164794922,,, +53.5605468750,856,1284.2490234375,,, +53.5625000000,857,1282.7839355469,,, +53.5644531250,857,1283.5164794922,,, +53.5664062500,857,1282.7839355469,,, +53.5683593750,857,1282.7839355469,,, +53.5703125000,857,1282.0512695312,,, +53.5722656250,857,1282.0512695312,,, +53.5742187500,857,1282.0512695312,,, +53.5761718750,857,1282.7839355469,,, +53.5781250000,857,1282.7839355469,,, +53.5800781250,857,1282.7839355469,,, +53.5820312500,857,1283.5164794922,,, +53.5839843750,857,1283.5164794922,,, +53.5859375000,857,1283.5164794922,,, +53.5878906250,857,1283.5164794922,,, +53.5898437500,857,1284.9816894531,,, +53.5917968750,857,1285.7142333984,,, +53.5937500000,857,1286.4468994141,,, +53.5957031250,857,1285.7142333984,,, +53.5976562500,857,1287.9121093750,,, +53.5996093750,857,1288.6446533203,,, +53.6015625000,857,1287.9121093750,,, +53.6035156250,857,1287.9121093750,,, +53.6054687500,857,1288.6446533203,,, +53.6074218750,857,1289.3773193359,,, +53.6093750000,857,1290.1098632812,,, +53.6113281250,857,1290.8425292969,,, +53.6132812500,857,1293.0402832031,,, +53.6152343750,857,1293.0402832031,,, +53.6171875000,857,1293.7729492188,,, +53.6191406250,857,1294.5054931641,,, +53.6210937500,857,1293.7729492188,,, +53.6230468750,857,1293.0402832031,,, +53.6250000000,858,1293.0402832031,,, +53.6269531250,858,1294.5054931641,,, +53.6289062500,858,1293.7729492188,,, +53.6308593750,858,1295.2380371094,,, +53.6328125000,858,1295.2380371094,,, +53.6347656250,858,1296.7032470703,,, +53.6367187500,858,1296.7032470703,,, +53.6386718750,858,1296.7032470703,,, +53.6406250000,858,1298.1684570312,,, +53.6425781250,858,1298.1684570312,,, +53.6445312500,858,1298.1684570312,,, +53.6464843750,858,1298.9011230469,,, +53.6484375000,858,1299.6336669922,,, +53.6503906250,858,1300.3663330078,,, +53.6523437500,858,1300.3663330078,,, +53.6542968750,858,1301.0988769531,,, +53.6562500000,858,1302.5640869141,,, +53.6582031250,858,1302.5640869141,,, +53.6601562500,858,1303.2967529297,,, +53.6621093750,858,1304.0292968750,,, +53.6640625000,858,1304.0292968750,,, +53.6660156250,858,1304.0292968750,,, +53.6679687500,858,1303.2967529297,,, +53.6699218750,858,1304.0292968750,,, +53.6718750000,858,1303.2967529297,,, +53.6738281250,858,1303.2967529297,,, +53.6757812500,858,1303.2967529297,,, +53.6777343750,858,1303.2967529297,,, +53.6796875000,858,1302.5640869141,,, +53.6816406250,858,1301.0988769531,,, +53.6835937500,858,1301.0988769531,,, +53.6855468750,858,1299.6336669922,,, +53.6875000000,859,1298.1684570312,,, +53.6894531250,859,1297.4359130859,,, +53.6914062500,859,1298.1684570312,,, +53.6933593750,859,1295.9707031250,,, +53.6953125000,859,1296.7032470703,,, +53.6972656250,859,1298.1684570312,,, +53.6992187500,859,1298.9011230469,,, +53.7011718750,859,1298.9011230469,,, +53.7031250000,859,1299.6336669922,,, +53.7050781250,859,1301.0988769531,,, +53.7070312500,859,1300.3663330078,,, +53.7089843750,859,1301.8315429688,,, +53.7109375000,859,1303.2967529297,,, +53.7128906250,859,1304.0292968750,,, +53.7148437500,859,1304.7619628906,,, +53.7167968750,859,1305.4945068359,,, +53.7187500000,859,1307.6922607422,,, +53.7207031250,859,1309.8901367188,,, +53.7226562500,859,1311.3553466797,,, +53.7246093750,859,1314.2857666016,,, +53.7265625000,859,1317.9487304688,,, +53.7285156250,859,1322.3443603516,,, +53.7304687500,859,1326.0073242188,,, +53.7324218750,859,1332.6007080078,,, +53.7343750000,859,1338.4615478516,,, +53.7363281250,859,1345.7875976562,,, +53.7382812500,859,1352.3809814453,,, +53.7402343750,859,1361.1721191406,,, +53.7421875000,859,1370.6959228516,,, +53.7441406250,859,1380.2197265625,,, +53.7460937500,859,1390.4761962891,,, +53.7480468750,859,1402.1977539062,,, +53.7500000000,860,1413.9194335938,,, +53.7519531250,860,1425.6409912109,,, +53.7539062500,860,1439.5604248047,,, +53.7558593750,860,1454.9450683594,,, +53.7578125000,860,1469.5970458984,,, +53.7597656250,860,1484.9816894531,,, +53.7617187500,860,1501.8315429688,,, +53.7636718750,860,1518.6812744141,,, +53.7656250000,860,1535.5311279297,,, +53.7675781250,860,1552.3809814453,,, +53.7695312500,860,1570.6959228516,,, +53.7714843750,860,1590.4761962891,,, +53.7734375000,860,1608.0585937500,,, +53.7753906250,860,1627.1062011719,,, +53.7773437500,860,1645.4212646484,,, +53.7792968750,860,1664.4688720703,,, +53.7812500000,860,1683.5164794922,,, +53.7832031250,860,1701.0988769531,,, +53.7851562500,860,1719.4139404297,,, +53.7871093750,860,1738.4615478516,,, +53.7890625000,860,1755.3114013672,,, +53.7910156250,860,1772.8937988281,,, +53.7929687500,860,1790.4761962891,,, +53.7949218750,860,1807.3260498047,,, +53.7968750000,860,1824.1757812500,,, +53.7988281250,860,1840.2930908203,,, +53.8007812500,860,1854.9450683594,,, +53.8027343750,860,1869.5970458984,,, +53.8046875000,860,1882.7839355469,,, +53.8066406250,860,1895.9707031250,,, +53.8085937500,860,1908.4249267578,,, +53.8105468750,860,1919.4139404297,,, +53.8125000000,861,1929.6702880859,,, +53.8144531250,861,1939.9267578125,,, +53.8164062500,861,1947.9853515625,,, +53.8183593750,861,1956.0439453125,,, +53.8203125000,861,1962.6373291016,,, +53.8222656250,861,1967.7656250000,,, +53.8242187500,861,1972.8937988281,,, +53.8261718750,861,1975.8242187500,,, +53.8281250000,861,1978.0219726562,,, +53.8300781250,861,1980.2197265625,,, +53.8320312500,861,1980.9523925781,,, +53.8339843750,861,1980.2197265625,,, +53.8359375000,861,1979.4871826172,,, +53.8378906250,861,1978.0219726562,,, +53.8398437500,861,1974.3590087891,,, +53.8417968750,861,1970.6959228516,,, +53.8437500000,861,1967.0329589844,,, +53.8457031250,861,1961.1721191406,,, +53.8476562500,861,1955.3114013672,,, +53.8496093750,861,1947.9853515625,,, +53.8515625000,861,1939.9267578125,,, +53.8535156250,861,1931.1354980469,,, +53.8554687500,861,1921.6116943359,,, +53.8574218750,861,1911.3553466797,,, +53.8593750000,861,1901.8315429688,,, +53.8613281250,861,1889.3773193359,,, +53.8632812500,861,1876.9230957031,,, +53.8652343750,861,1863.7362060547,,, +53.8671875000,861,1851.2821044922,,, +53.8691406250,861,1837.3626708984,,, +53.8710937500,861,1822.7105712891,,, +53.8730468750,861,1808.0585937500,,, +53.8750000000,862,1793.4066162109,,, +53.8769531250,862,1778.7546386719,,, +53.8789062500,862,1764.1025390625,,, +53.8808593750,862,1749.4505615234,,, +53.8828125000,862,1734.7985839844,,, +53.8847656250,862,1720.1464843750,,, +53.8867187500,862,1705.4945068359,,, +53.8886718750,862,1690.8425292969,,, +53.8906250000,862,1677.6556396484,,, +53.8925781250,862,1663.0036621094,,, +53.8945312500,862,1648.3516845703,,, +53.8964843750,862,1635.8974609375,,, +53.8984375000,862,1622.7105712891,,, +53.9003906250,862,1609.5238037109,,, +53.9023437500,862,1597.0695800781,,, +53.9042968750,862,1584.6153564453,,, +53.9062500000,862,1572.8937988281,,, +53.9082031250,862,1560.4395751953,,, +53.9101562500,862,1549.4505615234,,, +53.9121093750,862,1537.7288818359,,, +53.9140625000,862,1525.2747802734,,, +53.9160156250,862,1514.2857666016,,, +53.9179687500,862,1504.7619628906,,, +53.9199218750,862,1495.9707031250,,, +53.9218750000,862,1484.9816894531,,, +53.9238281250,862,1475.4578857422,,, +53.9257812500,862,1466.6666259766,,, +53.9277343750,862,1459.3406982422,,, +53.9296875000,862,1450.5494384766,,, +53.9316406250,862,1441.7583007812,,, +53.9335937500,862,1435.1647949219,,, +53.9355468750,862,1428.5714111328,,, +53.9375000000,863,1421.9780273438,,, +53.9394531250,863,1416.1171875000,,, +53.9414062500,863,1410.2564697266,,, +53.9433593750,863,1405.8608398438,,, +53.9453125000,863,1400.0000000000,,, +53.9472656250,863,1394.8718261719,,, +53.9492187500,863,1390.4761962891,,, +53.9511718750,863,1386.8132324219,,, +53.9531250000,863,1381.6849365234,,, +53.9550781250,863,1378.0219726562,,, +53.9570312500,863,1373.6263427734,,, +53.9589843750,863,1370.6959228516,,, +53.9609375000,863,1368.4981689453,,, +53.9628906250,863,1364.1025390625,,, +53.9648437500,863,1360.4395751953,,, +53.9667968750,863,1356.0439453125,,, +53.9687500000,863,1354.5787353516,,, +53.9707031250,863,1350.9157714844,,, +53.9726562500,863,1348.7178955078,,, +53.9746093750,863,1347.2528076172,,, +53.9765625000,863,1345.7875976562,,, +53.9785156250,863,1343.5897216797,,, +53.9804687500,863,1341.3919677734,,, +53.9824218750,863,1339.1940917969,,, +53.9843750000,863,1336.9963378906,,, +53.9863281250,863,1334.0659179688,,, +53.9882812500,863,1331.8681640625,,, +53.9902343750,863,1331.8681640625,,, +53.9921875000,863,1331.1354980469,,, +53.9941406250,863,1329.6702880859,,, +53.9960937500,863,1329.6702880859,,, +53.9980468750,863,1330.4029541016,,, +54.0000000000,864,1329.6702880859,,, +54.0019531250,864,1329.6702880859,,, +54.0039062500,864,1329.6702880859,,, +54.0058593750,864,1329.6702880859,,, +54.0078125000,864,1328.9377441406,,, +54.0097656250,864,1328.9377441406,,, +54.0117187500,864,1329.6702880859,,, +54.0136718750,864,1331.8681640625,,, +54.0156250000,864,1331.8681640625,,, +54.0175781250,864,1333.3333740234,,, +54.0195312500,864,1333.3333740234,,, +54.0214843750,864,1336.2637939453,,, +54.0234375000,864,1337.7288818359,,, +54.0253906250,864,1337.7288818359,,, +54.0273437500,864,1339.1940917969,,, +54.0292968750,864,1342.1245117188,,, +54.0312500000,864,1344.3223876953,,, +54.0332031250,864,1345.7875976562,,, +54.0351562500,864,1347.2528076172,,, +54.0371093750,864,1348.7178955078,,, +54.0390625000,864,1350.9157714844,,, +54.0410156250,864,1353.8461914062,,, +54.0429687500,864,1356.0439453125,,, +54.0449218750,864,1357.5091552734,,, +54.0468750000,864,1360.4395751953,,, +54.0488281250,864,1362.6373291016,,, +54.0507812500,864,1364.8352050781,,, +54.0527343750,864,1367.0329589844,,, +54.0546875000,864,1370.6959228516,,, +54.0566406250,864,1372.8937988281,,, +54.0585937500,864,1375.0915527344,,, +54.0605468750,864,1377.2894287109,,, +54.0625000000,865,1380.2197265625,,, +54.0644531250,865,1382.4176025391,,, +54.0664062500,865,1385.3480224609,,, +54.0683593750,865,1386.8132324219,,, +54.0703125000,865,1389.7435302734,,, +54.0722656250,865,1391.9414062500,,, +54.0742187500,865,1393.4066162109,,, +54.0761718750,865,1396.3370361328,,, +54.0781250000,865,1397.8022460938,,, +54.0800781250,865,1398.5347900391,,, +54.0820312500,865,1400.0000000000,,, +54.0839843750,865,1400.7325439453,,, +54.0859375000,865,1403.6629638672,,, +54.0878906250,865,1405.1281738281,,, +54.0898437500,865,1405.1281738281,,, +54.0917968750,865,1407.3260498047,,, +54.0937500000,865,1408.7912597656,,, +54.0957031250,865,1409.5238037109,,, +54.0976562500,865,1409.5238037109,,, +54.0996093750,865,1410.2564697266,,, +54.1015625000,865,1410.2564697266,,, +54.1035156250,865,1409.5238037109,,, +54.1054687500,865,1409.5238037109,,, +54.1074218750,865,1410.2564697266,,, +54.1093750000,865,1410.9890136719,,, +54.1113281250,865,1410.9890136719,,, +54.1132812500,865,1410.9890136719,,, +54.1152343750,865,1410.2564697266,,, +54.1171875000,865,1410.9890136719,,, +54.1191406250,865,1410.9890136719,,, +54.1210937500,865,1409.5238037109,,, +54.1230468750,865,1409.5238037109,,, +54.1250000000,866,1409.5238037109,,, +54.1269531250,866,1408.0585937500,,, +54.1289062500,866,1407.3260498047,,, +54.1308593750,866,1405.8608398438,,, +54.1328125000,866,1405.8608398438,,, +54.1347656250,866,1403.6629638672,,, +54.1367187500,866,1400.7325439453,,, +54.1386718750,866,1398.5347900391,,, +54.1406250000,866,1397.0695800781,,, +54.1425781250,866,1394.1391601562,,, +54.1445312500,866,1391.9414062500,,, +54.1464843750,866,1389.7435302734,,, +54.1484375000,866,1386.8132324219,,, +54.1503906250,866,1383.8828125000,,, +54.1523437500,866,1381.6849365234,,, +54.1542968750,866,1379.4871826172,,, +54.1562500000,866,1375.8242187500,,, +54.1582031250,866,1372.8937988281,,, +54.1601562500,866,1370.6959228516,,, +54.1621093750,866,1367.7656250000,,, +54.1640625000,866,1364.8352050781,,, +54.1660156250,866,1362.6373291016,,, +54.1679687500,866,1360.4395751953,,, +54.1699218750,866,1358.2416992188,,, +54.1718750000,866,1355.3114013672,,, +54.1738281250,866,1352.3809814453,,, +54.1757812500,866,1351.6483154297,,, +54.1777343750,866,1348.7178955078,,, +54.1796875000,866,1345.7875976562,,, +54.1816406250,866,1342.1245117188,,, +54.1835937500,866,1341.3919677734,,, +54.1855468750,866,1338.4615478516,,, +54.1875000000,867,1335.5311279297,,, +54.1894531250,867,1332.6007080078,,, +54.1914062500,867,1331.1354980469,,, +54.1933593750,867,1328.9377441406,,, +54.1953125000,867,1326.0073242188,,, +54.1972656250,867,1323.8095703125,,, +54.1992187500,867,1321.6116943359,,, +54.2011718750,867,1319.4139404297,,, +54.2031250000,867,1316.4835205078,,, +54.2050781250,867,1314.2857666016,,, +54.2070312500,867,1312.8205566406,,, +54.2089843750,867,1310.6226806641,,, +54.2109375000,867,1308.4249267578,,, +54.2128906250,867,1306.9597167969,,, +54.2148437500,867,1304.0292968750,,, +54.2167968750,867,1301.0988769531,,, +54.2187500000,867,1298.9011230469,,, +54.2207031250,867,1297.4359130859,,, +54.2226562500,867,1295.2380371094,,, +54.2246093750,867,1292.3077392578,,, +54.2265625000,867,1289.3773193359,,, +54.2285156250,867,1287.9121093750,,, +54.2304687500,867,1286.4468994141,,, +54.2324218750,867,1284.2490234375,,, +54.2343750000,867,1282.0512695312,,, +54.2363281250,867,1281.3187255859,,, +54.2382812500,867,1279.8535156250,,, +54.2402343750,867,1279.1208496094,,, +54.2421875000,867,1276.9230957031,,, +54.2441406250,867,1276.1904296875,,, +54.2460937500,867,1274.7252197266,,, +54.2480468750,867,1272.5274658203,,, +54.2500000000,868,1271.0622558594,,, +54.2519531250,868,1271.0622558594,,, +54.2539062500,868,1270.3297119141,,, +54.2558593750,868,1270.3297119141,,, +54.2578125000,868,1269.5970458984,,, +54.2597656250,868,1270.3297119141,,, +54.2617187500,868,1271.0622558594,,, +54.2636718750,868,1270.3297119141,,, +54.2656250000,868,1270.3297119141,,, +54.2675781250,868,1271.0622558594,,, +54.2695312500,868,1271.7949218750,,, +54.2714843750,868,1271.7949218750,,, +54.2734375000,868,1271.7949218750,,, +54.2753906250,868,1271.7949218750,,, +54.2773437500,868,1271.0622558594,,, +54.2792968750,868,1270.3297119141,,, +54.2812500000,868,1271.0622558594,,, +54.2832031250,868,1270.3297119141,,, +54.2851562500,868,1269.5970458984,,, +54.2871093750,868,1269.5970458984,,, +54.2890625000,868,1271.0622558594,,, +54.2910156250,868,1271.7949218750,,, +54.2929687500,868,1272.5274658203,,, +54.2949218750,868,1273.2601318359,,, +54.2968750000,868,1274.7252197266,,, +54.2988281250,868,1274.7252197266,,, +54.3007812500,868,1273.2601318359,,, +54.3027343750,868,1274.7252197266,,, +54.3046875000,868,1275.4578857422,,, +54.3066406250,868,1275.4578857422,,, +54.3085937500,868,1275.4578857422,,, +54.3105468750,868,1276.1904296875,,, +54.3125000000,869,1278.3883056641,,, +54.3144531250,869,1279.1208496094,,, +54.3164062500,869,1279.8535156250,,, +54.3183593750,869,1281.3187255859,,, +54.3203125000,869,1282.0512695312,,, +54.3222656250,869,1282.7839355469,,, +54.3242187500,869,1282.7839355469,,, +54.3261718750,869,1284.9816894531,,, +54.3281250000,869,1284.9816894531,,, +54.3300781250,869,1285.7142333984,,, +54.3320312500,869,1287.1794433594,,, +54.3339843750,869,1289.3773193359,,, +54.3359375000,869,1290.1098632812,,, +54.3378906250,869,1290.8425292969,,, +54.3398437500,869,1292.3077392578,,, +54.3417968750,869,1293.0402832031,,, +54.3437500000,869,1293.7729492188,,, +54.3457031250,869,1294.5054931641,,, +54.3476562500,869,1295.9707031250,,, +54.3496093750,869,1298.1684570312,,, +54.3515625000,869,1298.1684570312,,, +54.3535156250,869,1298.9011230469,,, +54.3554687500,869,1301.0988769531,,, +54.3574218750,869,1301.8315429688,,, +54.3593750000,869,1301.8315429688,,, +54.3613281250,869,1302.5640869141,,, +54.3632812500,869,1304.0292968750,,, +54.3652343750,869,1302.5640869141,,, +54.3671875000,869,1304.0292968750,,, +54.3691406250,869,1304.0292968750,,, +54.3710937500,869,1304.0292968750,,, +54.3730468750,869,1304.0292968750,,, +54.3750000000,870,1304.7619628906,,, +54.3769531250,870,1304.0292968750,,, +54.3789062500,870,1304.7619628906,,, +54.3808593750,870,1305.4945068359,,, +54.3828125000,870,1304.7619628906,,, +54.3847656250,870,1304.7619628906,,, +54.3867187500,870,1304.7619628906,,, +54.3886718750,870,1304.7619628906,,, +54.3906250000,870,1305.4945068359,,, +54.3925781250,870,1305.4945068359,,, +54.3945312500,870,1304.7619628906,,, +54.3964843750,870,1305.4945068359,,, +54.3984375000,870,1305.4945068359,,, +54.4003906250,870,1304.0292968750,,, +54.4023437500,870,1304.0292968750,,, +54.4042968750,870,1304.0292968750,,, +54.4062500000,870,1303.2967529297,,, +54.4082031250,870,1302.5640869141,,, +54.4101562500,870,1302.5640869141,,, +54.4121093750,870,1303.2967529297,,, +54.4140625000,870,1303.2967529297,,, +54.4160156250,870,1304.0292968750,,, +54.4179687500,870,1304.0292968750,,, +54.4199218750,870,1304.0292968750,,, +54.4218750000,870,1304.7619628906,,, +54.4238281250,870,1306.2270507812,,, +54.4257812500,870,1306.2270507812,,, +54.4277343750,870,1306.9597167969,,, +54.4296875000,870,1306.9597167969,,, +54.4316406250,870,1307.6922607422,,, +54.4335937500,870,1307.6922607422,,, +54.4355468750,870,1308.4249267578,,, +54.4375000000,871,1308.4249267578,,, +54.4394531250,871,1308.4249267578,,, +54.4414062500,871,1309.8901367188,,, +54.4433593750,871,1309.1574707031,,, +54.4453125000,871,1309.1574707031,,, +54.4472656250,871,1309.8901367188,,, +54.4492187500,871,1309.1574707031,,, +54.4511718750,871,1309.1574707031,,, +54.4531250000,871,1309.1574707031,,, +54.4550781250,871,1308.4249267578,,, +54.4570312500,871,1308.4249267578,,, +54.4589843750,871,1308.4249267578,,, +54.4609375000,871,1307.6922607422,,, +54.4628906250,871,1306.2270507812,,, +54.4648437500,871,1306.9597167969,,, +54.4667968750,871,1305.4945068359,,, +54.4687500000,871,1304.0292968750,,, +54.4707031250,871,1304.0292968750,,, +54.4726562500,871,1303.2967529297,,, +54.4746093750,871,1303.2967529297,,, +54.4765625000,871,1302.5640869141,,, +54.4785156250,871,1301.8315429688,,, +54.4804687500,871,1301.0988769531,,, +54.4824218750,871,1301.0988769531,,, +54.4843750000,871,1300.3663330078,,, +54.4863281250,871,1300.3663330078,,, +54.4882812500,871,1300.3663330078,,, +54.4902343750,871,1300.3663330078,,, +54.4921875000,871,1300.3663330078,,, +54.4941406250,871,1298.9011230469,,, +54.4960937500,871,1298.9011230469,,, +54.4980468750,871,1299.6336669922,,, +54.5000000000,872,1299.6336669922,,, +54.5019531250,872,1298.9011230469,,, +54.5039062500,872,1298.9011230469,,, +54.5058593750,872,1298.1684570312,,, +54.5078125000,872,1299.6336669922,,, +54.5097656250,872,1298.1684570312,,, +54.5117187500,872,1297.4359130859,,, +54.5136718750,872,1298.1684570312,,, +54.5156250000,872,1298.9011230469,,, +54.5175781250,872,1298.9011230469,,, +54.5195312500,872,1298.1684570312,,, +54.5214843750,872,1297.4359130859,,, +54.5234375000,872,1298.9011230469,,, +54.5253906250,872,1299.6336669922,,, +54.5273437500,872,1298.1684570312,,, +54.5292968750,872,1298.1684570312,,, +54.5312500000,872,1298.9011230469,,, +54.5332031250,872,1298.9011230469,,, +54.5351562500,872,1298.1684570312,,, +54.5371093750,872,1298.1684570312,,, +54.5390625000,872,1298.9011230469,,, +54.5410156250,872,1298.9011230469,,, +54.5429687500,872,1298.1684570312,,, +54.5449218750,872,1297.4359130859,,, +54.5468750000,872,1295.9707031250,,, +54.5488281250,872,1296.7032470703,,, +54.5507812500,872,1295.9707031250,,, +54.5527343750,872,1294.5054931641,,, +54.5546875000,872,1293.7729492188,,, +54.5566406250,872,1293.0402832031,,, +54.5585937500,872,1292.3077392578,,, +54.5605468750,872,1293.0402832031,,, +54.5625000000,873,1292.3077392578,,, +54.5644531250,873,1291.5750732422,,, +54.5664062500,873,1290.8425292969,,, +54.5683593750,873,1292.3077392578,,, +54.5703125000,873,1292.3077392578,,, +54.5722656250,873,1292.3077392578,,, +54.5742187500,873,1291.5750732422,,, +54.5761718750,873,1292.3077392578,,, +54.5781250000,873,1293.0402832031,,, +54.5800781250,873,1293.7729492188,,, +54.5820312500,873,1293.0402832031,,, +54.5839843750,873,1293.0402832031,,, +54.5859375000,873,1293.0402832031,,, +54.5878906250,873,1293.7729492188,,, +54.5898437500,873,1294.5054931641,,, +54.5917968750,873,1294.5054931641,,, +54.5937500000,873,1294.5054931641,,, +54.5957031250,873,1294.5054931641,,, +54.5976562500,873,1295.2380371094,,, +54.5996093750,873,1295.2380371094,,, +54.6015625000,873,1295.9707031250,,, +54.6035156250,873,1295.2380371094,,, +54.6054687500,873,1294.5054931641,,, +54.6074218750,873,1295.2380371094,,, +54.6093750000,873,1295.2380371094,,, +54.6113281250,873,1296.7032470703,,, +54.6132812500,873,1296.7032470703,,, +54.6152343750,873,1295.9707031250,,, +54.6171875000,873,1296.7032470703,,, +54.6191406250,873,1295.9707031250,,, +54.6210937500,873,1295.9707031250,,, +54.6230468750,873,1296.7032470703,,, +54.6250000000,874,1295.9707031250,,, +54.6269531250,874,1296.7032470703,,, +54.6289062500,874,1296.7032470703,,, +54.6308593750,874,1295.2380371094,,, +54.6328125000,874,1295.2380371094,,, +54.6347656250,874,1294.5054931641,,, +54.6367187500,874,1295.2380371094,,, +54.6386718750,874,1295.2380371094,,, +54.6406250000,874,1295.2380371094,,, +54.6425781250,874,1293.7729492188,,, +54.6445312500,874,1293.0402832031,,, +54.6464843750,874,1293.0402832031,,, +54.6484375000,874,1293.0402832031,,, +54.6503906250,874,1293.7729492188,,, +54.6523437500,874,1293.0402832031,,, +54.6542968750,874,1293.7729492188,,, +54.6562500000,874,1293.0402832031,,, +54.6582031250,874,1293.0402832031,,, +54.6601562500,874,1292.3077392578,,, +54.6621093750,874,1290.8425292969,,, +54.6640625000,874,1290.8425292969,,, +54.6660156250,874,1290.1098632812,,, +54.6679687500,874,1289.3773193359,,, +54.6699218750,874,1288.6446533203,,, +54.6718750000,874,1287.9121093750,,, +54.6738281250,874,1287.9121093750,,, +54.6757812500,874,1287.9121093750,,, +54.6777343750,874,1287.9121093750,,, +54.6796875000,874,1286.4468994141,,, +54.6816406250,874,1285.7142333984,,, +54.6835937500,874,1285.7142333984,,, +54.6855468750,874,1286.4468994141,,, +54.6875000000,875,1286.4468994141,,, +54.6894531250,875,1284.9816894531,,, +54.6914062500,875,1284.2490234375,,, +54.6933593750,875,1284.9816894531,,, +54.6953125000,875,1285.7142333984,,, +54.6972656250,875,1285.7142333984,,, +54.6992187500,875,1284.9816894531,,, +54.7011718750,875,1286.4468994141,,, +54.7031250000,875,1287.9121093750,,, +54.7050781250,875,1287.9121093750,,, +54.7070312500,875,1288.6446533203,,, +54.7089843750,875,1289.3773193359,,, +54.7109375000,875,1291.5750732422,,, +54.7128906250,875,1293.0402832031,,, +54.7148437500,875,1293.7729492188,,, +54.7167968750,875,1295.2380371094,,, +54.7187500000,875,1297.4359130859,,, +54.7207031250,875,1301.0988769531,,, +54.7226562500,875,1304.0292968750,,, +54.7246093750,875,1306.2270507812,,, +54.7265625000,875,1308.4249267578,,, +54.7285156250,875,1312.8205566406,,, +54.7304687500,875,1318.6812744141,,, +54.7324218750,875,1323.0769042969,,, +54.7343750000,875,1328.9377441406,,, +54.7363281250,875,1334.7985839844,,, +54.7382812500,875,1342.8571777344,,, +54.7402343750,875,1351.6483154297,,, +54.7421875000,875,1359.7069091797,,, +54.7441406250,875,1369.2307128906,,, +54.7460937500,875,1379.4871826172,,, +54.7480468750,875,1391.9414062500,,, +54.7500000000,876,1402.9304199219,,, +54.7519531250,876,1414.6519775391,,, +54.7539062500,876,1426.3736572266,,, +54.7558593750,876,1440.2930908203,,, +54.7578125000,876,1454.9450683594,,, +54.7597656250,876,1468.8645019531,,, +54.7617187500,876,1482.7839355469,,, +54.7636718750,876,1498.9011230469,,, +54.7656250000,876,1515.7509765625,,, +54.7675781250,876,1531.8681640625,,, +54.7695312500,876,1549.4505615234,,, +54.7714843750,876,1566.3004150391,,, +54.7734375000,876,1585.3480224609,,, +54.7753906250,876,1604.3956298828,,, +54.7773437500,876,1623.4432373047,,, +54.7792968750,876,1642.4908447266,,, +54.7812500000,876,1660.8059082031,,, +54.7832031250,876,1680.5860595703,,, +54.7851562500,876,1699.6336669922,,, +54.7871093750,876,1719.4139404297,,, +54.7890625000,876,1736.9963378906,,, +54.7910156250,876,1755.3114013672,,, +54.7929687500,876,1772.8937988281,,, +54.7949218750,876,1790.4761962891,,, +54.7968750000,876,1806.5933837891,,, +54.7988281250,876,1821.9780273438,,, +54.8007812500,876,1837.3626708984,,, +54.8027343750,876,1852.0146484375,,, +54.8046875000,876,1866.6666259766,,, +54.8066406250,876,1879.8535156250,,, +54.8085937500,876,1892.3077392578,,, +54.8105468750,876,1904.0292968750,,, +54.8125000000,877,1914.2857666016,,, +54.8144531250,877,1924.5421142578,,, +54.8164062500,877,1932.6007080078,,, +54.8183593750,877,1939.9267578125,,, +54.8203125000,877,1946.5201416016,,, +54.8222656250,877,1950.9157714844,,, +54.8242187500,877,1955.3114013672,,, +54.8261718750,877,1958.9743652344,,, +54.8281250000,877,1961.9047851562,,, +54.8300781250,877,1963.3699951172,,, +54.8320312500,877,1964.1025390625,,, +54.8339843750,877,1964.8352050781,,, +54.8359375000,877,1962.6373291016,,, +54.8378906250,877,1960.4395751953,,, +54.8398437500,877,1956.7766113281,,, +54.8417968750,877,1951.6483154297,,, +54.8437500000,877,1945.7875976562,,, +54.8457031250,877,1939.1940917969,,, +54.8476562500,877,1933.3333740234,,, +54.8496093750,877,1926.0073242188,,, +54.8515625000,877,1916.4835205078,,, +54.8535156250,877,1906.2270507812,,, +54.8554687500,877,1895.9707031250,,, +54.8574218750,877,1885.7142333984,,, +54.8593750000,877,1874.7252197266,,, +54.8613281250,877,1862.2711181641,,, +54.8632812500,877,1849.8168945312,,, +54.8652343750,877,1835.8974609375,,, +54.8671875000,877,1835.8974609375,,, +54.8691406250,877,1822.7105712891,,, +54.8710937500,877,1808.7912597656,,, +54.8730468750,877,1794.1391601562,,, +54.8750000000,878,1780.2197265625,,, +54.8769531250,878,1764.1025390625,,, +54.8789062500,878,1749.4505615234,,, +54.8808593750,878,1734.7985839844,,, +54.8828125000,878,1718.6812744141,,, +54.8847656250,878,1703.2967529297,,, +54.8867187500,878,1687.1794433594,,, +54.8886718750,878,1673.2601318359,,, +54.8906250000,878,1657.1428222656,,, +54.8925781250,878,1641.0256347656,,, +54.8945312500,878,1626.3736572266,,, +54.8964843750,878,1610.9890136719,,, +54.8984375000,878,1597.0695800781,,, +54.9003906250,878,1583.8828125000,,, +54.9023437500,878,1570.6959228516,,, +54.9042968750,878,1556.7766113281,,, +54.9062500000,878,1543.5897216797,,, +54.9082031250,878,1531.1354980469,,, +54.9101562500,878,1518.6812744141,,, +54.9121093750,878,1506.9597167969,,, +54.9140625000,878,1494.5054931641,,, +54.9160156250,878,1482.7839355469,,, +54.9179687500,878,1472.5274658203,,, +54.9199218750,878,1461.5384521484,,, +54.9218750000,878,1450.5494384766,,, +54.9238281250,878,1439.5604248047,,, +54.9257812500,878,1430.7692871094,,, +54.9277343750,878,1422.7105712891,,, +54.9296875000,878,1413.9194335938,,, +54.9316406250,878,1413.9194335938,,, +54.9335937500,878,1404.3956298828,,, +54.9355468750,878,1396.3370361328,,, +54.9375000000,879,1389.0109863281,,, +54.9394531250,879,1383.1501464844,,, +54.9414062500,879,1376.5567626953,,, +54.9433593750,879,1369.9633789062,,, +54.9453125000,879,1363.3699951172,,, +54.9472656250,879,1359.7069091797,,, +54.9492187500,879,1355.3114013672,,, +54.9511718750,879,1350.1831054688,,, +54.9531250000,879,1345.7875976562,,, +54.9550781250,879,1342.1245117188,,, +54.9570312500,879,1339.1940917969,,, +54.9589843750,879,1336.2637939453,,, +54.9609375000,879,1332.6007080078,,, +54.9628906250,879,1328.2050781250,,, +54.9648437500,879,1325.2747802734,,, +54.9667968750,879,1323.8095703125,,, +54.9687500000,879,1321.6116943359,,, +54.9707031250,879,1320.1464843750,,, +54.9726562500,879,1317.2160644531,,, +54.9746093750,879,1314.2857666016,,, +54.9765625000,879,1313.5531005859,,, +54.9785156250,879,1313.5531005859,,, +54.9804687500,879,1312.8205566406,,, +54.9824218750,879,1312.0878906250,,, +54.9843750000,879,1311.3553466797,,, +54.9863281250,879,1311.3553466797,,, +54.9882812500,879,1310.6226806641,,, +54.9902343750,879,1311.3553466797,,, +54.9921875000,879,1311.3553466797,,, +54.9941406250,879,1312.0878906250,,, +54.9960937500,879,1312.0878906250,,, +54.9980468750,879,1313.5531005859,,, +55.0000000000,880,1315.0183105469,,, +55.0019531250,880,1314.2857666016,,, +55.0039062500,880,1314.2857666016,,, +55.0058593750,880,1315.0183105469,,, +55.0078125000,880,1315.7509765625,,, +55.0097656250,880,1315.7509765625,,, +55.0117187500,880,1316.4835205078,,, +55.0136718750,880,1315.7509765625,,, +55.0156250000,880,1316.4835205078,,, +55.0175781250,880,1318.6812744141,,, +55.0195312500,880,1319.4139404297,,, +55.0214843750,880,1320.1464843750,,, +55.0234375000,880,1321.6116943359,,, +55.0253906250,880,1323.0769042969,,, +55.0273437500,880,1323.8095703125,,, +55.0292968750,880,1325.2747802734,,, +55.0312500000,880,1327.4725341797,,, +55.0332031250,880,1330.4029541016,,, +55.0351562500,880,1331.8681640625,,, +55.0371093750,880,1333.3333740234,,, +55.0390625000,880,1334.0659179688,,, +55.0410156250,880,1336.9963378906,,, +55.0429687500,880,1339.1940917969,,, +55.0449218750,880,1341.3919677734,,, +55.0468750000,880,1342.8571777344,,, +55.0488281250,880,1344.3223876953,,, +55.0507812500,880,1346.5201416016,,, +55.0527343750,880,1349.4505615234,,, +55.0546875000,880,1352.3809814453,,, +55.0566406250,880,1355.3114013672,,, +55.0585937500,880,1358.9743652344,,, +55.0605468750,880,1362.6373291016,,, +55.0625000000,881,1365.5677490234,,, +55.0644531250,881,1369.2307128906,,, +55.0664062500,881,1371.4285888672,,, +55.0683593750,881,1375.0915527344,,, +55.0703125000,881,1378.0219726562,,, +55.0722656250,881,1380.2197265625,,, +55.0742187500,881,1382.4176025391,,, +55.0761718750,881,1385.3480224609,,, +55.0781250000,881,1389.0109863281,,, +55.0800781250,881,1390.4761962891,,, +55.0820312500,881,1392.6739501953,,, +55.0839843750,881,1394.8718261719,,, +55.0859375000,881,1397.8022460938,,, +55.0878906250,881,1401.4652099609,,, +55.0898437500,881,1403.6629638672,,, +55.0917968750,881,1405.1281738281,,, +55.0937500000,881,1407.3260498047,,, +55.0957031250,881,1408.7912597656,,, +55.0976562500,881,1410.9890136719,,, +55.0996093750,881,1412.4542236328,,, +55.1015625000,881,1413.1867675781,,, +55.1035156250,881,1414.6519775391,,, +55.1054687500,881,1415.3846435547,,, +55.1074218750,881,1416.8498535156,,, +55.1093750000,881,1416.8498535156,,, +55.1113281250,881,1416.8498535156,,, +55.1132812500,881,1417.5823974609,,, +55.1152343750,881,1418.3150634766,,, +55.1171875000,881,1418.3150634766,,, +55.1191406250,881,1416.8498535156,,, +55.1210937500,881,1416.8498535156,,, +55.1230468750,881,1416.1171875000,,, +55.1250000000,882,1413.9194335938,,, +55.1269531250,882,1411.7215576172,,, +55.1289062500,882,1410.9890136719,,, +55.1308593750,882,1409.5238037109,,, +55.1328125000,882,1407.3260498047,,, +55.1347656250,882,1404.3956298828,,, +55.1367187500,882,1400.7325439453,,, +55.1386718750,882,1398.5347900391,,, +55.1406250000,882,1396.3370361328,,, +55.1425781250,882,1393.4066162109,,, +55.1445312500,882,1390.4761962891,,, +55.1464843750,882,1387.5457763672,,, +55.1484375000,882,1383.8828125000,,, +55.1503906250,882,1381.6849365234,,, +55.1523437500,882,1378.0219726562,,, +55.1542968750,882,1374.3590087891,,, +55.1562500000,882,1371.4285888672,,, +55.1582031250,882,1369.2307128906,,, +55.1601562500,882,1367.0329589844,,, +55.1621093750,882,1364.1025390625,,, +55.1640625000,882,1360.4395751953,,, +55.1660156250,882,1358.2416992188,,, +55.1679687500,882,1356.7766113281,,, +55.1699218750,882,1354.5787353516,,, +55.1718750000,882,1350.9157714844,,, +55.1738281250,882,1347.2528076172,,, +55.1757812500,882,1345.0549316406,,, +55.1777343750,882,1342.8571777344,,, +55.1796875000,882,1339.9267578125,,, +55.1816406250,882,1336.2637939453,,, +55.1835937500,882,1332.6007080078,,, +55.1855468750,882,1330.4029541016,,, +55.1875000000,883,1327.4725341797,,, +55.1894531250,883,1323.8095703125,,, +55.1914062500,883,1320.8791503906,,, +55.1933593750,883,1318.6812744141,,, +55.1953125000,883,1316.4835205078,,, +55.1972656250,883,1314.2857666016,,, +55.1992187500,883,1312.0878906250,,, +55.2011718750,883,1309.8901367188,,, +55.2031250000,883,1306.9597167969,,, +55.2050781250,883,1305.4945068359,,, +55.2070312500,883,1303.2967529297,,, +55.2089843750,883,1301.8315429688,,, +55.2109375000,883,1298.9011230469,,, +55.2128906250,883,1297.4359130859,,, +55.2148437500,883,1296.7032470703,,, +55.2167968750,883,1294.5054931641,,, +55.2187500000,883,1293.0402832031,,, +55.2207031250,883,1290.8425292969,,, +55.2226562500,883,1289.3773193359,,, +55.2246093750,883,1289.3773193359,,, +55.2265625000,883,1287.9121093750,,, +55.2285156250,883,1286.4468994141,,, +55.2304687500,883,1284.9816894531,,, +55.2324218750,883,1284.2490234375,,, +55.2343750000,883,1284.2490234375,,, +55.2363281250,883,1284.2490234375,,, +55.2382812500,883,1282.0512695312,,, +55.2402343750,883,1280.5860595703,,, +55.2421875000,883,1280.5860595703,,, +55.2441406250,883,1279.8535156250,,, +55.2460937500,883,1279.1208496094,,, +55.2480468750,883,1278.3883056641,,, +55.2500000000,884,1279.1208496094,,, +55.2519531250,884,1279.1208496094,,, +55.2539062500,884,1279.1208496094,,, +55.2558593750,884,1279.1208496094,,, +55.2578125000,884,1279.1208496094,,, +55.2597656250,884,1278.3883056641,,, +55.2617187500,884,1279.1208496094,,, +55.2636718750,884,1279.1208496094,,, +55.2656250000,884,1279.1208496094,,, +55.2675781250,884,1279.1208496094,,, +55.2695312500,884,1278.3883056641,,, +55.2714843750,884,1279.1208496094,,, +55.2734375000,884,1280.5860595703,,, +55.2753906250,884,1281.3187255859,,, +55.2773437500,884,1282.0512695312,,, +55.2792968750,884,1282.0512695312,,, +55.2812500000,884,1282.0512695312,,, +55.2832031250,884,1282.7839355469,,, +55.2851562500,884,1282.7839355469,,, +55.2871093750,884,1282.0512695312,,, +55.2890625000,884,1282.0512695312,,, +55.2910156250,884,1282.7839355469,,, +55.2929687500,884,1284.2490234375,,, +55.2949218750,884,1284.2490234375,,, +55.2968750000,884,1283.5164794922,,, +55.2988281250,884,1284.9816894531,,, +55.3007812500,884,1285.7142333984,,, +55.3027343750,884,1286.4468994141,,, +55.3046875000,884,1287.1794433594,,, +55.3066406250,884,1287.1794433594,,, +55.3085937500,884,1287.9121093750,,, +55.3105468750,884,1289.3773193359,,, +55.3125000000,885,1290.1098632812,,, +55.3144531250,885,1291.5750732422,,, +55.3164062500,885,1291.5750732422,,, +55.3183593750,885,1291.5750732422,,, +55.3203125000,885,1292.3077392578,,, +55.3222656250,885,1293.7729492188,,, +55.3242187500,885,1294.5054931641,,, +55.3261718750,885,1294.5054931641,,, +55.3281250000,885,1295.2380371094,,, +55.3300781250,885,1296.7032470703,,, +55.3320312500,885,1298.1684570312,,, +55.3339843750,885,1298.1684570312,,, +55.3359375000,885,1298.1684570312,,, +55.3378906250,885,1298.9011230469,,, +55.3398437500,885,1301.0988769531,,, +55.3417968750,885,1302.5640869141,,, +55.3437500000,885,1302.5640869141,,, +55.3457031250,885,1303.2967529297,,, +55.3476562500,885,1305.4945068359,,, +55.3496093750,885,1306.2270507812,,, +55.3515625000,885,1305.4945068359,,, +55.3535156250,885,1306.2270507812,,, +55.3554687500,885,1306.9597167969,,, +55.3574218750,885,1308.4249267578,,, +55.3593750000,885,1309.1574707031,,, +55.3613281250,885,1308.4249267578,,, +55.3632812500,885,1309.1574707031,,, +55.3652343750,885,1309.1574707031,,, +55.3671875000,885,1309.8901367188,,, +55.3691406250,885,1311.3553466797,,, +55.3710937500,885,1309.8901367188,,, +55.3730468750,885,1309.1574707031,,, +55.3750000000,886,1309.8901367188,,, +55.3769531250,886,1310.6226806641,,, +55.3789062500,886,1310.6226806641,,, +55.3808593750,886,1309.8901367188,,, +55.3828125000,886,1309.1574707031,,, +55.3847656250,886,1309.1574707031,,, +55.3867187500,886,1309.1574707031,,, +55.3886718750,886,1309.8901367188,,, +55.3906250000,886,1309.1574707031,,, +55.3925781250,886,1309.1574707031,,, +55.3945312500,886,1309.1574707031,,, +55.3964843750,886,1307.6922607422,,, +55.3984375000,886,1307.6922607422,,, +55.4003906250,886,1309.1574707031,,, +55.4023437500,886,1307.6922607422,,, +55.4042968750,886,1307.6922607422,,, +55.4062500000,886,1306.2270507812,,, +55.4082031250,886,1307.6922607422,,, +55.4101562500,886,1306.2270507812,,, +55.4121093750,886,1304.7619628906,,, +55.4140625000,886,1305.4945068359,,, +55.4160156250,886,1304.7619628906,,, +55.4179687500,886,1304.0292968750,,, +55.4199218750,886,1302.5640869141,,, +55.4218750000,886,1302.5640869141,,, +55.4238281250,886,1301.0988769531,,, +55.4257812500,886,1300.3663330078,,, +55.4277343750,886,1299.6336669922,,, +55.4296875000,886,1298.1684570312,,, +55.4316406250,886,1296.7032470703,,, +55.4335937500,886,1295.9707031250,,, +55.4355468750,886,1294.5054931641,,, +55.4375000000,887,1293.0402832031,,, +55.4394531250,887,1292.3077392578,,, +55.4414062500,887,1292.3077392578,,, +55.4433593750,887,1290.8425292969,,, +55.4453125000,887,1289.3773193359,,, +55.4472656250,887,1289.3773193359,,, +55.4492187500,887,1287.9121093750,,, +55.4511718750,887,1287.1794433594,,, +55.4531250000,887,1286.4468994141,,, +55.4550781250,887,1285.7142333984,,, +55.4570312500,887,1285.7142333984,,, +55.4589843750,887,1284.9816894531,,, +55.4609375000,887,1284.2490234375,,, +55.4628906250,887,1283.5164794922,,, +55.4648437500,887,1283.5164794922,,, +55.4667968750,887,1284.2490234375,,, +55.4687500000,887,1284.9816894531,,, +55.4707031250,887,1285.7142333984,,, +55.4726562500,887,1287.1794433594,,, +55.4746093750,887,1287.1794433594,,, +55.4765625000,887,1290.1098632812,,, +55.4785156250,887,1292.3077392578,,, +55.4804687500,887,1292.3077392578,,, +55.4824218750,887,1293.7729492188,,, +55.4843750000,887,1295.9707031250,,, +55.4863281250,887,1297.4359130859,,, +55.4882812500,887,1298.1684570312,,, +55.4902343750,887,1298.9011230469,,, +55.4921875000,887,1301.0988769531,,, +55.4941406250,887,1301.8315429688,,, +55.4960937500,887,1303.2967529297,,, +55.4980468750,887,1302.5640869141,,, +55.5000000000,888,1303.2967529297,,, +55.5019531250,888,1304.0292968750,,, +55.5039062500,888,1304.7619628906,,, +55.5058593750,888,1305.4945068359,,, +55.5078125000,888,1305.4945068359,,, +55.5097656250,888,1306.2270507812,,, +55.5117187500,888,1306.2270507812,,, +55.5136718750,888,1306.2270507812,,, +55.5156250000,888,1307.6922607422,,, +55.5175781250,888,1307.6922607422,,, +55.5195312500,888,1308.4249267578,,, +55.5214843750,888,1308.4249267578,,, +55.5234375000,888,1308.4249267578,,, +55.5253906250,888,1309.1574707031,,, +55.5273437500,888,1309.1574707031,,, +55.5292968750,888,1309.1574707031,,, +55.5312500000,888,1307.6922607422,,, +55.5332031250,888,1308.4249267578,,, +55.5351562500,888,1308.4249267578,,, +55.5371093750,888,1308.4249267578,,, +55.5390625000,888,1308.4249267578,,, +55.5410156250,888,1306.9597167969,,, +55.5429687500,888,1306.2270507812,,, +55.5449218750,888,1305.4945068359,,, +55.5468750000,888,1305.4945068359,,, +55.5488281250,888,1304.0292968750,,, +55.5507812500,888,1303.2967529297,,, +55.5527343750,888,1301.8315429688,,, +55.5546875000,888,1301.0988769531,,, +55.5566406250,888,1299.6336669922,,, +55.5585937500,888,1298.9011230469,,, +55.5605468750,888,1298.9011230469,,, +55.5625000000,889,1299.6336669922,,, +55.5644531250,889,1298.9011230469,,, +55.5664062500,889,1298.9011230469,,, +55.5683593750,889,1297.4359130859,,, +55.5703125000,889,1297.4359130859,,, +55.5722656250,889,1296.7032470703,,, +55.5742187500,889,1297.4359130859,,, +55.5761718750,889,1295.9707031250,,, +55.5781250000,889,1294.5054931641,,, +55.5800781250,889,1293.7729492188,,, +55.5820312500,889,1293.0402832031,,, +55.5839843750,889,1292.3077392578,,, +55.5859375000,889,1290.8425292969,,, +55.5878906250,889,1289.3773193359,,, +55.5898437500,889,1290.1098632812,,, +55.5917968750,889,1287.9121093750,,, +55.5937500000,889,1287.9121093750,,, +55.5957031250,889,1287.9121093750,,, +55.5976562500,889,1287.9121093750,,, +55.5996093750,889,1287.9121093750,,, +55.6015625000,889,1287.9121093750,,, +55.6035156250,889,1288.6446533203,,, +55.6054687500,889,1289.3773193359,,, +55.6074218750,889,1290.1098632812,,, +55.6093750000,889,1290.8425292969,,, +55.6113281250,889,1290.8425292969,,, +55.6132812500,889,1291.5750732422,,, +55.6152343750,889,1290.8425292969,,, +55.6171875000,889,1292.3077392578,,, +55.6191406250,889,1293.0402832031,,, +55.6210937500,889,1292.3077392578,,, +55.6230468750,889,1292.3077392578,,, +55.6250000000,890,1292.3077392578,,, +55.6269531250,890,1292.3077392578,,, +55.6289062500,890,1290.8425292969,,, +55.6308593750,890,1290.8425292969,,, +55.6328125000,890,1290.8425292969,,, +55.6347656250,890,1290.8425292969,,, +55.6367187500,890,1290.8425292969,,, +55.6386718750,890,1290.1098632812,,, +55.6406250000,890,1290.8425292969,,, +55.6425781250,890,1290.8425292969,,, +55.6445312500,890,1293.0402832031,,, +55.6464843750,890,1293.7729492188,,, +55.6484375000,890,1295.9707031250,,, +55.6503906250,890,1298.9011230469,,, +55.6523437500,890,1303.2967529297,,, +55.6542968750,890,1307.6922607422,,, +55.6562500000,890,1311.3553466797,,, +55.6582031250,890,1317.2160644531,,, +55.6601562500,890,1324.5421142578,,, +55.6621093750,890,1331.8681640625,,, +55.6640625000,890,1339.1940917969,,, +55.6660156250,890,1347.2528076172,,, +55.6679687500,890,1356.7766113281,,, +55.6699218750,890,1367.0329589844,,, +55.6718750000,890,1377.2894287109,,, +55.6738281250,890,1388.2784423828,,, +55.6757812500,890,1400.0000000000,,, +55.6777343750,890,1413.1867675781,,, +55.6796875000,890,1426.3736572266,,, +55.6816406250,890,1439.5604248047,,, +55.6835937500,890,1454.2124023438,,, +55.6855468750,890,1468.8645019531,,, +55.6875000000,891,1485.7142333984,,, +55.6894531250,891,1501.8315429688,,, +55.6914062500,891,1517.9487304688,,, +55.6933593750,891,1534.7985839844,,, +55.6953125000,891,1553.1135253906,,, +55.6972656250,891,1571.4285888672,,, +55.6992187500,891,1589.0109863281,,, +55.7011718750,891,1606.5933837891,,, +55.7031250000,891,1624.1757812500,,, +55.7050781250,891,1642.4908447266,,, +55.7070312500,891,1660.0732421875,,, +55.7089843750,891,1676.9230957031,,, +55.7109375000,891,1693.7729492188,,, +55.7128906250,891,1711.3553466797,,, +55.7148437500,891,1726.7398681641,,, +55.7167968750,891,1742.1245117188,,, +55.7187500000,891,1757.5091552734,,, +55.7207031250,891,1772.8937988281,,, +55.7226562500,891,1787.5457763672,,, +55.7246093750,891,1802.1977539062,,, +55.7265625000,891,1815.3846435547,,, +55.7285156250,891,1828.5714111328,,, +55.7304687500,891,1840.2930908203,,, +55.7324218750,891,1852.7471923828,,, +55.7343750000,891,1863.0036621094,,, +55.7363281250,891,1873.2601318359,,, +55.7382812500,891,1881.3187255859,,, +55.7402343750,891,1890.1098632812,,, +55.7421875000,891,1897.4359130859,,, +55.7441406250,891,1904.7619628906,,, +55.7460937500,891,1910.6226806641,,, +55.7480468750,891,1915.0183105469,,, +55.7500000000,892,1919.4139404297,,, +55.7519531250,892,1921.6116943359,,, +55.7539062500,892,1923.0769042969,,, +55.7558593750,892,1923.8095703125,,, +55.7578125000,892,1924.5421142578,,, +55.7597656250,892,1923.0769042969,,, +55.7617187500,892,1920.1464843750,,, +55.7636718750,892,1917.9487304688,,, +55.7656250000,892,1914.2857666016,,, +55.7675781250,892,1907.6922607422,,, +55.7695312500,892,1904.0292968750,,, +55.7714843750,892,1897.4359130859,,, +55.7734375000,892,1890.1098632812,,, +55.7753906250,892,1883.5164794922,,, +55.7773437500,892,1876.1904296875,,, +55.7792968750,892,1865.9340820312,,, +55.7812500000,892,1856.4102783203,,, +55.7832031250,892,1846.1538085938,,, +55.7851562500,892,1834.4322509766,,, +55.7871093750,892,1822.7105712891,,, +55.7890625000,892,1810.2564697266,,, +55.7910156250,892,1798.5347900391,,, +55.7929687500,892,1785.3480224609,,, +55.7949218750,892,1771.4285888672,,, +55.7968750000,892,1758.2416992188,,, +55.7988281250,892,1743.5897216797,,, +55.8007812500,892,1729.6702880859,,, +55.8027343750,892,1715.0183105469,,, +55.8046875000,892,1699.6336669922,,, +55.8066406250,892,1685.7142333984,,, +55.8085937500,892,1671.7949218750,,, +55.8105468750,892,1658.6080322266,,, +55.8125000000,893,1644.6885986328,,, +55.8144531250,893,1630.0366210938,,, +55.8164062500,893,1616.1171875000,,, +55.8183593750,893,1603.6629638672,,, +55.8203125000,893,1591.2087402344,,, +55.8222656250,893,1578.7546386719,,, +55.8242187500,893,1565.5677490234,,, +55.8261718750,893,1553.1135253906,,, +55.8281250000,893,1541.3919677734,,, +55.8300781250,893,1530.4029541016,,, +55.8320312500,893,1518.6812744141,,, +55.8339843750,893,1506.9597167969,,, +55.8359375000,893,1495.2380371094,,, +55.8378906250,893,1484.9816894531,,, +55.8398437500,893,1473.9926757812,,, +55.8417968750,893,1463.7362060547,,, +55.8437500000,893,1452.7471923828,,, +55.8457031250,893,1442.4908447266,,, +55.8476562500,893,1434.4322509766,,, +55.8496093750,893,1425.6409912109,,, +55.8515625000,893,1415.3846435547,,, +55.8535156250,893,1406.5933837891,,, +55.8554687500,893,1398.5347900391,,, +55.8574218750,893,1391.2087402344,,, +55.8593750000,893,1383.1501464844,,, +55.8613281250,893,1360.4395751953,,, +55.8632812500,893,1355.3114013672,,, +55.8652343750,893,1349.4505615234,,, +55.8671875000,893,1342.8571777344,,, +55.8691406250,893,1336.9963378906,,, +55.8710937500,893,1331.8681640625,,, +55.8730468750,893,1327.4725341797,,, +55.8750000000,894,1324.5421142578,,, +55.8769531250,894,1321.6116943359,,, +55.8789062500,894,1317.2160644531,,, +55.8808593750,894,1314.2857666016,,, +55.8828125000,894,1312.0878906250,,, +55.8847656250,894,1309.1574707031,,, +55.8867187500,894,1306.2270507812,,, +55.8886718750,894,1302.5640869141,,, +55.8906250000,894,1299.6336669922,,, +55.8925781250,894,1298.1684570312,,, +55.8945312500,894,1296.7032470703,,, +55.8964843750,894,1294.5054931641,,, +55.8984375000,894,1292.3077392578,,, +55.9003906250,894,1290.1098632812,,, +55.9023437500,894,1289.3773193359,,, +55.9042968750,894,1289.3773193359,,, +55.9062500000,894,1287.9121093750,,, +55.9082031250,894,1287.1794433594,,, +55.9101562500,894,1285.7142333984,,, +55.9121093750,894,1285.7142333984,,, +55.9140625000,894,1286.4468994141,,, +55.9160156250,894,1287.1794433594,,, +55.9179687500,894,1285.7142333984,,, +55.9199218750,894,1285.7142333984,,, +55.9218750000,894,1287.1794433594,,, +55.9238281250,894,1287.9121093750,,, +55.9257812500,894,1288.6446533203,,, +55.9277343750,894,1289.3773193359,,, +55.9296875000,894,1291.5750732422,,, +55.9316406250,894,1292.3077392578,,, +55.9335937500,894,1294.5054931641,,, +55.9355468750,894,1296.7032470703,,, +55.9375000000,895,1298.1684570312,,, +55.9394531250,895,1301.0988769531,,, +55.9414062500,895,1303.2967529297,,, +55.9433593750,895,1305.4945068359,,, +55.9453125000,895,1307.6922607422,,, +55.9472656250,895,1309.1574707031,,, +55.9492187500,895,1312.0878906250,,, +55.9511718750,895,1315.7509765625,,, +55.9531250000,895,1318.6812744141,,, +55.9550781250,895,1320.1464843750,,, +55.9570312500,895,1323.0769042969,,, +55.9589843750,895,1326.7398681641,,, +55.9609375000,895,1330.4029541016,,, +55.9628906250,895,1332.6007080078,,, +55.9648437500,895,1335.5311279297,,, +55.9667968750,895,1339.9267578125,,, +55.9687500000,895,1342.8571777344,,, +55.9707031250,895,1344.3223876953,,, +55.9726562500,895,1347.2528076172,,, +55.9746093750,895,1350.9157714844,,, +55.9765625000,895,1355.3114013672,,, +55.9785156250,895,1358.2416992188,,, +55.9804687500,895,1360.4395751953,,, +55.9824218750,895,1363.3699951172,,, +55.9843750000,895,1367.0329589844,,, +55.9863281250,895,1371.4285888672,,, +55.9882812500,895,1375.0915527344,,, +55.9902343750,895,1377.2894287109,,, +55.9921875000,895,1380.9523925781,,, +55.9941406250,895,1384.6153564453,,, +55.9960937500,895,1388.2784423828,,, +55.9980468750,895,1391.2087402344,,, +56.0000000000,896,1394.1391601562,,, +56.0019531250,896,1397.8022460938,,, +56.0039062500,896,1400.0000000000,,, +56.0058593750,896,1403.6629638672,,, +56.0078125000,896,1405.1281738281,,, +56.0097656250,896,1407.3260498047,,, +56.0117187500,896,1409.5238037109,,, +56.0136718750,896,1410.9890136719,,, +56.0156250000,896,1413.1867675781,,, +56.0175781250,896,1414.6519775391,,, +56.0195312500,896,1416.1171875000,,, +56.0214843750,896,1416.8498535156,,, +56.0234375000,896,1417.5823974609,,, +56.0253906250,896,1419.0476074219,,, +56.0273437500,896,1419.7802734375,,, +56.0292968750,896,1420.5128173828,,, +56.0312500000,896,1419.7802734375,,, +56.0332031250,896,1419.0476074219,,, +56.0351562500,896,1419.0476074219,,, +56.0371093750,896,1418.3150634766,,, +56.0390625000,896,1418.3150634766,,, +56.0410156250,896,1416.1171875000,,, +56.0429687500,896,1414.6519775391,,, +56.0449218750,896,1413.9194335938,,, +56.0468750000,896,1413.9194335938,,, +56.0488281250,896,1413.1867675781,,, +56.0507812500,896,1410.9890136719,,, +56.0527343750,896,1409.5238037109,,, +56.0546875000,896,1408.0585937500,,, +56.0566406250,896,1408.0585937500,,, +56.0585937500,896,1405.8608398438,,, +56.0605468750,896,1404.3956298828,,, +56.0625000000,897,1401.4652099609,,, +56.0644531250,897,1399.2674560547,,, +56.0664062500,897,1397.8022460938,,, +56.0683593750,897,1397.0695800781,,, +56.0703125000,897,1394.8718261719,,, +56.0722656250,897,1391.2087402344,,, +56.0742187500,897,1388.2784423828,,, +56.0761718750,897,1386.8132324219,,, +56.0781250000,897,1383.8828125000,,, +56.0800781250,897,1380.9523925781,,, +56.0820312500,897,1378.0219726562,,, +56.0839843750,897,1375.8242187500,,, +56.0859375000,897,1373.6263427734,,, +56.0878906250,897,1371.4285888672,,, +56.0898437500,897,1369.2307128906,,, +56.0917968750,897,1367.0329589844,,, +56.0937500000,897,1364.1025390625,,, +56.0957031250,897,1361.9047851562,,, +56.0976562500,897,1358.2416992188,,, +56.0996093750,897,1355.3114013672,,, +56.1015625000,897,1351.6483154297,,, +56.1035156250,897,1348.7178955078,,, +56.1054687500,897,1345.7875976562,,, +56.1074218750,897,1341.3919677734,,, +56.1093750000,897,1337.7288818359,,, +56.1113281250,897,1334.7985839844,,, +56.1132812500,897,1331.8681640625,,, +56.1152343750,897,1328.2050781250,,, +56.1171875000,897,1324.5421142578,,, +56.1191406250,897,1320.8791503906,,, +56.1210937500,897,1318.6812744141,,, +56.1230468750,897,1315.0183105469,,, +56.1250000000,898,1312.0878906250,,, +56.1269531250,898,1309.1574707031,,, +56.1289062500,898,1306.9597167969,,, +56.1308593750,898,1304.0292968750,,, +56.1328125000,898,1301.0988769531,,, +56.1347656250,898,1298.1684570312,,, +56.1367187500,898,1295.9707031250,,, +56.1386718750,898,1294.5054931641,,, +56.1406250000,898,1293.0402832031,,, +56.1425781250,898,1291.5750732422,,, +56.1445312500,898,1288.6446533203,,, +56.1464843750,898,1287.1794433594,,, +56.1484375000,898,1285.7142333984,,, +56.1503906250,898,1283.5164794922,,, +56.1523437500,898,1282.0512695312,,, +56.1542968750,898,1279.8535156250,,, +56.1562500000,898,1277.6556396484,,, +56.1582031250,898,1277.6556396484,,, +56.1601562500,898,1275.4578857422,,, +56.1621093750,898,1274.7252197266,,, +56.1640625000,898,1273.2601318359,,, +56.1660156250,898,1272.5274658203,,, +56.1679687500,898,1272.5274658203,,, +56.1699218750,898,1272.5274658203,,, +56.1718750000,898,1271.7949218750,,, +56.1738281250,898,1271.0622558594,,, +56.1757812500,898,1271.7949218750,,, +56.1777343750,898,1271.7949218750,,, +56.1796875000,898,1271.7949218750,,, +56.1816406250,898,1271.0622558594,,, +56.1835937500,898,1269.5970458984,,, +56.1855468750,898,1269.5970458984,,, +56.1875000000,899,1269.5970458984,,, +56.1894531250,899,1269.5970458984,,, +56.1914062500,899,1268.1318359375,,, +56.1933593750,899,1267.3992919922,,, +56.1953125000,899,1267.3992919922,,, +56.1972656250,899,1266.6666259766,,, +56.1992187500,899,1265.9340820312,,, +56.2011718750,899,1265.9340820312,,, +56.2031250000,899,1265.9340820312,,, +56.2050781250,899,1266.6666259766,,, +56.2070312500,899,1266.6666259766,,, +56.2089843750,899,1265.9340820312,,, +56.2109375000,899,1265.9340820312,,, +56.2128906250,899,1267.3992919922,,, +56.2148437500,899,1267.3992919922,,, +56.2167968750,899,1268.8645019531,,, +56.2187500000,899,1271.0622558594,,, +56.2207031250,899,1271.0622558594,,, +56.2226562500,899,1272.5274658203,,, +56.2246093750,899,1273.9926757812,,, +56.2265625000,899,1275.4578857422,,, +56.2285156250,899,1276.1904296875,,, +56.2304687500,899,1276.9230957031,,, +56.2324218750,899,1279.1208496094,,, +56.2343750000,899,1280.5860595703,,, +56.2363281250,899,1281.3187255859,,, +56.2382812500,899,1284.2490234375,,, +56.2402343750,899,1286.4468994141,,, +56.2421875000,899,1287.1794433594,,, +56.2441406250,899,1288.6446533203,,, +56.2460937500,899,1292.3077392578,,, +56.2480468750,899,1294.5054931641,,, +56.2500000000,900,1295.2380371094,,, +56.2519531250,900,1297.4359130859,,, +56.2539062500,900,1299.6336669922,,, +56.2558593750,900,1301.8315429688,,, +56.2578125000,900,1302.5640869141,,, +56.2597656250,900,1303.2967529297,,, +56.2617187500,900,1305.4945068359,,, +56.2636718750,900,1306.9597167969,,, +56.2656250000,900,1308.4249267578,,, +56.2675781250,900,1309.1574707031,,, +56.2695312500,900,1311.3553466797,,, +56.2714843750,900,1312.0878906250,,, +56.2734375000,900,1312.8205566406,,, +56.2753906250,900,1315.7509765625,,, +56.2773437500,900,1317.2160644531,,, +56.2792968750,900,1318.6812744141,,, +56.2812500000,900,1320.1464843750,,, +56.2832031250,900,1322.3443603516,,, +56.2851562500,900,1323.8095703125,,, +56.2871093750,900,1324.5421142578,,, +56.2890625000,900,1325.2747802734,,, +56.2910156250,900,1326.7398681641,,, +56.2929687500,900,1327.4725341797,,, +56.2949218750,900,1327.4725341797,,, +56.2968750000,900,1328.9377441406,,, +56.2988281250,900,1330.4029541016,,, +56.3007812500,900,1331.1354980469,,, +56.3027343750,900,1331.1354980469,,, +56.3046875000,900,1332.6007080078,,, +56.3066406250,900,1332.6007080078,,, +56.3085937500,900,1331.8681640625,,, +56.3105468750,900,1332.6007080078,,, +56.3125000000,901,1334.0659179688,,, +56.3144531250,901,1334.0659179688,,, +56.3164062500,901,1333.3333740234,,, +56.3183593750,901,1334.0659179688,,, +56.3203125000,901,1334.7985839844,,, +56.3222656250,901,1334.7985839844,,, +56.3242187500,901,1334.0659179688,,, +56.3261718750,901,1334.7985839844,,, +56.3281250000,901,1334.0659179688,,, +56.3300781250,901,1333.3333740234,,, +56.3320312500,901,1332.6007080078,,, +56.3339843750,901,1333.3333740234,,, +56.3359375000,901,1333.3333740234,,, +56.3378906250,901,1332.6007080078,,, +56.3398437500,901,1331.8681640625,,, +56.3417968750,901,1332.6007080078,,, +56.3437500000,901,1331.8681640625,,, +56.3457031250,901,1330.4029541016,,, +56.3476562500,901,1328.9377441406,,, +56.3496093750,901,1328.9377441406,,, +56.3515625000,901,1328.9377441406,,, +56.3535156250,901,1328.9377441406,,, +56.3554687500,901,1327.4725341797,,, +56.3574218750,901,1326.0073242188,,, +56.3593750000,901,1325.2747802734,,, +56.3613281250,901,1326.0073242188,,, +56.3632812500,901,1326.7398681641,,, +56.3652343750,901,1325.2747802734,,, +56.3671875000,901,1324.5421142578,,, +56.3691406250,901,1323.8095703125,,, +56.3710937500,901,1323.8095703125,,, +56.3730468750,901,1324.5421142578,,, +56.3750000000,902,1323.8095703125,,, +56.3769531250,902,1324.5421142578,,, +56.3789062500,902,1324.5421142578,,, +56.3808593750,902,1326.0073242188,,, +56.3828125000,902,1325.2747802734,,, +56.3847656250,902,1325.2747802734,,, +56.3867187500,902,1325.2747802734,,, +56.3886718750,902,1326.7398681641,,, +56.3906250000,902,1327.4725341797,,, +56.3925781250,902,1328.2050781250,,, +56.3945312500,902,1327.4725341797,,, +56.3964843750,902,1327.4725341797,,, +56.3984375000,902,1327.4725341797,,, +56.4003906250,902,1327.4725341797,,, +56.4023437500,902,1326.7398681641,,, +56.4042968750,902,1326.0073242188,,, +56.4062500000,902,1326.0073242188,,, +56.4082031250,902,1324.5421142578,,, +56.4101562500,902,1323.8095703125,,, +56.4121093750,902,1324.5421142578,,, +56.4140625000,902,1323.8095703125,,, +56.4160156250,902,1322.3443603516,,, +56.4179687500,902,1319.4139404297,,, +56.4199218750,902,1317.9487304688,,, +56.4218750000,902,1316.4835205078,,, +56.4238281250,902,1315.7509765625,,, +56.4257812500,902,1315.0183105469,,, +56.4277343750,902,1312.0878906250,,, +56.4296875000,902,1310.6226806641,,, +56.4316406250,902,1309.1574707031,,, +56.4335937500,902,1308.4249267578,,, +56.4355468750,902,1306.2270507812,,, +56.4375000000,903,1304.0292968750,,, +56.4394531250,903,1301.8315429688,,, +56.4414062500,903,1299.6336669922,,, +56.4433593750,903,1299.6336669922,,, +56.4453125000,903,1298.1684570312,,, +56.4472656250,903,1297.4359130859,,, +56.4492187500,903,1295.9707031250,,, +56.4511718750,903,1293.7729492188,,, +56.4531250000,903,1294.5054931641,,, +56.4550781250,903,1293.7729492188,,, +56.4570312500,903,1293.0402832031,,, +56.4589843750,903,1292.3077392578,,, +56.4609375000,903,1290.8425292969,,, +56.4628906250,903,1290.8425292969,,, +56.4648437500,903,1290.8425292969,,, +56.4667968750,903,1290.8425292969,,, +56.4687500000,903,1290.8425292969,,, +56.4707031250,903,1290.8425292969,,, +56.4726562500,903,1292.3077392578,,, +56.4746093750,903,1293.7729492188,,, +56.4765625000,903,1295.9707031250,,, +56.4785156250,903,1298.1684570312,,, +56.4804687500,903,1300.3663330078,,, +56.4824218750,903,1304.7619628906,,, +56.4843750000,903,1309.8901367188,,, +56.4863281250,903,1315.0183105469,,, +56.4882812500,903,1320.1464843750,,, +56.4902343750,903,1325.2747802734,,, +56.4921875000,903,1331.1354980469,,, +56.4941406250,903,1338.4615478516,,, +56.4960937500,903,1347.2528076172,,, +56.4980468750,903,1356.7766113281,,, +56.5000000000,904,1366.3004150391,,, +56.5019531250,904,1377.2894287109,,, +56.5039062500,904,1388.2784423828,,, +56.5058593750,904,1399.2674560547,,, +56.5078125000,904,1412.4542236328,,, +56.5097656250,904,1425.6409912109,,, +56.5117187500,904,1438.8278808594,,, +56.5136718750,904,1452.0146484375,,, +56.5156250000,904,1466.6666259766,,, +56.5175781250,904,1481.3187255859,,, +56.5195312500,904,1497.4359130859,,, +56.5214843750,904,1512.0878906250,,, +56.5234375000,904,1528.2050781250,,, +56.5253906250,904,1542.8571777344,,, +56.5273437500,904,1559.7069091797,,, +56.5292968750,904,1576.5567626953,,, +56.5312500000,904,1592.6739501953,,, +56.5332031250,904,1609.5238037109,,, +56.5351562500,904,1624.9084472656,,, +56.5371093750,904,1641.0256347656,,, +56.5390625000,904,1657.1428222656,,, +56.5410156250,904,1673.9926757812,,, +56.5429687500,904,1690.1098632812,,, +56.5449218750,904,1706.2270507812,,, +56.5468750000,904,1706.2270507812,,, +56.5488281250,904,1720.8791503906,,, +56.5507812500,904,1736.9963378906,,, +56.5527343750,904,1752.3809814453,,, +56.5546875000,904,1767.7656250000,,, +56.5566406250,904,1780.9523925781,,, +56.5585937500,904,1794.8718261719,,, +56.5605468750,904,1806.5933837891,,, +56.5625000000,905,1818.3150634766,,, +56.5644531250,905,1829.3040771484,,, +56.5664062500,905,1841.0256347656,,, +56.5683593750,905,1852.0146484375,,, +56.5703125000,905,1861.5384521484,,, +56.5722656250,905,1870.3297119141,,, +56.5742187500,905,1878.3883056641,,, +56.5761718750,905,1884.2490234375,,, +56.5781250000,905,1890.8425292969,,, +56.5800781250,905,1897.4359130859,,, +56.5820312500,905,1901.0988769531,,, +56.5839843750,905,1904.7619628906,,, +56.5859375000,905,1906.2270507812,,, +56.5878906250,905,1906.9597167969,,, +56.5898437500,905,1907.6922607422,,, +56.5917968750,905,1907.6922607422,,, +56.5937500000,905,1906.2270507812,,, +56.5957031250,905,1904.0292968750,,, +56.5976562500,905,1901.0988769531,,, +56.5996093750,905,1896.7032470703,,, +56.6015625000,905,1892.3077392578,,, +56.6035156250,905,1887.1794433594,,, +56.6054687500,905,1880.5860595703,,, +56.6074218750,905,1872.5274658203,,, +56.6093750000,905,1863.0036621094,,, +56.6113281250,905,1854.2124023438,,, +56.6132812500,905,1844.6885986328,,, +56.6152343750,905,1834.4322509766,,, +56.6171875000,905,1823.4432373047,,, +56.6191406250,905,1810.9890136719,,, +56.6210937500,905,1799.2674560547,,, +56.6230468750,905,1786.0805664062,,, +56.6250000000,906,1774.3590087891,,, +56.6269531250,906,1762.6373291016,,, +56.6289062500,906,1750.1831054688,,, +56.6308593750,906,1737.7288818359,,, +56.6328125000,906,1723.8095703125,,, +56.6347656250,906,1710.6226806641,,, +56.6367187500,906,1696.7032470703,,, +56.6386718750,906,1683.5164794922,,, +56.6406250000,906,1670.3297119141,,, +56.6425781250,906,1654.9450683594,,, +56.6445312500,906,1641.0256347656,,, +56.6464843750,906,1627.1062011719,,, +56.6484375000,906,1613.9194335938,,, +56.6503906250,906,1600.0000000000,,, +56.6523437500,906,1586.8132324219,,, +56.6542968750,906,1573.6263427734,,, +56.6562500000,906,1559.7069091797,,, +56.6582031250,906,1546.5201416016,,, +56.6601562500,906,1533.3333740234,,, +56.6621093750,906,1520.8791503906,,, +56.6640625000,906,1506.9597167969,,, +56.6660156250,906,1493.7729492188,,, +56.6679687500,906,1481.3187255859,,, +56.6699218750,906,1470.3297119141,,, +56.6718750000,906,1459.3406982422,,, +56.6738281250,906,1448.3516845703,,, +56.6757812500,906,1437.3626708984,,, +56.6777343750,906,1427.1062011719,,, +56.6796875000,906,1416.1171875000,,, +56.6816406250,906,1406.5933837891,,, +56.6835937500,906,1397.0695800781,,, +56.6855468750,906,1389.0109863281,,, +56.6875000000,907,1379.4871826172,,, +56.6894531250,907,1371.4285888672,,, +56.6914062500,907,1364.1025390625,,, +56.6933593750,907,1356.0439453125,,, +56.6953125000,907,1350.9157714844,,, +56.6972656250,907,1344.3223876953,,, +56.6992187500,907,1337.7288818359,,, +56.7011718750,907,1331.1354980469,,, +56.7031250000,907,1324.5421142578,,, +56.7050781250,907,1319.4139404297,,, +56.7070312500,907,1314.2857666016,,, +56.7089843750,907,1310.6226806641,,, +56.7109375000,907,1304.7619628906,,, +56.7128906250,907,1298.9011230469,,, +56.7148437500,907,1295.2380371094,,, +56.7167968750,907,1290.1098632812,,, +56.7187500000,907,1286.4468994141,,, +56.7207031250,907,1283.5164794922,,, +56.7226562500,907,1279.8535156250,,, +56.7246093750,907,1276.1904296875,,, +56.7265625000,907,1272.5274658203,,, +56.7285156250,907,1269.5970458984,,, +56.7304687500,907,1267.3992919922,,, +56.7324218750,907,1266.6666259766,,, +56.7343750000,907,1264.4688720703,,, +56.7363281250,907,1262.2711181641,,, +56.7382812500,907,1260.8059082031,,, +56.7402343750,907,1258.6080322266,,, +56.7421875000,907,1257.8754882812,,, +56.7441406250,907,1258.6080322266,,, +56.7460937500,907,1258.6080322266,,, +56.7480468750,907,1258.6080322266,,, +56.7500000000,908,1257.8754882812,,, +56.7519531250,908,1257.8754882812,,, +56.7539062500,908,1259.3406982422,,, +56.7558593750,908,1261.5384521484,,, +56.7578125000,908,1263.0036621094,,, +56.7597656250,908,1264.4688720703,,, +56.7617187500,908,1265.9340820312,,, +56.7636718750,908,1267.3992919922,,, +56.7656250000,908,1271.0622558594,,, +56.7675781250,908,1273.9926757812,,, +56.7695312500,908,1276.9230957031,,, +56.7714843750,908,1279.8535156250,,, +56.7734375000,908,1282.7839355469,,, +56.7753906250,908,1286.4468994141,,, +56.7773437500,908,1290.1098632812,,, +56.7792968750,908,1293.7729492188,,, +56.7812500000,908,1297.4359130859,,, +56.7832031250,908,1301.0988769531,,, +56.7851562500,908,1306.2270507812,,, +56.7871093750,908,1311.3553466797,,, +56.7890625000,908,1315.7509765625,,, +56.7910156250,908,1319.4139404297,,, +56.7929687500,908,1323.0769042969,,, +56.7949218750,908,1326.7398681641,,, +56.7968750000,908,1331.8681640625,,, +56.7988281250,908,1335.5311279297,,, +56.8007812500,908,1340.6593017578,,, +56.8027343750,908,1345.0549316406,,, +56.8046875000,908,1349.4505615234,,, +56.8066406250,908,1353.8461914062,,, +56.8085937500,908,1358.9743652344,,, +56.8105468750,908,1364.1025390625,,, +56.8125000000,909,1369.9633789062,,, +56.8144531250,909,1375.0915527344,,, +56.8164062500,909,1380.2197265625,,, +56.8183593750,909,1385.3480224609,,, +56.8203125000,909,1389.7435302734,,, +56.8222656250,909,1394.1391601562,,, +56.8242187500,909,1399.2674560547,,, +56.8261718750,909,1404.3956298828,,, +56.8281250000,909,1408.0585937500,,, +56.8300781250,909,1410.9890136719,,, +56.8320312500,909,1413.9194335938,,, +56.8339843750,909,1416.8498535156,,, +56.8359375000,909,1421.2453613281,,, +56.8378906250,909,1424.9084472656,,, +56.8398437500,909,1427.1062011719,,, +56.8417968750,909,1429.3040771484,,, +56.8437500000,909,1431.5018310547,,, +56.8457031250,909,1434.4322509766,,, +56.8476562500,909,1437.3626708984,,, +56.8496093750,909,1440.2930908203,,, +56.8515625000,909,1441.7583007812,,, +56.8535156250,909,1441.0256347656,,, +56.8554687500,909,1442.4908447266,,, +56.8574218750,909,1443.2233886719,,, +56.8593750000,909,1444.6885986328,,, +56.8613281250,909,1443.9560546875,,, +56.8632812500,909,1442.4908447266,,, +56.8652343750,909,1442.4908447266,,, +56.8671875000,909,1441.7583007812,,, +56.8691406250,909,1441.7583007812,,, +56.8710937500,909,1440.2930908203,,, +56.8730468750,909,1437.3626708984,,, +56.8750000000,910,1435.8974609375,,, +56.8769531250,910,1432.9670410156,,, +56.8789062500,910,1430.7692871094,,, +56.8808593750,910,1430.0366210938,,, +56.8828125000,910,1427.8388671875,,, +56.8847656250,910,1425.6409912109,,, +56.8867187500,910,1421.9780273438,,, +56.8886718750,910,1420.5128173828,,, +56.8906250000,910,1417.5823974609,,, +56.8925781250,910,1416.8498535156,,, +56.8945312500,910,1414.6519775391,,, +56.8964843750,910,1412.4542236328,,, +56.8984375000,910,1409.5238037109,,, +56.9003906250,910,1405.8608398438,,, +56.9023437500,910,1402.1977539062,,, +56.9042968750,910,1400.0000000000,,, +56.9062500000,910,1397.0695800781,,, +56.9082031250,910,1394.8718261719,,, +56.9101562500,910,1391.9414062500,,, +56.9121093750,910,1389.0109863281,,, +56.9140625000,910,1384.6153564453,,, +56.9160156250,910,1380.9523925781,,, +56.9179687500,910,1378.7546386719,,, +56.9199218750,910,1375.0915527344,,, +56.9218750000,910,1372.1611328125,,, +56.9238281250,910,1367.7656250000,,, +56.9257812500,910,1364.8352050781,,, +56.9277343750,910,1361.9047851562,,, +56.9296875000,910,1359.7069091797,,, +56.9316406250,910,1358.2416992188,,, +56.9335937500,910,1354.5787353516,,, +56.9355468750,910,1352.3809814453,,, +56.9375000000,911,1348.7178955078,,, +56.9394531250,911,1346.5201416016,,, +56.9414062500,911,1345.0549316406,,, +56.9433593750,911,1342.1245117188,,, +56.9453125000,911,1339.1940917969,,, +56.9472656250,911,1336.2637939453,,, +56.9492187500,911,1335.5311279297,,, +56.9511718750,911,1333.3333740234,,, +56.9531250000,911,1328.9377441406,,, +56.9550781250,911,1327.4725341797,,, +56.9570312500,911,1324.5421142578,,, +56.9589843750,911,1323.0769042969,,, +56.9609375000,911,1320.1464843750,,, +56.9628906250,911,1317.9487304688,,, +56.9648437500,911,1315.7509765625,,, +56.9667968750,911,1312.8205566406,,, +56.9687500000,911,1310.6226806641,,, +56.9707031250,911,1307.6922607422,,, +56.9726562500,911,1306.2270507812,,, +56.9746093750,911,1304.0292968750,,, +56.9765625000,911,1301.8315429688,,, +56.9785156250,911,1299.6336669922,,, +56.9804687500,911,1298.1684570312,,, +56.9824218750,911,1296.7032470703,,, +56.9843750000,911,1295.2380371094,,, +56.9863281250,911,1293.0402832031,,, +56.9882812500,911,1290.1098632812,,, +56.9902343750,911,1290.1098632812,,, +56.9921875000,911,1289.3773193359,,, +56.9941406250,911,1289.3773193359,,, +56.9960937500,911,1288.6446533203,,, +56.9980468750,911,1287.1794433594,,, +57.0000000000,912,1285.7142333984,,, +57.0019531250,912,1286.4468994141,,, +57.0039062500,912,1286.4468994141,,, +57.0058593750,912,1285.7142333984,,, +57.0078125000,912,1284.2490234375,,, +57.0097656250,912,1284.2490234375,,, +57.0117187500,912,1284.2490234375,,, +57.0136718750,912,1284.9816894531,,, +57.0156250000,912,1284.2490234375,,, +57.0175781250,912,1284.2490234375,,, +57.0195312500,912,1284.2490234375,,, +57.0214843750,912,1283.5164794922,,, +57.0234375000,912,1284.9816894531,,, +57.0253906250,912,1285.7142333984,,, +57.0273437500,912,1285.7142333984,,, +57.0292968750,912,1286.4468994141,,, +57.0312500000,912,1286.4468994141,,, +57.0332031250,912,1287.9121093750,,, +57.0351562500,912,1288.6446533203,,, +57.0371093750,912,1287.9121093750,,, +57.0390625000,912,1288.6446533203,,, +57.0410156250,912,1289.3773193359,,, +57.0429687500,912,1290.1098632812,,, +57.0449218750,912,1290.8425292969,,, +57.0468750000,912,1291.5750732422,,, +57.0488281250,912,1291.5750732422,,, +57.0507812500,912,1293.0402832031,,, +57.0527343750,912,1293.0402832031,,, +57.0546875000,912,1293.0402832031,,, +57.0566406250,912,1293.0402832031,,, +57.0585937500,912,1293.7729492188,,, +57.0605468750,912,1295.2380371094,,, +57.0625000000,913,1295.2380371094,,, +57.0644531250,913,1294.5054931641,,, +57.0664062500,913,1295.2380371094,,, +57.0683593750,913,1296.7032470703,,, +57.0703125000,913,1298.1684570312,,, +57.0722656250,913,1298.9011230469,,, +57.0742187500,913,1299.6336669922,,, +57.0761718750,913,1301.8315429688,,, +57.0781250000,913,1303.2967529297,,, +57.0800781250,913,1304.7619628906,,, +57.0820312500,913,1305.4945068359,,, +57.0839843750,913,1307.6922607422,,, +57.0859375000,913,1309.1574707031,,, +57.0878906250,913,1310.6226806641,,, +57.0898437500,913,1312.0878906250,,, +57.0917968750,913,1313.5531005859,,, +57.0937500000,913,1315.7509765625,,, +57.0957031250,913,1315.7509765625,,, +57.0976562500,913,1317.2160644531,,, +57.0996093750,913,1317.2160644531,,, +57.1015625000,913,1318.6812744141,,, +57.1035156250,913,1320.1464843750,,, +57.1054687500,913,1319.4139404297,,, +57.1074218750,913,1318.6812744141,,, +57.1093750000,913,1320.1464843750,,, +57.1113281250,913,1320.1464843750,,, +57.1132812500,913,1320.1464843750,,, +57.1152343750,913,1319.4139404297,,, +57.1171875000,913,1320.8791503906,,, +57.1191406250,913,1320.8791503906,,, +57.1210937500,913,1320.8791503906,,, +57.1230468750,913,1320.8791503906,,, +57.1250000000,914,1321.6116943359,,, +57.1269531250,914,1320.8791503906,,, +57.1289062500,914,1320.8791503906,,, +57.1308593750,914,1321.6116943359,,, +57.1328125000,914,1322.3443603516,,, +57.1347656250,914,1322.3443603516,,, +57.1367187500,914,1323.0769042969,,, +57.1386718750,914,1323.0769042969,,, +57.1406250000,914,1323.8095703125,,, +57.1425781250,914,1324.5421142578,,, +57.1445312500,914,1324.5421142578,,, +57.1464843750,914,1323.8095703125,,, +57.1484375000,914,1323.8095703125,,, +57.1503906250,914,1323.8095703125,,, +57.1523437500,914,1323.0769042969,,, +57.1542968750,914,1322.3443603516,,, +57.1562500000,914,1322.3443603516,,, +57.1582031250,914,1322.3443603516,,, +57.1601562500,914,1320.8791503906,,, +57.1621093750,914,1319.4139404297,,, +57.1640625000,914,1317.9487304688,,, +57.1660156250,914,1317.2160644531,,, +57.1679687500,914,1315.7509765625,,, +57.1699218750,914,1315.0183105469,,, +57.1718750000,914,1315.0183105469,,, +57.1738281250,914,1315.0183105469,,, +57.1757812500,914,1314.2857666016,,, +57.1777343750,914,1312.8205566406,,, +57.1796875000,914,1312.8205566406,,, +57.1816406250,914,1313.5531005859,,, +57.1835937500,914,1313.5531005859,,, +57.1855468750,914,1312.0878906250,,, +57.1875000000,915,1312.8205566406,,, +57.1894531250,915,1314.2857666016,,, +57.1914062500,915,1314.2857666016,,, +57.1933593750,915,1314.2857666016,,, +57.1953125000,915,1314.2857666016,,, +57.1972656250,915,1315.7509765625,,, +57.1992187500,915,1316.4835205078,,, +57.2011718750,915,1315.7509765625,,, +57.2031250000,915,1315.7509765625,,, +57.2050781250,915,1316.4835205078,,, +57.2070312500,915,1317.2160644531,,, +57.2089843750,915,1316.4835205078,,, +57.2109375000,915,1316.4835205078,,, +57.2128906250,915,1315.7509765625,,, +57.2148437500,915,1315.0183105469,,, +57.2167968750,915,1315.7509765625,,, +57.2187500000,915,1316.4835205078,,, +57.2207031250,915,1317.2160644531,,, +57.2226562500,915,1316.4835205078,,, +57.2246093750,915,1316.4835205078,,, +57.2265625000,915,1315.7509765625,,, +57.2285156250,915,1315.7509765625,,, +57.2304687500,915,1315.7509765625,,, +57.2324218750,915,1316.4835205078,,, +57.2343750000,915,1317.2160644531,,, +57.2363281250,915,1316.4835205078,,, +57.2382812500,915,1316.4835205078,,, +57.2402343750,915,1315.0183105469,,, +57.2421875000,915,1314.2857666016,,, +57.2441406250,915,1314.2857666016,,, +57.2460937500,915,1314.2857666016,,, +57.2480468750,915,1314.2857666016,,, +57.2500000000,916,1314.2857666016,,, +57.2519531250,916,1313.5531005859,,, +57.2539062500,916,1312.0878906250,,, +57.2558593750,916,1310.6226806641,,, +57.2578125000,916,1310.6226806641,,, +57.2597656250,916,1309.8901367188,,, +57.2617187500,916,1309.1574707031,,, +57.2636718750,916,1307.6922607422,,, +57.2656250000,916,1306.9597167969,,, +57.2675781250,916,1305.4945068359,,, +57.2695312500,916,1304.7619628906,,, +57.2714843750,916,1304.0292968750,,, +57.2734375000,916,1304.7619628906,,, +57.2753906250,916,1304.0292968750,,, +57.2773437500,916,1303.2967529297,,, +57.2792968750,916,1303.2967529297,,, +57.2812500000,916,1303.2967529297,,, +57.2832031250,916,1303.2967529297,,, +57.2851562500,916,1303.2967529297,,, +57.2871093750,916,1302.5640869141,,, +57.2890625000,916,1303.2967529297,,, +57.2910156250,916,1304.7619628906,,, +57.2929687500,916,1304.7619628906,,, +57.2949218750,916,1304.0292968750,,, +57.2968750000,916,1304.0292968750,,, +57.2988281250,916,1304.0292968750,,, +57.3007812500,916,1304.0292968750,,, +57.3027343750,916,1303.2967529297,,, +57.3046875000,916,1302.5640869141,,, +57.3066406250,916,1302.5640869141,,, +57.3085937500,916,1304.0292968750,,, +57.3105468750,916,1304.7619628906,,, +57.3125000000,917,1305.4945068359,,, +57.3144531250,917,1307.6922607422,,, +57.3164062500,917,1310.6226806641,,, +57.3183593750,917,1312.0878906250,,, +57.3203125000,917,1315.0183105469,,, +57.3222656250,917,1317.9487304688,,, +57.3242187500,917,1323.0769042969,,, +57.3261718750,917,1326.7398681641,,, +57.3281250000,917,1332.6007080078,,, +57.3300781250,917,1338.4615478516,,, +57.3320312500,917,1346.5201416016,,, +57.3339843750,917,1354.5787353516,,, +57.3359375000,917,1363.3699951172,,, +57.3378906250,917,1373.6263427734,,, +57.3398437500,917,1384.6153564453,,, +57.3417968750,917,1394.8718261719,,, +57.3437500000,917,1407.3260498047,,, +57.3457031250,917,1420.5128173828,,, +57.3476562500,917,1435.1647949219,,, +57.3496093750,917,1449.0842285156,,, +57.3515625000,917,1464.4688720703,,, +57.3535156250,917,1481.3187255859,,, +57.3554687500,917,1498.1684570312,,, +57.3574218750,917,1515.7509765625,,, +57.3593750000,917,1533.3333740234,,, +57.3613281250,917,1552.3809814453,,, +57.3632812500,917,1571.4285888672,,, +57.3652343750,917,1589.7435302734,,, +57.3671875000,917,1609.5238037109,,, +57.3691406250,917,1629.3040771484,,, +57.3710937500,917,1649.8168945312,,, +57.3730468750,917,1668.8645019531,,, +57.3750000000,918,1687.9121093750,,, +57.3769531250,918,1708.4249267578,,, +57.3789062500,918,1728.2050781250,,, +57.3808593750,918,1746.5201416016,,, +57.3828125000,918,1764.1025390625,,, +57.3847656250,918,1783.8828125000,,, +57.3867187500,918,1801.4652099609,,, +57.3886718750,918,1819.0476074219,,, +57.3906250000,918,1835.1647949219,,, +57.3925781250,918,1852.0146484375,,, +57.3945312500,918,1868.1318359375,,, +57.3964843750,918,1883.5164794922,,, +57.3984375000,918,1897.4359130859,,, +57.4003906250,918,1911.3553466797,,, +57.4023437500,918,1925.2747802734,,, +57.4042968750,918,1937.7288818359,,, +57.4062500000,918,1947.9853515625,,, +57.4082031250,918,1958.2416992188,,, +57.4101562500,918,1967.7656250000,,, +57.4121093750,918,1975.8242187500,,, +57.4140625000,918,1983.1501464844,,, +57.4160156250,918,1989.0109863281,,, +57.4179687500,918,1994.8718261719,,, +57.4199218750,918,1999.2674560547,,, +57.4218750000,918,2002.1977539062,,, +57.4238281250,918,2005.1281738281,,, +57.4257812500,918,2006.5933837891,,, +57.4277343750,918,2007.3260498047,,, +57.4296875000,918,2006.5933837891,,, +57.4316406250,918,2006.5933837891,,, +57.4335937500,918,2005.8608398438,,, +57.4355468750,918,2002.9304199219,,, +57.4375000000,919,1998.5347900391,,, +57.4394531250,919,1994.8718261719,,, +57.4414062500,919,1989.7435302734,,, +57.4433593750,919,1983.1501464844,,, +57.4453125000,919,1976.5567626953,,, +57.4472656250,919,1969.2307128906,,, +57.4492187500,919,1961.1721191406,,, +57.4511718750,919,1951.6483154297,,, +57.4531250000,919,1941.3919677734,,, +57.4550781250,919,1931.8681640625,,, +57.4570312500,919,1920.1464843750,,, +57.4589843750,919,1909.1574707031,,, +57.4609375000,919,1896.7032470703,,, +57.4628906250,919,1884.9816894531,,, +57.4648437500,919,1873.2601318359,,, +57.4667968750,919,1860.0732421875,,, +57.4687500000,919,1846.8864746094,,, +57.4707031250,919,1834.4322509766,,, +57.4726562500,919,1821.9780273438,,, +57.4746093750,919,1808.7912597656,,, +57.4765625000,919,1794.8718261719,,, +57.4785156250,919,1781.6849365234,,, +57.4804687500,919,1769.2307128906,,, +57.4824218750,919,1755.3114013672,,, +57.4843750000,919,1742.1245117188,,, +57.4863281250,919,1728.9377441406,,, +57.4882812500,919,1728.9377441406,,, +57.4902343750,919,1716.4835205078,,, +57.4921875000,919,1702.5640869141,,, +57.4941406250,919,1690.1098632812,,, +57.4960937500,919,1677.6556396484,,, +57.4980468750,919,1665.9340820312,,, +57.5000000000,920,1652.7471923828,,, +57.5019531250,920,1640.2930908203,,, +57.5039062500,920,1628.5714111328,,, +57.5058593750,920,1616.8498535156,,, +57.5078125000,920,1604.3956298828,,, +57.5097656250,920,1593.4066162109,,, +57.5117187500,920,1582.4176025391,,, +57.5136718750,920,1569.9633789062,,, +57.5156250000,920,1559.7069091797,,, +57.5175781250,920,1549.4505615234,,, +57.5195312500,920,1539.9267578125,,, +57.5214843750,920,1530.4029541016,,, +57.5234375000,920,1520.1464843750,,, +57.5253906250,920,1511.3553466797,,, +57.5273437500,920,1503.2967529297,,, +57.5292968750,920,1494.5054931641,,, +57.5312500000,920,1485.7142333984,,, +57.5332031250,920,1478.3883056641,,, +57.5351562500,920,1471.0622558594,,, +57.5371093750,920,1463.7362060547,,, +57.5390625000,920,1457.8754882812,,, +57.5410156250,920,1451.2821044922,,, +57.5429687500,920,1443.9560546875,,, +57.5449218750,920,1438.0952148438,,, +57.5468750000,920,1432.2343750000,,, +57.5488281250,920,1426.3736572266,,, +57.5507812500,920,1420.5128173828,,, +57.5527343750,920,1414.6519775391,,, +57.5546875000,920,1409.5238037109,,, +57.5566406250,920,1405.1281738281,,, +57.5585937500,920,1400.7325439453,,, +57.5605468750,920,1396.3370361328,,, +57.5625000000,921,1391.2087402344,,, +57.5644531250,921,1386.8132324219,,, +57.5664062500,921,1382.4176025391,,, +57.5683593750,921,1378.7546386719,,, +57.5703125000,921,1375.8242187500,,, +57.5722656250,921,1372.1611328125,,, +57.5742187500,921,1368.4981689453,,, +57.5761718750,921,1364.8352050781,,, +57.5781250000,921,1361.9047851562,,, +57.5800781250,921,1360.4395751953,,, +57.5820312500,921,1358.9743652344,,, +57.5839843750,921,1357.5091552734,,, +57.5859375000,921,1356.0439453125,,, +57.5878906250,921,1353.8461914062,,, +57.5898437500,921,1353.8461914062,,, +57.5917968750,921,1353.1135253906,,, +57.5937500000,921,1353.1135253906,,, +57.5957031250,921,1353.1135253906,,, +57.5976562500,921,1352.3809814453,,, +57.5996093750,921,1352.3809814453,,, +57.6015625000,921,1353.1135253906,,, +57.6035156250,921,1354.5787353516,,, +57.6054687500,921,1355.3114013672,,, +57.6074218750,921,1356.0439453125,,, +57.6093750000,921,1356.7766113281,,, +57.6113281250,921,1357.5091552734,,, +57.6132812500,921,1359.7069091797,,, +57.6152343750,921,1361.1721191406,,, +57.6171875000,921,1362.6373291016,,, +57.6191406250,921,1363.3699951172,,, +57.6210937500,921,1365.5677490234,,, +57.6230468750,921,1367.0329589844,,, +57.6250000000,922,1369.9633789062,,, +57.6269531250,922,1371.4285888672,,, +57.6289062500,922,1372.8937988281,,, +57.6308593750,922,1374.3590087891,,, +57.6328125000,922,1375.8242187500,,, +57.6347656250,922,1378.7546386719,,, +57.6367187500,922,1381.6849365234,,, +57.6386718750,922,1383.8828125000,,, +57.6406250000,922,1385.3480224609,,, +57.6425781250,922,1386.8132324219,,, +57.6445312500,922,1389.0109863281,,, +57.6464843750,922,1392.6739501953,,, +57.6484375000,922,1394.8718261719,,, +57.6503906250,922,1397.0695800781,,, +57.6523437500,922,1399.2674560547,,, +57.6542968750,922,1400.7325439453,,, +57.6562500000,922,1403.6629638672,,, +57.6582031250,922,1405.1281738281,,, +57.6601562500,922,1405.8608398438,,, +57.6621093750,922,1408.7912597656,,, +57.6640625000,922,1410.9890136719,,, +57.6660156250,922,1413.1867675781,,, +57.6679687500,922,1416.1171875000,,, +57.6699218750,922,1419.7802734375,,, +57.6718750000,922,1421.2453613281,,, +57.6738281250,922,1423.4432373047,,, +57.6757812500,922,1425.6409912109,,, +57.6777343750,922,1427.8388671875,,, +57.6796875000,922,1430.0366210938,,, +57.6816406250,922,1431.5018310547,,, +57.6835937500,922,1432.9670410156,,, +57.6855468750,922,1432.9670410156,,, +57.6875000000,923,1434.4322509766,,, +57.6894531250,923,1435.8974609375,,, +57.6914062500,923,1437.3626708984,,, +57.6933593750,923,1438.8278808594,,, +57.6953125000,923,1438.8278808594,,, +57.6972656250,923,1440.2930908203,,, +57.6992187500,923,1440.2930908203,,, +57.7011718750,923,1440.2930908203,,, +57.7031250000,923,1441.7583007812,,, +57.7050781250,923,1441.7583007812,,, +57.7070312500,923,1441.0256347656,,, +57.7089843750,923,1439.5604248047,,, +57.7109375000,923,1438.8278808594,,, +57.7128906250,923,1437.3626708984,,, +57.7148437500,923,1435.8974609375,,, +57.7167968750,923,1435.1647949219,,, +57.7187500000,923,1433.6995849609,,, +57.7207031250,923,1432.2343750000,,, +57.7226562500,923,1429.3040771484,,, +57.7246093750,923,1426.3736572266,,, +57.7265625000,923,1424.9084472656,,, +57.7285156250,923,1421.9780273438,,, +57.7304687500,923,1420.5128173828,,, +57.7324218750,923,1418.3150634766,,, +57.7343750000,923,1416.1171875000,,, +57.7363281250,923,1412.4542236328,,, +57.7382812500,923,1409.5238037109,,, +57.7402343750,923,1406.5933837891,,, +57.7421875000,923,1404.3956298828,,, +57.7441406250,923,1401.4652099609,,, +57.7460937500,923,1398.5347900391,,, +57.7480468750,923,1396.3370361328,,, +57.7500000000,924,1394.1391601562,,, +57.7519531250,924,1391.9414062500,,, +57.7539062500,924,1390.4761962891,,, +57.7558593750,924,1387.5457763672,,, +57.7578125000,924,1384.6153564453,,, +57.7597656250,924,1380.9523925781,,, +57.7617187500,924,1378.7546386719,,, +57.7636718750,924,1375.8242187500,,, +57.7656250000,924,1372.1611328125,,, +57.7675781250,924,1369.2307128906,,, +57.7695312500,924,1366.3004150391,,, +57.7714843750,924,1363.3699951172,,, +57.7734375000,924,1361.1721191406,,, +57.7753906250,924,1358.9743652344,,, +57.7773437500,924,1356.7766113281,,, +57.7792968750,924,1354.5787353516,,, +57.7812500000,924,1351.6483154297,,, +57.7832031250,924,1348.7178955078,,, +57.7851562500,924,1346.5201416016,,, +57.7871093750,924,1344.3223876953,,, +57.7890625000,924,1341.3919677734,,, +57.7910156250,924,1339.1940917969,,, +57.7929687500,924,1336.2637939453,,, +57.7949218750,924,1334.0659179688,,, +57.7968750000,924,1332.6007080078,,, +57.7988281250,924,1330.4029541016,,, +57.8007812500,924,1328.2050781250,,, +57.8027343750,924,1328.2050781250,,, +57.8046875000,924,1326.7398681641,,, +57.8066406250,924,1326.0073242188,,, +57.8085937500,924,1323.8095703125,,, +57.8105468750,924,1321.6116943359,,, +57.8125000000,925,1320.1464843750,,, +57.8144531250,925,1317.9487304688,,, +57.8164062500,925,1317.2160644531,,, +57.8183593750,925,1315.0183105469,,, +57.8203125000,925,1313.5531005859,,, +57.8222656250,925,1312.8205566406,,, +57.8242187500,925,1312.8205566406,,, +57.8261718750,925,1312.0878906250,,, +57.8281250000,925,1310.6226806641,,, +57.8300781250,925,1309.1574707031,,, +57.8320312500,925,1308.4249267578,,, +57.8339843750,925,1308.4249267578,,, +57.8359375000,925,1308.4249267578,,, +57.8378906250,925,1308.4249267578,,, +57.8398437500,925,1306.9597167969,,, +57.8417968750,925,1306.2270507812,,, +57.8437500000,925,1304.7619628906,,, +57.8457031250,925,1305.4945068359,,, +57.8476562500,925,1305.4945068359,,, +57.8496093750,925,1304.7619628906,,, +57.8515625000,925,1303.2967529297,,, +57.8535156250,925,1303.2967529297,,, +57.8554687500,925,1303.2967529297,,, +57.8574218750,925,1304.0292968750,,, +57.8593750000,925,1304.0292968750,,, +57.8613281250,925,1303.2967529297,,, +57.8632812500,925,1301.0988769531,,, +57.8652343750,925,1300.3663330078,,, +57.8671875000,925,1299.6336669922,,, +57.8691406250,925,1299.6336669922,,, +57.8710937500,925,1299.6336669922,,, +57.8730468750,925,1299.6336669922,,, +57.8750000000,926,1298.9011230469,,, +57.8769531250,926,1298.1684570312,,, +57.8789062500,926,1298.9011230469,,, +57.8808593750,926,1298.9011230469,,, +57.8828125000,926,1299.6336669922,,, +57.8847656250,926,1301.0988769531,,, +57.8867187500,926,1301.8315429688,,, +57.8886718750,926,1302.5640869141,,, +57.8906250000,926,1302.5640869141,,, +57.8925781250,926,1302.5640869141,,, +57.8945312500,926,1302.5640869141,,, +57.8964843750,926,1303.2967529297,,, +57.8984375000,926,1304.7619628906,,, +57.9003906250,926,1306.9597167969,,, +57.9023437500,926,1307.6922607422,,, +57.9042968750,926,1309.1574707031,,, +57.9062500000,926,1309.8901367188,,, +57.9082031250,926,1309.8901367188,,, +57.9101562500,926,1309.8901367188,,, +57.9121093750,926,1311.3553466797,,, +57.9140625000,926,1312.0878906250,,, +57.9160156250,926,1313.5531005859,,, +57.9179687500,926,1314.2857666016,,, +57.9199218750,926,1313.5531005859,,, +57.9218750000,926,1314.2857666016,,, +57.9238281250,926,1313.5531005859,,, +57.9257812500,926,1315.0183105469,,, +57.9277343750,926,1315.7509765625,,, +57.9296875000,926,1316.4835205078,,, +57.9316406250,926,1317.2160644531,,, +57.9335937500,926,1317.9487304688,,, +57.9355468750,926,1317.9487304688,,, +57.9375000000,927,1318.6812744141,,, +57.9394531250,927,1320.1464843750,,, +57.9414062500,927,1323.0769042969,,, +57.9433593750,927,1322.3443603516,,, +57.9453125000,927,1323.8095703125,,, +57.9472656250,927,1324.5421142578,,, +57.9492187500,927,1325.2747802734,,, +57.9511718750,927,1326.0073242188,,, +57.9531250000,927,1326.7398681641,,, +57.9550781250,927,1328.2050781250,,, +57.9570312500,927,1328.9377441406,,, +57.9589843750,927,1329.6702880859,,, +57.9609375000,927,1328.9377441406,,, +57.9628906250,927,1328.9377441406,,, +57.9648437500,927,1328.9377441406,,, +57.9667968750,927,1329.6702880859,,, +57.9687500000,927,1329.6702880859,,, +57.9707031250,927,1330.4029541016,,, +57.9726562500,927,1330.4029541016,,, +57.9746093750,927,1329.6702880859,,, +57.9765625000,927,1329.6702880859,,, +57.9785156250,927,1329.6702880859,,, +57.9804687500,927,1328.9377441406,,, +57.9824218750,927,1329.6702880859,,, +57.9843750000,927,1329.6702880859,,, +57.9863281250,927,1330.4029541016,,, +57.9882812500,927,1331.8681640625,,, +57.9902343750,927,1331.8681640625,,, +57.9921875000,927,1331.1354980469,,, +57.9941406250,927,1330.4029541016,,, +57.9960937500,927,1331.1354980469,,, +57.9980468750,927,1329.6702880859,,, +58.0000000000,928,1331.1354980469,,, +58.0019531250,928,1331.8681640625,,, +58.0039062500,928,1332.6007080078,,, +58.0058593750,928,1332.6007080078,,, +58.0078125000,928,1332.6007080078,,, +58.0097656250,928,1332.6007080078,,, +58.0117187500,928,1333.3333740234,,, +58.0136718750,928,1334.0659179688,,, +58.0156250000,928,1334.7985839844,,, +58.0175781250,928,1336.2637939453,,, +58.0195312500,928,1337.7288818359,,, +58.0214843750,928,1338.4615478516,,, +58.0234375000,928,1339.1940917969,,, +58.0253906250,928,1339.1940917969,,, +58.0273437500,928,1339.9267578125,,, +58.0292968750,928,1340.6593017578,,, +58.0312500000,928,1342.1245117188,,, +58.0332031250,928,1341.3919677734,,, +58.0351562500,928,1340.6593017578,,, +58.0371093750,928,1339.9267578125,,, +58.0390625000,928,1339.1940917969,,, +58.0410156250,928,1337.7288818359,,, +58.0429687500,928,1337.7288818359,,, +58.0449218750,928,1337.7288818359,,, +58.0468750000,928,1337.7288818359,,, +58.0488281250,928,1336.9963378906,,, +58.0507812500,928,1336.9963378906,,, +58.0527343750,928,1336.2637939453,,, +58.0546875000,928,1336.2637939453,,, +58.0566406250,928,1336.2637939453,,, +58.0585937500,928,1335.5311279297,,, +58.0605468750,928,1335.5311279297,,, +58.0625000000,929,1336.2637939453,,, +58.0644531250,929,1336.2637939453,,, +58.0664062500,929,1335.5311279297,,, +58.0683593750,929,1334.7985839844,,, +58.0703125000,929,1332.6007080078,,, +58.0722656250,929,1331.8681640625,,, +58.0742187500,929,1331.8681640625,,, +58.0761718750,929,1331.8681640625,,, +58.0781250000,929,1331.8681640625,,, +58.0800781250,929,1331.1354980469,,, +58.0820312500,929,1330.4029541016,,, +58.0839843750,929,1328.9377441406,,, +58.0859375000,929,1327.4725341797,,, +58.0878906250,929,1326.7398681641,,, +58.0898437500,929,1326.0073242188,,, +58.0917968750,929,1326.0073242188,,, +58.0937500000,929,1326.7398681641,,, +58.0957031250,929,1326.0073242188,,, +58.0976562500,929,1326.7398681641,,, +58.0996093750,929,1326.0073242188,,, +58.1015625000,929,1324.5421142578,,, +58.1035156250,929,1324.5421142578,,, +58.1054687500,929,1323.8095703125,,, +58.1074218750,929,1324.5421142578,,, +58.1093750000,929,1324.5421142578,,, +58.1113281250,929,1324.5421142578,,, +58.1132812500,929,1323.8095703125,,, +58.1152343750,929,1323.8095703125,,, +58.1171875000,929,1323.0769042969,,, +58.1191406250,929,1320.8791503906,,, +58.1210937500,929,1320.1464843750,,, +58.1230468750,929,1317.9487304688,,, +58.1250000000,930,1317.9487304688,,, +58.1269531250,930,1316.4835205078,,, +58.1289062500,930,1315.7509765625,,, +58.1308593750,930,1314.2857666016,,, +58.1328125000,930,1313.5531005859,,, +58.1347656250,930,1313.5531005859,,, +58.1367187500,930,1312.8205566406,,, +58.1386718750,930,1312.0878906250,,, +58.1406250000,930,1311.3553466797,,, +58.1425781250,930,1312.0878906250,,, +58.1445312500,930,1312.0878906250,,, +58.1464843750,930,1310.6226806641,,, +58.1484375000,930,1310.6226806641,,, +58.1503906250,930,1310.6226806641,,, +58.1523437500,930,1310.6226806641,,, +58.1542968750,930,1310.6226806641,,, +58.1562500000,930,1309.1574707031,,, +58.1582031250,930,1309.1574707031,,, +58.1601562500,930,1309.1574707031,,, +58.1621093750,930,1309.1574707031,,, +58.1640625000,930,1308.4249267578,,, +58.1660156250,930,1307.6922607422,,, +58.1679687500,930,1308.4249267578,,, +58.1699218750,930,1307.6922607422,,, +58.1718750000,930,1307.6922607422,,, +58.1738281250,930,1307.6922607422,,, +58.1757812500,930,1309.8901367188,,, +58.1777343750,930,1311.3553466797,,, +58.1796875000,930,1312.8205566406,,, +58.1816406250,930,1315.0183105469,,, +58.1835937500,930,1317.9487304688,,, +58.1855468750,930,1322.3443603516,,, +58.1875000000,931,1326.7398681641,,, +58.1894531250,931,1331.8681640625,,, +58.1914062500,931,1339.9267578125,,, +58.1933593750,931,1347.2528076172,,, +58.1953125000,931,1355.3114013672,,, +58.1972656250,931,1364.1025390625,,, +58.1992187500,931,1375.8242187500,,, +58.2011718750,931,1385.3480224609,,, +58.2031250000,931,1396.3370361328,,, +58.2050781250,931,1408.0585937500,,, +58.2070312500,931,1421.2453613281,,, +58.2089843750,931,1435.1647949219,,, +58.2109375000,931,1448.3516845703,,, +58.2128906250,931,1463.0036621094,,, +58.2148437500,931,1478.3883056641,,, +58.2167968750,931,1495.2380371094,,, +58.2187500000,931,1512.8205566406,,, +58.2207031250,931,1529.6702880859,,, +58.2226562500,931,1547.9853515625,,, +58.2246093750,931,1566.3004150391,,, +58.2265625000,931,1586.0805664062,,, +58.2285156250,931,1606.5933837891,,, +58.2304687500,931,1626.3736572266,,, +58.2324218750,931,1646.1538085938,,, +58.2343750000,931,1666.6666259766,,, +58.2363281250,931,1687.1794433594,,, +58.2382812500,931,1707.6922607422,,, +58.2402343750,931,1728.9377441406,,, +58.2421875000,931,1750.1831054688,,, +58.2441406250,931,1769.9633789062,,, +58.2460937500,931,1789.7435302734,,, +58.2480468750,931,1809.5238037109,,, +58.2500000000,932,1829.3040771484,,, +58.2519531250,932,1847.6190185547,,, +58.2539062500,932,1865.2014160156,,, +58.2558593750,932,1882.7839355469,,, +58.2578125000,932,1898.9011230469,,, +58.2597656250,932,1914.2857666016,,, +58.2617187500,932,1929.6702880859,,, +58.2636718750,932,1942.8571777344,,, +58.2656250000,932,1954.5787353516,,, +58.2675781250,932,1966.3004150391,,, +58.2695312500,932,1977.2894287109,,, +58.2714843750,932,1986.8132324219,,, +58.2734375000,932,1995.6043701172,,, +58.2753906250,932,2003.6629638672,,, +58.2773437500,932,2010.2564697266,,, +58.2792968750,932,2016.1171875000,,, +58.2812500000,932,2021.9780273438,,, +58.2832031250,932,2025.6409912109,,, +58.2851562500,932,2028.5714111328,,, +58.2871093750,932,2030.0366210938,,, +58.2890625000,932,2030.0366210938,,, +58.2910156250,932,2029.3040771484,,, +58.2929687500,932,2028.5714111328,,, +58.2949218750,932,2026.3736572266,,, +58.2968750000,932,2023.4432373047,,, +58.2988281250,932,2018.3150634766,,, +58.3007812500,932,2014.6519775391,,, +58.3027343750,932,2009.5238037109,,, +58.3046875000,932,2002.9304199219,,, +58.3066406250,932,1995.6043701172,,, +58.3085937500,932,1986.0805664062,,, +58.3105468750,932,1977.2894287109,,, +58.3125000000,933,1967.0329589844,,, +58.3144531250,933,1956.7766113281,,, +58.3164062500,933,1945.7875976562,,, +58.3183593750,933,1933.3333740234,,, +58.3203125000,933,1920.1464843750,,, +58.3222656250,933,1906.2270507812,,, +58.3242187500,933,1892.3077392578,,, +58.3261718750,933,1878.3883056641,,, +58.3281250000,933,1863.7362060547,,, +58.3300781250,933,1849.0842285156,,, +58.3320312500,933,1834.4322509766,,, +58.3339843750,933,1818.3150634766,,, +58.3359375000,933,1802.1977539062,,, +58.3378906250,933,1787.5457763672,,, +58.3398437500,933,1771.4285888672,,, +58.3417968750,933,1756.7766113281,,, +58.3437500000,933,1740.6593017578,,, +58.3457031250,933,1725.2747802734,,, +58.3476562500,933,1710.6226806641,,, +58.3496093750,933,1696.7032470703,,, +58.3515625000,933,1682.7839355469,,, +58.3535156250,933,1668.1318359375,,, +58.3554687500,933,1653.4798583984,,, +58.3574218750,933,1638.8278808594,,, +58.3593750000,933,1626.3736572266,,, +58.3613281250,933,1613.9194335938,,, +58.3632812500,933,1601.4652099609,,, +58.3652343750,933,1589.0109863281,,, +58.3671875000,933,1578.0219726562,,, +58.3691406250,933,1567.7656250000,,, +58.3710937500,933,1558.2416992188,,, +58.3730468750,933,1547.2528076172,,, +58.3750000000,934,1537.7288818359,,, +58.3769531250,934,1528.9377441406,,, +58.3789062500,934,1519.4139404297,,, +58.3808593750,934,1510.6226806641,,, +58.3828125000,934,1501.8315429688,,, +58.3847656250,934,1495.9707031250,,, +58.3867187500,934,1488.6446533203,,, +58.3886718750,934,1482.7839355469,,, +58.3906250000,934,1476.1904296875,,, +58.3925781250,934,1470.3297119141,,, +58.3945312500,934,1464.4688720703,,, +58.3964843750,934,1457.1428222656,,, +58.3984375000,934,1452.0146484375,,, +58.4003906250,934,1446.1538085938,,, +58.4023437500,934,1441.0256347656,,, +58.4042968750,934,1436.6300048828,,, +58.4062500000,934,1432.9670410156,,, +58.4082031250,934,1429.3040771484,,, +58.4101562500,934,1424.9084472656,,, +58.4121093750,934,1421.2453613281,,, +58.4140625000,934,1416.8498535156,,, +58.4160156250,934,1413.1867675781,,, +58.4179687500,934,1410.2564697266,,, +58.4199218750,934,1406.5933837891,,, +58.4218750000,934,1405.1281738281,,, +58.4238281250,934,1402.1977539062,,, +58.4257812500,934,1400.0000000000,,, +58.4277343750,934,1394.8718261719,,, +58.4296875000,934,1393.4066162109,,, +58.4316406250,934,1390.4761962891,,, +58.4335937500,934,1387.5457763672,,, +58.4355468750,934,1386.0805664062,,, +58.4375000000,935,1383.8828125000,,, +58.4394531250,935,1383.1501464844,,, +58.4414062500,935,1382.4176025391,,, +58.4433593750,935,1380.9523925781,,, +58.4453125000,935,1378.0219726562,,, +58.4472656250,935,1376.5567626953,,, +58.4492187500,935,1375.8242187500,,, +58.4511718750,935,1374.3590087891,,, +58.4531250000,935,1373.6263427734,,, +58.4550781250,935,1372.8937988281,,, +58.4570312500,935,1372.1611328125,,, +58.4589843750,935,1370.6959228516,,, +58.4609375000,935,1369.9633789062,,, +58.4628906250,935,1369.2307128906,,, +58.4648437500,935,1367.7656250000,,, +58.4667968750,935,1367.0329589844,,, +58.4687500000,935,1367.7656250000,,, +58.4707031250,935,1367.7656250000,,, +58.4726562500,935,1367.7656250000,,, +58.4746093750,935,1367.7656250000,,, +58.4765625000,935,1367.7656250000,,, +58.4785156250,935,1366.3004150391,,, +58.4804687500,935,1367.0329589844,,, +58.4824218750,935,1367.0329589844,,, +58.4843750000,935,1369.2307128906,,, +58.4863281250,935,1370.6959228516,,, +58.4882812500,935,1371.4285888672,,, +58.4902343750,935,1372.8937988281,,, +58.4921875000,935,1372.8937988281,,, +58.4941406250,935,1372.8937988281,,, +58.4960937500,935,1372.8937988281,,, +58.4980468750,935,1373.6263427734,,, +58.5000000000,936,1375.0915527344,,, +58.5019531250,936,1376.5567626953,,, +58.5039062500,936,1378.0219726562,,, +58.5058593750,936,1378.0219726562,,, +58.5078125000,936,1378.7546386719,,, +58.5097656250,936,1378.7546386719,,, +58.5117187500,936,1380.2197265625,,, +58.5136718750,936,1380.9523925781,,, +58.5156250000,936,1383.1501464844,,, +58.5175781250,936,1385.3480224609,,, +58.5195312500,936,1387.5457763672,,, +58.5214843750,936,1391.2087402344,,, +58.5234375000,936,1393.4066162109,,, +58.5253906250,936,1395.6043701172,,, +58.5273437500,936,1397.0695800781,,, +58.5292968750,936,1399.2674560547,,, +58.5312500000,936,1401.4652099609,,, +58.5332031250,936,1404.3956298828,,, +58.5351562500,936,1407.3260498047,,, +58.5371093750,936,1410.2564697266,,, +58.5390625000,936,1413.1867675781,,, +58.5410156250,936,1416.1171875000,,, +58.5429687500,936,1417.5823974609,,, +58.5449218750,936,1419.0476074219,,, +58.5468750000,936,1419.7802734375,,, +58.5488281250,936,1421.2453613281,,, +58.5507812500,936,1421.9780273438,,, +58.5527343750,936,1424.1757812500,,, +58.5546875000,936,1425.6409912109,,, +58.5566406250,936,1426.3736572266,,, +58.5585937500,936,1426.3736572266,,, +58.5605468750,936,1425.6409912109,,, +58.5625000000,937,1426.3736572266,,, +58.5644531250,937,1426.3736572266,,, +58.5664062500,937,1427.1062011719,,, +58.5683593750,937,1427.8388671875,,, +58.5703125000,937,1428.5714111328,,, +58.5722656250,937,1427.8388671875,,, +58.5742187500,937,1427.1062011719,,, +58.5761718750,937,1426.3736572266,,, +58.5781250000,937,1425.6409912109,,, +58.5800781250,937,1424.1757812500,,, +58.5820312500,937,1424.1757812500,,, +58.5839843750,937,1423.4432373047,,, +58.5859375000,937,1423.4432373047,,, +58.5878906250,937,1422.7105712891,,, +58.5898437500,937,1421.9780273438,,, +58.5917968750,937,1421.2453613281,,, +58.5937500000,937,1419.7802734375,,, +58.5957031250,937,1417.5823974609,,, +58.5976562500,937,1416.1171875000,,, +58.5996093750,937,1415.3846435547,,, +58.6015625000,937,1414.6519775391,,, +58.6035156250,937,1413.1867675781,,, +58.6054687500,937,1410.9890136719,,, +58.6074218750,937,1408.7912597656,,, +58.6093750000,937,1406.5933837891,,, +58.6113281250,937,1404.3956298828,,, +58.6132812500,937,1402.9304199219,,, +58.6152343750,937,1400.7325439453,,, +58.6171875000,937,1399.2674560547,,, +58.6191406250,937,1397.0695800781,,, +58.6210937500,937,1394.1391601562,,, +58.6230468750,937,1391.9414062500,,, +58.6250000000,938,1389.7435302734,,, +58.6269531250,938,1387.5457763672,,, +58.6289062500,938,1385.3480224609,,, +58.6308593750,938,1383.8828125000,,, +58.6328125000,938,1380.9523925781,,, +58.6347656250,938,1376.5567626953,,, +58.6367187500,938,1373.6263427734,,, +58.6386718750,938,1368.4981689453,,, +58.6406250000,938,1364.8352050781,,, +58.6425781250,938,1361.1721191406,,, +58.6445312500,938,1358.9743652344,,, +58.6464843750,938,1356.0439453125,,, +58.6484375000,938,1353.8461914062,,, +58.6503906250,938,1350.9157714844,,, +58.6523437500,938,1347.9853515625,,, +58.6542968750,938,1344.3223876953,,, +58.6562500000,938,1341.3919677734,,, +58.6582031250,938,1337.7288818359,,, +58.6601562500,938,1335.5311279297,,, +58.6621093750,938,1333.3333740234,,, +58.6640625000,938,1331.1354980469,,, +58.6660156250,938,1328.9377441406,,, +58.6679687500,938,1326.0073242188,,, +58.6699218750,938,1323.0769042969,,, +58.6718750000,938,1319.4139404297,,, +58.6738281250,938,1317.2160644531,,, +58.6757812500,938,1315.0183105469,,, +58.6777343750,938,1312.8205566406,,, +58.6796875000,938,1312.0878906250,,, +58.6816406250,938,1310.6226806641,,, +58.6835937500,938,1309.1574707031,,, +58.6855468750,938,1307.6922607422,,, +58.6875000000,939,1306.2270507812,,, +58.6894531250,939,1304.7619628906,,, +58.6914062500,939,1303.2967529297,,, +58.6933593750,939,1301.0988769531,,, +58.6953125000,939,1300.3663330078,,, +58.6972656250,939,1300.3663330078,,, +58.6992187500,939,1298.9011230469,,, +58.7011718750,939,1298.9011230469,,, +58.7031250000,939,1297.4359130859,,, +58.7050781250,939,1295.2380371094,,, +58.7070312500,939,1294.5054931641,,, +58.7089843750,939,1293.7729492188,,, +58.7109375000,939,1293.0402832031,,, +58.7128906250,939,1293.0402832031,,, +58.7148437500,939,1293.0402832031,,, +58.7167968750,939,1293.7729492188,,, +58.7187500000,939,1295.2380371094,,, +58.7207031250,939,1295.2380371094,,, +58.7226562500,939,1295.2380371094,,, +58.7246093750,939,1294.5054931641,,, +58.7265625000,939,1295.2380371094,,, +58.7285156250,939,1295.2380371094,,, +58.7304687500,939,1296.7032470703,,, +58.7324218750,939,1297.4359130859,,, +58.7343750000,939,1298.9011230469,,, +58.7363281250,939,1298.9011230469,,, +58.7382812500,939,1299.6336669922,,, +58.7402343750,939,1298.9011230469,,, +58.7421875000,939,1298.9011230469,,, +58.7441406250,939,1298.9011230469,,, +58.7460937500,939,1299.6336669922,,, +58.7480468750,939,1301.0988769531,,, +58.7500000000,940,1301.8315429688,,, +58.7519531250,940,1301.0988769531,,, +58.7539062500,940,1300.3663330078,,, +58.7558593750,940,1301.0988769531,,, +58.7578125000,940,1301.8315429688,,, +58.7597656250,940,1302.5640869141,,, +58.7617187500,940,1304.7619628906,,, +58.7636718750,940,1306.9597167969,,, +58.7656250000,940,1308.4249267578,,, +58.7675781250,940,1309.1574707031,,, +58.7695312500,940,1309.8901367188,,, +58.7714843750,940,1309.8901367188,,, +58.7734375000,940,1309.8901367188,,, +58.7753906250,940,1309.8901367188,,, +58.7773437500,940,1310.6226806641,,, +58.7792968750,940,1312.0878906250,,, +58.7812500000,940,1312.0878906250,,, +58.7832031250,940,1312.8205566406,,, +58.7851562500,940,1312.8205566406,,, +58.7871093750,940,1312.8205566406,,, +58.7890625000,940,1314.2857666016,,, +58.7910156250,940,1315.0183105469,,, +58.7929687500,940,1316.4835205078,,, +58.7949218750,940,1318.6812744141,,, +58.7968750000,940,1319.4139404297,,, +58.7988281250,940,1320.1464843750,,, +58.8007812500,940,1320.1464843750,,, +58.8027343750,940,1320.1464843750,,, +58.8046875000,940,1321.6116943359,,, +58.8066406250,940,1322.3443603516,,, +58.8085937500,940,1323.8095703125,,, +58.8105468750,940,1324.5421142578,,, +58.8125000000,941,1324.5421142578,,, +58.8144531250,941,1325.2747802734,,, +58.8164062500,941,1323.8095703125,,, +58.8183593750,941,1323.8095703125,,, +58.8203125000,941,1323.0769042969,,, +58.8222656250,941,1324.5421142578,,, +58.8242187500,941,1325.2747802734,,, +58.8261718750,941,1324.5421142578,,, +58.8281250000,941,1325.2747802734,,, +58.8300781250,941,1323.8095703125,,, +58.8320312500,941,1323.8095703125,,, +58.8339843750,941,1323.8095703125,,, +58.8359375000,941,1325.2747802734,,, +58.8378906250,941,1326.0073242188,,, +58.8398437500,941,1326.0073242188,,, +58.8417968750,941,1326.7398681641,,, +58.8437500000,941,1324.5421142578,,, +58.8457031250,941,1325.2747802734,,, +58.8476562500,941,1324.5421142578,,, +58.8496093750,941,1325.2747802734,,, +58.8515625000,941,1326.0073242188,,, +58.8535156250,941,1325.2747802734,,, +58.8554687500,941,1326.0073242188,,, +58.8574218750,941,1324.5421142578,,, +58.8593750000,941,1325.2747802734,,, +58.8613281250,941,1325.2747802734,,, +58.8632812500,941,1326.7398681641,,, +58.8652343750,941,1328.2050781250,,, +58.8671875000,941,1328.2050781250,,, +58.8691406250,941,1328.9377441406,,, +58.8710937500,941,1328.9377441406,,, +58.8730468750,941,1328.9377441406,,, +58.8750000000,942,1329.6702880859,,, +58.8769531250,942,1330.4029541016,,, +58.8789062500,942,1331.8681640625,,, +58.8808593750,942,1332.6007080078,,, +58.8828125000,942,1333.3333740234,,, +58.8847656250,942,1333.3333740234,,, +58.8867187500,942,1333.3333740234,,, +58.8886718750,942,1332.6007080078,,, +58.8906250000,942,1334.0659179688,,, +58.8925781250,942,1334.7985839844,,, +58.8945312500,942,1334.7985839844,,, +58.8964843750,942,1335.5311279297,,, +58.8984375000,942,1334.7985839844,,, +58.9003906250,942,1334.0659179688,,, +58.9023437500,942,1334.0659179688,,, +58.9042968750,942,1334.0659179688,,, +58.9062500000,942,1334.7985839844,,, +58.9082031250,942,1334.7985839844,,, +58.9101562500,942,1334.7985839844,,, +58.9121093750,942,1333.3333740234,,, +58.9140625000,942,1332.6007080078,,, +58.9160156250,942,1332.6007080078,,, +58.9179687500,942,1332.6007080078,,, +58.9199218750,942,1332.6007080078,,, +58.9218750000,942,1331.8681640625,,, +58.9238281250,942,1331.1354980469,,, +58.9257812500,942,1330.4029541016,,, +58.9277343750,942,1328.9377441406,,, +58.9296875000,942,1328.9377441406,,, +58.9316406250,942,1328.9377441406,,, +58.9335937500,942,1328.2050781250,,, +58.9355468750,942,1327.4725341797,,, +58.9375000000,943,1326.0073242188,,, +58.9394531250,943,1323.8095703125,,, +58.9414062500,943,1321.6116943359,,, +58.9433593750,943,1321.6116943359,,, +58.9453125000,943,1321.6116943359,,, +58.9472656250,943,1320.8791503906,,, +58.9492187500,943,1320.1464843750,,, +58.9511718750,943,1319.4139404297,,, +58.9531250000,943,1317.9487304688,,, +58.9550781250,943,1317.2160644531,,, +58.9570312500,943,1315.7509765625,,, +58.9589843750,943,1315.7509765625,,, +58.9609375000,943,1315.7509765625,,, +58.9628906250,943,1315.7509765625,,, +58.9648437500,943,1315.7509765625,,, +58.9667968750,943,1315.0183105469,,, +58.9687500000,943,1314.2857666016,,, +58.9707031250,943,1312.8205566406,,, +58.9726562500,943,1312.0878906250,,, +58.9746093750,943,1312.8205566406,,, +58.9765625000,943,1313.5531005859,,, +58.9785156250,943,1313.5531005859,,, +58.9804687500,943,1313.5531005859,,, +58.9824218750,943,1312.8205566406,,, +58.9843750000,943,1311.3553466797,,, +58.9863281250,943,1309.8901367188,,, +58.9882812500,943,1309.8901367188,,, +58.9902343750,943,1309.1574707031,,, +58.9921875000,943,1309.1574707031,,, +58.9941406250,943,1309.8901367188,,, +58.9960937500,943,1308.4249267578,,, +58.9980468750,943,1307.6922607422,,, +59.0000000000,944,1306.2270507812,,, +59.0019531250,944,1304.7619628906,,, +59.0039062500,944,1303.2967529297,,, +59.0058593750,944,1301.8315429688,,, +59.0078125000,944,1299.6336669922,,, +59.0097656250,944,1299.6336669922,,, +59.0117187500,944,1299.6336669922,,, +59.0136718750,944,1300.3663330078,,, +59.0156250000,944,1300.3663330078,,, +59.0175781250,944,1299.6336669922,,, +59.0195312500,944,1298.9011230469,,, +59.0214843750,944,1298.9011230469,,, +59.0234375000,944,1299.6336669922,,, +59.0253906250,944,1300.3663330078,,, +59.0273437500,944,1301.0988769531,,, +59.0292968750,944,1302.5640869141,,, +59.0312500000,944,1304.7619628906,,, +59.0332031250,944,1306.9597167969,,, +59.0351562500,944,1309.1574707031,,, +59.0371093750,944,1310.6226806641,,, +59.0390625000,944,1312.8205566406,,, +59.0410156250,944,1314.2857666016,,, +59.0429687500,944,1317.9487304688,,, +59.0449218750,944,1320.8791503906,,, +59.0468750000,944,1324.5421142578,,, +59.0488281250,944,1329.6702880859,,, +59.0507812500,944,1334.7985839844,,, +59.0527343750,944,1340.6593017578,,, +59.0546875000,944,1347.2528076172,,, +59.0566406250,944,1354.5787353516,,, +59.0585937500,944,1361.9047851562,,, +59.0605468750,944,1369.9633789062,,, +59.0625000000,945,1380.2197265625,,, +59.0644531250,945,1391.2087402344,,, +59.0664062500,945,1404.3956298828,,, +59.0683593750,945,1417.5823974609,,, +59.0703125000,945,1431.5018310547,,, +59.0722656250,945,1445.4212646484,,, +59.0742187500,945,1460.0732421875,,, +59.0761718750,945,1475.4578857422,,, +59.0781250000,945,1492.3077392578,,, +59.0800781250,945,1508.4249267578,,, +59.0820312500,945,1526.0073242188,,, +59.0839843750,945,1544.3223876953,,, +59.0859375000,945,1563.3699951172,,, +59.0878906250,945,1583.1501464844,,, +59.0898437500,945,1602.9304199219,,, +59.0917968750,945,1623.4432373047,,, +59.0937500000,945,1643.2233886719,,, +59.0957031250,945,1664.4688720703,,, +59.0976562500,945,1684.2490234375,,, +59.0996093750,945,1705.4945068359,,, +59.1015625000,945,1725.2747802734,,, +59.1035156250,945,1745.7875976562,,, +59.1054687500,945,1765.5677490234,,, +59.1074218750,945,1784.6153564453,,, +59.1093750000,945,1804.3956298828,,, +59.1113281250,945,1823.4432373047,,, +59.1132812500,945,1841.7583007812,,, +59.1152343750,945,1859.3406982422,,, +59.1171875000,945,1876.1904296875,,, +59.1191406250,945,1893.0402832031,,, +59.1210937500,945,1908.4249267578,,, +59.1230468750,945,1923.8095703125,,, +59.1250000000,946,1938.4615478516,,, +59.1269531250,946,1950.9157714844,,, +59.1289062500,946,1964.8352050781,,, +59.1308593750,946,1976.5567626953,,, +59.1328125000,946,1988.2784423828,,, +59.1347656250,946,1996.3370361328,,, +59.1367187500,946,2004.3956298828,,, +59.1386718750,946,2010.9890136719,,, +59.1406250000,946,2016.8498535156,,, +59.1425781250,946,2021.9780273438,,, +59.1445312500,946,2025.6409912109,,, +59.1464843750,946,2028.5714111328,,, +59.1484375000,946,2030.0366210938,,, +59.1503906250,946,2030.7692871094,,, +59.1523437500,946,2030.7692871094,,, +59.1542968750,946,2030.0366210938,,, +59.1562500000,946,2027.1062011719,,, +59.1582031250,946,2022.7105712891,,, +59.1601562500,946,2017.5823974609,,, +59.1621093750,946,2010.9890136719,,, +59.1640625000,946,2003.6629638672,,, +59.1660156250,946,1995.6043701172,,, +59.1679687500,946,1986.8132324219,,, +59.1699218750,946,1977.2894287109,,, +59.1718750000,946,1967.0329589844,,, +59.1738281250,946,1956.7766113281,,, +59.1757812500,946,1945.7875976562,,, +59.1777343750,946,1933.3333740234,,, +59.1796875000,946,1920.8791503906,,, +59.1816406250,946,1906.9597167969,,, +59.1835937500,946,1893.0402832031,,, +59.1855468750,946,1878.3883056641,,, +59.1875000000,947,1863.7362060547,,, +59.1894531250,947,1849.0842285156,,, +59.1914062500,947,1834.4322509766,,, +59.1933593750,947,1820.5128173828,,, +59.1953125000,947,1806.5933837891,,, +59.1972656250,947,1791.2087402344,,, +59.1992187500,947,1775.0915527344,,, +59.2011718750,947,1758.9743652344,,, +59.2031250000,947,1742.1245117188,,, +59.2050781250,947,1725.2747802734,,, +59.2070312500,947,1709.1574707031,,, +59.2089843750,947,1692.3077392578,,, +59.2109375000,947,1678.3883056641,,, +59.2128906250,947,1663.0036621094,,, +59.2148437500,947,1649.0842285156,,, +59.2167968750,947,1635.1647949219,,, +59.2187500000,947,1619.7802734375,,, +59.2207031250,947,1605.8608398438,,, +59.2226562500,947,1592.6739501953,,, +59.2246093750,947,1578.7546386719,,, +59.2265625000,947,1566.3004150391,,, +59.2285156250,947,1554.5787353516,,, +59.2304687500,947,1542.8571777344,,, +59.2324218750,947,1530.4029541016,,, +59.2343750000,947,1519.4139404297,,, +59.2363281250,947,1508.4249267578,,, +59.2382812500,947,1498.1684570312,,, +59.2402343750,947,1488.6446533203,,, +59.2421875000,947,1479.1208496094,,, +59.2441406250,947,1471.0622558594,,, +59.2460937500,947,1462.2711181641,,, +59.2480468750,947,1454.9450683594,,, +59.2500000000,948,1446.1538085938,,, +59.2519531250,948,1437.3626708984,,, +59.2539062500,948,1431.5018310547,,, +59.2558593750,948,1425.6409912109,,, +59.2578125000,948,1418.3150634766,,, +59.2597656250,948,1410.2564697266,,, +59.2617187500,948,1404.3956298828,,, +59.2636718750,948,1400.0000000000,,, +59.2656250000,948,1394.1391601562,,, +59.2675781250,948,1389.7435302734,,, +59.2695312500,948,1384.6153564453,,, +59.2714843750,948,1379.4871826172,,, +59.2734375000,948,1375.8242187500,,, +59.2753906250,948,1372.1611328125,,, +59.2773437500,948,1368.4981689453,,, +59.2792968750,948,1364.1025390625,,, +59.2812500000,948,1360.4395751953,,, +59.2832031250,948,1356.7766113281,,, +59.2851562500,948,1354.5787353516,,, +59.2871093750,948,1350.1831054688,,, +59.2890625000,948,1347.2528076172,,, +59.2910156250,948,1345.0549316406,,, +59.2929687500,948,1342.8571777344,,, +59.2949218750,948,1339.9267578125,,, +59.2968750000,948,1336.9963378906,,, +59.2988281250,948,1334.7985839844,,, +59.3007812500,948,1333.3333740234,,, +59.3027343750,948,1331.1354980469,,, +59.3046875000,948,1329.6702880859,,, +59.3066406250,948,1328.2050781250,,, +59.3085937500,948,1326.7398681641,,, +59.3105468750,948,1324.5421142578,,, +59.3125000000,949,1323.0769042969,,, +59.3144531250,949,1321.6116943359,,, +59.3164062500,949,1321.6116943359,,, +59.3183593750,949,1320.8791503906,,, +59.3203125000,949,1317.9487304688,,, +59.3222656250,949,1317.9487304688,,, +59.3242187500,949,1317.2160644531,,, +59.3261718750,949,1317.2160644531,,, +59.3281250000,949,1317.2160644531,,, +59.3300781250,949,1317.2160644531,,, +59.3320312500,949,1317.9487304688,,, +59.3339843750,949,1318.6812744141,,, +59.3359375000,949,1320.1464843750,,, +59.3378906250,949,1321.6116943359,,, +59.3398437500,949,1322.3443603516,,, +59.3417968750,949,1325.2747802734,,, +59.3437500000,949,1326.7398681641,,, +59.3457031250,949,1328.2050781250,,, +59.3476562500,949,1330.4029541016,,, +59.3496093750,949,1332.6007080078,,, +59.3515625000,949,1335.5311279297,,, +59.3535156250,949,1338.4615478516,,, +59.3554687500,949,1340.6593017578,,, +59.3574218750,949,1343.5897216797,,, +59.3593750000,949,1346.5201416016,,, +59.3613281250,949,1349.4505615234,,, +59.3632812500,949,1351.6483154297,,, +59.3652343750,949,1353.8461914062,,, +59.3671875000,949,1357.5091552734,,, +59.3691406250,949,1361.1721191406,,, +59.3710937500,949,1363.3699951172,,, +59.3730468750,949,1366.3004150391,,, +59.3750000000,950,1369.2307128906,,, +59.3769531250,950,1373.6263427734,,, +59.3789062500,950,1376.5567626953,,, +59.3808593750,950,1378.7546386719,,, +59.3828125000,950,1383.1501464844,,, +59.3847656250,950,1386.0805664062,,, +59.3867187500,950,1389.7435302734,,, +59.3886718750,950,1393.4066162109,,, +59.3906250000,950,1397.0695800781,,, +59.3925781250,950,1401.4652099609,,, +59.3945312500,950,1405.1281738281,,, +59.3964843750,950,1407.3260498047,,, +59.3984375000,950,1410.9890136719,,, +59.4003906250,950,1415.3846435547,,, +59.4023437500,950,1419.0476074219,,, +59.4042968750,950,1421.9780273438,,, +59.4062500000,950,1424.9084472656,,, +59.4082031250,950,1426.3736572266,,, +59.4101562500,950,1428.5714111328,,, +59.4121093750,950,1430.7692871094,,, +59.4140625000,950,1432.2343750000,,, +59.4160156250,950,1432.9670410156,,, +59.4179687500,950,1433.6995849609,,, +59.4199218750,950,1434.4322509766,,, +59.4218750000,950,1434.4322509766,,, +59.4238281250,950,1433.6995849609,,, +59.4257812500,950,1434.4322509766,,, +59.4277343750,950,1434.4322509766,,, +59.4296875000,950,1434.4322509766,,, +59.4316406250,950,1433.6995849609,,, +59.4335937500,950,1432.9670410156,,, +59.4355468750,950,1431.5018310547,,, +59.4375000000,951,1431.5018310547,,, +59.4394531250,951,1430.7692871094,,, +59.4414062500,951,1430.0366210938,,, +59.4433593750,951,1428.5714111328,,, +59.4453125000,951,1426.3736572266,,, +59.4472656250,951,1424.1757812500,,, +59.4492187500,951,1421.9780273438,,, +59.4511718750,951,1419.7802734375,,, +59.4531250000,951,1417.5823974609,,, +59.4550781250,951,1415.3846435547,,, +59.4570312500,951,1413.9194335938,,, +59.4589843750,951,1410.9890136719,,, +59.4609375000,951,1408.7912597656,,, +59.4628906250,951,1405.1281738281,,, +59.4648437500,951,1402.1977539062,,, +59.4667968750,951,1398.5347900391,,, +59.4687500000,951,1394.1391601562,,, +59.4707031250,951,1391.2087402344,,, +59.4726562500,951,1387.5457763672,,, +59.4746093750,951,1383.8828125000,,, +59.4765625000,951,1378.7546386719,,, +59.4785156250,951,1375.0915527344,,, +59.4804687500,951,1370.6959228516,,, +59.4824218750,951,1366.3004150391,,, +59.4843750000,951,1363.3699951172,,, +59.4863281250,951,1359.7069091797,,, +59.4882812500,951,1356.0439453125,,, +59.4902343750,951,1350.9157714844,,, +59.4921875000,951,1347.2528076172,,, +59.4941406250,951,1343.5897216797,,, +59.4960937500,951,1339.9267578125,,, +59.4980468750,951,1337.7288818359,,, +59.5000000000,952,1334.7985839844,,, +59.5019531250,952,1331.8681640625,,, +59.5039062500,952,1328.9377441406,,, +59.5058593750,952,1326.0073242188,,, +59.5078125000,952,1323.8095703125,,, +59.5097656250,952,1320.8791503906,,, +59.5117187500,952,1319.4139404297,,, +59.5136718750,952,1317.2160644531,,, +59.5156250000,952,1315.7509765625,,, +59.5175781250,952,1315.0183105469,,, +59.5195312500,952,1312.8205566406,,, +59.5214843750,952,1311.3553466797,,, +59.5234375000,952,1309.8901367188,,, +59.5253906250,952,1309.1574707031,,, +59.5273437500,952,1307.6922607422,,, +59.5292968750,952,1306.2270507812,,, +59.5312500000,952,1306.2270507812,,, +59.5332031250,952,1305.4945068359,,, +59.5351562500,952,1304.7619628906,,, +59.5371093750,952,1304.0292968750,,, +59.5390625000,952,1301.0988769531,,, +59.5410156250,952,1300.3663330078,,, +59.5429687500,952,1298.1684570312,,, +59.5449218750,952,1296.7032470703,,, +59.5468750000,952,1296.7032470703,,, +59.5488281250,952,1296.7032470703,,, +59.5507812500,952,1295.2380371094,,, +59.5527343750,952,1293.0402832031,,, +59.5546875000,952,1292.3077392578,,, +59.5566406250,952,1289.3773193359,,, +59.5585937500,952,1287.9121093750,,, +59.5605468750,952,1286.4468994141,,, +59.5625000000,953,1285.7142333984,,, +59.5644531250,953,1284.2490234375,,, +59.5664062500,953,1284.2490234375,,, +59.5683593750,953,1284.2490234375,,, +59.5703125000,953,1283.5164794922,,, +59.5722656250,953,1283.5164794922,,, +59.5742187500,953,1282.7839355469,,, +59.5761718750,953,1282.7839355469,,, +59.5781250000,953,1282.7839355469,,, +59.5800781250,953,1283.5164794922,,, +59.5820312500,953,1284.9816894531,,, +59.5839843750,953,1285.7142333984,,, +59.5859375000,953,1286.4468994141,,, +59.5878906250,953,1287.9121093750,,, +59.5898437500,953,1287.1794433594,,, +59.5917968750,953,1287.9121093750,,, +59.5937500000,953,1288.6446533203,,, +59.5957031250,953,1289.3773193359,,, +59.5976562500,953,1289.3773193359,,, +59.5996093750,953,1290.1098632812,,, +59.6015625000,953,1290.8425292969,,, +59.6035156250,953,1291.5750732422,,, +59.6054687500,953,1293.0402832031,,, +59.6074218750,953,1293.7729492188,,, +59.6093750000,953,1295.2380371094,,, +59.6113281250,953,1296.7032470703,,, +59.6132812500,953,1297.4359130859,,, +59.6152343750,953,1298.1684570312,,, +59.6171875000,953,1298.1684570312,,, +59.6191406250,953,1299.6336669922,,, +59.6210937500,953,1299.6336669922,,, +59.6230468750,953,1301.0988769531,,, +59.6250000000,954,1302.5640869141,,, +59.6269531250,954,1304.7619628906,,, +59.6289062500,954,1306.9597167969,,, +59.6308593750,954,1307.6922607422,,, +59.6328125000,954,1307.6922607422,,, +59.6347656250,954,1308.4249267578,,, +59.6367187500,954,1309.8901367188,,, +59.6386718750,954,1309.8901367188,,, +59.6406250000,954,1311.3553466797,,, +59.6425781250,954,1311.3553466797,,, +59.6445312500,954,1312.8205566406,,, +59.6464843750,954,1313.5531005859,,, +59.6484375000,954,1315.7509765625,,, +59.6503906250,954,1317.2160644531,,, +59.6523437500,954,1319.4139404297,,, +59.6542968750,954,1320.1464843750,,, +59.6562500000,954,1321.6116943359,,, +59.6582031250,954,1322.3443603516,,, +59.6601562500,954,1321.6116943359,,, +59.6621093750,954,1322.3443603516,,, +59.6640625000,954,1323.8095703125,,, +59.6660156250,954,1324.5421142578,,, +59.6679687500,954,1326.0073242188,,, +59.6699218750,954,1327.4725341797,,, +59.6718750000,954,1327.4725341797,,, +59.6738281250,954,1328.2050781250,,, +59.6757812500,954,1328.9377441406,,, +59.6777343750,954,1328.2050781250,,, +59.6796875000,954,1330.4029541016,,, +59.6816406250,954,1329.6702880859,,, +59.6835937500,954,1330.4029541016,,, +59.6855468750,954,1331.8681640625,,, +59.6875000000,955,1333.3333740234,,, +59.6894531250,955,1334.7985839844,,, +59.6914062500,955,1336.2637939453,,, +59.6933593750,955,1336.9963378906,,, +59.6953125000,955,1336.9963378906,,, +59.6972656250,955,1337.7288818359,,, +59.6992187500,955,1337.7288818359,,, +59.7011718750,955,1336.2637939453,,, +59.7031250000,955,1336.2637939453,,, +59.7050781250,955,1335.5311279297,,, +59.7070312500,955,1336.9963378906,,, +59.7089843750,955,1336.9963378906,,, +59.7109375000,955,1337.7288818359,,, +59.7128906250,955,1338.4615478516,,, +59.7148437500,955,1337.7288818359,,, +59.7167968750,955,1336.9963378906,,, +59.7187500000,955,1335.5311279297,,, +59.7207031250,955,1334.7985839844,,, +59.7226562500,955,1333.3333740234,,, +59.7246093750,955,1331.1354980469,,, +59.7265625000,955,1330.4029541016,,, +59.7285156250,955,1329.6702880859,,, +59.7304687500,955,1328.9377441406,,, +59.7324218750,955,1328.2050781250,,, +59.7343750000,955,1328.2050781250,,, +59.7363281250,955,1327.4725341797,,, +59.7382812500,955,1326.7398681641,,, +59.7402343750,955,1326.0073242188,,, +59.7421875000,955,1324.5421142578,,, +59.7441406250,955,1324.5421142578,,, +59.7460937500,955,1323.0769042969,,, +59.7480468750,955,1323.0769042969,,, +59.7500000000,956,1323.0769042969,,, +59.7519531250,956,1322.3443603516,,, +59.7539062500,956,1323.0769042969,,, +59.7558593750,956,1323.0769042969,,, +59.7578125000,956,1323.8095703125,,, +59.7597656250,956,1325.2747802734,,, +59.7617187500,956,1325.2747802734,,, +59.7636718750,956,1325.2747802734,,, +59.7656250000,956,1324.5421142578,,, +59.7675781250,956,1323.0769042969,,, +59.7695312500,956,1323.0769042969,,, +59.7714843750,956,1322.3443603516,,, +59.7734375000,956,1322.3443603516,,, +59.7753906250,956,1322.3443603516,,, +59.7773437500,956,1323.0769042969,,, +59.7792968750,956,1323.0769042969,,, +59.7812500000,956,1323.8095703125,,, +59.7832031250,956,1323.8095703125,,, +59.7851562500,956,1324.5421142578,,, +59.7871093750,956,1323.8095703125,,, +59.7890625000,956,1322.3443603516,,, +59.7910156250,956,1322.3443603516,,, +59.7929687500,956,1321.6116943359,,, +59.7949218750,956,1320.1464843750,,, +59.7968750000,956,1320.1464843750,,, +59.7988281250,956,1320.1464843750,,, +59.8007812500,956,1320.1464843750,,, +59.8027343750,956,1318.6812744141,,, +59.8046875000,956,1317.2160644531,,, +59.8066406250,956,1315.7509765625,,, +59.8085937500,956,1314.2857666016,,, +59.8105468750,956,1312.8205566406,,, +59.8125000000,957,1312.8205566406,,, +59.8144531250,957,1312.0878906250,,, +59.8164062500,957,1311.3553466797,,, +59.8183593750,957,1309.8901367188,,, +59.8203125000,957,1308.4249267578,,, +59.8222656250,957,1306.9597167969,,, +59.8242187500,957,1306.2270507812,,, +59.8261718750,957,1305.4945068359,,, +59.8281250000,957,1305.4945068359,,, +59.8300781250,957,1305.4945068359,,, +59.8320312500,957,1304.0292968750,,, +59.8339843750,957,1303.2967529297,,, +59.8359375000,957,1302.5640869141,,, +59.8378906250,957,1301.8315429688,,, +59.8398437500,957,1302.5640869141,,, +59.8417968750,957,1303.2967529297,,, +59.8437500000,957,1304.0292968750,,, +59.8457031250,957,1304.0292968750,,, +59.8476562500,957,1302.5640869141,,, +59.8496093750,957,1302.5640869141,,, +59.8515625000,957,1303.2967529297,,, +59.8535156250,957,1304.0292968750,,, +59.8554687500,957,1304.7619628906,,, +59.8574218750,957,1304.7619628906,,, +59.8593750000,957,1305.4945068359,,, +59.8613281250,957,1306.2270507812,,, +59.8632812500,957,1306.9597167969,,, +59.8652343750,957,1307.6922607422,,, +59.8671875000,957,1306.9597167969,,, +59.8691406250,957,1307.6922607422,,, +59.8710937500,957,1307.6922607422,,, +59.8730468750,957,1308.4249267578,,, +59.8750000000,958,1309.8901367188,,, +59.8769531250,958,1310.6226806641,,, +59.8789062500,958,1310.6226806641,,, +59.8808593750,958,1309.8901367188,,, +59.8828125000,958,1310.6226806641,,, +59.8847656250,958,1310.6226806641,,, +59.8867187500,958,1310.6226806641,,, +59.8886718750,958,1309.8901367188,,, +59.8906250000,958,1309.1574707031,,, +59.8925781250,958,1308.4249267578,,, +59.8945312500,958,1307.6922607422,,, +59.8964843750,958,1308.4249267578,,, +59.8984375000,958,1309.8901367188,,, +59.9003906250,958,1311.3553466797,,, +59.9023437500,958,1312.0878906250,,, +59.9042968750,958,1313.5531005859,,, +59.9062500000,958,1315.0183105469,,, +59.9082031250,958,1316.4835205078,,, +59.9101562500,958,1319.4139404297,,, +59.9121093750,958,1322.3443603516,,, +59.9140625000,958,1326.0073242188,,, +59.9160156250,958,1330.4029541016,,, +59.9179687500,958,1335.5311279297,,, +59.9199218750,958,1341.3919677734,,, +59.9218750000,958,1348.7178955078,,, +59.9238281250,958,1356.7766113281,,, +59.9257812500,958,1365.5677490234,,, +59.9277343750,958,1373.6263427734,,, +59.9296875000,958,1382.4176025391,,, +59.9316406250,958,1391.9414062500,,, +59.9335937500,958,1401.4652099609,,, +59.9355468750,958,1413.1867675781,,, +59.9375000000,959,1424.1757812500,,, +59.9394531250,959,1437.3626708984,,, +59.9414062500,959,1451.2821044922,,, +59.9433593750,959,1466.6666259766,,, +59.9453125000,959,1481.3187255859,,, +59.9472656250,959,1498.1684570312,,, +59.9492187500,959,1513.5531005859,,, +59.9511718750,959,1530.4029541016,,, +59.9531250000,959,1547.2528076172,,, +59.9550781250,959,1564.1025390625,,, +59.9570312500,959,1581.6849365234,,, +59.9589843750,959,1599.2674560547,,, +59.9609375000,959,1618.3150634766,,, +59.9628906250,959,1637.3626708984,,, +59.9648437500,959,1657.8754882812,,, +59.9667968750,959,1676.1904296875,,, +59.9687500000,959,1695.2380371094,,, +59.9707031250,959,1713.5531005859,,, +59.9726562500,959,1731.1354980469,,, +59.9746093750,959,1749.4505615234,,, +59.9765625000,959,1767.7656250000,,, +59.9785156250,959,1784.6153564453,,, +59.9804687500,959,1802.1977539062,,, +59.9824218750,959,1819.0476074219,,, +59.9843750000,959,1834.4322509766,,, +59.9863281250,959,1849.8168945312,,, +59.9882812500,959,1865.2014160156,,, +59.9902343750,959,1865.2014160156,,, +59.9921875000,959,1877.6556396484,,, +59.9941406250,959,1890.8425292969,,, +59.9960937500,959,1903.2967529297,,, +59.9980468750,959,1915.0183105469,,, +60.0000000000,960,1925.2747802734,,, +60.0019531250,960,1934.7985839844,,, +60.0039062500,960,1943.5897216797,,, +60.0058593750,960,1950.9157714844,,, +60.0078125000,960,1956.7766113281,,, +60.0097656250,960,1960.4395751953,,, +60.0117187500,960,1965.5677490234,,, +60.0136718750,960,1968.4981689453,,, +60.0156250000,960,1971.4285888672,,, +60.0175781250,960,1972.8937988281,,, +60.0195312500,960,1975.0915527344,,, +60.0214843750,960,1975.8242187500,,, +60.0234375000,960,1975.8242187500,,, +60.0253906250,960,1974.3590087891,,, +60.0273437500,960,1972.1611328125,,, +60.0292968750,960,1968.4981689453,,, +60.0312500000,960,1962.6373291016,,, +60.0332031250,960,1956.7766113281,,, +60.0351562500,960,1950.1831054688,,, +60.0371093750,960,1942.1245117188,,, +60.0390625000,960,1933.3333740234,,, +60.0410156250,960,1924.5421142578,,, +60.0429687500,960,1914.2857666016,,, +60.0449218750,960,1904.7619628906,,, +60.0468750000,960,1893.0402832031,,, +60.0488281250,960,1882.0512695312,,, +60.0507812500,960,1869.5970458984,,, +60.0527343750,960,1854.9450683594,,, +60.0546875000,960,1854.9450683594,,, +60.0566406250,960,1841.7583007812,,, +60.0585937500,960,1827.1062011719,,, +60.0605468750,960,1813.1867675781,,, +60.0625000000,961,1798.5347900391,,, +60.0644531250,961,1783.8828125000,,, +60.0664062500,961,1769.2307128906,,, +60.0683593750,961,1753.8461914062,,, +60.0703125000,961,1739.1940917969,,, +60.0722656250,961,1724.5421142578,,, +60.0742187500,961,1708.4249267578,,, +60.0761718750,961,1693.0402832031,,, +60.0781250000,961,1676.9230957031,,, +60.0800781250,961,1660.0732421875,,, +60.0820312500,961,1643.9560546875,,, +60.0839843750,961,1629.3040771484,,, +60.0859375000,961,1615.3846435547,,, +60.0878906250,961,1600.0000000000,,, +60.0898437500,961,1586.0805664062,,, +60.0917968750,961,1571.4285888672,,, +60.0937500000,961,1557.5091552734,,, +60.0957031250,961,1544.3223876953,,, +60.0976562500,961,1531.1354980469,,, +60.0996093750,961,1517.9487304688,,, +60.1015625000,961,1506.2270507812,,, +60.1035156250,961,1495.2380371094,,, +60.1054687500,961,1483.5164794922,,, +60.1074218750,961,1473.2601318359,,, +60.1093750000,961,1461.5384521484,,, +60.1113281250,961,1451.2821044922,,, +60.1132812500,961,1441.7583007812,,, +60.1152343750,961,1431.5018310547,,, +60.1171875000,961,1422.7105712891,,, +60.1191406250,961,1412.4542236328,,, +60.1210937500,961,1405.1281738281,,, +60.1230468750,961,1397.8022460938,,, diff --git a/plugins/processing/signal-processing/test/scenarios-tests/Pulse-Rate-Calculator-ref.csv b/plugins/processing/signal-processing/test/scenarios-tests/Pulse-Rate-Calculator-ref.csv new file mode 100644 index 0000000000000000000000000000000000000000..6fcc7ebdef8a55e1fa72cde89e352d4151a1324d --- /dev/null +++ b/plugins/processing/signal-processing/test/scenarios-tests/Pulse-Rate-Calculator-ref.csv @@ -0,0 +1,30785 @@ +Time:512Hz,Epoch,Internal ADC A13,Event Id,Event Date,Event Duration +0.0000000000,0,0.0000000000,,, +0.0019531250,0,0.0000000000,,, +0.0039062500,0,0.0000000000,,, +0.0058593750,0,0.0000000000,,, +0.0078125000,0,0.0000000000,,, +0.0097656250,0,0.0000000000,,, +0.0117187500,0,0.0000000000,,, +0.0136718750,0,0.0000000000,,, +0.0156250000,0,0.0000000000,,, +0.0175781250,0,0.0000000000,,, +0.0195312500,0,0.0000000000,,, +0.0214843750,0,0.0000000000,,, +0.0234375000,0,0.0000000000,,, +0.0253906250,0,0.0000000000,,, +0.0273437500,0,0.0000000000,,, +0.0292968750,0,0.0000000000,,, +0.0312500000,0,0.0000000000,,, +0.0332031250,0,0.0000000000,,, +0.0351562500,0,0.0000000000,,, +0.0371093750,0,0.0000000000,,, +0.0390625000,0,0.0000000000,,, +0.0410156250,0,0.0000000000,,, +0.0429687500,0,0.0000000000,,, +0.0449218750,0,0.0000000000,,, +0.0468750000,0,0.0000000000,,, +0.0488281250,0,0.0000000000,,, +0.0507812500,0,0.0000000000,,, +0.0527343750,0,0.0000000000,,, +0.0546875000,0,0.0000000000,,, +0.0566406250,0,0.0000000000,,, +0.0585937500,0,0.0000000000,,, +0.0605468750,0,0.0000000000,,, +0.0625000000,1,0.0000000000,,, +0.0644531250,1,0.0000000000,,, +0.0664062500,1,0.0000000000,,, +0.0683593750,1,0.0000000000,,, +0.0703125000,1,0.0000000000,,, +0.0722656250,1,0.0000000000,,, +0.0742187500,1,0.0000000000,,, +0.0761718750,1,0.0000000000,,, +0.0781250000,1,0.0000000000,,, +0.0800781250,1,0.0000000000,,, +0.0820312500,1,0.0000000000,,, +0.0839843750,1,0.0000000000,,, +0.0859375000,1,0.0000000000,,, +0.0878906250,1,0.0000000000,,, +0.0898437500,1,0.0000000000,,, +0.0917968750,1,0.0000000000,,, +0.0937500000,1,0.0000000000,,, +0.0957031250,1,0.0000000000,,, +0.0976562500,1,0.0000000000,,, +0.0996093750,1,0.0000000000,,, +0.1015625000,1,0.0000000000,,, +0.1035156250,1,0.0000000000,,, +0.1054687500,1,0.0000000000,,, +0.1074218750,1,0.0000000000,,, +0.1093750000,1,0.0000000000,,, +0.1113281250,1,0.0000000000,,, +0.1132812500,1,0.0000000000,,, +0.1152343750,1,0.0000000000,,, +0.1171875000,1,0.0000000000,,, +0.1191406250,1,0.0000000000,,, +0.1210937500,1,0.0000000000,,, +0.1230468750,1,0.0000000000,,, +0.1250000000,2,0.0000000000,,, +0.1269531250,2,0.0000000000,,, +0.1289062500,2,0.0000000000,,, +0.1308593750,2,0.0000000000,,, +0.1328125000,2,0.0000000000,,, +0.1347656250,2,0.0000000000,,, +0.1367187500,2,0.0000000000,,, +0.1386718750,2,0.0000000000,,, +0.1406250000,2,0.0000000000,,, +0.1425781250,2,0.0000000000,,, +0.1445312500,2,0.0000000000,,, +0.1464843750,2,0.0000000000,,, +0.1484375000,2,0.0000000000,,, +0.1503906250,2,0.0000000000,,, +0.1523437500,2,0.0000000000,,, +0.1542968750,2,0.0000000000,,, +0.1562500000,2,0.0000000000,,, +0.1582031250,2,0.0000000000,,, +0.1601562500,2,0.0000000000,,, +0.1621093750,2,0.0000000000,,, +0.1640625000,2,0.0000000000,,, +0.1660156250,2,0.0000000000,,, +0.1679687500,2,0.0000000000,,, +0.1699218750,2,0.0000000000,,, +0.1718750000,2,0.0000000000,,, +0.1738281250,2,0.0000000000,,, +0.1757812500,2,0.0000000000,,, +0.1777343750,2,0.0000000000,,, +0.1796875000,2,0.0000000000,,, +0.1816406250,2,0.0000000000,,, +0.1835937500,2,0.0000000000,,, +0.1855468750,2,0.0000000000,,, +0.1875000000,3,0.0000000000,,, +0.1894531250,3,0.0000000000,,, +0.1914062500,3,0.0000000000,,, +0.1933593750,3,0.0000000000,,, +0.1953125000,3,0.0000000000,,, +0.1972656250,3,0.0000000000,,, +0.1992187500,3,0.0000000000,,, +0.2011718750,3,0.0000000000,,, +0.2031250000,3,0.0000000000,,, +0.2050781250,3,0.0000000000,,, +0.2070312500,3,0.0000000000,,, +0.2089843750,3,0.0000000000,,, +0.2109375000,3,0.0000000000,,, +0.2128906250,3,0.0000000000,,, +0.2148437500,3,0.0000000000,,, +0.2167968750,3,0.0000000000,,, +0.2187500000,3,0.0000000000,,, +0.2207031250,3,0.0000000000,,, +0.2226562500,3,0.0000000000,,, +0.2246093750,3,0.0000000000,,, +0.2265625000,3,0.0000000000,,, +0.2285156250,3,0.0000000000,,, +0.2304687500,3,0.0000000000,,, +0.2324218750,3,0.0000000000,,, +0.2343750000,3,0.0000000000,,, +0.2363281250,3,0.0000000000,,, +0.2382812500,3,0.0000000000,,, +0.2402343750,3,0.0000000000,,, +0.2421875000,3,0.0000000000,,, +0.2441406250,3,0.0000000000,,, +0.2460937500,3,0.0000000000,,, +0.2480468750,3,0.0000000000,,, +0.2500000000,4,0.0000000000,,, +0.2519531250,4,0.0000000000,,, +0.2539062500,4,0.0000000000,,, +0.2558593750,4,0.0000000000,,, +0.2578125000,4,0.0000000000,,, +0.2597656250,4,0.0000000000,,, +0.2617187500,4,0.0000000000,,, +0.2636718750,4,0.0000000000,,, +0.2656250000,4,0.0000000000,,, +0.2675781250,4,0.0000000000,,, +0.2695312500,4,0.0000000000,,, +0.2714843750,4,0.0000000000,,, +0.2734375000,4,0.0000000000,,, +0.2753906250,4,0.0000000000,,, +0.2773437500,4,0.0000000000,,, +0.2792968750,4,0.0000000000,,, +0.2812500000,4,0.0000000000,,, +0.2832031250,4,0.0000000000,,, +0.2851562500,4,0.0000000000,,, +0.2871093750,4,0.0000000000,,, +0.2890625000,4,0.0000000000,,, +0.2910156250,4,0.0000000000,,, +0.2929687500,4,0.0000000000,,, +0.2949218750,4,0.0000000000,,, +0.2968750000,4,0.0000000000,,, +0.2988281250,4,0.0000000000,,, +0.3007812500,4,0.0000000000,,, +0.3027343750,4,0.0000000000,,, +0.3046875000,4,0.0000000000,,, +0.3066406250,4,0.0000000000,,, +0.3085937500,4,0.0000000000,,, +0.3105468750,4,0.0000000000,,, +0.3125000000,5,0.0000000000,,, +0.3144531250,5,0.0000000000,,, +0.3164062500,5,0.0000000000,,, +0.3183593750,5,0.0000000000,,, +0.3203125000,5,0.0000000000,,, +0.3222656250,5,0.0000000000,,, +0.3242187500,5,0.0000000000,,, +0.3261718750,5,0.0000000000,,, +0.3281250000,5,0.0000000000,,, +0.3300781250,5,0.0000000000,,, +0.3320312500,5,0.0000000000,,, +0.3339843750,5,0.0000000000,,, +0.3359375000,5,0.0000000000,,, +0.3378906250,5,0.0000000000,,, +0.3398437500,5,0.0000000000,,, +0.3417968750,5,0.0000000000,,, +0.3437500000,5,0.0000000000,,, +0.3457031250,5,0.0000000000,,, +0.3476562500,5,0.0000000000,,, +0.3496093750,5,0.0000000000,,, +0.3515625000,5,0.0000000000,,, +0.3535156250,5,0.0000000000,,, +0.3554687500,5,0.0000000000,,, +0.3574218750,5,0.0000000000,,, +0.3593750000,5,0.0000000000,,, +0.3613281250,5,0.0000000000,,, +0.3632812500,5,0.0000000000,,, +0.3652343750,5,0.0000000000,,, +0.3671875000,5,0.0000000000,,, +0.3691406250,5,0.0000000000,,, +0.3710937500,5,0.0000000000,,, +0.3730468750,5,0.0000000000,,, +0.3750000000,6,0.0000000000,,, +0.3769531250,6,0.0000000000,,, +0.3789062500,6,0.0000000000,,, +0.3808593750,6,0.0000000000,,, +0.3828125000,6,0.0000000000,,, +0.3847656250,6,0.0000000000,,, +0.3867187500,6,0.0000000000,,, +0.3886718750,6,0.0000000000,,, +0.3906250000,6,0.0000000000,,, +0.3925781250,6,0.0000000000,,, +0.3945312500,6,0.0000000000,,, +0.3964843750,6,0.0000000000,,, +0.3984375000,6,0.0000000000,,, +0.4003906250,6,0.0000000000,,, +0.4023437500,6,0.0000000000,,, +0.4042968750,6,0.0000000000,,, +0.4062500000,6,0.0000000000,,, +0.4082031250,6,0.0000000000,,, +0.4101562500,6,0.0000000000,,, +0.4121093750,6,0.0000000000,,, +0.4140625000,6,0.0000000000,,, +0.4160156250,6,0.0000000000,,, +0.4179687500,6,0.0000000000,,, +0.4199218750,6,0.0000000000,,, +0.4218750000,6,0.0000000000,,, +0.4238281250,6,0.0000000000,,, +0.4257812500,6,0.0000000000,,, +0.4277343750,6,0.0000000000,,, +0.4296875000,6,0.0000000000,,, +0.4316406250,6,0.0000000000,,, +0.4335937500,6,0.0000000000,,, +0.4355468750,6,0.0000000000,,, +0.4375000000,7,0.0000000000,,, +0.4394531250,7,0.0000000000,,, +0.4414062500,7,0.0000000000,,, +0.4433593750,7,0.0000000000,,, +0.4453125000,7,0.0000000000,,, +0.4472656250,7,0.0000000000,,, +0.4492187500,7,0.0000000000,,, +0.4511718750,7,0.0000000000,,, +0.4531250000,7,0.0000000000,,, +0.4550781250,7,0.0000000000,,, +0.4570312500,7,0.0000000000,,, +0.4589843750,7,0.0000000000,,, +0.4609375000,7,0.0000000000,,, +0.4628906250,7,0.0000000000,,, +0.4648437500,7,0.0000000000,,, +0.4667968750,7,0.0000000000,,, +0.4687500000,7,0.0000000000,,, +0.4707031250,7,0.0000000000,,, +0.4726562500,7,0.0000000000,,, +0.4746093750,7,0.0000000000,,, +0.4765625000,7,0.0000000000,,, +0.4785156250,7,0.0000000000,,, +0.4804687500,7,0.0000000000,,, +0.4824218750,7,0.0000000000,,, +0.4843750000,7,0.0000000000,,, +0.4863281250,7,0.0000000000,,, +0.4882812500,7,0.0000000000,,, +0.4902343750,7,0.0000000000,,, +0.4921875000,7,0.0000000000,,, +0.4941406250,7,0.0000000000,,, +0.4960937500,7,0.0000000000,,, +0.4980468750,7,0.0000000000,,, +0.5000000000,8,0.0000000000,,, +0.5019531250,8,0.0000000000,,, +0.5039062500,8,0.0000000000,,, +0.5058593750,8,0.0000000000,,, +0.5078125000,8,0.0000000000,,, +0.5097656250,8,0.0000000000,,, +0.5117187500,8,0.0000000000,,, +0.5136718750,8,0.0000000000,,, +0.5156250000,8,0.0000000000,,, +0.5175781250,8,0.0000000000,,, +0.5195312500,8,0.0000000000,,, +0.5214843750,8,0.0000000000,,, +0.5234375000,8,0.0000000000,,, +0.5253906250,8,0.0000000000,,, +0.5273437500,8,0.0000000000,,, +0.5292968750,8,0.0000000000,,, +0.5312500000,8,0.0000000000,,, +0.5332031250,8,0.0000000000,,, +0.5351562500,8,0.0000000000,,, +0.5371093750,8,0.0000000000,,, +0.5390625000,8,0.0000000000,,, +0.5410156250,8,0.0000000000,,, +0.5429687500,8,0.0000000000,,, +0.5449218750,8,0.0000000000,,, +0.5468750000,8,0.0000000000,,, +0.5488281250,8,0.0000000000,,, +0.5507812500,8,0.0000000000,,, +0.5527343750,8,0.0000000000,,, +0.5546875000,8,0.0000000000,,, +0.5566406250,8,0.0000000000,,, +0.5585937500,8,0.0000000000,,, +0.5605468750,8,0.0000000000,,, +0.5625000000,9,0.0000000000,,, +0.5644531250,9,0.0000000000,,, +0.5664062500,9,0.0000000000,,, +0.5683593750,9,0.0000000000,,, +0.5703125000,9,0.0000000000,,, +0.5722656250,9,0.0000000000,,, +0.5742187500,9,0.0000000000,,, +0.5761718750,9,0.0000000000,,, +0.5781250000,9,0.0000000000,,, +0.5800781250,9,0.0000000000,,, +0.5820312500,9,0.0000000000,,, +0.5839843750,9,0.0000000000,,, +0.5859375000,9,0.0000000000,,, +0.5878906250,9,0.0000000000,,, +0.5898437500,9,0.0000000000,,, +0.5917968750,9,0.0000000000,,, +0.5937500000,9,0.0000000000,,, +0.5957031250,9,0.0000000000,,, +0.5976562500,9,0.0000000000,,, +0.5996093750,9,0.0000000000,,, +0.6015625000,9,0.0000000000,,, +0.6035156250,9,0.0000000000,,, +0.6054687500,9,0.0000000000,,, +0.6074218750,9,0.0000000000,,, +0.6093750000,9,0.0000000000,,, +0.6113281250,9,0.0000000000,,, +0.6132812500,9,0.0000000000,,, +0.6152343750,9,0.0000000000,,, +0.6171875000,9,0.0000000000,,, +0.6191406250,9,0.0000000000,,, +0.6210937500,9,0.0000000000,,, +0.6230468750,9,0.0000000000,,, +0.6250000000,10,0.0000000000,,, +0.6269531250,10,0.0000000000,,, +0.6289062500,10,0.0000000000,,, +0.6308593750,10,0.0000000000,,, +0.6328125000,10,0.0000000000,,, +0.6347656250,10,0.0000000000,,, +0.6367187500,10,0.0000000000,,, +0.6386718750,10,0.0000000000,,, +0.6406250000,10,0.0000000000,,, +0.6425781250,10,0.0000000000,,, +0.6445312500,10,0.0000000000,,, +0.6464843750,10,0.0000000000,,, +0.6484375000,10,0.0000000000,,, +0.6503906250,10,0.0000000000,,, +0.6523437500,10,0.0000000000,,, +0.6542968750,10,0.0000000000,,, +0.6562500000,10,0.0000000000,,, +0.6582031250,10,0.0000000000,,, +0.6601562500,10,0.0000000000,,, +0.6621093750,10,0.0000000000,,, +0.6640625000,10,0.0000000000,,, +0.6660156250,10,0.0000000000,,, +0.6679687500,10,0.0000000000,,, +0.6699218750,10,0.0000000000,,, +0.6718750000,10,0.0000000000,,, +0.6738281250,10,0.0000000000,,, +0.6757812500,10,0.0000000000,,, +0.6777343750,10,0.0000000000,,, +0.6796875000,10,0.0000000000,,, +0.6816406250,10,0.0000000000,,, +0.6835937500,10,0.0000000000,,, +0.6855468750,10,0.0000000000,,, +0.6875000000,11,0.0000000000,,, +0.6894531250,11,0.0000000000,,, +0.6914062500,11,0.0000000000,,, +0.6933593750,11,0.0000000000,,, +0.6953125000,11,0.0000000000,,, +0.6972656250,11,0.0000000000,,, +0.6992187500,11,0.0000000000,,, +0.7011718750,11,0.0000000000,,, +0.7031250000,11,0.0000000000,,, +0.7050781250,11,0.0000000000,,, +0.7070312500,11,0.0000000000,,, +0.7089843750,11,0.0000000000,,, +0.7109375000,11,0.0000000000,,, +0.7128906250,11,0.0000000000,,, +0.7148437500,11,0.0000000000,,, +0.7167968750,11,0.0000000000,,, +0.7187500000,11,0.0000000000,,, +0.7207031250,11,0.0000000000,,, +0.7226562500,11,0.0000000000,,, +0.7246093750,11,0.0000000000,,, +0.7265625000,11,0.0000000000,,, +0.7285156250,11,0.0000000000,,, +0.7304687500,11,0.0000000000,,, +0.7324218750,11,0.0000000000,,, +0.7343750000,11,0.0000000000,,, +0.7363281250,11,0.0000000000,,, +0.7382812500,11,0.0000000000,,, +0.7402343750,11,0.0000000000,,, +0.7421875000,11,0.0000000000,,, +0.7441406250,11,0.0000000000,,, +0.7460937500,11,0.0000000000,,, +0.7480468750,11,0.0000000000,,, +0.7500000000,12,0.0000000000,,, +0.7519531250,12,0.0000000000,,, +0.7539062500,12,0.0000000000,,, +0.7558593750,12,0.0000000000,,, +0.7578125000,12,0.0000000000,,, +0.7597656250,12,0.0000000000,,, +0.7617187500,12,0.0000000000,,, +0.7636718750,12,0.0000000000,,, +0.7656250000,12,0.0000000000,,, +0.7675781250,12,0.0000000000,,, +0.7695312500,12,0.0000000000,,, +0.7714843750,12,0.0000000000,,, +0.7734375000,12,0.0000000000,,, +0.7753906250,12,0.0000000000,,, +0.7773437500,12,0.0000000000,,, +0.7792968750,12,0.0000000000,,, +0.7812500000,12,0.0000000000,,, +0.7832031250,12,0.0000000000,,, +0.7851562500,12,0.0000000000,,, +0.7871093750,12,0.0000000000,,, +0.7890625000,12,0.0000000000,,, +0.7910156250,12,0.0000000000,,, +0.7929687500,12,0.0000000000,,, +0.7949218750,12,0.0000000000,,, +0.7968750000,12,0.0000000000,,, +0.7988281250,12,0.0000000000,,, +0.8007812500,12,0.0000000000,,, +0.8027343750,12,0.0000000000,,, +0.8046875000,12,0.0000000000,,, +0.8066406250,12,0.0000000000,,, +0.8085937500,12,0.0000000000,,, +0.8105468750,12,0.0000000000,,, +0.8125000000,13,0.0000000000,,, +0.8144531250,13,0.0000000000,,, +0.8164062500,13,0.0000000000,,, +0.8183593750,13,0.0000000000,,, +0.8203125000,13,0.0000000000,,, +0.8222656250,13,0.0000000000,,, +0.8242187500,13,0.0000000000,,, +0.8261718750,13,0.0000000000,,, +0.8281250000,13,0.0000000000,,, +0.8300781250,13,0.0000000000,,, +0.8320312500,13,0.0000000000,,, +0.8339843750,13,0.0000000000,,, +0.8359375000,13,0.0000000000,,, +0.8378906250,13,0.0000000000,,, +0.8398437500,13,0.0000000000,,, +0.8417968750,13,0.0000000000,,, +0.8437500000,13,0.0000000000,,, +0.8457031250,13,0.0000000000,,, +0.8476562500,13,0.0000000000,,, +0.8496093750,13,0.0000000000,,, +0.8515625000,13,0.0000000000,,, +0.8535156250,13,0.0000000000,,, +0.8554687500,13,0.0000000000,,, +0.8574218750,13,0.0000000000,,, +0.8593750000,13,0.0000000000,,, +0.8613281250,13,0.0000000000,,, +0.8632812500,13,0.0000000000,,, +0.8652343750,13,0.0000000000,,, +0.8671875000,13,0.0000000000,,, +0.8691406250,13,0.0000000000,,, +0.8710937500,13,0.0000000000,,, +0.8730468750,13,0.0000000000,,, +0.8750000000,14,0.0000000000,,, +0.8769531250,14,0.0000000000,,, +0.8789062500,14,0.0000000000,,, +0.8808593750,14,0.0000000000,,, +0.8828125000,14,0.0000000000,,, +0.8847656250,14,0.0000000000,,, +0.8867187500,14,0.0000000000,,, +0.8886718750,14,0.0000000000,,, +0.8906250000,14,0.0000000000,,, +0.8925781250,14,0.0000000000,,, +0.8945312500,14,0.0000000000,,, +0.8964843750,14,0.0000000000,,, +0.8984375000,14,0.0000000000,,, +0.9003906250,14,0.0000000000,,, +0.9023437500,14,0.0000000000,,, +0.9042968750,14,0.0000000000,,, +0.9062500000,14,0.0000000000,,, +0.9082031250,14,0.0000000000,,, +0.9101562500,14,0.0000000000,,, +0.9121093750,14,0.0000000000,,, +0.9140625000,14,0.0000000000,,, +0.9160156250,14,0.0000000000,,, +0.9179687500,14,0.0000000000,,, +0.9199218750,14,0.0000000000,,, +0.9218750000,14,0.0000000000,,, +0.9238281250,14,0.0000000000,,, +0.9257812500,14,0.0000000000,,, +0.9277343750,14,0.0000000000,,, +0.9296875000,14,0.0000000000,,, +0.9316406250,14,0.0000000000,,, +0.9335937500,14,0.0000000000,,, +0.9355468750,14,0.0000000000,,, +0.9375000000,15,0.0000000000,,, +0.9394531250,15,0.0000000000,,, +0.9414062500,15,0.0000000000,,, +0.9433593750,15,0.0000000000,,, +0.9453125000,15,0.0000000000,,, +0.9472656250,15,0.0000000000,,, +0.9492187500,15,0.0000000000,,, +0.9511718750,15,0.0000000000,,, +0.9531250000,15,0.0000000000,,, +0.9550781250,15,0.0000000000,,, +0.9570312500,15,0.0000000000,,, +0.9589843750,15,0.0000000000,,, +0.9609375000,15,0.0000000000,,, +0.9628906250,15,0.0000000000,,, +0.9648437500,15,0.0000000000,,, +0.9667968750,15,0.0000000000,,, +0.9687500000,15,0.0000000000,,, +0.9707031250,15,0.0000000000,,, +0.9726562500,15,0.0000000000,,, +0.9746093750,15,0.0000000000,,, +0.9765625000,15,0.0000000000,,, +0.9785156250,15,0.0000000000,,, +0.9804687500,15,0.0000000000,,, +0.9824218750,15,0.0000000000,,, +0.9843750000,15,0.0000000000,,, +0.9863281250,15,0.0000000000,,, +0.9882812500,15,0.0000000000,,, +0.9902343750,15,0.0000000000,,, +0.9921875000,15,0.0000000000,,, +0.9941406250,15,0.0000000000,,, +0.9960937500,15,0.0000000000,,, +0.9980468750,15,0.0000000000,,, +1.0000000000,16,0.0000000000,,, +1.0019531250,16,0.0000000000,,, +1.0039062500,16,0.0000000000,,, +1.0058593750,16,0.0000000000,,, +1.0078125000,16,0.0000000000,,, +1.0097656250,16,0.0000000000,,, +1.0117187500,16,0.0000000000,,, +1.0136718750,16,0.0000000000,,, +1.0156250000,16,0.0000000000,,, +1.0175781250,16,0.0000000000,,, +1.0195312500,16,0.0000000000,,, +1.0214843750,16,0.0000000000,,, +1.0234375000,16,0.0000000000,,, +1.0253906250,16,0.0000000000,,, +1.0273437500,16,0.0000000000,,, +1.0292968750,16,0.0000000000,,, +1.0312500000,16,0.0000000000,,, +1.0332031250,16,0.0000000000,,, +1.0351562500,16,0.0000000000,,, +1.0371093750,16,0.0000000000,,, +1.0390625000,16,0.0000000000,,, +1.0410156250,16,0.0000000000,,, +1.0429687500,16,0.0000000000,,, +1.0449218750,16,0.0000000000,,, +1.0468750000,16,0.0000000000,,, +1.0488281250,16,0.0000000000,,, +1.0507812500,16,0.0000000000,,, +1.0527343750,16,0.0000000000,,, +1.0546875000,16,0.0000000000,,, +1.0566406250,16,0.0000000000,,, +1.0585937500,16,0.0000000000,,, +1.0605468750,16,0.0000000000,,, +1.0625000000,17,0.0000000000,,, +1.0644531250,17,0.0000000000,,, +1.0664062500,17,0.0000000000,,, +1.0683593750,17,0.0000000000,,, +1.0703125000,17,0.0000000000,,, +1.0722656250,17,0.0000000000,,, +1.0742187500,17,0.0000000000,,, +1.0761718750,17,0.0000000000,,, +1.0781250000,17,0.0000000000,,, +1.0800781250,17,0.0000000000,,, +1.0820312500,17,0.0000000000,,, +1.0839843750,17,0.0000000000,,, +1.0859375000,17,0.0000000000,,, +1.0878906250,17,0.0000000000,,, +1.0898437500,17,0.0000000000,,, +1.0917968750,17,0.0000000000,,, +1.0937500000,17,0.0000000000,,, +1.0957031250,17,0.0000000000,,, +1.0976562500,17,0.0000000000,,, +1.0996093750,17,0.0000000000,,, +1.1015625000,17,0.0000000000,,, +1.1035156250,17,0.0000000000,,, +1.1054687500,17,0.0000000000,,, +1.1074218750,17,0.0000000000,,, +1.1093750000,17,0.0000000000,,, +1.1113281250,17,0.0000000000,,, +1.1132812500,17,0.0000000000,,, +1.1152343750,17,0.0000000000,,, +1.1171875000,17,0.0000000000,,, +1.1191406250,17,0.0000000000,,, +1.1210937500,17,0.0000000000,,, +1.1230468750,17,0.0000000000,,, +1.1250000000,18,0.0000000000,,, +1.1269531250,18,0.0000000000,,, +1.1289062500,18,0.0000000000,,, +1.1308593750,18,0.0000000000,,, +1.1328125000,18,0.0000000000,,, +1.1347656250,18,0.0000000000,,, +1.1367187500,18,0.0000000000,,, +1.1386718750,18,0.0000000000,,, +1.1406250000,18,0.0000000000,,, +1.1425781250,18,0.0000000000,,, +1.1445312500,18,0.0000000000,,, +1.1464843750,18,0.0000000000,,, +1.1484375000,18,0.0000000000,,, +1.1503906250,18,0.0000000000,,, +1.1523437500,18,0.0000000000,,, +1.1542968750,18,0.0000000000,,, +1.1562500000,18,0.0000000000,,, +1.1582031250,18,0.0000000000,,, +1.1601562500,18,0.0000000000,,, +1.1621093750,18,0.0000000000,,, +1.1640625000,18,0.0000000000,,, +1.1660156250,18,0.0000000000,,, +1.1679687500,18,0.0000000000,,, +1.1699218750,18,0.0000000000,,, +1.1718750000,18,0.0000000000,,, +1.1738281250,18,0.0000000000,,, +1.1757812500,18,0.0000000000,,, +1.1777343750,18,0.0000000000,,, +1.1796875000,18,0.0000000000,,, +1.1816406250,18,0.0000000000,,, +1.1835937500,18,0.0000000000,,, +1.1855468750,18,0.0000000000,,, +1.1875000000,19,0.0000000000,,, +1.1894531250,19,0.0000000000,,, +1.1914062500,19,0.0000000000,,, +1.1933593750,19,0.0000000000,,, +1.1953125000,19,0.0000000000,,, +1.1972656250,19,0.0000000000,,, +1.1992187500,19,0.0000000000,,, +1.2011718750,19,0.0000000000,,, +1.2031250000,19,0.0000000000,,, +1.2050781250,19,0.0000000000,,, +1.2070312500,19,0.0000000000,,, +1.2089843750,19,0.0000000000,,, +1.2109375000,19,0.0000000000,,, +1.2128906250,19,0.0000000000,,, +1.2148437500,19,0.0000000000,,, +1.2167968750,19,0.0000000000,,, +1.2187500000,19,0.0000000000,,, +1.2207031250,19,0.0000000000,,, +1.2226562500,19,0.0000000000,,, +1.2246093750,19,0.0000000000,,, +1.2265625000,19,0.0000000000,,, +1.2285156250,19,0.0000000000,,, +1.2304687500,19,0.0000000000,,, +1.2324218750,19,0.0000000000,,, +1.2343750000,19,0.0000000000,,, +1.2363281250,19,0.0000000000,,, +1.2382812500,19,0.0000000000,,, +1.2402343750,19,0.0000000000,,, +1.2421875000,19,0.0000000000,,, +1.2441406250,19,0.0000000000,,, +1.2460937500,19,0.0000000000,,, +1.2480468750,19,0.0000000000,,, +1.2500000000,20,0.0000000000,,, +1.2519531250,20,0.0000000000,,, +1.2539062500,20,0.0000000000,,, +1.2558593750,20,0.0000000000,,, +1.2578125000,20,0.0000000000,,, +1.2597656250,20,0.0000000000,,, +1.2617187500,20,0.0000000000,,, +1.2636718750,20,0.0000000000,,, +1.2656250000,20,0.0000000000,,, +1.2675781250,20,0.0000000000,,, +1.2695312500,20,0.0000000000,,, +1.2714843750,20,0.0000000000,,, +1.2734375000,20,0.0000000000,,, +1.2753906250,20,0.0000000000,,, +1.2773437500,20,0.0000000000,,, +1.2792968750,20,0.0000000000,,, +1.2812500000,20,0.0000000000,,, +1.2832031250,20,0.0000000000,,, +1.2851562500,20,0.0000000000,,, +1.2871093750,20,0.0000000000,,, +1.2890625000,20,0.0000000000,,, +1.2910156250,20,0.0000000000,,, +1.2929687500,20,0.0000000000,,, +1.2949218750,20,0.0000000000,,, +1.2968750000,20,0.0000000000,,, +1.2988281250,20,0.0000000000,,, +1.3007812500,20,0.0000000000,,, +1.3027343750,20,0.0000000000,,, +1.3046875000,20,0.0000000000,,, +1.3066406250,20,0.0000000000,,, +1.3085937500,20,0.0000000000,,, +1.3105468750,20,0.0000000000,,, +1.3125000000,21,0.0000000000,,, +1.3144531250,21,0.0000000000,,, +1.3164062500,21,0.0000000000,,, +1.3183593750,21,0.0000000000,,, +1.3203125000,21,0.0000000000,,, +1.3222656250,21,0.0000000000,,, +1.3242187500,21,0.0000000000,,, +1.3261718750,21,0.0000000000,,, +1.3281250000,21,0.0000000000,,, +1.3300781250,21,0.0000000000,,, +1.3320312500,21,0.0000000000,,, +1.3339843750,21,0.0000000000,,, +1.3359375000,21,0.0000000000,,, +1.3378906250,21,0.0000000000,,, +1.3398437500,21,0.0000000000,,, +1.3417968750,21,0.0000000000,,, +1.3437500000,21,0.0000000000,,, +1.3457031250,21,0.0000000000,,, +1.3476562500,21,0.0000000000,,, +1.3496093750,21,0.0000000000,,, +1.3515625000,21,0.0000000000,,, +1.3535156250,21,0.0000000000,,, +1.3554687500,21,0.0000000000,,, +1.3574218750,21,0.0000000000,,, +1.3593750000,21,0.0000000000,,, +1.3613281250,21,0.0000000000,,, +1.3632812500,21,0.0000000000,,, +1.3652343750,21,0.0000000000,,, +1.3671875000,21,0.0000000000,,, +1.3691406250,21,0.0000000000,,, +1.3710937500,21,0.0000000000,,, +1.3730468750,21,0.0000000000,,, +1.3750000000,22,0.0000000000,,, +1.3769531250,22,0.0000000000,,, +1.3789062500,22,0.0000000000,,, +1.3808593750,22,0.0000000000,,, +1.3828125000,22,0.0000000000,,, +1.3847656250,22,0.0000000000,,, +1.3867187500,22,0.0000000000,,, +1.3886718750,22,0.0000000000,,, +1.3906250000,22,0.0000000000,,, +1.3925781250,22,0.0000000000,,, +1.3945312500,22,0.0000000000,,, +1.3964843750,22,0.0000000000,,, +1.3984375000,22,0.0000000000,,, +1.4003906250,22,0.0000000000,,, +1.4023437500,22,0.0000000000,,, +1.4042968750,22,0.0000000000,,, +1.4062500000,22,0.0000000000,,, +1.4082031250,22,0.0000000000,,, +1.4101562500,22,0.0000000000,,, +1.4121093750,22,0.0000000000,,, +1.4140625000,22,0.0000000000,,, +1.4160156250,22,0.0000000000,,, +1.4179687500,22,0.0000000000,,, +1.4199218750,22,0.0000000000,,, +1.4218750000,22,0.0000000000,,, +1.4238281250,22,0.0000000000,,, +1.4257812500,22,0.0000000000,,, +1.4277343750,22,0.0000000000,,, +1.4296875000,22,0.0000000000,,, +1.4316406250,22,0.0000000000,,, +1.4335937500,22,0.0000000000,,, +1.4355468750,22,0.0000000000,,, +1.4375000000,23,0.0000000000,,, +1.4394531250,23,0.0000000000,,, +1.4414062500,23,0.0000000000,,, +1.4433593750,23,0.0000000000,,, +1.4453125000,23,0.0000000000,,, +1.4472656250,23,0.0000000000,,, +1.4492187500,23,0.0000000000,,, +1.4511718750,23,0.0000000000,,, +1.4531250000,23,0.0000000000,,, +1.4550781250,23,0.0000000000,,, +1.4570312500,23,0.0000000000,,, +1.4589843750,23,0.0000000000,,, +1.4609375000,23,0.0000000000,,, +1.4628906250,23,0.0000000000,,, +1.4648437500,23,0.0000000000,,, +1.4667968750,23,0.0000000000,,, +1.4687500000,23,0.0000000000,,, +1.4707031250,23,0.0000000000,,, +1.4726562500,23,0.0000000000,,, +1.4746093750,23,0.0000000000,,, +1.4765625000,23,0.0000000000,,, +1.4785156250,23,0.0000000000,,, +1.4804687500,23,0.0000000000,,, +1.4824218750,23,0.0000000000,,, +1.4843750000,23,0.0000000000,,, +1.4863281250,23,0.0000000000,,, +1.4882812500,23,0.0000000000,,, +1.4902343750,23,0.0000000000,,, +1.4921875000,23,0.0000000000,,, +1.4941406250,23,0.0000000000,,, +1.4960937500,23,0.0000000000,,, +1.4980468750,23,0.0000000000,,, +1.5000000000,24,0.0000000000,,, +1.5019531250,24,0.0000000000,,, +1.5039062500,24,0.0000000000,,, +1.5058593750,24,0.0000000000,,, +1.5078125000,24,0.0000000000,,, +1.5097656250,24,0.0000000000,,, +1.5117187500,24,0.0000000000,,, +1.5136718750,24,0.0000000000,,, +1.5156250000,24,0.0000000000,,, +1.5175781250,24,0.0000000000,,, +1.5195312500,24,0.0000000000,,, +1.5214843750,24,0.0000000000,,, +1.5234375000,24,0.0000000000,,, +1.5253906250,24,0.0000000000,,, +1.5273437500,24,0.0000000000,,, +1.5292968750,24,0.0000000000,,, +1.5312500000,24,0.0000000000,,, +1.5332031250,24,0.0000000000,,, +1.5351562500,24,0.0000000000,,, +1.5371093750,24,0.0000000000,,, +1.5390625000,24,0.0000000000,,, +1.5410156250,24,0.0000000000,,, +1.5429687500,24,0.0000000000,,, +1.5449218750,24,0.0000000000,,, +1.5468750000,24,0.0000000000,,, +1.5488281250,24,0.0000000000,,, +1.5507812500,24,0.0000000000,,, +1.5527343750,24,0.0000000000,,, +1.5546875000,24,0.0000000000,,, +1.5566406250,24,0.0000000000,,, +1.5585937500,24,0.0000000000,,, +1.5605468750,24,0.0000000000,,, +1.5625000000,25,0.0000000000,,, +1.5644531250,25,0.0000000000,,, +1.5664062500,25,0.0000000000,,, +1.5683593750,25,0.0000000000,,, +1.5703125000,25,0.0000000000,,, +1.5722656250,25,0.0000000000,,, +1.5742187500,25,0.0000000000,,, +1.5761718750,25,0.0000000000,,, +1.5781250000,25,0.0000000000,,, +1.5800781250,25,0.0000000000,,, +1.5820312500,25,0.0000000000,,, +1.5839843750,25,0.0000000000,,, +1.5859375000,25,0.0000000000,,, +1.5878906250,25,0.0000000000,,, +1.5898437500,25,0.0000000000,,, +1.5917968750,25,0.0000000000,,, +1.5937500000,25,0.0000000000,,, +1.5957031250,25,0.0000000000,,, +1.5976562500,25,0.0000000000,,, +1.5996093750,25,0.0000000000,,, +1.6015625000,25,0.0000000000,,, +1.6035156250,25,0.0000000000,,, +1.6054687500,25,0.0000000000,,, +1.6074218750,25,0.0000000000,,, +1.6093750000,25,0.0000000000,,, +1.6113281250,25,0.0000000000,,, +1.6132812500,25,0.0000000000,,, +1.6152343750,25,0.0000000000,,, +1.6171875000,25,0.0000000000,,, +1.6191406250,25,0.0000000000,,, +1.6210937500,25,0.0000000000,,, +1.6230468750,25,0.0000000000,,, +1.6250000000,26,0.0000000000,,, +1.6269531250,26,0.0000000000,,, +1.6289062500,26,0.0000000000,,, +1.6308593750,26,0.0000000000,,, +1.6328125000,26,0.0000000000,,, +1.6347656250,26,0.0000000000,,, +1.6367187500,26,0.0000000000,,, +1.6386718750,26,0.0000000000,,, +1.6406250000,26,0.0000000000,,, +1.6425781250,26,0.0000000000,,, +1.6445312500,26,0.0000000000,,, +1.6464843750,26,0.0000000000,,, +1.6484375000,26,0.0000000000,,, +1.6503906250,26,0.0000000000,,, +1.6523437500,26,0.0000000000,,, +1.6542968750,26,0.0000000000,,, +1.6562500000,26,0.0000000000,,, +1.6582031250,26,0.0000000000,,, +1.6601562500,26,0.0000000000,,, +1.6621093750,26,0.0000000000,,, +1.6640625000,26,0.0000000000,,, +1.6660156250,26,0.0000000000,,, +1.6679687500,26,0.0000000000,,, +1.6699218750,26,0.0000000000,,, +1.6718750000,26,0.0000000000,,, +1.6738281250,26,0.0000000000,,, +1.6757812500,26,0.0000000000,,, +1.6777343750,26,0.0000000000,,, +1.6796875000,26,0.0000000000,,, +1.6816406250,26,0.0000000000,,, +1.6835937500,26,0.0000000000,,, +1.6855468750,26,0.0000000000,,, +1.6875000000,27,0.0000000000,,, +1.6894531250,27,0.0000000000,,, +1.6914062500,27,0.0000000000,,, +1.6933593750,27,0.0000000000,,, +1.6953125000,27,0.0000000000,,, +1.6972656250,27,0.0000000000,,, +1.6992187500,27,0.0000000000,,, +1.7011718750,27,0.0000000000,,, +1.7031250000,27,0.0000000000,,, +1.7050781250,27,0.0000000000,,, +1.7070312500,27,0.0000000000,,, +1.7089843750,27,0.0000000000,,, +1.7109375000,27,0.0000000000,,, +1.7128906250,27,0.0000000000,,, +1.7148437500,27,0.0000000000,,, +1.7167968750,27,0.0000000000,,, +1.7187500000,27,0.0000000000,,, +1.7207031250,27,0.0000000000,,, +1.7226562500,27,0.0000000000,,, +1.7246093750,27,0.0000000000,,, +1.7265625000,27,0.0000000000,,, +1.7285156250,27,0.0000000000,,, +1.7304687500,27,0.0000000000,,, +1.7324218750,27,0.0000000000,,, +1.7343750000,27,0.0000000000,,, +1.7363281250,27,0.0000000000,,, +1.7382812500,27,0.0000000000,,, +1.7402343750,27,0.0000000000,,, +1.7421875000,27,0.0000000000,,, +1.7441406250,27,0.0000000000,,, +1.7460937500,27,0.0000000000,,, +1.7480468750,27,0.0000000000,,, +1.7500000000,28,0.0000000000,,, +1.7519531250,28,0.0000000000,,, +1.7539062500,28,0.0000000000,,, +1.7558593750,28,0.0000000000,,, +1.7578125000,28,0.0000000000,,, +1.7597656250,28,0.0000000000,,, +1.7617187500,28,0.0000000000,,, +1.7636718750,28,0.0000000000,,, +1.7656250000,28,0.0000000000,,, +1.7675781250,28,0.0000000000,,, +1.7695312500,28,0.0000000000,,, +1.7714843750,28,0.0000000000,,, +1.7734375000,28,0.0000000000,,, +1.7753906250,28,0.0000000000,,, +1.7773437500,28,0.0000000000,,, +1.7792968750,28,0.0000000000,,, +1.7812500000,28,0.0000000000,,, +1.7832031250,28,0.0000000000,,, +1.7851562500,28,0.0000000000,,, +1.7871093750,28,0.0000000000,,, +1.7890625000,28,0.0000000000,,, +1.7910156250,28,0.0000000000,,, +1.7929687500,28,0.0000000000,,, +1.7949218750,28,0.0000000000,,, +1.7968750000,28,0.0000000000,,, +1.7988281250,28,0.0000000000,,, +1.8007812500,28,0.0000000000,,, +1.8027343750,28,0.0000000000,,, +1.8046875000,28,0.0000000000,,, +1.8066406250,28,0.0000000000,,, +1.8085937500,28,0.0000000000,,, +1.8105468750,28,0.0000000000,,, +1.8125000000,29,0.0000000000,,, +1.8144531250,29,0.0000000000,,, +1.8164062500,29,0.0000000000,,, +1.8183593750,29,0.0000000000,,, +1.8203125000,29,0.0000000000,,, +1.8222656250,29,0.0000000000,,, +1.8242187500,29,0.0000000000,,, +1.8261718750,29,0.0000000000,,, +1.8281250000,29,0.0000000000,,, +1.8300781250,29,0.0000000000,,, +1.8320312500,29,0.0000000000,,, +1.8339843750,29,0.0000000000,,, +1.8359375000,29,0.0000000000,,, +1.8378906250,29,0.0000000000,,, +1.8398437500,29,0.0000000000,,, +1.8417968750,29,0.0000000000,,, +1.8437500000,29,0.0000000000,,, +1.8457031250,29,0.0000000000,,, +1.8476562500,29,0.0000000000,,, +1.8496093750,29,0.0000000000,,, +1.8515625000,29,0.0000000000,,, +1.8535156250,29,0.0000000000,,, +1.8554687500,29,0.0000000000,,, +1.8574218750,29,0.0000000000,,, +1.8593750000,29,0.0000000000,,, +1.8613281250,29,0.0000000000,,, +1.8632812500,29,0.0000000000,,, +1.8652343750,29,0.0000000000,,, +1.8671875000,29,0.0000000000,,, +1.8691406250,29,0.0000000000,,, +1.8710937500,29,0.0000000000,,, +1.8730468750,29,0.0000000000,,, +1.8750000000,30,0.0000000000,,, +1.8769531250,30,0.0000000000,,, +1.8789062500,30,0.0000000000,,, +1.8808593750,30,0.0000000000,,, +1.8828125000,30,0.0000000000,,, +1.8847656250,30,0.0000000000,,, +1.8867187500,30,0.0000000000,,, +1.8886718750,30,0.0000000000,,, +1.8906250000,30,0.0000000000,,, +1.8925781250,30,0.0000000000,,, +1.8945312500,30,0.0000000000,,, +1.8964843750,30,0.0000000000,,, +1.8984375000,30,0.0000000000,,, +1.9003906250,30,0.0000000000,,, +1.9023437500,30,0.0000000000,,, +1.9042968750,30,0.0000000000,,, +1.9062500000,30,0.0000000000,,, +1.9082031250,30,0.0000000000,,, +1.9101562500,30,0.0000000000,,, +1.9121093750,30,0.0000000000,,, +1.9140625000,30,0.0000000000,,, +1.9160156250,30,0.0000000000,,, +1.9179687500,30,0.0000000000,,, +1.9199218750,30,0.0000000000,,, +1.9218750000,30,0.0000000000,,, +1.9238281250,30,0.0000000000,,, +1.9257812500,30,0.0000000000,,, +1.9277343750,30,0.0000000000,,, +1.9296875000,30,0.0000000000,,, +1.9316406250,30,0.0000000000,,, +1.9335937500,30,0.0000000000,,, +1.9355468750,30,0.0000000000,,, +1.9375000000,31,0.0000000000,,, +1.9394531250,31,0.0000000000,,, +1.9414062500,31,0.0000000000,,, +1.9433593750,31,0.0000000000,,, +1.9453125000,31,0.0000000000,,, +1.9472656250,31,0.0000000000,,, +1.9492187500,31,0.0000000000,,, +1.9511718750,31,0.0000000000,,, +1.9531250000,31,0.0000000000,,, +1.9550781250,31,0.0000000000,,, +1.9570312500,31,0.0000000000,,, +1.9589843750,31,0.0000000000,,, +1.9609375000,31,0.0000000000,,, +1.9628906250,31,0.0000000000,,, +1.9648437500,31,0.0000000000,,, +1.9667968750,31,0.0000000000,,, +1.9687500000,31,0.0000000000,,, +1.9707031250,31,0.0000000000,,, +1.9726562500,31,0.0000000000,,, +1.9746093750,31,0.0000000000,,, +1.9765625000,31,0.0000000000,,, +1.9785156250,31,0.0000000000,,, +1.9804687500,31,0.0000000000,,, +1.9824218750,31,0.0000000000,,, +1.9843750000,31,0.0000000000,,, +1.9863281250,31,0.0000000000,,, +1.9882812500,31,0.0000000000,,, +1.9902343750,31,0.0000000000,,, +1.9921875000,31,0.0000000000,,, +1.9941406250,31,0.0000000000,,, +1.9960937500,31,0.0000000000,,, +1.9980468750,31,0.0000000000,,, +2.0000000000,32,0.0000000000,,, +2.0019531250,32,0.0000000000,,, +2.0039062500,32,0.0000000000,,, +2.0058593750,32,0.0000000000,,, +2.0078125000,32,0.0000000000,,, +2.0097656250,32,0.0000000000,,, +2.0117187500,32,0.0000000000,,, +2.0136718750,32,0.0000000000,,, +2.0156250000,32,0.0000000000,,, +2.0175781250,32,0.0000000000,,, +2.0195312500,32,0.0000000000,,, +2.0214843750,32,0.0000000000,,, +2.0234375000,32,0.0000000000,,, +2.0253906250,32,0.0000000000,,, +2.0273437500,32,0.0000000000,,, +2.0292968750,32,0.0000000000,,, +2.0312500000,32,0.0000000000,,, +2.0332031250,32,0.0000000000,,, +2.0351562500,32,0.0000000000,,, +2.0371093750,32,0.0000000000,,, +2.0390625000,32,0.0000000000,,, +2.0410156250,32,0.0000000000,,, +2.0429687500,32,0.0000000000,,, +2.0449218750,32,0.0000000000,,, +2.0468750000,32,0.0000000000,,, +2.0488281250,32,0.0000000000,,, +2.0507812500,32,0.0000000000,,, +2.0527343750,32,0.0000000000,,, +2.0546875000,32,0.0000000000,,, +2.0566406250,32,0.0000000000,,, +2.0585937500,32,0.0000000000,,, +2.0605468750,32,0.0000000000,,, +2.0625000000,33,0.0000000000,,, +2.0644531250,33,0.0000000000,,, +2.0664062500,33,0.0000000000,,, +2.0683593750,33,0.0000000000,,, +2.0703125000,33,0.0000000000,,, +2.0722656250,33,0.0000000000,,, +2.0742187500,33,0.0000000000,,, +2.0761718750,33,0.0000000000,,, +2.0781250000,33,0.0000000000,,, +2.0800781250,33,0.0000000000,,, +2.0820312500,33,0.0000000000,,, +2.0839843750,33,0.0000000000,,, +2.0859375000,33,0.0000000000,,, +2.0878906250,33,0.0000000000,,, +2.0898437500,33,0.0000000000,,, +2.0917968750,33,0.0000000000,,, +2.0937500000,33,0.0000000000,,, +2.0957031250,33,0.0000000000,,, +2.0976562500,33,0.0000000000,,, +2.0996093750,33,0.0000000000,,, +2.1015625000,33,0.0000000000,,, +2.1035156250,33,0.0000000000,,, +2.1054687500,33,0.0000000000,,, +2.1074218750,33,0.0000000000,,, +2.1093750000,33,0.0000000000,,, +2.1113281250,33,0.0000000000,,, +2.1132812500,33,0.0000000000,,, +2.1152343750,33,0.0000000000,,, +2.1171875000,33,0.0000000000,,, +2.1191406250,33,0.0000000000,,, +2.1210937500,33,0.0000000000,,, +2.1230468750,33,0.0000000000,,, +2.1250000000,34,0.0000000000,,, +2.1269531250,34,0.0000000000,,, +2.1289062500,34,0.0000000000,,, +2.1308593750,34,0.0000000000,,, +2.1328125000,34,0.0000000000,,, +2.1347656250,34,0.0000000000,,, +2.1367187500,34,0.0000000000,,, +2.1386718750,34,0.0000000000,,, +2.1406250000,34,0.0000000000,,, +2.1425781250,34,0.0000000000,,, +2.1445312500,34,0.0000000000,,, +2.1464843750,34,0.0000000000,,, +2.1484375000,34,0.0000000000,,, +2.1503906250,34,0.0000000000,,, +2.1523437500,34,0.0000000000,,, +2.1542968750,34,0.0000000000,,, +2.1562500000,34,0.0000000000,,, +2.1582031250,34,0.0000000000,,, +2.1601562500,34,0.0000000000,,, +2.1621093750,34,0.0000000000,,, +2.1640625000,34,0.0000000000,,, +2.1660156250,34,0.0000000000,,, +2.1679687500,34,0.0000000000,,, +2.1699218750,34,0.0000000000,,, +2.1718750000,34,0.0000000000,,, +2.1738281250,34,0.0000000000,,, +2.1757812500,34,0.0000000000,,, +2.1777343750,34,0.0000000000,,, +2.1796875000,34,0.0000000000,,, +2.1816406250,34,0.0000000000,,, +2.1835937500,34,0.0000000000,,, +2.1855468750,34,0.0000000000,,, +2.1875000000,35,0.0000000000,,, +2.1894531250,35,0.0000000000,,, +2.1914062500,35,0.0000000000,,, +2.1933593750,35,0.0000000000,,, +2.1953125000,35,0.0000000000,,, +2.1972656250,35,0.0000000000,,, +2.1992187500,35,0.0000000000,,, +2.2011718750,35,0.0000000000,,, +2.2031250000,35,0.0000000000,,, +2.2050781250,35,0.0000000000,,, +2.2070312500,35,0.0000000000,,, +2.2089843750,35,0.0000000000,,, +2.2109375000,35,0.0000000000,,, +2.2128906250,35,0.0000000000,,, +2.2148437500,35,0.0000000000,,, +2.2167968750,35,0.0000000000,,, +2.2187500000,35,0.0000000000,,, +2.2207031250,35,0.0000000000,,, +2.2226562500,35,0.0000000000,,, +2.2246093750,35,0.0000000000,,, +2.2265625000,35,0.0000000000,,, +2.2285156250,35,0.0000000000,,, +2.2304687500,35,0.0000000000,,, +2.2324218750,35,0.0000000000,,, +2.2343750000,35,0.0000000000,,, +2.2363281250,35,0.0000000000,,, +2.2382812500,35,0.0000000000,,, +2.2402343750,35,0.0000000000,,, +2.2421875000,35,0.0000000000,,, +2.2441406250,35,0.0000000000,,, +2.2460937500,35,0.0000000000,,, +2.2480468750,35,0.0000000000,,, +2.2500000000,36,0.0000000000,,, +2.2519531250,36,0.0000000000,,, +2.2539062500,36,0.0000000000,,, +2.2558593750,36,0.0000000000,,, +2.2578125000,36,0.0000000000,,, +2.2597656250,36,0.0000000000,,, +2.2617187500,36,0.0000000000,,, +2.2636718750,36,0.0000000000,,, +2.2656250000,36,0.0000000000,,, +2.2675781250,36,0.0000000000,,, +2.2695312500,36,0.0000000000,,, +2.2714843750,36,0.0000000000,,, +2.2734375000,36,0.0000000000,,, +2.2753906250,36,0.0000000000,,, +2.2773437500,36,0.0000000000,,, +2.2792968750,36,0.0000000000,,, +2.2812500000,36,0.0000000000,,, +2.2832031250,36,0.0000000000,,, +2.2851562500,36,0.0000000000,,, +2.2871093750,36,0.0000000000,,, +2.2890625000,36,0.0000000000,,, +2.2910156250,36,0.0000000000,,, +2.2929687500,36,0.0000000000,,, +2.2949218750,36,0.0000000000,,, +2.2968750000,36,0.0000000000,,, +2.2988281250,36,0.0000000000,,, +2.3007812500,36,0.0000000000,,, +2.3027343750,36,0.0000000000,,, +2.3046875000,36,0.0000000000,,, +2.3066406250,36,0.0000000000,,, +2.3085937500,36,0.0000000000,,, +2.3105468750,36,0.0000000000,,, +2.3125000000,37,0.0000000000,,, +2.3144531250,37,0.0000000000,,, +2.3164062500,37,0.0000000000,,, +2.3183593750,37,0.0000000000,,, +2.3203125000,37,0.0000000000,,, +2.3222656250,37,0.0000000000,,, +2.3242187500,37,0.0000000000,,, +2.3261718750,37,0.0000000000,,, +2.3281250000,37,0.0000000000,,, +2.3300781250,37,0.0000000000,,, +2.3320312500,37,0.0000000000,,, +2.3339843750,37,0.0000000000,,, +2.3359375000,37,0.0000000000,,, +2.3378906250,37,0.0000000000,,, +2.3398437500,37,0.0000000000,,, +2.3417968750,37,0.0000000000,,, +2.3437500000,37,0.0000000000,,, +2.3457031250,37,0.0000000000,,, +2.3476562500,37,0.0000000000,,, +2.3496093750,37,0.0000000000,,, +2.3515625000,37,0.0000000000,,, +2.3535156250,37,0.0000000000,,, +2.3554687500,37,0.0000000000,,, +2.3574218750,37,0.0000000000,,, +2.3593750000,37,0.0000000000,,, +2.3613281250,37,0.0000000000,,, +2.3632812500,37,0.0000000000,,, +2.3652343750,37,0.0000000000,,, +2.3671875000,37,0.0000000000,,, +2.3691406250,37,0.0000000000,,, +2.3710937500,37,0.0000000000,,, +2.3730468750,37,0.0000000000,,, +2.3750000000,38,0.0000000000,,, +2.3769531250,38,0.0000000000,,, +2.3789062500,38,0.0000000000,,, +2.3808593750,38,0.0000000000,,, +2.3828125000,38,0.0000000000,,, +2.3847656250,38,0.0000000000,,, +2.3867187500,38,0.0000000000,,, +2.3886718750,38,0.0000000000,,, +2.3906250000,38,0.0000000000,,, +2.3925781250,38,0.0000000000,,, +2.3945312500,38,0.0000000000,,, +2.3964843750,38,0.0000000000,,, +2.3984375000,38,0.0000000000,,, +2.4003906250,38,0.0000000000,,, +2.4023437500,38,0.0000000000,,, +2.4042968750,38,0.0000000000,,, +2.4062500000,38,0.0000000000,,, +2.4082031250,38,0.0000000000,,, +2.4101562500,38,0.0000000000,,, +2.4121093750,38,0.0000000000,,, +2.4140625000,38,0.0000000000,,, +2.4160156250,38,0.0000000000,,, +2.4179687500,38,0.0000000000,,, +2.4199218750,38,0.0000000000,,, +2.4218750000,38,0.0000000000,,, +2.4238281250,38,0.0000000000,,, +2.4257812500,38,0.0000000000,,, +2.4277343750,38,0.0000000000,,, +2.4296875000,38,0.0000000000,,, +2.4316406250,38,0.0000000000,,, +2.4335937500,38,0.0000000000,,, +2.4355468750,38,0.0000000000,,, +2.4375000000,39,0.0000000000,,, +2.4394531250,39,0.0000000000,,, +2.4414062500,39,0.0000000000,,, +2.4433593750,39,0.0000000000,,, +2.4453125000,39,0.0000000000,,, +2.4472656250,39,0.0000000000,,, +2.4492187500,39,0.0000000000,,, +2.4511718750,39,0.0000000000,,, +2.4531250000,39,0.0000000000,,, +2.4550781250,39,0.0000000000,,, +2.4570312500,39,0.0000000000,,, +2.4589843750,39,0.0000000000,,, +2.4609375000,39,0.0000000000,,, +2.4628906250,39,0.0000000000,,, +2.4648437500,39,0.0000000000,,, +2.4667968750,39,0.0000000000,,, +2.4687500000,39,0.0000000000,,, +2.4707031250,39,0.0000000000,,, +2.4726562500,39,0.0000000000,,, +2.4746093750,39,0.0000000000,,, +2.4765625000,39,0.0000000000,,, +2.4785156250,39,0.0000000000,,, +2.4804687500,39,0.0000000000,,, +2.4824218750,39,0.0000000000,,, +2.4843750000,39,0.0000000000,,, +2.4863281250,39,0.0000000000,,, +2.4882812500,39,0.0000000000,,, +2.4902343750,39,0.0000000000,,, +2.4921875000,39,0.0000000000,,, +2.4941406250,39,0.0000000000,,, +2.4960937500,39,0.0000000000,,, +2.4980468750,39,0.0000000000,,, +2.5000000000,40,0.0000000000,,, +2.5019531250,40,0.0000000000,,, +2.5039062500,40,0.0000000000,,, +2.5058593750,40,0.0000000000,,, +2.5078125000,40,0.0000000000,,, +2.5097656250,40,0.0000000000,,, +2.5117187500,40,0.0000000000,,, +2.5136718750,40,0.0000000000,,, +2.5156250000,40,0.0000000000,,, +2.5175781250,40,0.0000000000,,, +2.5195312500,40,0.0000000000,,, +2.5214843750,40,0.0000000000,,, +2.5234375000,40,0.0000000000,,, +2.5253906250,40,0.0000000000,,, +2.5273437500,40,0.0000000000,,, +2.5292968750,40,0.0000000000,,, +2.5312500000,40,0.0000000000,,, +2.5332031250,40,0.0000000000,,, +2.5351562500,40,0.0000000000,,, +2.5371093750,40,0.0000000000,,, +2.5390625000,40,0.0000000000,,, +2.5410156250,40,0.0000000000,,, +2.5429687500,40,0.0000000000,,, +2.5449218750,40,0.0000000000,,, +2.5468750000,40,0.0000000000,,, +2.5488281250,40,0.0000000000,,, +2.5507812500,40,0.0000000000,,, +2.5527343750,40,0.0000000000,,, +2.5546875000,40,0.0000000000,,, +2.5566406250,40,0.0000000000,,, +2.5585937500,40,0.0000000000,,, +2.5605468750,40,0.0000000000,,, +2.5625000000,41,0.0000000000,,, +2.5644531250,41,0.0000000000,,, +2.5664062500,41,0.0000000000,,, +2.5683593750,41,0.0000000000,,, +2.5703125000,41,0.0000000000,,, +2.5722656250,41,0.0000000000,,, +2.5742187500,41,0.0000000000,,, +2.5761718750,41,0.0000000000,,, +2.5781250000,41,0.0000000000,,, +2.5800781250,41,0.0000000000,,, +2.5820312500,41,0.0000000000,,, +2.5839843750,41,0.0000000000,,, +2.5859375000,41,0.0000000000,,, +2.5878906250,41,0.0000000000,,, +2.5898437500,41,0.0000000000,,, +2.5917968750,41,0.0000000000,,, +2.5937500000,41,0.0000000000,,, +2.5957031250,41,0.0000000000,,, +2.5976562500,41,0.0000000000,,, +2.5996093750,41,0.0000000000,,, +2.6015625000,41,0.0000000000,,, +2.6035156250,41,0.0000000000,,, +2.6054687500,41,0.0000000000,,, +2.6074218750,41,0.0000000000,,, +2.6093750000,41,0.0000000000,,, +2.6113281250,41,0.0000000000,,, +2.6132812500,41,0.0000000000,,, +2.6152343750,41,0.0000000000,,, +2.6171875000,41,0.0000000000,,, +2.6191406250,41,0.0000000000,,, +2.6210937500,41,0.0000000000,,, +2.6230468750,41,0.0000000000,,, +2.6250000000,42,0.0000000000,,, +2.6269531250,42,0.0000000000,,, +2.6289062500,42,0.0000000000,,, +2.6308593750,42,0.0000000000,,, +2.6328125000,42,0.0000000000,,, +2.6347656250,42,0.0000000000,,, +2.6367187500,42,0.0000000000,,, +2.6386718750,42,0.0000000000,,, +2.6406250000,42,0.0000000000,,, +2.6425781250,42,0.0000000000,,, +2.6445312500,42,0.0000000000,,, +2.6464843750,42,0.0000000000,,, +2.6484375000,42,0.0000000000,,, +2.6503906250,42,0.0000000000,,, +2.6523437500,42,0.0000000000,,, +2.6542968750,42,0.0000000000,,, +2.6562500000,42,0.0000000000,,, +2.6582031250,42,0.0000000000,,, +2.6601562500,42,0.0000000000,,, +2.6621093750,42,0.0000000000,,, +2.6640625000,42,0.0000000000,,, +2.6660156250,42,0.0000000000,,, +2.6679687500,42,0.0000000000,,, +2.6699218750,42,0.0000000000,,, +2.6718750000,42,0.0000000000,,, +2.6738281250,42,0.0000000000,,, +2.6757812500,42,0.0000000000,,, +2.6777343750,42,0.0000000000,,, +2.6796875000,42,0.0000000000,,, +2.6816406250,42,0.0000000000,,, +2.6835937500,42,0.0000000000,,, +2.6855468750,42,0.0000000000,,, +2.6875000000,43,0.0000000000,,, +2.6894531250,43,0.0000000000,,, +2.6914062500,43,0.0000000000,,, +2.6933593750,43,0.0000000000,,, +2.6953125000,43,0.0000000000,,, +2.6972656250,43,0.0000000000,,, +2.6992187500,43,0.0000000000,,, +2.7011718750,43,0.0000000000,,, +2.7031250000,43,0.0000000000,,, +2.7050781250,43,0.0000000000,,, +2.7070312500,43,0.0000000000,,, +2.7089843750,43,0.0000000000,,, +2.7109375000,43,0.0000000000,,, +2.7128906250,43,0.0000000000,,, +2.7148437500,43,0.0000000000,,, +2.7167968750,43,0.0000000000,,, +2.7187500000,43,0.0000000000,,, +2.7207031250,43,0.0000000000,,, +2.7226562500,43,0.0000000000,,, +2.7246093750,43,0.0000000000,,, +2.7265625000,43,0.0000000000,,, +2.7285156250,43,0.0000000000,,, +2.7304687500,43,0.0000000000,,, +2.7324218750,43,0.0000000000,,, +2.7343750000,43,0.0000000000,,, +2.7363281250,43,0.0000000000,,, +2.7382812500,43,0.0000000000,,, +2.7402343750,43,0.0000000000,,, +2.7421875000,43,0.0000000000,,, +2.7441406250,43,0.0000000000,,, +2.7460937500,43,0.0000000000,,, +2.7480468750,43,0.0000000000,,, +2.7500000000,44,0.0000000000,,, +2.7519531250,44,0.0000000000,,, +2.7539062500,44,0.0000000000,,, +2.7558593750,44,0.0000000000,,, +2.7578125000,44,0.0000000000,,, +2.7597656250,44,0.0000000000,,, +2.7617187500,44,0.0000000000,,, +2.7636718750,44,0.0000000000,,, +2.7656250000,44,0.0000000000,,, +2.7675781250,44,0.0000000000,,, +2.7695312500,44,0.0000000000,,, +2.7714843750,44,0.0000000000,,, +2.7734375000,44,0.0000000000,,, +2.7753906250,44,0.0000000000,,, +2.7773437500,44,0.0000000000,,, +2.7792968750,44,0.0000000000,,, +2.7812500000,44,0.0000000000,,, +2.7832031250,44,0.0000000000,,, +2.7851562500,44,0.0000000000,,, +2.7871093750,44,0.0000000000,,, +2.7890625000,44,0.0000000000,,, +2.7910156250,44,0.0000000000,,, +2.7929687500,44,0.0000000000,,, +2.7949218750,44,0.0000000000,,, +2.7968750000,44,0.0000000000,,, +2.7988281250,44,0.0000000000,,, +2.8007812500,44,0.0000000000,,, +2.8027343750,44,0.0000000000,,, +2.8046875000,44,0.0000000000,,, +2.8066406250,44,0.0000000000,,, +2.8085937500,44,0.0000000000,,, +2.8105468750,44,0.0000000000,,, +2.8125000000,45,0.0000000000,,, +2.8144531250,45,0.0000000000,,, +2.8164062500,45,0.0000000000,,, +2.8183593750,45,0.0000000000,,, +2.8203125000,45,0.0000000000,,, +2.8222656250,45,0.0000000000,,, +2.8242187500,45,0.0000000000,,, +2.8261718750,45,0.0000000000,,, +2.8281250000,45,0.0000000000,,, +2.8300781250,45,0.0000000000,,, +2.8320312500,45,0.0000000000,,, +2.8339843750,45,0.0000000000,,, +2.8359375000,45,0.0000000000,,, +2.8378906250,45,0.0000000000,,, +2.8398437500,45,0.0000000000,,, +2.8417968750,45,0.0000000000,,, +2.8437500000,45,0.0000000000,,, +2.8457031250,45,0.0000000000,,, +2.8476562500,45,0.0000000000,,, +2.8496093750,45,0.0000000000,,, +2.8515625000,45,0.0000000000,,, +2.8535156250,45,0.0000000000,,, +2.8554687500,45,0.0000000000,,, +2.8574218750,45,0.0000000000,,, +2.8593750000,45,0.0000000000,,, +2.8613281250,45,0.0000000000,,, +2.8632812500,45,0.0000000000,,, +2.8652343750,45,0.0000000000,,, +2.8671875000,45,0.0000000000,,, +2.8691406250,45,0.0000000000,,, +2.8710937500,45,0.0000000000,,, +2.8730468750,45,0.0000000000,,, +2.8750000000,46,0.0000000000,,, +2.8769531250,46,0.0000000000,,, +2.8789062500,46,0.0000000000,,, +2.8808593750,46,0.0000000000,,, +2.8828125000,46,0.0000000000,,, +2.8847656250,46,0.0000000000,,, +2.8867187500,46,0.0000000000,,, +2.8886718750,46,0.0000000000,,, +2.8906250000,46,0.0000000000,,, +2.8925781250,46,0.0000000000,,, +2.8945312500,46,0.0000000000,,, +2.8964843750,46,0.0000000000,,, +2.8984375000,46,0.0000000000,,, +2.9003906250,46,0.0000000000,,, +2.9023437500,46,0.0000000000,,, +2.9042968750,46,0.0000000000,,, +2.9062500000,46,0.0000000000,,, +2.9082031250,46,0.0000000000,,, +2.9101562500,46,0.0000000000,,, +2.9121093750,46,0.0000000000,,, +2.9140625000,46,0.0000000000,,, +2.9160156250,46,0.0000000000,,, +2.9179687500,46,0.0000000000,,, +2.9199218750,46,0.0000000000,,, +2.9218750000,46,0.0000000000,,, +2.9238281250,46,0.0000000000,,, +2.9257812500,46,0.0000000000,,, +2.9277343750,46,0.0000000000,,, +2.9296875000,46,0.0000000000,,, +2.9316406250,46,0.0000000000,,, +2.9335937500,46,0.0000000000,,, +2.9355468750,46,0.0000000000,,, +2.9375000000,47,0.0000000000,,, +2.9394531250,47,0.0000000000,,, +2.9414062500,47,0.0000000000,,, +2.9433593750,47,0.0000000000,,, +2.9453125000,47,0.0000000000,,, +2.9472656250,47,0.0000000000,,, +2.9492187500,47,0.0000000000,,, +2.9511718750,47,0.0000000000,,, +2.9531250000,47,0.0000000000,,, +2.9550781250,47,0.0000000000,,, +2.9570312500,47,0.0000000000,,, +2.9589843750,47,0.0000000000,,, +2.9609375000,47,0.0000000000,,, +2.9628906250,47,0.0000000000,,, +2.9648437500,47,0.0000000000,,, +2.9667968750,47,0.0000000000,,, +2.9687500000,47,0.0000000000,,, +2.9707031250,47,0.0000000000,,, +2.9726562500,47,0.0000000000,,, +2.9746093750,47,0.0000000000,,, +2.9765625000,47,0.0000000000,,, +2.9785156250,47,0.0000000000,,, +2.9804687500,47,0.0000000000,,, +2.9824218750,47,0.0000000000,,, +2.9843750000,47,0.0000000000,,, +2.9863281250,47,0.0000000000,,, +2.9882812500,47,0.0000000000,,, +2.9902343750,47,0.0000000000,,, +2.9921875000,47,0.0000000000,,, +2.9941406250,47,0.0000000000,,, +2.9960937500,47,0.0000000000,,, +2.9980468750,47,0.0000000000,,, +3.0000000000,48,0.0000000000,,, +3.0019531250,48,0.0000000000,,, +3.0039062500,48,0.0000000000,,, +3.0058593750,48,0.0000000000,,, +3.0078125000,48,0.0000000000,,, +3.0097656250,48,0.0000000000,,, +3.0117187500,48,0.0000000000,,, +3.0136718750,48,0.0000000000,,, +3.0156250000,48,0.0000000000,,, +3.0175781250,48,0.0000000000,,, +3.0195312500,48,0.0000000000,,, +3.0214843750,48,0.0000000000,,, +3.0234375000,48,0.0000000000,,, +3.0253906250,48,0.0000000000,,, +3.0273437500,48,0.0000000000,,, +3.0292968750,48,0.0000000000,,, +3.0312500000,48,0.0000000000,,, +3.0332031250,48,0.0000000000,,, +3.0351562500,48,0.0000000000,,, +3.0371093750,48,0.0000000000,,, +3.0390625000,48,0.0000000000,,, +3.0410156250,48,0.0000000000,,, +3.0429687500,48,0.0000000000,,, +3.0449218750,48,0.0000000000,,, +3.0468750000,48,0.0000000000,,, +3.0488281250,48,0.0000000000,,, +3.0507812500,48,0.0000000000,,, +3.0527343750,48,0.0000000000,,, +3.0546875000,48,0.0000000000,,, +3.0566406250,48,0.0000000000,,, +3.0585937500,48,0.0000000000,,, +3.0605468750,48,0.0000000000,,, +3.0625000000,49,0.0000000000,,, +3.0644531250,49,0.0000000000,,, +3.0664062500,49,0.0000000000,,, +3.0683593750,49,0.0000000000,,, +3.0703125000,49,0.0000000000,,, +3.0722656250,49,0.0000000000,,, +3.0742187500,49,0.0000000000,,, +3.0761718750,49,0.0000000000,,, +3.0781250000,49,0.0000000000,,, +3.0800781250,49,0.0000000000,,, +3.0820312500,49,0.0000000000,,, +3.0839843750,49,0.0000000000,,, +3.0859375000,49,0.0000000000,,, +3.0878906250,49,0.0000000000,,, +3.0898437500,49,0.0000000000,,, +3.0917968750,49,0.0000000000,,, +3.0937500000,49,0.0000000000,,, +3.0957031250,49,0.0000000000,,, +3.0976562500,49,0.0000000000,,, +3.0996093750,49,0.0000000000,,, +3.1015625000,49,0.0000000000,,, +3.1035156250,49,0.0000000000,,, +3.1054687500,49,0.0000000000,,, +3.1074218750,49,0.0000000000,,, +3.1093750000,49,0.0000000000,,, +3.1113281250,49,0.0000000000,,, +3.1132812500,49,0.0000000000,,, +3.1152343750,49,0.0000000000,,, +3.1171875000,49,0.0000000000,,, +3.1191406250,49,0.0000000000,,, +3.1210937500,49,0.0000000000,,, +3.1230468750,49,0.0000000000,,, +3.1250000000,50,0.0000000000,,, +3.1269531250,50,0.0000000000,,, +3.1289062500,50,0.0000000000,,, +3.1308593750,50,0.0000000000,,, +3.1328125000,50,0.0000000000,,, +3.1347656250,50,0.0000000000,,, +3.1367187500,50,0.0000000000,,, +3.1386718750,50,0.0000000000,,, +3.1406250000,50,0.0000000000,,, +3.1425781250,50,0.0000000000,,, +3.1445312500,50,0.0000000000,,, +3.1464843750,50,0.0000000000,,, +3.1484375000,50,0.0000000000,,, +3.1503906250,50,0.0000000000,,, +3.1523437500,50,0.0000000000,,, +3.1542968750,50,0.0000000000,,, +3.1562500000,50,0.0000000000,,, +3.1582031250,50,0.0000000000,,, +3.1601562500,50,0.0000000000,,, +3.1621093750,50,0.0000000000,,, +3.1640625000,50,0.0000000000,,, +3.1660156250,50,0.0000000000,,, +3.1679687500,50,0.0000000000,,, +3.1699218750,50,0.0000000000,,, +3.1718750000,50,0.0000000000,,, +3.1738281250,50,0.0000000000,,, +3.1757812500,50,0.0000000000,,, +3.1777343750,50,0.0000000000,,, +3.1796875000,50,0.0000000000,,, +3.1816406250,50,0.0000000000,,, +3.1835937500,50,0.0000000000,,, +3.1855468750,50,0.0000000000,,, +3.1875000000,51,0.0000000000,,, +3.1894531250,51,0.0000000000,,, +3.1914062500,51,0.0000000000,,, +3.1933593750,51,0.0000000000,,, +3.1953125000,51,0.0000000000,,, +3.1972656250,51,0.0000000000,,, +3.1992187500,51,0.0000000000,,, +3.2011718750,51,0.0000000000,,, +3.2031250000,51,0.0000000000,,, +3.2050781250,51,0.0000000000,,, +3.2070312500,51,0.0000000000,,, +3.2089843750,51,0.0000000000,,, +3.2109375000,51,0.0000000000,,, +3.2128906250,51,0.0000000000,,, +3.2148437500,51,0.0000000000,,, +3.2167968750,51,0.0000000000,,, +3.2187500000,51,0.0000000000,,, +3.2207031250,51,0.0000000000,,, +3.2226562500,51,0.0000000000,,, +3.2246093750,51,0.0000000000,,, +3.2265625000,51,0.0000000000,,, +3.2285156250,51,0.0000000000,,, +3.2304687500,51,0.0000000000,,, +3.2324218750,51,0.0000000000,,, +3.2343750000,51,0.0000000000,,, +3.2363281250,51,0.0000000000,,, +3.2382812500,51,0.0000000000,,, +3.2402343750,51,0.0000000000,,, +3.2421875000,51,0.0000000000,,, +3.2441406250,51,0.0000000000,,, +3.2460937500,51,0.0000000000,,, +3.2480468750,51,0.0000000000,,, +3.2500000000,52,0.0000000000,,, +3.2519531250,52,0.0000000000,,, +3.2539062500,52,0.0000000000,,, +3.2558593750,52,0.0000000000,,, +3.2578125000,52,0.0000000000,,, +3.2597656250,52,0.0000000000,,, +3.2617187500,52,0.0000000000,,, +3.2636718750,52,0.0000000000,,, +3.2656250000,52,0.0000000000,,, +3.2675781250,52,0.0000000000,,, +3.2695312500,52,0.0000000000,,, +3.2714843750,52,0.0000000000,,, +3.2734375000,52,0.0000000000,,, +3.2753906250,52,0.0000000000,,, +3.2773437500,52,0.0000000000,,, +3.2792968750,52,0.0000000000,,, +3.2812500000,52,0.0000000000,,, +3.2832031250,52,0.0000000000,,, +3.2851562500,52,0.0000000000,,, +3.2871093750,52,0.0000000000,,, +3.2890625000,52,0.0000000000,,, +3.2910156250,52,0.0000000000,,, +3.2929687500,52,0.0000000000,,, +3.2949218750,52,0.0000000000,,, +3.2968750000,52,0.0000000000,,, +3.2988281250,52,0.0000000000,,, +3.3007812500,52,0.0000000000,,, +3.3027343750,52,0.0000000000,,, +3.3046875000,52,0.0000000000,,, +3.3066406250,52,0.0000000000,,, +3.3085937500,52,0.0000000000,,, +3.3105468750,52,0.0000000000,,, +3.3125000000,53,0.0000000000,,, +3.3144531250,53,0.0000000000,,, +3.3164062500,53,0.0000000000,,, +3.3183593750,53,0.0000000000,,, +3.3203125000,53,0.0000000000,,, +3.3222656250,53,0.0000000000,,, +3.3242187500,53,0.0000000000,,, +3.3261718750,53,0.0000000000,,, +3.3281250000,53,0.0000000000,,, +3.3300781250,53,0.0000000000,,, +3.3320312500,53,0.0000000000,,, +3.3339843750,53,0.0000000000,,, +3.3359375000,53,0.0000000000,,, +3.3378906250,53,0.0000000000,,, +3.3398437500,53,0.0000000000,,, +3.3417968750,53,0.0000000000,,, +3.3437500000,53,0.0000000000,,, +3.3457031250,53,0.0000000000,,, +3.3476562500,53,0.0000000000,,, +3.3496093750,53,0.0000000000,,, +3.3515625000,53,0.0000000000,,, +3.3535156250,53,0.0000000000,,, +3.3554687500,53,0.0000000000,,, +3.3574218750,53,0.0000000000,,, +3.3593750000,53,0.0000000000,,, +3.3613281250,53,0.0000000000,,, +3.3632812500,53,0.0000000000,,, +3.3652343750,53,0.0000000000,,, +3.3671875000,53,0.0000000000,,, +3.3691406250,53,0.0000000000,,, +3.3710937500,53,0.0000000000,,, +3.3730468750,53,0.0000000000,,, +3.3750000000,54,0.0000000000,,, +3.3769531250,54,0.0000000000,,, +3.3789062500,54,0.0000000000,,, +3.3808593750,54,0.0000000000,,, +3.3828125000,54,0.0000000000,,, +3.3847656250,54,0.0000000000,,, +3.3867187500,54,0.0000000000,,, +3.3886718750,54,0.0000000000,,, +3.3906250000,54,0.0000000000,,, +3.3925781250,54,0.0000000000,,, +3.3945312500,54,0.0000000000,,, +3.3964843750,54,0.0000000000,,, +3.3984375000,54,0.0000000000,,, +3.4003906250,54,0.0000000000,,, +3.4023437500,54,0.0000000000,,, +3.4042968750,54,0.0000000000,,, +3.4062500000,54,0.0000000000,,, +3.4082031250,54,0.0000000000,,, +3.4101562500,54,0.0000000000,,, +3.4121093750,54,0.0000000000,,, +3.4140625000,54,0.0000000000,,, +3.4160156250,54,0.0000000000,,, +3.4179687500,54,0.0000000000,,, +3.4199218750,54,0.0000000000,,, +3.4218750000,54,0.0000000000,,, +3.4238281250,54,0.0000000000,,, +3.4257812500,54,0.0000000000,,, +3.4277343750,54,0.0000000000,,, +3.4296875000,54,0.0000000000,,, +3.4316406250,54,0.0000000000,,, +3.4335937500,54,0.0000000000,,, +3.4355468750,54,0.0000000000,,, +3.4375000000,55,0.0000000000,,, +3.4394531250,55,0.0000000000,,, +3.4414062500,55,0.0000000000,,, +3.4433593750,55,0.0000000000,,, +3.4453125000,55,0.0000000000,,, +3.4472656250,55,0.0000000000,,, +3.4492187500,55,0.0000000000,,, +3.4511718750,55,0.0000000000,,, +3.4531250000,55,0.0000000000,,, +3.4550781250,55,0.0000000000,,, +3.4570312500,55,0.0000000000,,, +3.4589843750,55,0.0000000000,,, +3.4609375000,55,0.0000000000,,, +3.4628906250,55,0.0000000000,,, +3.4648437500,55,0.0000000000,,, +3.4667968750,55,0.0000000000,,, +3.4687500000,55,0.0000000000,,, +3.4707031250,55,0.0000000000,,, +3.4726562500,55,0.0000000000,,, +3.4746093750,55,0.0000000000,,, +3.4765625000,55,0.0000000000,,, +3.4785156250,55,0.0000000000,,, +3.4804687500,55,0.0000000000,,, +3.4824218750,55,0.0000000000,,, +3.4843750000,55,0.0000000000,,, +3.4863281250,55,0.0000000000,,, +3.4882812500,55,0.0000000000,,, +3.4902343750,55,0.0000000000,,, +3.4921875000,55,0.0000000000,,, +3.4941406250,55,0.0000000000,,, +3.4960937500,55,0.0000000000,,, +3.4980468750,55,0.0000000000,,, +3.5000000000,56,0.0000000000,,, +3.5019531250,56,0.0000000000,,, +3.5039062500,56,0.0000000000,,, +3.5058593750,56,0.0000000000,,, +3.5078125000,56,0.0000000000,,, +3.5097656250,56,0.0000000000,,, +3.5117187500,56,0.0000000000,,, +3.5136718750,56,0.0000000000,,, +3.5156250000,56,0.0000000000,,, +3.5175781250,56,0.0000000000,,, +3.5195312500,56,0.0000000000,,, +3.5214843750,56,0.0000000000,,, +3.5234375000,56,0.0000000000,,, +3.5253906250,56,0.0000000000,,, +3.5273437500,56,0.0000000000,,, +3.5292968750,56,0.0000000000,,, +3.5312500000,56,0.0000000000,,, +3.5332031250,56,0.0000000000,,, +3.5351562500,56,0.0000000000,,, +3.5371093750,56,0.0000000000,,, +3.5390625000,56,0.0000000000,,, +3.5410156250,56,0.0000000000,,, +3.5429687500,56,0.0000000000,,, +3.5449218750,56,0.0000000000,,, +3.5468750000,56,0.0000000000,,, +3.5488281250,56,0.0000000000,,, +3.5507812500,56,0.0000000000,,, +3.5527343750,56,0.0000000000,,, +3.5546875000,56,0.0000000000,,, +3.5566406250,56,0.0000000000,,, +3.5585937500,56,0.0000000000,,, +3.5605468750,56,0.0000000000,,, +3.5625000000,57,0.0000000000,,, +3.5644531250,57,0.0000000000,,, +3.5664062500,57,0.0000000000,,, +3.5683593750,57,0.0000000000,,, +3.5703125000,57,0.0000000000,,, +3.5722656250,57,0.0000000000,,, +3.5742187500,57,0.0000000000,,, +3.5761718750,57,0.0000000000,,, +3.5781250000,57,0.0000000000,,, +3.5800781250,57,0.0000000000,,, +3.5820312500,57,0.0000000000,,, +3.5839843750,57,0.0000000000,,, +3.5859375000,57,0.0000000000,,, +3.5878906250,57,0.0000000000,,, +3.5898437500,57,0.0000000000,,, +3.5917968750,57,0.0000000000,,, +3.5937500000,57,0.0000000000,,, +3.5957031250,57,0.0000000000,,, +3.5976562500,57,0.0000000000,,, +3.5996093750,57,0.0000000000,,, +3.6015625000,57,0.0000000000,,, +3.6035156250,57,0.0000000000,,, +3.6054687500,57,0.0000000000,,, +3.6074218750,57,0.0000000000,,, +3.6093750000,57,0.0000000000,,, +3.6113281250,57,0.0000000000,,, +3.6132812500,57,0.0000000000,,, +3.6152343750,57,0.0000000000,,, +3.6171875000,57,0.0000000000,,, +3.6191406250,57,0.0000000000,,, +3.6210937500,57,0.0000000000,,, +3.6230468750,57,0.0000000000,,, +3.6250000000,58,0.0000000000,,, +3.6269531250,58,0.0000000000,,, +3.6289062500,58,0.0000000000,,, +3.6308593750,58,0.0000000000,,, +3.6328125000,58,0.0000000000,,, +3.6347656250,58,0.0000000000,,, +3.6367187500,58,0.0000000000,,, +3.6386718750,58,0.0000000000,,, +3.6406250000,58,0.0000000000,,, +3.6425781250,58,0.0000000000,,, +3.6445312500,58,0.0000000000,,, +3.6464843750,58,0.0000000000,,, +3.6484375000,58,0.0000000000,,, +3.6503906250,58,0.0000000000,,, +3.6523437500,58,0.0000000000,,, +3.6542968750,58,0.0000000000,,, +3.6562500000,58,0.0000000000,,, +3.6582031250,58,0.0000000000,,, +3.6601562500,58,0.0000000000,,, +3.6621093750,58,0.0000000000,,, +3.6640625000,58,0.0000000000,,, +3.6660156250,58,0.0000000000,,, +3.6679687500,58,0.0000000000,,, +3.6699218750,58,0.0000000000,,, +3.6718750000,58,0.0000000000,,, +3.6738281250,58,0.0000000000,,, +3.6757812500,58,0.0000000000,,, +3.6777343750,58,0.0000000000,,, +3.6796875000,58,0.0000000000,,, +3.6816406250,58,0.0000000000,,, +3.6835937500,58,0.0000000000,,, +3.6855468750,58,0.0000000000,,, +3.6875000000,59,0.0000000000,,, +3.6894531250,59,0.0000000000,,, +3.6914062500,59,0.0000000000,,, +3.6933593750,59,0.0000000000,,, +3.6953125000,59,0.0000000000,,, +3.6972656250,59,0.0000000000,,, +3.6992187500,59,0.0000000000,,, +3.7011718750,59,0.0000000000,,, +3.7031250000,59,0.0000000000,,, +3.7050781250,59,0.0000000000,,, +3.7070312500,59,0.0000000000,,, +3.7089843750,59,0.0000000000,,, +3.7109375000,59,0.0000000000,,, +3.7128906250,59,0.0000000000,,, +3.7148437500,59,0.0000000000,,, +3.7167968750,59,0.0000000000,,, +3.7187500000,59,0.0000000000,,, +3.7207031250,59,0.0000000000,,, +3.7226562500,59,0.0000000000,,, +3.7246093750,59,0.0000000000,,, +3.7265625000,59,0.0000000000,,, +3.7285156250,59,0.0000000000,,, +3.7304687500,59,0.0000000000,,, +3.7324218750,59,0.0000000000,,, +3.7343750000,59,0.0000000000,,, +3.7363281250,59,0.0000000000,,, +3.7382812500,59,0.0000000000,,, +3.7402343750,59,0.0000000000,,, +3.7421875000,59,0.0000000000,,, +3.7441406250,59,0.0000000000,,, +3.7460937500,59,0.0000000000,,, +3.7480468750,59,0.0000000000,,, +3.7500000000,60,0.0000000000,,, +3.7519531250,60,0.0000000000,,, +3.7539062500,60,0.0000000000,,, +3.7558593750,60,0.0000000000,,, +3.7578125000,60,0.0000000000,,, +3.7597656250,60,0.0000000000,,, +3.7617187500,60,0.0000000000,,, +3.7636718750,60,0.0000000000,,, +3.7656250000,60,0.0000000000,,, +3.7675781250,60,0.0000000000,,, +3.7695312500,60,0.0000000000,,, +3.7714843750,60,0.0000000000,,, +3.7734375000,60,0.0000000000,,, +3.7753906250,60,0.0000000000,,, +3.7773437500,60,0.0000000000,,, +3.7792968750,60,0.0000000000,,, +3.7812500000,60,0.0000000000,,, +3.7832031250,60,0.0000000000,,, +3.7851562500,60,0.0000000000,,, +3.7871093750,60,0.0000000000,,, +3.7890625000,60,0.0000000000,,, +3.7910156250,60,0.0000000000,,, +3.7929687500,60,0.0000000000,,, +3.7949218750,60,0.0000000000,,, +3.7968750000,60,0.0000000000,,, +3.7988281250,60,0.0000000000,,, +3.8007812500,60,0.0000000000,,, +3.8027343750,60,0.0000000000,,, +3.8046875000,60,0.0000000000,,, +3.8066406250,60,0.0000000000,,, +3.8085937500,60,0.0000000000,,, +3.8105468750,60,0.0000000000,,, +3.8125000000,61,0.0000000000,,, +3.8144531250,61,0.0000000000,,, +3.8164062500,61,0.0000000000,,, +3.8183593750,61,0.0000000000,,, +3.8203125000,61,0.0000000000,,, +3.8222656250,61,0.0000000000,,, +3.8242187500,61,0.0000000000,,, +3.8261718750,61,0.0000000000,,, +3.8281250000,61,0.0000000000,,, +3.8300781250,61,0.0000000000,,, +3.8320312500,61,0.0000000000,,, +3.8339843750,61,0.0000000000,,, +3.8359375000,61,0.0000000000,,, +3.8378906250,61,0.0000000000,,, +3.8398437500,61,0.0000000000,,, +3.8417968750,61,0.0000000000,,, +3.8437500000,61,0.0000000000,,, +3.8457031250,61,0.0000000000,,, +3.8476562500,61,0.0000000000,,, +3.8496093750,61,0.0000000000,,, +3.8515625000,61,0.0000000000,,, +3.8535156250,61,0.0000000000,,, +3.8554687500,61,0.0000000000,,, +3.8574218750,61,0.0000000000,,, +3.8593750000,61,0.0000000000,,, +3.8613281250,61,0.0000000000,,, +3.8632812500,61,0.0000000000,,, +3.8652343750,61,0.0000000000,,, +3.8671875000,61,0.0000000000,,, +3.8691406250,61,0.0000000000,,, +3.8710937500,61,0.0000000000,,, +3.8730468750,61,0.0000000000,,, +3.8750000000,62,0.0000000000,,, +3.8769531250,62,0.0000000000,,, +3.8789062500,62,0.0000000000,,, +3.8808593750,62,0.0000000000,,, +3.8828125000,62,0.0000000000,,, +3.8847656250,62,0.0000000000,,, +3.8867187500,62,0.0000000000,,, +3.8886718750,62,0.0000000000,,, +3.8906250000,62,0.0000000000,,, +3.8925781250,62,0.0000000000,,, +3.8945312500,62,0.0000000000,,, +3.8964843750,62,0.0000000000,,, +3.8984375000,62,0.0000000000,,, +3.9003906250,62,0.0000000000,,, +3.9023437500,62,0.0000000000,,, +3.9042968750,62,0.0000000000,,, +3.9062500000,62,0.0000000000,,, +3.9082031250,62,0.0000000000,,, +3.9101562500,62,0.0000000000,,, +3.9121093750,62,0.0000000000,,, +3.9140625000,62,0.0000000000,,, +3.9160156250,62,0.0000000000,,, +3.9179687500,62,0.0000000000,,, +3.9199218750,62,0.0000000000,,, +3.9218750000,62,0.0000000000,,, +3.9238281250,62,0.0000000000,,, +3.9257812500,62,0.0000000000,,, +3.9277343750,62,0.0000000000,,, +3.9296875000,62,0.0000000000,,, +3.9316406250,62,0.0000000000,,, +3.9335937500,62,0.0000000000,,, +3.9355468750,62,0.0000000000,,, +3.9375000000,63,0.0000000000,,, +3.9394531250,63,0.0000000000,,, +3.9414062500,63,0.0000000000,,, +3.9433593750,63,0.0000000000,,, +3.9453125000,63,0.0000000000,,, +3.9472656250,63,0.0000000000,,, +3.9492187500,63,0.0000000000,,, +3.9511718750,63,0.0000000000,,, +3.9531250000,63,0.0000000000,,, +3.9550781250,63,0.0000000000,,, +3.9570312500,63,0.0000000000,,, +3.9589843750,63,0.0000000000,,, +3.9609375000,63,0.0000000000,,, +3.9628906250,63,0.0000000000,,, +3.9648437500,63,0.0000000000,,, +3.9667968750,63,0.0000000000,,, +3.9687500000,63,0.0000000000,,, +3.9707031250,63,0.0000000000,,, +3.9726562500,63,0.0000000000,,, +3.9746093750,63,0.0000000000,,, +3.9765625000,63,0.0000000000,,, +3.9785156250,63,0.0000000000,,, +3.9804687500,63,0.0000000000,,, +3.9824218750,63,0.0000000000,,, +3.9843750000,63,0.0000000000,,, +3.9863281250,63,0.0000000000,,, +3.9882812500,63,0.0000000000,,, +3.9902343750,63,0.0000000000,,, +3.9921875000,63,0.0000000000,,, +3.9941406250,63,0.0000000000,,, +3.9960937500,63,0.0000000000,,, +3.9980468750,63,0.0000000000,,, +4.0000000000,64,0.0000000000,,, +4.0019531250,64,0.0000000000,,, +4.0039062500,64,0.0000000000,,, +4.0058593750,64,0.0000000000,,, +4.0078125000,64,0.0000000000,,, +4.0097656250,64,0.0000000000,,, +4.0117187500,64,0.0000000000,,, +4.0136718750,64,0.0000000000,,, +4.0156250000,64,0.0000000000,,, +4.0175781250,64,0.0000000000,,, +4.0195312500,64,0.0000000000,,, +4.0214843750,64,0.0000000000,,, +4.0234375000,64,0.0000000000,,, +4.0253906250,64,0.0000000000,,, +4.0273437500,64,0.0000000000,,, +4.0292968750,64,0.0000000000,,, +4.0312500000,64,0.0000000000,,, +4.0332031250,64,0.0000000000,,, +4.0351562500,64,0.0000000000,,, +4.0371093750,64,0.0000000000,,, +4.0390625000,64,0.0000000000,,, +4.0410156250,64,0.0000000000,,, +4.0429687500,64,0.0000000000,,, +4.0449218750,64,0.0000000000,,, +4.0468750000,64,0.0000000000,,, +4.0488281250,64,0.0000000000,,, +4.0507812500,64,0.0000000000,,, +4.0527343750,64,0.0000000000,,, +4.0546875000,64,0.0000000000,,, +4.0566406250,64,0.0000000000,,, +4.0585937500,64,0.0000000000,,, +4.0605468750,64,0.0000000000,,, +4.0625000000,65,0.0000000000,,, +4.0644531250,65,0.0000000000,,, +4.0664062500,65,0.0000000000,,, +4.0683593750,65,0.0000000000,,, +4.0703125000,65,0.0000000000,,, +4.0722656250,65,0.0000000000,,, +4.0742187500,65,0.0000000000,,, +4.0761718750,65,0.0000000000,,, +4.0781250000,65,0.0000000000,,, +4.0800781250,65,0.0000000000,,, +4.0820312500,65,0.0000000000,,, +4.0839843750,65,0.0000000000,,, +4.0859375000,65,0.0000000000,,, +4.0878906250,65,0.0000000000,,, +4.0898437500,65,0.0000000000,,, +4.0917968750,65,0.0000000000,,, +4.0937500000,65,0.0000000000,,, +4.0957031250,65,0.0000000000,,, +4.0976562500,65,0.0000000000,,, +4.0996093750,65,0.0000000000,,, +4.1015625000,65,0.0000000000,,, +4.1035156250,65,0.0000000000,,, +4.1054687500,65,0.0000000000,,, +4.1074218750,65,0.0000000000,,, +4.1093750000,65,0.0000000000,,, +4.1113281250,65,0.0000000000,,, +4.1132812500,65,0.0000000000,,, +4.1152343750,65,0.0000000000,,, +4.1171875000,65,0.0000000000,,, +4.1191406250,65,0.0000000000,,, +4.1210937500,65,0.0000000000,,, +4.1230468750,65,0.0000000000,,, +4.1250000000,66,0.0000000000,,, +4.1269531250,66,0.0000000000,,, +4.1289062500,66,0.0000000000,,, +4.1308593750,66,0.0000000000,,, +4.1328125000,66,0.0000000000,,, +4.1347656250,66,0.0000000000,,, +4.1367187500,66,0.0000000000,,, +4.1386718750,66,0.0000000000,,, +4.1406250000,66,0.0000000000,,, +4.1425781250,66,0.0000000000,,, +4.1445312500,66,0.0000000000,,, +4.1464843750,66,0.0000000000,,, +4.1484375000,66,0.0000000000,,, +4.1503906250,66,0.0000000000,,, +4.1523437500,66,0.0000000000,,, +4.1542968750,66,0.0000000000,,, +4.1562500000,66,0.0000000000,,, +4.1582031250,66,0.0000000000,,, +4.1601562500,66,0.0000000000,,, +4.1621093750,66,0.0000000000,,, +4.1640625000,66,0.0000000000,,, +4.1660156250,66,0.0000000000,,, +4.1679687500,66,0.0000000000,,, +4.1699218750,66,0.0000000000,,, +4.1718750000,66,0.0000000000,,, +4.1738281250,66,0.0000000000,,, +4.1757812500,66,0.0000000000,,, +4.1777343750,66,0.0000000000,,, +4.1796875000,66,0.0000000000,,, +4.1816406250,66,0.0000000000,,, +4.1835937500,66,0.0000000000,,, +4.1855468750,66,0.0000000000,,, +4.1875000000,67,0.0000000000,,, +4.1894531250,67,0.0000000000,,, +4.1914062500,67,0.0000000000,,, +4.1933593750,67,0.0000000000,,, +4.1953125000,67,0.0000000000,,, +4.1972656250,67,0.0000000000,,, +4.1992187500,67,0.0000000000,,, +4.2011718750,67,0.0000000000,,, +4.2031250000,67,0.0000000000,,, +4.2050781250,67,0.0000000000,,, +4.2070312500,67,0.0000000000,,, +4.2089843750,67,0.0000000000,,, +4.2109375000,67,0.0000000000,,, +4.2128906250,67,0.0000000000,,, +4.2148437500,67,0.0000000000,,, +4.2167968750,67,0.0000000000,,, +4.2187500000,67,0.0000000000,,, +4.2207031250,67,0.0000000000,,, +4.2226562500,67,0.0000000000,,, +4.2246093750,67,0.0000000000,,, +4.2265625000,67,0.0000000000,,, +4.2285156250,67,0.0000000000,,, +4.2304687500,67,0.0000000000,,, +4.2324218750,67,0.0000000000,,, +4.2343750000,67,0.0000000000,,, +4.2363281250,67,0.0000000000,,, +4.2382812500,67,0.0000000000,,, +4.2402343750,67,0.0000000000,,, +4.2421875000,67,0.0000000000,,, +4.2441406250,67,0.0000000000,,, +4.2460937500,67,0.0000000000,,, +4.2480468750,67,0.0000000000,,, +4.2500000000,68,0.0000000000,,, +4.2519531250,68,0.0000000000,,, +4.2539062500,68,0.0000000000,,, +4.2558593750,68,0.0000000000,,, +4.2578125000,68,0.0000000000,,, +4.2597656250,68,0.0000000000,,, +4.2617187500,68,0.0000000000,,, +4.2636718750,68,0.0000000000,,, +4.2656250000,68,0.0000000000,,, +4.2675781250,68,0.0000000000,,, +4.2695312500,68,0.0000000000,,, +4.2714843750,68,0.0000000000,,, +4.2734375000,68,0.0000000000,,, +4.2753906250,68,0.0000000000,,, +4.2773437500,68,0.0000000000,,, +4.2792968750,68,0.0000000000,,, +4.2812500000,68,0.0000000000,,, +4.2832031250,68,0.0000000000,,, +4.2851562500,68,0.0000000000,,, +4.2871093750,68,0.0000000000,,, +4.2890625000,68,0.0000000000,,, +4.2910156250,68,0.0000000000,,, +4.2929687500,68,0.0000000000,,, +4.2949218750,68,0.0000000000,,, +4.2968750000,68,0.0000000000,,, +4.2988281250,68,0.0000000000,,, +4.3007812500,68,0.0000000000,,, +4.3027343750,68,0.0000000000,,, +4.3046875000,68,0.0000000000,,, +4.3066406250,68,0.0000000000,,, +4.3085937500,68,0.0000000000,,, +4.3105468750,68,0.0000000000,,, +4.3125000000,69,0.0000000000,,, +4.3144531250,69,0.0000000000,,, +4.3164062500,69,0.0000000000,,, +4.3183593750,69,0.0000000000,,, +4.3203125000,69,0.0000000000,,, +4.3222656250,69,0.0000000000,,, +4.3242187500,69,0.0000000000,,, +4.3261718750,69,0.0000000000,,, +4.3281250000,69,0.0000000000,,, +4.3300781250,69,0.0000000000,,, +4.3320312500,69,0.0000000000,,, +4.3339843750,69,0.0000000000,,, +4.3359375000,69,0.0000000000,,, +4.3378906250,69,0.0000000000,,, +4.3398437500,69,0.0000000000,,, +4.3417968750,69,0.0000000000,,, +4.3437500000,69,0.0000000000,,, +4.3457031250,69,0.0000000000,,, +4.3476562500,69,0.0000000000,,, +4.3496093750,69,0.0000000000,,, +4.3515625000,69,0.0000000000,,, +4.3535156250,69,0.0000000000,,, +4.3554687500,69,0.0000000000,,, +4.3574218750,69,0.0000000000,,, +4.3593750000,69,0.0000000000,,, +4.3613281250,69,0.0000000000,,, +4.3632812500,69,0.0000000000,,, +4.3652343750,69,0.0000000000,,, +4.3671875000,69,0.0000000000,,, +4.3691406250,69,0.0000000000,,, +4.3710937500,69,0.0000000000,,, +4.3730468750,69,0.0000000000,,, +4.3750000000,70,0.0000000000,,, +4.3769531250,70,0.0000000000,,, +4.3789062500,70,0.0000000000,,, +4.3808593750,70,0.0000000000,,, +4.3828125000,70,0.0000000000,,, +4.3847656250,70,0.0000000000,,, +4.3867187500,70,0.0000000000,,, +4.3886718750,70,0.0000000000,,, +4.3906250000,70,0.0000000000,,, +4.3925781250,70,0.0000000000,,, +4.3945312500,70,0.0000000000,,, +4.3964843750,70,0.0000000000,,, +4.3984375000,70,0.0000000000,,, +4.4003906250,70,0.0000000000,,, +4.4023437500,70,0.0000000000,,, +4.4042968750,70,0.0000000000,,, +4.4062500000,70,0.0000000000,,, +4.4082031250,70,0.0000000000,,, +4.4101562500,70,0.0000000000,,, +4.4121093750,70,0.0000000000,,, +4.4140625000,70,0.0000000000,,, +4.4160156250,70,0.0000000000,,, +4.4179687500,70,0.0000000000,,, +4.4199218750,70,0.0000000000,,, +4.4218750000,70,0.0000000000,,, +4.4238281250,70,0.0000000000,,, +4.4257812500,70,0.0000000000,,, +4.4277343750,70,0.0000000000,,, +4.4296875000,70,0.0000000000,,, +4.4316406250,70,0.0000000000,,, +4.4335937500,70,0.0000000000,,, +4.4355468750,70,0.0000000000,,, +4.4375000000,71,0.0000000000,,, +4.4394531250,71,0.0000000000,,, +4.4414062500,71,0.0000000000,,, +4.4433593750,71,0.0000000000,,, +4.4453125000,71,0.0000000000,,, +4.4472656250,71,0.0000000000,,, +4.4492187500,71,0.0000000000,,, +4.4511718750,71,0.0000000000,,, +4.4531250000,71,0.0000000000,,, +4.4550781250,71,0.0000000000,,, +4.4570312500,71,0.0000000000,,, +4.4589843750,71,0.0000000000,,, +4.4609375000,71,0.0000000000,,, +4.4628906250,71,0.0000000000,,, +4.4648437500,71,0.0000000000,,, +4.4667968750,71,0.0000000000,,, +4.4687500000,71,0.0000000000,,, +4.4707031250,71,0.0000000000,,, +4.4726562500,71,0.0000000000,,, +4.4746093750,71,0.0000000000,,, +4.4765625000,71,0.0000000000,,, +4.4785156250,71,0.0000000000,,, +4.4804687500,71,0.0000000000,,, +4.4824218750,71,0.0000000000,,, +4.4843750000,71,0.0000000000,,, +4.4863281250,71,0.0000000000,,, +4.4882812500,71,0.0000000000,,, +4.4902343750,71,0.0000000000,,, +4.4921875000,71,0.0000000000,,, +4.4941406250,71,0.0000000000,,, +4.4960937500,71,0.0000000000,,, +4.4980468750,71,0.0000000000,,, +4.5000000000,72,0.0000000000,,, +4.5019531250,72,0.0000000000,,, +4.5039062500,72,0.0000000000,,, +4.5058593750,72,0.0000000000,,, +4.5078125000,72,0.0000000000,,, +4.5097656250,72,0.0000000000,,, +4.5117187500,72,0.0000000000,,, +4.5136718750,72,0.0000000000,,, +4.5156250000,72,0.0000000000,,, +4.5175781250,72,0.0000000000,,, +4.5195312500,72,0.0000000000,,, +4.5214843750,72,0.0000000000,,, +4.5234375000,72,0.0000000000,,, +4.5253906250,72,0.0000000000,,, +4.5273437500,72,0.0000000000,,, +4.5292968750,72,0.0000000000,,, +4.5312500000,72,0.0000000000,,, +4.5332031250,72,0.0000000000,,, +4.5351562500,72,0.0000000000,,, +4.5371093750,72,0.0000000000,,, +4.5390625000,72,0.0000000000,,, +4.5410156250,72,0.0000000000,,, +4.5429687500,72,0.0000000000,,, +4.5449218750,72,0.0000000000,,, +4.5468750000,72,0.0000000000,,, +4.5488281250,72,0.0000000000,,, +4.5507812500,72,0.0000000000,,, +4.5527343750,72,0.0000000000,,, +4.5546875000,72,0.0000000000,,, +4.5566406250,72,0.0000000000,,, +4.5585937500,72,0.0000000000,,, +4.5605468750,72,0.0000000000,,, +4.5625000000,73,0.0000000000,,, +4.5644531250,73,0.0000000000,,, +4.5664062500,73,0.0000000000,,, +4.5683593750,73,0.0000000000,,, +4.5703125000,73,0.0000000000,,, +4.5722656250,73,0.0000000000,,, +4.5742187500,73,0.0000000000,,, +4.5761718750,73,0.0000000000,,, +4.5781250000,73,0.0000000000,,, +4.5800781250,73,0.0000000000,,, +4.5820312500,73,0.0000000000,,, +4.5839843750,73,0.0000000000,,, +4.5859375000,73,0.0000000000,,, +4.5878906250,73,0.0000000000,,, +4.5898437500,73,0.0000000000,,, +4.5917968750,73,0.0000000000,,, +4.5937500000,73,0.0000000000,,, +4.5957031250,73,0.0000000000,,, +4.5976562500,73,0.0000000000,,, +4.5996093750,73,0.0000000000,,, +4.6015625000,73,0.0000000000,,, +4.6035156250,73,0.0000000000,,, +4.6054687500,73,0.0000000000,,, +4.6074218750,73,0.0000000000,,, +4.6093750000,73,0.0000000000,,, +4.6113281250,73,0.0000000000,,, +4.6132812500,73,0.0000000000,,, +4.6152343750,73,0.0000000000,,, +4.6171875000,73,0.0000000000,,, +4.6191406250,73,0.0000000000,,, +4.6210937500,73,0.0000000000,,, +4.6230468750,73,0.0000000000,,, +4.6250000000,74,0.0000000000,,, +4.6269531250,74,0.0000000000,,, +4.6289062500,74,0.0000000000,,, +4.6308593750,74,0.0000000000,,, +4.6328125000,74,0.0000000000,,, +4.6347656250,74,0.0000000000,,, +4.6367187500,74,0.0000000000,,, +4.6386718750,74,0.0000000000,,, +4.6406250000,74,0.0000000000,,, +4.6425781250,74,0.0000000000,,, +4.6445312500,74,0.0000000000,,, +4.6464843750,74,0.0000000000,,, +4.6484375000,74,0.0000000000,,, +4.6503906250,74,0.0000000000,,, +4.6523437500,74,0.0000000000,,, +4.6542968750,74,0.0000000000,,, +4.6562500000,74,0.0000000000,,, +4.6582031250,74,0.0000000000,,, +4.6601562500,74,0.0000000000,,, +4.6621093750,74,0.0000000000,,, +4.6640625000,74,0.0000000000,,, +4.6660156250,74,0.0000000000,,, +4.6679687500,74,0.0000000000,,, +4.6699218750,74,0.0000000000,,, +4.6718750000,74,0.0000000000,,, +4.6738281250,74,0.0000000000,,, +4.6757812500,74,0.0000000000,,, +4.6777343750,74,0.0000000000,,, +4.6796875000,74,0.0000000000,,, +4.6816406250,74,0.0000000000,,, +4.6835937500,74,0.0000000000,,, +4.6855468750,74,0.0000000000,,, +4.6875000000,75,0.0000000000,,, +4.6894531250,75,0.0000000000,,, +4.6914062500,75,0.0000000000,,, +4.6933593750,75,0.0000000000,,, +4.6953125000,75,0.0000000000,,, +4.6972656250,75,0.0000000000,,, +4.6992187500,75,0.0000000000,,, +4.7011718750,75,0.0000000000,,, +4.7031250000,75,0.0000000000,,, +4.7050781250,75,0.0000000000,,, +4.7070312500,75,0.0000000000,,, +4.7089843750,75,0.0000000000,,, +4.7109375000,75,0.0000000000,,, +4.7128906250,75,0.0000000000,,, +4.7148437500,75,0.0000000000,,, +4.7167968750,75,0.0000000000,,, +4.7187500000,75,0.0000000000,,, +4.7207031250,75,0.0000000000,,, +4.7226562500,75,0.0000000000,,, +4.7246093750,75,0.0000000000,,, +4.7265625000,75,0.0000000000,,, +4.7285156250,75,0.0000000000,,, +4.7304687500,75,0.0000000000,,, +4.7324218750,75,0.0000000000,,, +4.7343750000,75,0.0000000000,,, +4.7363281250,75,0.0000000000,,, +4.7382812500,75,0.0000000000,,, +4.7402343750,75,0.0000000000,,, +4.7421875000,75,0.0000000000,,, +4.7441406250,75,0.0000000000,,, +4.7460937500,75,0.0000000000,,, +4.7480468750,75,0.0000000000,,, +4.7500000000,76,0.0000000000,,, +4.7519531250,76,0.0000000000,,, +4.7539062500,76,0.0000000000,,, +4.7558593750,76,0.0000000000,,, +4.7578125000,76,0.0000000000,,, +4.7597656250,76,0.0000000000,,, +4.7617187500,76,0.0000000000,,, +4.7636718750,76,0.0000000000,,, +4.7656250000,76,0.0000000000,,, +4.7675781250,76,0.0000000000,,, +4.7695312500,76,0.0000000000,,, +4.7714843750,76,0.0000000000,,, +4.7734375000,76,0.0000000000,,, +4.7753906250,76,0.0000000000,,, +4.7773437500,76,0.0000000000,,, +4.7792968750,76,0.0000000000,,, +4.7812500000,76,0.0000000000,,, +4.7832031250,76,0.0000000000,,, +4.7851562500,76,0.0000000000,,, +4.7871093750,76,0.0000000000,,, +4.7890625000,76,0.0000000000,,, +4.7910156250,76,0.0000000000,,, +4.7929687500,76,0.0000000000,,, +4.7949218750,76,0.0000000000,,, +4.7968750000,76,0.0000000000,,, +4.7988281250,76,0.0000000000,,, +4.8007812500,76,0.0000000000,,, +4.8027343750,76,0.0000000000,,, +4.8046875000,76,0.0000000000,,, +4.8066406250,76,0.0000000000,,, +4.8085937500,76,0.0000000000,,, +4.8105468750,76,0.0000000000,,, +4.8125000000,77,0.0000000000,,, +4.8144531250,77,0.0000000000,,, +4.8164062500,77,0.0000000000,,, +4.8183593750,77,0.0000000000,,, +4.8203125000,77,0.0000000000,,, +4.8222656250,77,0.0000000000,,, +4.8242187500,77,0.0000000000,,, +4.8261718750,77,0.0000000000,,, +4.8281250000,77,0.0000000000,,, +4.8300781250,77,0.0000000000,,, +4.8320312500,77,0.0000000000,,, +4.8339843750,77,0.0000000000,,, +4.8359375000,77,0.0000000000,,, +4.8378906250,77,0.0000000000,,, +4.8398437500,77,0.0000000000,,, +4.8417968750,77,0.0000000000,,, +4.8437500000,77,0.0000000000,,, +4.8457031250,77,0.0000000000,,, +4.8476562500,77,0.0000000000,,, +4.8496093750,77,0.0000000000,,, +4.8515625000,77,0.0000000000,,, +4.8535156250,77,0.0000000000,,, +4.8554687500,77,0.0000000000,,, +4.8574218750,77,0.0000000000,,, +4.8593750000,77,0.0000000000,,, +4.8613281250,77,0.0000000000,,, +4.8632812500,77,0.0000000000,,, +4.8652343750,77,0.0000000000,,, +4.8671875000,77,0.0000000000,,, +4.8691406250,77,0.0000000000,,, +4.8710937500,77,0.0000000000,,, +4.8730468750,77,0.0000000000,,, +4.8750000000,78,0.0000000000,,, +4.8769531250,78,0.0000000000,,, +4.8789062500,78,0.0000000000,,, +4.8808593750,78,0.0000000000,,, +4.8828125000,78,0.0000000000,,, +4.8847656250,78,0.0000000000,,, +4.8867187500,78,0.0000000000,,, +4.8886718750,78,0.0000000000,,, +4.8906250000,78,0.0000000000,,, +4.8925781250,78,0.0000000000,,, +4.8945312500,78,0.0000000000,,, +4.8964843750,78,0.0000000000,,, +4.8984375000,78,0.0000000000,,, +4.9003906250,78,0.0000000000,,, +4.9023437500,78,0.0000000000,,, +4.9042968750,78,0.0000000000,,, +4.9062500000,78,0.0000000000,,, +4.9082031250,78,0.0000000000,,, +4.9101562500,78,0.0000000000,,, +4.9121093750,78,0.0000000000,,, +4.9140625000,78,0.0000000000,,, +4.9160156250,78,0.0000000000,,, +4.9179687500,78,0.0000000000,,, +4.9199218750,78,0.0000000000,,, +4.9218750000,78,0.0000000000,,, +4.9238281250,78,0.0000000000,,, +4.9257812500,78,0.0000000000,,, +4.9277343750,78,0.0000000000,,, +4.9296875000,78,0.0000000000,,, +4.9316406250,78,0.0000000000,,, +4.9335937500,78,0.0000000000,,, +4.9355468750,78,0.0000000000,,, +4.9375000000,79,0.0000000000,,, +4.9394531250,79,0.0000000000,,, +4.9414062500,79,0.0000000000,,, +4.9433593750,79,0.0000000000,,, +4.9453125000,79,0.0000000000,,, +4.9472656250,79,0.0000000000,,, +4.9492187500,79,0.0000000000,,, +4.9511718750,79,0.0000000000,,, +4.9531250000,79,0.0000000000,,, +4.9550781250,79,0.0000000000,,, +4.9570312500,79,0.0000000000,,, +4.9589843750,79,0.0000000000,,, +4.9609375000,79,0.0000000000,,, +4.9628906250,79,0.0000000000,,, +4.9648437500,79,0.0000000000,,, +4.9667968750,79,0.0000000000,,, +4.9687500000,79,0.0000000000,,, +4.9707031250,79,0.0000000000,,, +4.9726562500,79,0.0000000000,,, +4.9746093750,79,0.0000000000,,, +4.9765625000,79,0.0000000000,,, +4.9785156250,79,0.0000000000,,, +4.9804687500,79,0.0000000000,,, +4.9824218750,79,0.0000000000,,, +4.9843750000,79,0.0000000000,,, +4.9863281250,79,0.0000000000,,, +4.9882812500,79,0.0000000000,,, +4.9902343750,79,0.0000000000,,, +4.9921875000,79,0.0000000000,,, +4.9941406250,79,0.0000000000,,, +4.9960937500,79,0.0000000000,,, +4.9980468750,79,0.0000000000,,, +5.0000000000,80,0.0000000000,,, +5.0019531250,80,0.0000000000,,, +5.0039062500,80,0.0000000000,,, +5.0058593750,80,0.0000000000,,, +5.0078125000,80,0.0000000000,,, +5.0097656250,80,0.0000000000,,, +5.0117187500,80,0.0000000000,,, +5.0136718750,80,0.0000000000,,, +5.0156250000,80,0.0000000000,,, +5.0175781250,80,0.0000000000,,, +5.0195312500,80,0.0000000000,,, +5.0214843750,80,0.0000000000,,, +5.0234375000,80,0.0000000000,,, +5.0253906250,80,0.0000000000,,, +5.0273437500,80,0.0000000000,,, +5.0292968750,80,0.0000000000,,, +5.0312500000,80,0.0000000000,,, +5.0332031250,80,0.0000000000,,, +5.0351562500,80,0.0000000000,,, +5.0371093750,80,0.0000000000,,, +5.0390625000,80,0.0000000000,,, +5.0410156250,80,0.0000000000,,, +5.0429687500,80,0.0000000000,,, +5.0449218750,80,0.0000000000,,, +5.0468750000,80,0.0000000000,,, +5.0488281250,80,0.0000000000,,, +5.0507812500,80,0.0000000000,,, +5.0527343750,80,0.0000000000,,, +5.0546875000,80,0.0000000000,,, +5.0566406250,80,0.0000000000,,, +5.0585937500,80,0.0000000000,,, +5.0605468750,80,0.0000000000,,, +5.0625000000,81,0.0000000000,,, +5.0644531250,81,0.0000000000,,, +5.0664062500,81,0.0000000000,,, +5.0683593750,81,0.0000000000,,, +5.0703125000,81,0.0000000000,,, +5.0722656250,81,0.0000000000,,, +5.0742187500,81,0.0000000000,,, +5.0761718750,81,0.0000000000,,, +5.0781250000,81,0.0000000000,,, +5.0800781250,81,0.0000000000,,, +5.0820312500,81,0.0000000000,,, +5.0839843750,81,0.0000000000,,, +5.0859375000,81,0.0000000000,,, +5.0878906250,81,0.0000000000,,, +5.0898437500,81,0.0000000000,,, +5.0917968750,81,0.0000000000,,, +5.0937500000,81,0.0000000000,,, +5.0957031250,81,0.0000000000,,, +5.0976562500,81,0.0000000000,,, +5.0996093750,81,0.0000000000,,, +5.1015625000,81,0.0000000000,,, +5.1035156250,81,0.0000000000,,, +5.1054687500,81,0.0000000000,,, +5.1074218750,81,0.0000000000,,, +5.1093750000,81,0.0000000000,,, +5.1113281250,81,0.0000000000,,, +5.1132812500,81,0.0000000000,,, +5.1152343750,81,0.0000000000,,, +5.1171875000,81,0.0000000000,,, +5.1191406250,81,0.0000000000,,, +5.1210937500,81,0.0000000000,,, +5.1230468750,81,0.0000000000,,, +5.1250000000,82,0.0000000000,,, +5.1269531250,82,0.0000000000,,, +5.1289062500,82,0.0000000000,,, +5.1308593750,82,0.0000000000,,, +5.1328125000,82,0.0000000000,,, +5.1347656250,82,0.0000000000,,, +5.1367187500,82,0.0000000000,,, +5.1386718750,82,0.0000000000,,, +5.1406250000,82,0.0000000000,,, +5.1425781250,82,0.0000000000,,, +5.1445312500,82,0.0000000000,,, +5.1464843750,82,0.0000000000,,, +5.1484375000,82,0.0000000000,,, +5.1503906250,82,0.0000000000,,, +5.1523437500,82,0.0000000000,,, +5.1542968750,82,0.0000000000,,, +5.1562500000,82,0.0000000000,,, +5.1582031250,82,0.0000000000,,, +5.1601562500,82,0.0000000000,,, +5.1621093750,82,0.0000000000,,, +5.1640625000,82,0.0000000000,,, +5.1660156250,82,0.0000000000,,, +5.1679687500,82,0.0000000000,,, +5.1699218750,82,0.0000000000,,, +5.1718750000,82,0.0000000000,,, +5.1738281250,82,0.0000000000,,, +5.1757812500,82,0.0000000000,,, +5.1777343750,82,0.0000000000,,, +5.1796875000,82,0.0000000000,,, +5.1816406250,82,0.0000000000,,, +5.1835937500,82,0.0000000000,,, +5.1855468750,82,0.0000000000,,, +5.1875000000,83,0.0000000000,,, +5.1894531250,83,0.0000000000,,, +5.1914062500,83,0.0000000000,,, +5.1933593750,83,0.0000000000,,, +5.1953125000,83,0.0000000000,,, +5.1972656250,83,0.0000000000,,, +5.1992187500,83,0.0000000000,,, +5.2011718750,83,0.0000000000,,, +5.2031250000,83,0.0000000000,,, +5.2050781250,83,0.0000000000,,, +5.2070312500,83,0.0000000000,,, +5.2089843750,83,0.0000000000,,, +5.2109375000,83,0.0000000000,,, +5.2128906250,83,0.0000000000,,, +5.2148437500,83,0.0000000000,,, +5.2167968750,83,0.0000000000,,, +5.2187500000,83,0.0000000000,,, +5.2207031250,83,0.0000000000,,, +5.2226562500,83,0.0000000000,,, +5.2246093750,83,0.0000000000,,, +5.2265625000,83,0.0000000000,,, +5.2285156250,83,0.0000000000,,, +5.2304687500,83,0.0000000000,,, +5.2324218750,83,0.0000000000,,, +5.2343750000,83,0.0000000000,,, +5.2363281250,83,0.0000000000,,, +5.2382812500,83,0.0000000000,,, +5.2402343750,83,0.0000000000,,, +5.2421875000,83,0.0000000000,,, +5.2441406250,83,0.0000000000,,, +5.2460937500,83,0.0000000000,,, +5.2480468750,83,0.0000000000,,, +5.2500000000,84,0.0000000000,,, +5.2519531250,84,0.0000000000,,, +5.2539062500,84,0.0000000000,,, +5.2558593750,84,0.0000000000,,, +5.2578125000,84,0.0000000000,,, +5.2597656250,84,0.0000000000,,, +5.2617187500,84,0.0000000000,,, +5.2636718750,84,0.0000000000,,, +5.2656250000,84,0.0000000000,,, +5.2675781250,84,0.0000000000,,, +5.2695312500,84,0.0000000000,,, +5.2714843750,84,0.0000000000,,, +5.2734375000,84,0.0000000000,,, +5.2753906250,84,0.0000000000,,, +5.2773437500,84,0.0000000000,,, +5.2792968750,84,0.0000000000,,, +5.2812500000,84,0.0000000000,,, +5.2832031250,84,0.0000000000,,, +5.2851562500,84,0.0000000000,,, +5.2871093750,84,0.0000000000,,, +5.2890625000,84,0.0000000000,,, +5.2910156250,84,0.0000000000,,, +5.2929687500,84,0.0000000000,,, +5.2949218750,84,0.0000000000,,, +5.2968750000,84,0.0000000000,,, +5.2988281250,84,0.0000000000,,, +5.3007812500,84,0.0000000000,,, +5.3027343750,84,0.0000000000,,, +5.3046875000,84,0.0000000000,,, +5.3066406250,84,0.0000000000,,, +5.3085937500,84,0.0000000000,,, +5.3105468750,84,0.0000000000,,, +5.3125000000,85,0.0000000000,,, +5.3144531250,85,0.0000000000,,, +5.3164062500,85,0.0000000000,,, +5.3183593750,85,0.0000000000,,, +5.3203125000,85,0.0000000000,,, +5.3222656250,85,0.0000000000,,, +5.3242187500,85,0.0000000000,,, +5.3261718750,85,0.0000000000,,, +5.3281250000,85,0.0000000000,,, +5.3300781250,85,0.0000000000,,, +5.3320312500,85,0.0000000000,,, +5.3339843750,85,0.0000000000,,, +5.3359375000,85,0.0000000000,,, +5.3378906250,85,0.0000000000,,, +5.3398437500,85,0.0000000000,,, +5.3417968750,85,0.0000000000,,, +5.3437500000,85,0.0000000000,,, +5.3457031250,85,0.0000000000,,, +5.3476562500,85,0.0000000000,,, +5.3496093750,85,0.0000000000,,, +5.3515625000,85,0.0000000000,,, +5.3535156250,85,0.0000000000,,, +5.3554687500,85,0.0000000000,,, +5.3574218750,85,0.0000000000,,, +5.3593750000,85,0.0000000000,,, +5.3613281250,85,0.0000000000,,, +5.3632812500,85,0.0000000000,,, +5.3652343750,85,0.0000000000,,, +5.3671875000,85,0.0000000000,,, +5.3691406250,85,0.0000000000,,, +5.3710937500,85,0.0000000000,,, +5.3730468750,85,0.0000000000,,, +5.3750000000,86,0.0000000000,,, +5.3769531250,86,0.0000000000,,, +5.3789062500,86,0.0000000000,,, +5.3808593750,86,0.0000000000,,, +5.3828125000,86,0.0000000000,,, +5.3847656250,86,0.0000000000,,, +5.3867187500,86,0.0000000000,,, +5.3886718750,86,0.0000000000,,, +5.3906250000,86,0.0000000000,,, +5.3925781250,86,0.0000000000,,, +5.3945312500,86,0.0000000000,,, +5.3964843750,86,0.0000000000,,, +5.3984375000,86,0.0000000000,,, +5.4003906250,86,0.0000000000,,, +5.4023437500,86,0.0000000000,,, +5.4042968750,86,0.0000000000,,, +5.4062500000,86,0.0000000000,,, +5.4082031250,86,0.0000000000,,, +5.4101562500,86,0.0000000000,,, +5.4121093750,86,0.0000000000,,, +5.4140625000,86,0.0000000000,,, +5.4160156250,86,0.0000000000,,, +5.4179687500,86,0.0000000000,,, +5.4199218750,86,0.0000000000,,, +5.4218750000,86,0.0000000000,,, +5.4238281250,86,0.0000000000,,, +5.4257812500,86,0.0000000000,,, +5.4277343750,86,0.0000000000,,, +5.4296875000,86,0.0000000000,,, +5.4316406250,86,0.0000000000,,, +5.4335937500,86,0.0000000000,,, +5.4355468750,86,0.0000000000,,, +5.4375000000,87,0.0000000000,,, +5.4394531250,87,0.0000000000,,, +5.4414062500,87,0.0000000000,,, +5.4433593750,87,0.0000000000,,, +5.4453125000,87,0.0000000000,,, +5.4472656250,87,0.0000000000,,, +5.4492187500,87,0.0000000000,,, +5.4511718750,87,0.0000000000,,, +5.4531250000,87,0.0000000000,,, +5.4550781250,87,0.0000000000,,, +5.4570312500,87,0.0000000000,,, +5.4589843750,87,0.0000000000,,, +5.4609375000,87,0.0000000000,,, +5.4628906250,87,0.0000000000,,, +5.4648437500,87,0.0000000000,,, +5.4667968750,87,0.0000000000,,, +5.4687500000,87,0.0000000000,,, +5.4707031250,87,0.0000000000,,, +5.4726562500,87,0.0000000000,,, +5.4746093750,87,0.0000000000,,, +5.4765625000,87,0.0000000000,,, +5.4785156250,87,0.0000000000,,, +5.4804687500,87,0.0000000000,,, +5.4824218750,87,0.0000000000,,, +5.4843750000,87,0.0000000000,,, +5.4863281250,87,0.0000000000,,, +5.4882812500,87,0.0000000000,,, +5.4902343750,87,0.0000000000,,, +5.4921875000,87,0.0000000000,,, +5.4941406250,87,0.0000000000,,, +5.4960937500,87,0.0000000000,,, +5.4980468750,87,0.0000000000,,, +5.5000000000,88,865.2343750000,,, +5.5019531250,88,865.2343750000,,, +5.5039062500,88,865.2343750000,,, +5.5058593750,88,865.2343750000,,, +5.5078125000,88,865.2343750000,,, +5.5097656250,88,865.2343750000,,, +5.5117187500,88,865.2343750000,,, +5.5136718750,88,865.2343750000,,, +5.5156250000,88,865.2343750000,,, +5.5175781250,88,865.2343750000,,, +5.5195312500,88,865.2343750000,,, +5.5214843750,88,865.2343750000,,, +5.5234375000,88,865.2343750000,,, +5.5253906250,88,865.2343750000,,, +5.5273437500,88,865.2343750000,,, +5.5292968750,88,865.2343750000,,, +5.5312500000,88,865.2343750000,,, +5.5332031250,88,865.2343750000,,, +5.5351562500,88,865.2343750000,,, +5.5371093750,88,865.2343750000,,, +5.5390625000,88,865.2343750000,,, +5.5410156250,88,865.2343750000,,, +5.5429687500,88,865.2343750000,,, +5.5449218750,88,865.2343750000,,, +5.5468750000,88,865.2343750000,,, +5.5488281250,88,865.2343750000,,, +5.5507812500,88,865.2343750000,,, +5.5527343750,88,865.2343750000,,, +5.5546875000,88,865.2343750000,,, +5.5566406250,88,865.2343750000,,, +5.5585937500,88,865.2343750000,,, +5.5605468750,88,865.2343750000,,, +5.5625000000,89,865.2343750000,,, +5.5644531250,89,865.2343750000,,, +5.5664062500,89,865.2343750000,,, +5.5683593750,89,865.2343750000,,, +5.5703125000,89,865.2343750000,,, +5.5722656250,89,865.2343750000,,, +5.5742187500,89,865.2343750000,,, +5.5761718750,89,865.2343750000,,, +5.5781250000,89,865.2343750000,,, +5.5800781250,89,865.2343750000,,, +5.5820312500,89,865.2343750000,,, +5.5839843750,89,865.2343750000,,, +5.5859375000,89,865.2343750000,,, +5.5878906250,89,865.2343750000,,, +5.5898437500,89,865.2343750000,,, +5.5917968750,89,865.2343750000,,, +5.5937500000,89,865.2343750000,,, +5.5957031250,89,865.2343750000,,, +5.5976562500,89,865.2343750000,,, +5.5996093750,89,865.2343750000,,, +5.6015625000,89,865.2343750000,,, +5.6035156250,89,865.2343750000,,, +5.6054687500,89,865.2343750000,,, +5.6074218750,89,865.2343750000,,, +5.6093750000,89,865.2343750000,,, +5.6113281250,89,865.2343750000,,, +5.6132812500,89,865.2343750000,,, +5.6152343750,89,865.2343750000,,, +5.6171875000,89,865.2343750000,,, +5.6191406250,89,865.2343750000,,, +5.6210937500,89,865.2343750000,,, +5.6230468750,89,865.2343750000,,, +5.6250000000,90,865.2343750000,,, +5.6269531250,90,865.2343750000,,, +5.6289062500,90,865.2343750000,,, +5.6308593750,90,865.2343750000,,, +5.6328125000,90,865.2343750000,,, +5.6347656250,90,865.2343750000,,, +5.6367187500,90,865.2343750000,,, +5.6386718750,90,865.2343750000,,, +5.6406250000,90,865.2343750000,,, +5.6425781250,90,865.2343750000,,, +5.6445312500,90,865.2343750000,,, +5.6464843750,90,865.2343750000,,, +5.6484375000,90,865.2343750000,,, +5.6503906250,90,865.2343750000,,, +5.6523437500,90,865.2343750000,,, +5.6542968750,90,865.2343750000,,, +5.6562500000,90,865.2343750000,,, +5.6582031250,90,865.2343750000,,, +5.6601562500,90,865.2343750000,,, +5.6621093750,90,865.2343750000,,, +5.6640625000,90,865.2343750000,,, +5.6660156250,90,865.2343750000,,, +5.6679687500,90,865.2343750000,,, +5.6699218750,90,865.2343750000,,, +5.6718750000,90,865.2343750000,,, +5.6738281250,90,865.2343750000,,, +5.6757812500,90,865.2343750000,,, +5.6777343750,90,865.2343750000,,, +5.6796875000,90,865.2343750000,,, +5.6816406250,90,865.2343750000,,, +5.6835937500,90,865.2343750000,,, +5.6855468750,90,865.2343750000,,, +5.6875000000,91,865.2343750000,,, +5.6894531250,91,865.2343750000,,, +5.6914062500,91,865.2343750000,,, +5.6933593750,91,865.2343750000,,, +5.6953125000,91,865.2343750000,,, +5.6972656250,91,865.2343750000,,, +5.6992187500,91,865.2343750000,,, +5.7011718750,91,865.2343750000,,, +5.7031250000,91,865.2343750000,,, +5.7050781250,91,865.2343750000,,, +5.7070312500,91,865.2343750000,,, +5.7089843750,91,865.2343750000,,, +5.7109375000,91,865.2343750000,,, +5.7128906250,91,865.2343750000,,, +5.7148437500,91,865.2343750000,,, +5.7167968750,91,865.2343750000,,, +5.7187500000,91,865.2343750000,,, +5.7207031250,91,865.2343750000,,, +5.7226562500,91,865.2343750000,,, +5.7246093750,91,865.2343750000,,, +5.7265625000,91,865.2343750000,,, +5.7285156250,91,865.2343750000,,, +5.7304687500,91,865.2343750000,,, +5.7324218750,91,865.2343750000,,, +5.7343750000,91,865.2343750000,,, +5.7363281250,91,865.2343750000,,, +5.7382812500,91,865.2343750000,,, +5.7402343750,91,865.2343750000,,, +5.7421875000,91,865.2343750000,,, +5.7441406250,91,865.2343750000,,, +5.7460937500,91,865.2343750000,,, +5.7480468750,91,865.2343750000,,, +5.7500000000,92,865.2343750000,,, +5.7519531250,92,865.2343750000,,, +5.7539062500,92,865.2343750000,,, +5.7558593750,92,865.2343750000,,, +5.7578125000,92,865.2343750000,,, +5.7597656250,92,865.2343750000,,, +5.7617187500,92,865.2343750000,,, +5.7636718750,92,865.2343750000,,, +5.7656250000,92,865.2343750000,,, +5.7675781250,92,865.2343750000,,, +5.7695312500,92,865.2343750000,,, +5.7714843750,92,865.2343750000,,, +5.7734375000,92,865.2343750000,,, +5.7753906250,92,865.2343750000,,, +5.7773437500,92,865.2343750000,,, +5.7792968750,92,865.2343750000,,, +5.7812500000,92,865.2343750000,,, +5.7832031250,92,865.2343750000,,, +5.7851562500,92,865.2343750000,,, +5.7871093750,92,865.2343750000,,, +5.7890625000,92,865.2343750000,,, +5.7910156250,92,865.2343750000,,, +5.7929687500,92,865.2343750000,,, +5.7949218750,92,865.2343750000,,, +5.7968750000,92,865.2343750000,,, +5.7988281250,92,865.2343750000,,, +5.8007812500,92,865.2343750000,,, +5.8027343750,92,865.2343750000,,, +5.8046875000,92,865.2343750000,,, +5.8066406250,92,865.2343750000,,, +5.8085937500,92,865.2343750000,,, +5.8105468750,92,865.2343750000,,, +5.8125000000,93,865.2343750000,,, +5.8144531250,93,865.2343750000,,, +5.8164062500,93,865.2343750000,,, +5.8183593750,93,865.2343750000,,, +5.8203125000,93,865.2343750000,,, +5.8222656250,93,865.2343750000,,, +5.8242187500,93,865.2343750000,,, +5.8261718750,93,865.2343750000,,, +5.8281250000,93,865.2343750000,,, +5.8300781250,93,865.2343750000,,, +5.8320312500,93,865.2343750000,,, +5.8339843750,93,865.2343750000,,, +5.8359375000,93,865.2343750000,,, +5.8378906250,93,865.2343750000,,, +5.8398437500,93,865.2343750000,,, +5.8417968750,93,865.2343750000,,, +5.8437500000,93,865.2343750000,,, +5.8457031250,93,865.2343750000,,, +5.8476562500,93,865.2343750000,,, +5.8496093750,93,865.2343750000,,, +5.8515625000,93,865.2343750000,,, +5.8535156250,93,865.2343750000,,, +5.8554687500,93,865.2343750000,,, +5.8574218750,93,865.2343750000,,, +5.8593750000,93,865.2343750000,,, +5.8613281250,93,865.2343750000,,, +5.8632812500,93,865.2343750000,,, +5.8652343750,93,865.2343750000,,, +5.8671875000,93,865.2343750000,,, +5.8691406250,93,865.2343750000,,, +5.8710937500,93,865.2343750000,,, +5.8730468750,93,865.2343750000,,, +5.8750000000,94,865.2343750000,,, +5.8769531250,94,865.2343750000,,, +5.8789062500,94,865.2343750000,,, +5.8808593750,94,865.2343750000,,, +5.8828125000,94,865.2343750000,,, +5.8847656250,94,865.2343750000,,, +5.8867187500,94,865.2343750000,,, +5.8886718750,94,865.2343750000,,, +5.8906250000,94,865.2343750000,,, +5.8925781250,94,865.2343750000,,, +5.8945312500,94,865.2343750000,,, +5.8964843750,94,865.2343750000,,, +5.8984375000,94,865.2343750000,,, +5.9003906250,94,865.2343750000,,, +5.9023437500,94,865.2343750000,,, +5.9042968750,94,865.2343750000,,, +5.9062500000,94,865.2343750000,,, +5.9082031250,94,865.2343750000,,, +5.9101562500,94,865.2343750000,,, +5.9121093750,94,865.2343750000,,, +5.9140625000,94,865.2343750000,,, +5.9160156250,94,865.2343750000,,, +5.9179687500,94,865.2343750000,,, +5.9199218750,94,865.2343750000,,, +5.9218750000,94,865.2343750000,,, +5.9238281250,94,865.2343750000,,, +5.9257812500,94,865.2343750000,,, +5.9277343750,94,865.2343750000,,, +5.9296875000,94,865.2343750000,,, +5.9316406250,94,865.2343750000,,, +5.9335937500,94,865.2343750000,,, +5.9355468750,94,865.2343750000,,, +5.9375000000,95,865.2343750000,,, +5.9394531250,95,865.2343750000,,, +5.9414062500,95,865.2343750000,,, +5.9433593750,95,865.2343750000,,, +5.9453125000,95,865.2343750000,,, +5.9472656250,95,865.2343750000,,, +5.9492187500,95,865.2343750000,,, +5.9511718750,95,865.2343750000,,, +5.9531250000,95,865.2343750000,,, +5.9550781250,95,865.2343750000,,, +5.9570312500,95,865.2343750000,,, +5.9589843750,95,865.2343750000,,, +5.9609375000,95,865.2343750000,,, +5.9628906250,95,865.2343750000,,, +5.9648437500,95,865.2343750000,,, +5.9667968750,95,865.2343750000,,, +5.9687500000,95,865.2343750000,,, +5.9707031250,95,865.2343750000,,, +5.9726562500,95,865.2343750000,,, +5.9746093750,95,865.2343750000,,, +5.9765625000,95,865.2343750000,,, +5.9785156250,95,865.2343750000,,, +5.9804687500,95,865.2343750000,,, +5.9824218750,95,865.2343750000,,, +5.9843750000,95,865.2343750000,,, +5.9863281250,95,865.2343750000,,, +5.9882812500,95,865.2343750000,,, +5.9902343750,95,865.2343750000,,, +5.9921875000,95,865.2343750000,,, +5.9941406250,95,865.2343750000,,, +5.9960937500,95,865.2343750000,,, +5.9980468750,95,865.2343750000,,, +6.0000000000,96,865.2343750000,,, +6.0019531250,96,865.2343750000,,, +6.0039062500,96,865.2343750000,,, +6.0058593750,96,865.2343750000,,, +6.0078125000,96,865.2343750000,,, +6.0097656250,96,865.2343750000,,, +6.0117187500,96,865.2343750000,,, +6.0136718750,96,865.2343750000,,, +6.0156250000,96,865.2343750000,,, +6.0175781250,96,865.2343750000,,, +6.0195312500,96,865.2343750000,,, +6.0214843750,96,865.2343750000,,, +6.0234375000,96,865.2343750000,,, +6.0253906250,96,865.2343750000,,, +6.0273437500,96,865.2343750000,,, +6.0292968750,96,865.2343750000,,, +6.0312500000,96,865.2343750000,,, +6.0332031250,96,865.2343750000,,, +6.0351562500,96,865.2343750000,,, +6.0371093750,96,865.2343750000,,, +6.0390625000,96,865.2343750000,,, +6.0410156250,96,865.2343750000,,, +6.0429687500,96,865.2343750000,,, +6.0449218750,96,865.2343750000,,, +6.0468750000,96,865.2343750000,,, +6.0488281250,96,865.2343750000,,, +6.0507812500,96,865.2343750000,,, +6.0527343750,96,865.2343750000,,, +6.0546875000,96,865.2343750000,,, +6.0566406250,96,865.2343750000,,, +6.0585937500,96,865.2343750000,,, +6.0605468750,96,865.2343750000,,, +6.0625000000,97,865.2343750000,,, +6.0644531250,97,865.2343750000,,, +6.0664062500,97,865.2343750000,,, +6.0683593750,97,865.2343750000,,, +6.0703125000,97,865.2343750000,,, +6.0722656250,97,865.2343750000,,, +6.0742187500,97,865.2343750000,,, +6.0761718750,97,865.2343750000,,, +6.0781250000,97,865.2343750000,,, +6.0800781250,97,865.2343750000,,, +6.0820312500,97,865.2343750000,,, +6.0839843750,97,865.2343750000,,, +6.0859375000,97,865.2343750000,,, +6.0878906250,97,865.2343750000,,, +6.0898437500,97,865.2343750000,,, +6.0917968750,97,865.2343750000,,, +6.0937500000,97,865.2343750000,,, +6.0957031250,97,865.2343750000,,, +6.0976562500,97,865.2343750000,,, +6.0996093750,97,865.2343750000,,, +6.1015625000,97,865.2343750000,,, +6.1035156250,97,865.2343750000,,, +6.1054687500,97,865.2343750000,,, +6.1074218750,97,865.2343750000,,, +6.1093750000,97,865.2343750000,,, +6.1113281250,97,865.2343750000,,, +6.1132812500,97,865.2343750000,,, +6.1152343750,97,865.2343750000,,, +6.1171875000,97,865.2343750000,,, +6.1191406250,97,865.2343750000,,, +6.1210937500,97,865.2343750000,,, +6.1230468750,97,865.2343750000,,, +6.1250000000,98,865.2343750000,,, +6.1269531250,98,865.2343750000,,, +6.1289062500,98,865.2343750000,,, +6.1308593750,98,865.2343750000,,, +6.1328125000,98,865.2343750000,,, +6.1347656250,98,865.2343750000,,, +6.1367187500,98,865.2343750000,,, +6.1386718750,98,865.2343750000,,, +6.1406250000,98,865.2343750000,,, +6.1425781250,98,865.2343750000,,, +6.1445312500,98,865.2343750000,,, +6.1464843750,98,865.2343750000,,, +6.1484375000,98,865.2343750000,,, +6.1503906250,98,865.2343750000,,, +6.1523437500,98,865.2343750000,,, +6.1542968750,98,865.2343750000,,, +6.1562500000,98,865.2343750000,,, +6.1582031250,98,865.2343750000,,, +6.1601562500,98,865.2343750000,,, +6.1621093750,98,865.2343750000,,, +6.1640625000,98,865.2343750000,,, +6.1660156250,98,865.2343750000,,, +6.1679687500,98,865.2343750000,,, +6.1699218750,98,865.2343750000,,, +6.1718750000,98,865.2343750000,,, +6.1738281250,98,865.2343750000,,, +6.1757812500,98,865.2343750000,,, +6.1777343750,98,865.2343750000,,, +6.1796875000,98,865.2343750000,,, +6.1816406250,98,865.2343750000,,, +6.1835937500,98,865.2343750000,,, +6.1855468750,98,865.2343750000,,, +6.1875000000,99,865.2343750000,,, +6.1894531250,99,865.2343750000,,, +6.1914062500,99,865.2343750000,,, +6.1933593750,99,865.2343750000,,, +6.1953125000,99,865.2343750000,,, +6.1972656250,99,865.2343750000,,, +6.1992187500,99,865.2343750000,,, +6.2011718750,99,865.2343750000,,, +6.2031250000,99,865.2343750000,,, +6.2050781250,99,865.2343750000,,, +6.2070312500,99,865.2343750000,,, +6.2089843750,99,865.2343750000,,, +6.2109375000,99,865.2343750000,,, +6.2128906250,99,865.2343750000,,, +6.2148437500,99,865.2343750000,,, +6.2167968750,99,865.2343750000,,, +6.2187500000,99,865.2343750000,,, +6.2207031250,99,865.2343750000,,, +6.2226562500,99,865.2343750000,,, +6.2246093750,99,865.2343750000,,, +6.2265625000,99,865.2343750000,,, +6.2285156250,99,865.2343750000,,, +6.2304687500,99,865.2343750000,,, +6.2324218750,99,865.2343750000,,, +6.2343750000,99,865.2343750000,,, +6.2363281250,99,865.2343750000,,, +6.2382812500,99,865.2343750000,,, +6.2402343750,99,865.2343750000,,, +6.2421875000,99,865.2343750000,,, +6.2441406250,99,865.2343750000,,, +6.2460937500,99,865.2343750000,,, +6.2480468750,99,865.2343750000,,, +6.2500000000,100,865.2343750000,,, +6.2519531250,100,865.2343750000,,, +6.2539062500,100,865.2343750000,,, +6.2558593750,100,865.2343750000,,, +6.2578125000,100,865.2343750000,,, +6.2597656250,100,865.2343750000,,, +6.2617187500,100,865.2343750000,,, +6.2636718750,100,865.2343750000,,, +6.2656250000,100,865.2343750000,,, +6.2675781250,100,865.2343750000,,, +6.2695312500,100,865.2343750000,,, +6.2714843750,100,865.2343750000,,, +6.2734375000,100,865.2343750000,,, +6.2753906250,100,865.2343750000,,, +6.2773437500,100,865.2343750000,,, +6.2792968750,100,865.2343750000,,, +6.2812500000,100,865.2343750000,,, +6.2832031250,100,865.2343750000,,, +6.2851562500,100,865.2343750000,,, +6.2871093750,100,865.2343750000,,, +6.2890625000,100,865.2343750000,,, +6.2910156250,100,865.2343750000,,, +6.2929687500,100,865.2343750000,,, +6.2949218750,100,865.2343750000,,, +6.2968750000,100,865.2343750000,,, +6.2988281250,100,865.2343750000,,, +6.3007812500,100,865.2343750000,,, +6.3027343750,100,865.2343750000,,, +6.3046875000,100,865.2343750000,,, +6.3066406250,100,865.2343750000,,, +6.3085937500,100,865.2343750000,,, +6.3105468750,100,865.2343750000,,, +6.3125000000,101,865.2343750000,,, +6.3144531250,101,865.2343750000,,, +6.3164062500,101,865.2343750000,,, +6.3183593750,101,865.2343750000,,, +6.3203125000,101,865.2343750000,,, +6.3222656250,101,865.2343750000,,, +6.3242187500,101,865.2343750000,,, +6.3261718750,101,865.2343750000,,, +6.3281250000,101,865.2343750000,,, +6.3300781250,101,865.2343750000,,, +6.3320312500,101,865.2343750000,,, +6.3339843750,101,865.2343750000,,, +6.3359375000,101,865.2343750000,,, +6.3378906250,101,865.2343750000,,, +6.3398437500,101,865.2343750000,,, +6.3417968750,101,865.2343750000,,, +6.3437500000,101,865.2343750000,,, +6.3457031250,101,865.2343750000,,, +6.3476562500,101,865.2343750000,,, +6.3496093750,101,865.2343750000,,, +6.3515625000,101,865.2343750000,,, +6.3535156250,101,865.2343750000,,, +6.3554687500,101,865.2343750000,,, +6.3574218750,101,865.2343750000,,, +6.3593750000,101,865.2343750000,,, +6.3613281250,101,865.2343750000,,, +6.3632812500,101,865.2343750000,,, +6.3652343750,101,865.2343750000,,, +6.3671875000,101,865.2343750000,,, +6.3691406250,101,865.2343750000,,, +6.3710937500,101,865.2343750000,,, +6.3730468750,101,865.2343750000,,, +6.3750000000,102,865.2343750000,,, +6.3769531250,102,865.2343750000,,, +6.3789062500,102,865.2343750000,,, +6.3808593750,102,865.2343750000,,, +6.3828125000,102,865.2343750000,,, +6.3847656250,102,865.2343750000,,, +6.3867187500,102,865.2343750000,,, +6.3886718750,102,865.2343750000,,, +6.3906250000,102,865.2343750000,,, +6.3925781250,102,865.2343750000,,, +6.3945312500,102,865.2343750000,,, +6.3964843750,102,865.2343750000,,, +6.3984375000,102,865.2343750000,,, +6.4003906250,102,865.2343750000,,, +6.4023437500,102,865.2343750000,,, +6.4042968750,102,865.2343750000,,, +6.4062500000,102,865.2343750000,,, +6.4082031250,102,865.2343750000,,, +6.4101562500,102,865.2343750000,,, +6.4121093750,102,865.2343750000,,, +6.4140625000,102,865.2343750000,,, +6.4160156250,102,865.2343750000,,, +6.4179687500,102,865.2343750000,,, +6.4199218750,102,865.2343750000,,, +6.4218750000,102,865.2343750000,,, +6.4238281250,102,865.2343750000,,, +6.4257812500,102,865.2343750000,,, +6.4277343750,102,865.2343750000,,, +6.4296875000,102,865.2343750000,,, +6.4316406250,102,865.2343750000,,, +6.4335937500,102,865.2343750000,,, +6.4355468750,102,865.2343750000,,, +6.4375000000,103,910.1562500000,,, +6.4394531250,103,910.1562500000,,, +6.4414062500,103,910.1562500000,,, +6.4433593750,103,910.1562500000,,, +6.4453125000,103,910.1562500000,,, +6.4472656250,103,910.1562500000,,, +6.4492187500,103,910.1562500000,,, +6.4511718750,103,910.1562500000,,, +6.4531250000,103,910.1562500000,,, +6.4550781250,103,910.1562500000,,, +6.4570312500,103,910.1562500000,,, +6.4589843750,103,910.1562500000,,, +6.4609375000,103,910.1562500000,,, +6.4628906250,103,910.1562500000,,, +6.4648437500,103,910.1562500000,,, +6.4667968750,103,910.1562500000,,, +6.4687500000,103,910.1562500000,,, +6.4707031250,103,910.1562500000,,, +6.4726562500,103,910.1562500000,,, +6.4746093750,103,910.1562500000,,, +6.4765625000,103,910.1562500000,,, +6.4785156250,103,910.1562500000,,, +6.4804687500,103,910.1562500000,,, +6.4824218750,103,910.1562500000,,, +6.4843750000,103,910.1562500000,,, +6.4863281250,103,910.1562500000,,, +6.4882812500,103,910.1562500000,,, +6.4902343750,103,910.1562500000,,, +6.4921875000,103,910.1562500000,,, +6.4941406250,103,910.1562500000,,, +6.4960937500,103,910.1562500000,,, +6.4980468750,103,910.1562500000,,, +6.5000000000,104,910.1562500000,,, +6.5019531250,104,910.1562500000,,, +6.5039062500,104,910.1562500000,,, +6.5058593750,104,910.1562500000,,, +6.5078125000,104,910.1562500000,,, +6.5097656250,104,910.1562500000,,, +6.5117187500,104,910.1562500000,,, +6.5136718750,104,910.1562500000,,, +6.5156250000,104,910.1562500000,,, +6.5175781250,104,910.1562500000,,, +6.5195312500,104,910.1562500000,,, +6.5214843750,104,910.1562500000,,, +6.5234375000,104,910.1562500000,,, +6.5253906250,104,910.1562500000,,, +6.5273437500,104,910.1562500000,,, +6.5292968750,104,910.1562500000,,, +6.5312500000,104,910.1562500000,,, +6.5332031250,104,910.1562500000,,, +6.5351562500,104,910.1562500000,,, +6.5371093750,104,910.1562500000,,, +6.5390625000,104,910.1562500000,,, +6.5410156250,104,910.1562500000,,, +6.5429687500,104,910.1562500000,,, +6.5449218750,104,910.1562500000,,, +6.5468750000,104,910.1562500000,,, +6.5488281250,104,910.1562500000,,, +6.5507812500,104,910.1562500000,,, +6.5527343750,104,910.1562500000,,, +6.5546875000,104,910.1562500000,,, +6.5566406250,104,910.1562500000,,, +6.5585937500,104,910.1562500000,,, +6.5605468750,104,910.1562500000,,, +6.5625000000,105,910.1562500000,,, +6.5644531250,105,910.1562500000,,, +6.5664062500,105,910.1562500000,,, +6.5683593750,105,910.1562500000,,, +6.5703125000,105,910.1562500000,,, +6.5722656250,105,910.1562500000,,, +6.5742187500,105,910.1562500000,,, +6.5761718750,105,910.1562500000,,, +6.5781250000,105,910.1562500000,,, +6.5800781250,105,910.1562500000,,, +6.5820312500,105,910.1562500000,,, +6.5839843750,105,910.1562500000,,, +6.5859375000,105,910.1562500000,,, +6.5878906250,105,910.1562500000,,, +6.5898437500,105,910.1562500000,,, +6.5917968750,105,910.1562500000,,, +6.5937500000,105,910.1562500000,,, +6.5957031250,105,910.1562500000,,, +6.5976562500,105,910.1562500000,,, +6.5996093750,105,910.1562500000,,, +6.6015625000,105,910.1562500000,,, +6.6035156250,105,910.1562500000,,, +6.6054687500,105,910.1562500000,,, +6.6074218750,105,910.1562500000,,, +6.6093750000,105,910.1562500000,,, +6.6113281250,105,910.1562500000,,, +6.6132812500,105,910.1562500000,,, +6.6152343750,105,910.1562500000,,, +6.6171875000,105,910.1562500000,,, +6.6191406250,105,910.1562500000,,, +6.6210937500,105,910.1562500000,,, +6.6230468750,105,910.1562500000,,, +6.6250000000,106,910.1562500000,,, +6.6269531250,106,910.1562500000,,, +6.6289062500,106,910.1562500000,,, +6.6308593750,106,910.1562500000,,, +6.6328125000,106,910.1562500000,,, +6.6347656250,106,910.1562500000,,, +6.6367187500,106,910.1562500000,,, +6.6386718750,106,910.1562500000,,, +6.6406250000,106,910.1562500000,,, +6.6425781250,106,910.1562500000,,, +6.6445312500,106,910.1562500000,,, +6.6464843750,106,910.1562500000,,, +6.6484375000,106,910.1562500000,,, +6.6503906250,106,910.1562500000,,, +6.6523437500,106,910.1562500000,,, +6.6542968750,106,910.1562500000,,, +6.6562500000,106,910.1562500000,,, +6.6582031250,106,910.1562500000,,, +6.6601562500,106,910.1562500000,,, +6.6621093750,106,910.1562500000,,, +6.6640625000,106,910.1562500000,,, +6.6660156250,106,910.1562500000,,, +6.6679687500,106,910.1562500000,,, +6.6699218750,106,910.1562500000,,, +6.6718750000,106,910.1562500000,,, +6.6738281250,106,910.1562500000,,, +6.6757812500,106,910.1562500000,,, +6.6777343750,106,910.1562500000,,, +6.6796875000,106,910.1562500000,,, +6.6816406250,106,910.1562500000,,, +6.6835937500,106,910.1562500000,,, +6.6855468750,106,910.1562500000,,, +6.6875000000,107,910.1562500000,,, +6.6894531250,107,910.1562500000,,, +6.6914062500,107,910.1562500000,,, +6.6933593750,107,910.1562500000,,, +6.6953125000,107,910.1562500000,,, +6.6972656250,107,910.1562500000,,, +6.6992187500,107,910.1562500000,,, +6.7011718750,107,910.1562500000,,, +6.7031250000,107,910.1562500000,,, +6.7050781250,107,910.1562500000,,, +6.7070312500,107,910.1562500000,,, +6.7089843750,107,910.1562500000,,, +6.7109375000,107,910.1562500000,,, +6.7128906250,107,910.1562500000,,, +6.7148437500,107,910.1562500000,,, +6.7167968750,107,910.1562500000,,, +6.7187500000,107,910.1562500000,,, +6.7207031250,107,910.1562500000,,, +6.7226562500,107,910.1562500000,,, +6.7246093750,107,910.1562500000,,, +6.7265625000,107,910.1562500000,,, +6.7285156250,107,910.1562500000,,, +6.7304687500,107,910.1562500000,,, +6.7324218750,107,910.1562500000,,, +6.7343750000,107,910.1562500000,,, +6.7363281250,107,910.1562500000,,, +6.7382812500,107,910.1562500000,,, +6.7402343750,107,910.1562500000,,, +6.7421875000,107,910.1562500000,,, +6.7441406250,107,910.1562500000,,, +6.7460937500,107,910.1562500000,,, +6.7480468750,107,910.1562500000,,, +6.7500000000,108,910.1562500000,,, +6.7519531250,108,910.1562500000,,, +6.7539062500,108,910.1562500000,,, +6.7558593750,108,910.1562500000,,, +6.7578125000,108,910.1562500000,,, +6.7597656250,108,910.1562500000,,, +6.7617187500,108,910.1562500000,,, +6.7636718750,108,910.1562500000,,, +6.7656250000,108,910.1562500000,,, +6.7675781250,108,910.1562500000,,, +6.7695312500,108,910.1562500000,,, +6.7714843750,108,910.1562500000,,, +6.7734375000,108,910.1562500000,,, +6.7753906250,108,910.1562500000,,, +6.7773437500,108,910.1562500000,,, +6.7792968750,108,910.1562500000,,, +6.7812500000,108,910.1562500000,,, +6.7832031250,108,910.1562500000,,, +6.7851562500,108,910.1562500000,,, +6.7871093750,108,910.1562500000,,, +6.7890625000,108,910.1562500000,,, +6.7910156250,108,910.1562500000,,, +6.7929687500,108,910.1562500000,,, +6.7949218750,108,910.1562500000,,, +6.7968750000,108,910.1562500000,,, +6.7988281250,108,910.1562500000,,, +6.8007812500,108,910.1562500000,,, +6.8027343750,108,910.1562500000,,, +6.8046875000,108,910.1562500000,,, +6.8066406250,108,910.1562500000,,, +6.8085937500,108,910.1562500000,,, +6.8105468750,108,910.1562500000,,, +6.8125000000,109,910.1562500000,,, +6.8144531250,109,910.1562500000,,, +6.8164062500,109,910.1562500000,,, +6.8183593750,109,910.1562500000,,, +6.8203125000,109,910.1562500000,,, +6.8222656250,109,910.1562500000,,, +6.8242187500,109,910.1562500000,,, +6.8261718750,109,910.1562500000,,, +6.8281250000,109,910.1562500000,,, +6.8300781250,109,910.1562500000,,, +6.8320312500,109,910.1562500000,,, +6.8339843750,109,910.1562500000,,, +6.8359375000,109,910.1562500000,,, +6.8378906250,109,910.1562500000,,, +6.8398437500,109,910.1562500000,,, +6.8417968750,109,910.1562500000,,, +6.8437500000,109,910.1562500000,,, +6.8457031250,109,910.1562500000,,, +6.8476562500,109,910.1562500000,,, +6.8496093750,109,910.1562500000,,, +6.8515625000,109,910.1562500000,,, +6.8535156250,109,910.1562500000,,, +6.8554687500,109,910.1562500000,,, +6.8574218750,109,910.1562500000,,, +6.8593750000,109,910.1562500000,,, +6.8613281250,109,910.1562500000,,, +6.8632812500,109,910.1562500000,,, +6.8652343750,109,910.1562500000,,, +6.8671875000,109,910.1562500000,,, +6.8691406250,109,910.1562500000,,, +6.8710937500,109,910.1562500000,,, +6.8730468750,109,910.1562500000,,, +6.8750000000,110,910.1562500000,,, +6.8769531250,110,910.1562500000,,, +6.8789062500,110,910.1562500000,,, +6.8808593750,110,910.1562500000,,, +6.8828125000,110,910.1562500000,,, +6.8847656250,110,910.1562500000,,, +6.8867187500,110,910.1562500000,,, +6.8886718750,110,910.1562500000,,, +6.8906250000,110,910.1562500000,,, +6.8925781250,110,910.1562500000,,, +6.8945312500,110,910.1562500000,,, +6.8964843750,110,910.1562500000,,, +6.8984375000,110,910.1562500000,,, +6.9003906250,110,910.1562500000,,, +6.9023437500,110,910.1562500000,,, +6.9042968750,110,910.1562500000,,, +6.9062500000,110,910.1562500000,,, +6.9082031250,110,910.1562500000,,, +6.9101562500,110,910.1562500000,,, +6.9121093750,110,910.1562500000,,, +6.9140625000,110,910.1562500000,,, +6.9160156250,110,910.1562500000,,, +6.9179687500,110,910.1562500000,,, +6.9199218750,110,910.1562500000,,, +6.9218750000,110,910.1562500000,,, +6.9238281250,110,910.1562500000,,, +6.9257812500,110,910.1562500000,,, +6.9277343750,110,910.1562500000,,, +6.9296875000,110,910.1562500000,,, +6.9316406250,110,910.1562500000,,, +6.9335937500,110,910.1562500000,,, +6.9355468750,110,910.1562500000,,, +6.9375000000,111,910.1562500000,,, +6.9394531250,111,910.1562500000,,, +6.9414062500,111,910.1562500000,,, +6.9433593750,111,910.1562500000,,, +6.9453125000,111,910.1562500000,,, +6.9472656250,111,910.1562500000,,, +6.9492187500,111,910.1562500000,,, +6.9511718750,111,910.1562500000,,, +6.9531250000,111,910.1562500000,,, +6.9550781250,111,910.1562500000,,, +6.9570312500,111,910.1562500000,,, +6.9589843750,111,910.1562500000,,, +6.9609375000,111,910.1562500000,,, +6.9628906250,111,910.1562500000,,, +6.9648437500,111,910.1562500000,,, +6.9667968750,111,910.1562500000,,, +6.9687500000,111,910.1562500000,,, +6.9707031250,111,910.1562500000,,, +6.9726562500,111,910.1562500000,,, +6.9746093750,111,910.1562500000,,, +6.9765625000,111,910.1562500000,,, +6.9785156250,111,910.1562500000,,, +6.9804687500,111,910.1562500000,,, +6.9824218750,111,910.1562500000,,, +6.9843750000,111,910.1562500000,,, +6.9863281250,111,910.1562500000,,, +6.9882812500,111,910.1562500000,,, +6.9902343750,111,910.1562500000,,, +6.9921875000,111,910.1562500000,,, +6.9941406250,111,910.1562500000,,, +6.9960937500,111,910.1562500000,,, +6.9980468750,111,910.1562500000,,, +7.0000000000,112,910.1562500000,,, +7.0019531250,112,910.1562500000,,, +7.0039062500,112,910.1562500000,,, +7.0058593750,112,910.1562500000,,, +7.0078125000,112,910.1562500000,,, +7.0097656250,112,910.1562500000,,, +7.0117187500,112,910.1562500000,,, +7.0136718750,112,910.1562500000,,, +7.0156250000,112,910.1562500000,,, +7.0175781250,112,910.1562500000,,, +7.0195312500,112,910.1562500000,,, +7.0214843750,112,910.1562500000,,, +7.0234375000,112,910.1562500000,,, +7.0253906250,112,910.1562500000,,, +7.0273437500,112,910.1562500000,,, +7.0292968750,112,910.1562500000,,, +7.0312500000,112,910.1562500000,,, +7.0332031250,112,910.1562500000,,, +7.0351562500,112,910.1562500000,,, +7.0371093750,112,910.1562500000,,, +7.0390625000,112,910.1562500000,,, +7.0410156250,112,910.1562500000,,, +7.0429687500,112,910.1562500000,,, +7.0449218750,112,910.1562500000,,, +7.0468750000,112,910.1562500000,,, +7.0488281250,112,910.1562500000,,, +7.0507812500,112,910.1562500000,,, +7.0527343750,112,910.1562500000,,, +7.0546875000,112,910.1562500000,,, +7.0566406250,112,910.1562500000,,, +7.0585937500,112,910.1562500000,,, +7.0605468750,112,910.1562500000,,, +7.0625000000,113,910.1562500000,,, +7.0644531250,113,910.1562500000,,, +7.0664062500,113,910.1562500000,,, +7.0683593750,113,910.1562500000,,, +7.0703125000,113,910.1562500000,,, +7.0722656250,113,910.1562500000,,, +7.0742187500,113,910.1562500000,,, +7.0761718750,113,910.1562500000,,, +7.0781250000,113,910.1562500000,,, +7.0800781250,113,910.1562500000,,, +7.0820312500,113,910.1562500000,,, +7.0839843750,113,910.1562500000,,, +7.0859375000,113,910.1562500000,,, +7.0878906250,113,910.1562500000,,, +7.0898437500,113,910.1562500000,,, +7.0917968750,113,910.1562500000,,, +7.0937500000,113,910.1562500000,,, +7.0957031250,113,910.1562500000,,, +7.0976562500,113,910.1562500000,,, +7.0996093750,113,910.1562500000,,, +7.1015625000,113,910.1562500000,,, +7.1035156250,113,910.1562500000,,, +7.1054687500,113,910.1562500000,,, +7.1074218750,113,910.1562500000,,, +7.1093750000,113,910.1562500000,,, +7.1113281250,113,910.1562500000,,, +7.1132812500,113,910.1562500000,,, +7.1152343750,113,910.1562500000,,, +7.1171875000,113,910.1562500000,,, +7.1191406250,113,910.1562500000,,, +7.1210937500,113,910.1562500000,,, +7.1230468750,113,910.1562500000,,, +7.1250000000,114,910.1562500000,,, +7.1269531250,114,910.1562500000,,, +7.1289062500,114,910.1562500000,,, +7.1308593750,114,910.1562500000,,, +7.1328125000,114,910.1562500000,,, +7.1347656250,114,910.1562500000,,, +7.1367187500,114,910.1562500000,,, +7.1386718750,114,910.1562500000,,, +7.1406250000,114,910.1562500000,,, +7.1425781250,114,910.1562500000,,, +7.1445312500,114,910.1562500000,,, +7.1464843750,114,910.1562500000,,, +7.1484375000,114,910.1562500000,,, +7.1503906250,114,910.1562500000,,, +7.1523437500,114,910.1562500000,,, +7.1542968750,114,910.1562500000,,, +7.1562500000,114,910.1562500000,,, +7.1582031250,114,910.1562500000,,, +7.1601562500,114,910.1562500000,,, +7.1621093750,114,910.1562500000,,, +7.1640625000,114,910.1562500000,,, +7.1660156250,114,910.1562500000,,, +7.1679687500,114,910.1562500000,,, +7.1699218750,114,910.1562500000,,, +7.1718750000,114,910.1562500000,,, +7.1738281250,114,910.1562500000,,, +7.1757812500,114,910.1562500000,,, +7.1777343750,114,910.1562500000,,, +7.1796875000,114,910.1562500000,,, +7.1816406250,114,910.1562500000,,, +7.1835937500,114,910.1562500000,,, +7.1855468750,114,910.1562500000,,, +7.1875000000,115,910.1562500000,,, +7.1894531250,115,910.1562500000,,, +7.1914062500,115,910.1562500000,,, +7.1933593750,115,910.1562500000,,, +7.1953125000,115,910.1562500000,,, +7.1972656250,115,910.1562500000,,, +7.1992187500,115,910.1562500000,,, +7.2011718750,115,910.1562500000,,, +7.2031250000,115,910.1562500000,,, +7.2050781250,115,910.1562500000,,, +7.2070312500,115,910.1562500000,,, +7.2089843750,115,910.1562500000,,, +7.2109375000,115,910.1562500000,,, +7.2128906250,115,910.1562500000,,, +7.2148437500,115,910.1562500000,,, +7.2167968750,115,910.1562500000,,, +7.2187500000,115,910.1562500000,,, +7.2207031250,115,910.1562500000,,, +7.2226562500,115,910.1562500000,,, +7.2246093750,115,910.1562500000,,, +7.2265625000,115,910.1562500000,,, +7.2285156250,115,910.1562500000,,, +7.2304687500,115,910.1562500000,,, +7.2324218750,115,910.1562500000,,, +7.2343750000,115,910.1562500000,,, +7.2363281250,115,910.1562500000,,, +7.2382812500,115,910.1562500000,,, +7.2402343750,115,910.1562500000,,, +7.2421875000,115,910.1562500000,,, +7.2441406250,115,910.1562500000,,, +7.2460937500,115,910.1562500000,,, +7.2480468750,115,910.1562500000,,, +7.2500000000,116,910.1562500000,,, +7.2519531250,116,910.1562500000,,, +7.2539062500,116,910.1562500000,,, +7.2558593750,116,910.1562500000,,, +7.2578125000,116,910.1562500000,,, +7.2597656250,116,910.1562500000,,, +7.2617187500,116,910.1562500000,,, +7.2636718750,116,910.1562500000,,, +7.2656250000,116,910.1562500000,,, +7.2675781250,116,910.1562500000,,, +7.2695312500,116,910.1562500000,,, +7.2714843750,116,910.1562500000,,, +7.2734375000,116,910.1562500000,,, +7.2753906250,116,910.1562500000,,, +7.2773437500,116,910.1562500000,,, +7.2792968750,116,910.1562500000,,, +7.2812500000,116,910.1562500000,,, +7.2832031250,116,910.1562500000,,, +7.2851562500,116,910.1562500000,,, +7.2871093750,116,910.1562500000,,, +7.2890625000,116,910.1562500000,,, +7.2910156250,116,910.1562500000,,, +7.2929687500,116,910.1562500000,,, +7.2949218750,116,910.1562500000,,, +7.2968750000,116,910.1562500000,,, +7.2988281250,116,910.1562500000,,, +7.3007812500,116,910.1562500000,,, +7.3027343750,116,910.1562500000,,, +7.3046875000,116,910.1562500000,,, +7.3066406250,116,910.1562500000,,, +7.3085937500,116,910.1562500000,,, +7.3105468750,116,910.1562500000,,, +7.3125000000,117,931.6406250000,,, +7.3144531250,117,931.6406250000,,, +7.3164062500,117,931.6406250000,,, +7.3183593750,117,931.6406250000,,, +7.3203125000,117,931.6406250000,,, +7.3222656250,117,931.6406250000,,, +7.3242187500,117,931.6406250000,,, +7.3261718750,117,931.6406250000,,, +7.3281250000,117,931.6406250000,,, +7.3300781250,117,931.6406250000,,, +7.3320312500,117,931.6406250000,,, +7.3339843750,117,931.6406250000,,, +7.3359375000,117,931.6406250000,,, +7.3378906250,117,931.6406250000,,, +7.3398437500,117,931.6406250000,,, +7.3417968750,117,931.6406250000,,, +7.3437500000,117,931.6406250000,,, +7.3457031250,117,931.6406250000,,, +7.3476562500,117,931.6406250000,,, +7.3496093750,117,931.6406250000,,, +7.3515625000,117,931.6406250000,,, +7.3535156250,117,931.6406250000,,, +7.3554687500,117,931.6406250000,,, +7.3574218750,117,931.6406250000,,, +7.3593750000,117,931.6406250000,,, +7.3613281250,117,931.6406250000,,, +7.3632812500,117,931.6406250000,,, +7.3652343750,117,931.6406250000,,, +7.3671875000,117,931.6406250000,,, +7.3691406250,117,931.6406250000,,, +7.3710937500,117,931.6406250000,,, +7.3730468750,117,931.6406250000,,, +7.3750000000,118,931.6406250000,,, +7.3769531250,118,931.6406250000,,, +7.3789062500,118,931.6406250000,,, +7.3808593750,118,931.6406250000,,, +7.3828125000,118,931.6406250000,,, +7.3847656250,118,931.6406250000,,, +7.3867187500,118,931.6406250000,,, +7.3886718750,118,931.6406250000,,, +7.3906250000,118,931.6406250000,,, +7.3925781250,118,931.6406250000,,, +7.3945312500,118,931.6406250000,,, +7.3964843750,118,931.6406250000,,, +7.3984375000,118,931.6406250000,,, +7.4003906250,118,931.6406250000,,, +7.4023437500,118,931.6406250000,,, +7.4042968750,118,931.6406250000,,, +7.4062500000,118,931.6406250000,,, +7.4082031250,118,931.6406250000,,, +7.4101562500,118,931.6406250000,,, +7.4121093750,118,931.6406250000,,, +7.4140625000,118,931.6406250000,,, +7.4160156250,118,931.6406250000,,, +7.4179687500,118,931.6406250000,,, +7.4199218750,118,931.6406250000,,, +7.4218750000,118,931.6406250000,,, +7.4238281250,118,931.6406250000,,, +7.4257812500,118,931.6406250000,,, +7.4277343750,118,931.6406250000,,, +7.4296875000,118,931.6406250000,,, +7.4316406250,118,931.6406250000,,, +7.4335937500,118,931.6406250000,,, +7.4355468750,118,931.6406250000,,, +7.4375000000,119,931.6406250000,,, +7.4394531250,119,931.6406250000,,, +7.4414062500,119,931.6406250000,,, +7.4433593750,119,931.6406250000,,, +7.4453125000,119,931.6406250000,,, +7.4472656250,119,931.6406250000,,, +7.4492187500,119,931.6406250000,,, +7.4511718750,119,931.6406250000,,, +7.4531250000,119,931.6406250000,,, +7.4550781250,119,931.6406250000,,, +7.4570312500,119,931.6406250000,,, +7.4589843750,119,931.6406250000,,, +7.4609375000,119,931.6406250000,,, +7.4628906250,119,931.6406250000,,, +7.4648437500,119,931.6406250000,,, +7.4667968750,119,931.6406250000,,, +7.4687500000,119,931.6406250000,,, +7.4707031250,119,931.6406250000,,, +7.4726562500,119,931.6406250000,,, +7.4746093750,119,931.6406250000,,, +7.4765625000,119,931.6406250000,,, +7.4785156250,119,931.6406250000,,, +7.4804687500,119,931.6406250000,,, +7.4824218750,119,931.6406250000,,, +7.4843750000,119,931.6406250000,,, +7.4863281250,119,931.6406250000,,, +7.4882812500,119,931.6406250000,,, +7.4902343750,119,931.6406250000,,, +7.4921875000,119,931.6406250000,,, +7.4941406250,119,931.6406250000,,, +7.4960937500,119,931.6406250000,,, +7.4980468750,119,931.6406250000,,, +7.5000000000,120,931.6406250000,,, +7.5019531250,120,931.6406250000,,, +7.5039062500,120,931.6406250000,,, +7.5058593750,120,931.6406250000,,, +7.5078125000,120,931.6406250000,,, +7.5097656250,120,931.6406250000,,, +7.5117187500,120,931.6406250000,,, +7.5136718750,120,931.6406250000,,, +7.5156250000,120,931.6406250000,,, +7.5175781250,120,931.6406250000,,, +7.5195312500,120,931.6406250000,,, +7.5214843750,120,931.6406250000,,, +7.5234375000,120,931.6406250000,,, +7.5253906250,120,931.6406250000,,, +7.5273437500,120,931.6406250000,,, +7.5292968750,120,931.6406250000,,, +7.5312500000,120,931.6406250000,,, +7.5332031250,120,931.6406250000,,, +7.5351562500,120,931.6406250000,,, +7.5371093750,120,931.6406250000,,, +7.5390625000,120,931.6406250000,,, +7.5410156250,120,931.6406250000,,, +7.5429687500,120,931.6406250000,,, +7.5449218750,120,931.6406250000,,, +7.5468750000,120,931.6406250000,,, +7.5488281250,120,931.6406250000,,, +7.5507812500,120,931.6406250000,,, +7.5527343750,120,931.6406250000,,, +7.5546875000,120,931.6406250000,,, +7.5566406250,120,931.6406250000,,, +7.5585937500,120,931.6406250000,,, +7.5605468750,120,931.6406250000,,, +7.5625000000,121,931.6406250000,,, +7.5644531250,121,931.6406250000,,, +7.5664062500,121,931.6406250000,,, +7.5683593750,121,931.6406250000,,, +7.5703125000,121,931.6406250000,,, +7.5722656250,121,931.6406250000,,, +7.5742187500,121,931.6406250000,,, +7.5761718750,121,931.6406250000,,, +7.5781250000,121,931.6406250000,,, +7.5800781250,121,931.6406250000,,, +7.5820312500,121,931.6406250000,,, +7.5839843750,121,931.6406250000,,, +7.5859375000,121,931.6406250000,,, +7.5878906250,121,931.6406250000,,, +7.5898437500,121,931.6406250000,,, +7.5917968750,121,931.6406250000,,, +7.5937500000,121,931.6406250000,,, +7.5957031250,121,931.6406250000,,, +7.5976562500,121,931.6406250000,,, +7.5996093750,121,931.6406250000,,, +7.6015625000,121,931.6406250000,,, +7.6035156250,121,931.6406250000,,, +7.6054687500,121,931.6406250000,,, +7.6074218750,121,931.6406250000,,, +7.6093750000,121,931.6406250000,,, +7.6113281250,121,931.6406250000,,, +7.6132812500,121,931.6406250000,,, +7.6152343750,121,931.6406250000,,, +7.6171875000,121,931.6406250000,,, +7.6191406250,121,931.6406250000,,, +7.6210937500,121,931.6406250000,,, +7.6230468750,121,931.6406250000,,, +7.6250000000,122,931.6406250000,,, +7.6269531250,122,931.6406250000,,, +7.6289062500,122,931.6406250000,,, +7.6308593750,122,931.6406250000,,, +7.6328125000,122,931.6406250000,,, +7.6347656250,122,931.6406250000,,, +7.6367187500,122,931.6406250000,,, +7.6386718750,122,931.6406250000,,, +7.6406250000,122,931.6406250000,,, +7.6425781250,122,931.6406250000,,, +7.6445312500,122,931.6406250000,,, +7.6464843750,122,931.6406250000,,, +7.6484375000,122,931.6406250000,,, +7.6503906250,122,931.6406250000,,, +7.6523437500,122,931.6406250000,,, +7.6542968750,122,931.6406250000,,, +7.6562500000,122,931.6406250000,,, +7.6582031250,122,931.6406250000,,, +7.6601562500,122,931.6406250000,,, +7.6621093750,122,931.6406250000,,, +7.6640625000,122,931.6406250000,,, +7.6660156250,122,931.6406250000,,, +7.6679687500,122,931.6406250000,,, +7.6699218750,122,931.6406250000,,, +7.6718750000,122,931.6406250000,,, +7.6738281250,122,931.6406250000,,, +7.6757812500,122,931.6406250000,,, +7.6777343750,122,931.6406250000,,, +7.6796875000,122,931.6406250000,,, +7.6816406250,122,931.6406250000,,, +7.6835937500,122,931.6406250000,,, +7.6855468750,122,931.6406250000,,, +7.6875000000,123,931.6406250000,,, +7.6894531250,123,931.6406250000,,, +7.6914062500,123,931.6406250000,,, +7.6933593750,123,931.6406250000,,, +7.6953125000,123,931.6406250000,,, +7.6972656250,123,931.6406250000,,, +7.6992187500,123,931.6406250000,,, +7.7011718750,123,931.6406250000,,, +7.7031250000,123,931.6406250000,,, +7.7050781250,123,931.6406250000,,, +7.7070312500,123,931.6406250000,,, +7.7089843750,123,931.6406250000,,, +7.7109375000,123,931.6406250000,,, +7.7128906250,123,931.6406250000,,, +7.7148437500,123,931.6406250000,,, +7.7167968750,123,931.6406250000,,, +7.7187500000,123,931.6406250000,,, +7.7207031250,123,931.6406250000,,, +7.7226562500,123,931.6406250000,,, +7.7246093750,123,931.6406250000,,, +7.7265625000,123,931.6406250000,,, +7.7285156250,123,931.6406250000,,, +7.7304687500,123,931.6406250000,,, +7.7324218750,123,931.6406250000,,, +7.7343750000,123,931.6406250000,,, +7.7363281250,123,931.6406250000,,, +7.7382812500,123,931.6406250000,,, +7.7402343750,123,931.6406250000,,, +7.7421875000,123,931.6406250000,,, +7.7441406250,123,931.6406250000,,, +7.7460937500,123,931.6406250000,,, +7.7480468750,123,931.6406250000,,, +7.7500000000,124,931.6406250000,,, +7.7519531250,124,931.6406250000,,, +7.7539062500,124,931.6406250000,,, +7.7558593750,124,931.6406250000,,, +7.7578125000,124,931.6406250000,,, +7.7597656250,124,931.6406250000,,, +7.7617187500,124,931.6406250000,,, +7.7636718750,124,931.6406250000,,, +7.7656250000,124,931.6406250000,,, +7.7675781250,124,931.6406250000,,, +7.7695312500,124,931.6406250000,,, +7.7714843750,124,931.6406250000,,, +7.7734375000,124,931.6406250000,,, +7.7753906250,124,931.6406250000,,, +7.7773437500,124,931.6406250000,,, +7.7792968750,124,931.6406250000,,, +7.7812500000,124,931.6406250000,,, +7.7832031250,124,931.6406250000,,, +7.7851562500,124,931.6406250000,,, +7.7871093750,124,931.6406250000,,, +7.7890625000,124,931.6406250000,,, +7.7910156250,124,931.6406250000,,, +7.7929687500,124,931.6406250000,,, +7.7949218750,124,931.6406250000,,, +7.7968750000,124,931.6406250000,,, +7.7988281250,124,931.6406250000,,, +7.8007812500,124,931.6406250000,,, +7.8027343750,124,931.6406250000,,, +7.8046875000,124,931.6406250000,,, +7.8066406250,124,931.6406250000,,, +7.8085937500,124,931.6406250000,,, +7.8105468750,124,931.6406250000,,, +7.8125000000,125,931.6406250000,,, +7.8144531250,125,931.6406250000,,, +7.8164062500,125,931.6406250000,,, +7.8183593750,125,931.6406250000,,, +7.8203125000,125,931.6406250000,,, +7.8222656250,125,931.6406250000,,, +7.8242187500,125,931.6406250000,,, +7.8261718750,125,931.6406250000,,, +7.8281250000,125,931.6406250000,,, +7.8300781250,125,931.6406250000,,, +7.8320312500,125,931.6406250000,,, +7.8339843750,125,931.6406250000,,, +7.8359375000,125,931.6406250000,,, +7.8378906250,125,931.6406250000,,, +7.8398437500,125,931.6406250000,,, +7.8417968750,125,931.6406250000,,, +7.8437500000,125,931.6406250000,,, +7.8457031250,125,931.6406250000,,, +7.8476562500,125,931.6406250000,,, +7.8496093750,125,931.6406250000,,, +7.8515625000,125,931.6406250000,,, +7.8535156250,125,931.6406250000,,, +7.8554687500,125,931.6406250000,,, +7.8574218750,125,931.6406250000,,, +7.8593750000,125,931.6406250000,,, +7.8613281250,125,931.6406250000,,, +7.8632812500,125,931.6406250000,,, +7.8652343750,125,931.6406250000,,, +7.8671875000,125,931.6406250000,,, +7.8691406250,125,931.6406250000,,, +7.8710937500,125,931.6406250000,,, +7.8730468750,125,931.6406250000,,, +7.8750000000,126,931.6406250000,,, +7.8769531250,126,931.6406250000,,, +7.8789062500,126,931.6406250000,,, +7.8808593750,126,931.6406250000,,, +7.8828125000,126,931.6406250000,,, +7.8847656250,126,931.6406250000,,, +7.8867187500,126,931.6406250000,,, +7.8886718750,126,931.6406250000,,, +7.8906250000,126,931.6406250000,,, +7.8925781250,126,931.6406250000,,, +7.8945312500,126,931.6406250000,,, +7.8964843750,126,931.6406250000,,, +7.8984375000,126,931.6406250000,,, +7.9003906250,126,931.6406250000,,, +7.9023437500,126,931.6406250000,,, +7.9042968750,126,931.6406250000,,, +7.9062500000,126,931.6406250000,,, +7.9082031250,126,931.6406250000,,, +7.9101562500,126,931.6406250000,,, +7.9121093750,126,931.6406250000,,, +7.9140625000,126,931.6406250000,,, +7.9160156250,126,931.6406250000,,, +7.9179687500,126,931.6406250000,,, +7.9199218750,126,931.6406250000,,, +7.9218750000,126,931.6406250000,,, +7.9238281250,126,931.6406250000,,, +7.9257812500,126,931.6406250000,,, +7.9277343750,126,931.6406250000,,, +7.9296875000,126,931.6406250000,,, +7.9316406250,126,931.6406250000,,, +7.9335937500,126,931.6406250000,,, +7.9355468750,126,931.6406250000,,, +7.9375000000,127,931.6406250000,,, +7.9394531250,127,931.6406250000,,, +7.9414062500,127,931.6406250000,,, +7.9433593750,127,931.6406250000,,, +7.9453125000,127,931.6406250000,,, +7.9472656250,127,931.6406250000,,, +7.9492187500,127,931.6406250000,,, +7.9511718750,127,931.6406250000,,, +7.9531250000,127,931.6406250000,,, +7.9550781250,127,931.6406250000,,, +7.9570312500,127,931.6406250000,,, +7.9589843750,127,931.6406250000,,, +7.9609375000,127,931.6406250000,,, +7.9628906250,127,931.6406250000,,, +7.9648437500,127,931.6406250000,,, +7.9667968750,127,931.6406250000,,, +7.9687500000,127,931.6406250000,,, +7.9707031250,127,931.6406250000,,, +7.9726562500,127,931.6406250000,,, +7.9746093750,127,931.6406250000,,, +7.9765625000,127,931.6406250000,,, +7.9785156250,127,931.6406250000,,, +7.9804687500,127,931.6406250000,,, +7.9824218750,127,931.6406250000,,, +7.9843750000,127,931.6406250000,,, +7.9863281250,127,931.6406250000,,, +7.9882812500,127,931.6406250000,,, +7.9902343750,127,931.6406250000,,, +7.9921875000,127,931.6406250000,,, +7.9941406250,127,931.6406250000,,, +7.9960937500,127,931.6406250000,,, +7.9980468750,127,931.6406250000,,, +8.0000000000,128,931.6406250000,,, +8.0019531250,128,931.6406250000,,, +8.0039062500,128,931.6406250000,,, +8.0058593750,128,931.6406250000,,, +8.0078125000,128,931.6406250000,,, +8.0097656250,128,931.6406250000,,, +8.0117187500,128,931.6406250000,,, +8.0136718750,128,931.6406250000,,, +8.0156250000,128,931.6406250000,,, +8.0175781250,128,931.6406250000,,, +8.0195312500,128,931.6406250000,,, +8.0214843750,128,931.6406250000,,, +8.0234375000,128,931.6406250000,,, +8.0253906250,128,931.6406250000,,, +8.0273437500,128,931.6406250000,,, +8.0292968750,128,931.6406250000,,, +8.0312500000,128,931.6406250000,,, +8.0332031250,128,931.6406250000,,, +8.0351562500,128,931.6406250000,,, +8.0371093750,128,931.6406250000,,, +8.0390625000,128,931.6406250000,,, +8.0410156250,128,931.6406250000,,, +8.0429687500,128,931.6406250000,,, +8.0449218750,128,931.6406250000,,, +8.0468750000,128,931.6406250000,,, +8.0488281250,128,931.6406250000,,, +8.0507812500,128,931.6406250000,,, +8.0527343750,128,931.6406250000,,, +8.0546875000,128,931.6406250000,,, +8.0566406250,128,931.6406250000,,, +8.0585937500,128,931.6406250000,,, +8.0605468750,128,931.6406250000,,, +8.0625000000,129,931.6406250000,,, +8.0644531250,129,931.6406250000,,, +8.0664062500,129,931.6406250000,,, +8.0683593750,129,931.6406250000,,, +8.0703125000,129,931.6406250000,,, +8.0722656250,129,931.6406250000,,, +8.0742187500,129,931.6406250000,,, +8.0761718750,129,931.6406250000,,, +8.0781250000,129,931.6406250000,,, +8.0800781250,129,931.6406250000,,, +8.0820312500,129,931.6406250000,,, +8.0839843750,129,931.6406250000,,, +8.0859375000,129,931.6406250000,,, +8.0878906250,129,931.6406250000,,, +8.0898437500,129,931.6406250000,,, +8.0917968750,129,931.6406250000,,, +8.0937500000,129,931.6406250000,,, +8.0957031250,129,931.6406250000,,, +8.0976562500,129,931.6406250000,,, +8.0996093750,129,931.6406250000,,, +8.1015625000,129,931.6406250000,,, +8.1035156250,129,931.6406250000,,, +8.1054687500,129,931.6406250000,,, +8.1074218750,129,931.6406250000,,, +8.1093750000,129,931.6406250000,,, +8.1113281250,129,931.6406250000,,, +8.1132812500,129,931.6406250000,,, +8.1152343750,129,931.6406250000,,, +8.1171875000,129,931.6406250000,,, +8.1191406250,129,931.6406250000,,, +8.1210937500,129,931.6406250000,,, +8.1230468750,129,931.6406250000,,, +8.1250000000,130,884.7656250000,,, +8.1269531250,130,884.7656250000,,, +8.1289062500,130,884.7656250000,,, +8.1308593750,130,884.7656250000,,, +8.1328125000,130,884.7656250000,,, +8.1347656250,130,884.7656250000,,, +8.1367187500,130,884.7656250000,,, +8.1386718750,130,884.7656250000,,, +8.1406250000,130,884.7656250000,,, +8.1425781250,130,884.7656250000,,, +8.1445312500,130,884.7656250000,,, +8.1464843750,130,884.7656250000,,, +8.1484375000,130,884.7656250000,,, +8.1503906250,130,884.7656250000,,, +8.1523437500,130,884.7656250000,,, +8.1542968750,130,884.7656250000,,, +8.1562500000,130,884.7656250000,,, +8.1582031250,130,884.7656250000,,, +8.1601562500,130,884.7656250000,,, +8.1621093750,130,884.7656250000,,, +8.1640625000,130,884.7656250000,,, +8.1660156250,130,884.7656250000,,, +8.1679687500,130,884.7656250000,,, +8.1699218750,130,884.7656250000,,, +8.1718750000,130,884.7656250000,,, +8.1738281250,130,884.7656250000,,, +8.1757812500,130,884.7656250000,,, +8.1777343750,130,884.7656250000,,, +8.1796875000,130,884.7656250000,,, +8.1816406250,130,884.7656250000,,, +8.1835937500,130,884.7656250000,,, +8.1855468750,130,884.7656250000,,, +8.1875000000,131,884.7656250000,,, +8.1894531250,131,884.7656250000,,, +8.1914062500,131,884.7656250000,,, +8.1933593750,131,884.7656250000,,, +8.1953125000,131,884.7656250000,,, +8.1972656250,131,884.7656250000,,, +8.1992187500,131,884.7656250000,,, +8.2011718750,131,884.7656250000,,, +8.2031250000,131,884.7656250000,,, +8.2050781250,131,884.7656250000,,, +8.2070312500,131,884.7656250000,,, +8.2089843750,131,884.7656250000,,, +8.2109375000,131,884.7656250000,,, +8.2128906250,131,884.7656250000,,, +8.2148437500,131,884.7656250000,,, +8.2167968750,131,884.7656250000,,, +8.2187500000,131,884.7656250000,,, +8.2207031250,131,884.7656250000,,, +8.2226562500,131,884.7656250000,,, +8.2246093750,131,884.7656250000,,, +8.2265625000,131,884.7656250000,,, +8.2285156250,131,884.7656250000,,, +8.2304687500,131,884.7656250000,,, +8.2324218750,131,884.7656250000,,, +8.2343750000,131,884.7656250000,,, +8.2363281250,131,884.7656250000,,, +8.2382812500,131,884.7656250000,,, +8.2402343750,131,884.7656250000,,, +8.2421875000,131,884.7656250000,,, +8.2441406250,131,884.7656250000,,, +8.2460937500,131,884.7656250000,,, +8.2480468750,131,884.7656250000,,, +8.2500000000,132,884.7656250000,,, +8.2519531250,132,884.7656250000,,, +8.2539062500,132,884.7656250000,,, +8.2558593750,132,884.7656250000,,, +8.2578125000,132,884.7656250000,,, +8.2597656250,132,884.7656250000,,, +8.2617187500,132,884.7656250000,,, +8.2636718750,132,884.7656250000,,, +8.2656250000,132,884.7656250000,,, +8.2675781250,132,884.7656250000,,, +8.2695312500,132,884.7656250000,,, +8.2714843750,132,884.7656250000,,, +8.2734375000,132,884.7656250000,,, +8.2753906250,132,884.7656250000,,, +8.2773437500,132,884.7656250000,,, +8.2792968750,132,884.7656250000,,, +8.2812500000,132,884.7656250000,,, +8.2832031250,132,884.7656250000,,, +8.2851562500,132,884.7656250000,,, +8.2871093750,132,884.7656250000,,, +8.2890625000,132,884.7656250000,,, +8.2910156250,132,884.7656250000,,, +8.2929687500,132,884.7656250000,,, +8.2949218750,132,884.7656250000,,, +8.2968750000,132,884.7656250000,,, +8.2988281250,132,884.7656250000,,, +8.3007812500,132,884.7656250000,,, +8.3027343750,132,884.7656250000,,, +8.3046875000,132,884.7656250000,,, +8.3066406250,132,884.7656250000,,, +8.3085937500,132,884.7656250000,,, +8.3105468750,132,884.7656250000,,, +8.3125000000,133,884.7656250000,,, +8.3144531250,133,884.7656250000,,, +8.3164062500,133,884.7656250000,,, +8.3183593750,133,884.7656250000,,, +8.3203125000,133,884.7656250000,,, +8.3222656250,133,884.7656250000,,, +8.3242187500,133,884.7656250000,,, +8.3261718750,133,884.7656250000,,, +8.3281250000,133,884.7656250000,,, +8.3300781250,133,884.7656250000,,, +8.3320312500,133,884.7656250000,,, +8.3339843750,133,884.7656250000,,, +8.3359375000,133,884.7656250000,,, +8.3378906250,133,884.7656250000,,, +8.3398437500,133,884.7656250000,,, +8.3417968750,133,884.7656250000,,, +8.3437500000,133,884.7656250000,,, +8.3457031250,133,884.7656250000,,, +8.3476562500,133,884.7656250000,,, +8.3496093750,133,884.7656250000,,, +8.3515625000,133,884.7656250000,,, +8.3535156250,133,884.7656250000,,, +8.3554687500,133,884.7656250000,,, +8.3574218750,133,884.7656250000,,, +8.3593750000,133,884.7656250000,,, +8.3613281250,133,884.7656250000,,, +8.3632812500,133,884.7656250000,,, +8.3652343750,133,884.7656250000,,, +8.3671875000,133,884.7656250000,,, +8.3691406250,133,884.7656250000,,, +8.3710937500,133,884.7656250000,,, +8.3730468750,133,884.7656250000,,, +8.3750000000,134,884.7656250000,,, +8.3769531250,134,884.7656250000,,, +8.3789062500,134,884.7656250000,,, +8.3808593750,134,884.7656250000,,, +8.3828125000,134,884.7656250000,,, +8.3847656250,134,884.7656250000,,, +8.3867187500,134,884.7656250000,,, +8.3886718750,134,884.7656250000,,, +8.3906250000,134,884.7656250000,,, +8.3925781250,134,884.7656250000,,, +8.3945312500,134,884.7656250000,,, +8.3964843750,134,884.7656250000,,, +8.3984375000,134,884.7656250000,,, +8.4003906250,134,884.7656250000,,, +8.4023437500,134,884.7656250000,,, +8.4042968750,134,884.7656250000,,, +8.4062500000,134,884.7656250000,,, +8.4082031250,134,884.7656250000,,, +8.4101562500,134,884.7656250000,,, +8.4121093750,134,884.7656250000,,, +8.4140625000,134,884.7656250000,,, +8.4160156250,134,884.7656250000,,, +8.4179687500,134,884.7656250000,,, +8.4199218750,134,884.7656250000,,, +8.4218750000,134,884.7656250000,,, +8.4238281250,134,884.7656250000,,, +8.4257812500,134,884.7656250000,,, +8.4277343750,134,884.7656250000,,, +8.4296875000,134,884.7656250000,,, +8.4316406250,134,884.7656250000,,, +8.4335937500,134,884.7656250000,,, +8.4355468750,134,884.7656250000,,, +8.4375000000,135,884.7656250000,,, +8.4394531250,135,884.7656250000,,, +8.4414062500,135,884.7656250000,,, +8.4433593750,135,884.7656250000,,, +8.4453125000,135,884.7656250000,,, +8.4472656250,135,884.7656250000,,, +8.4492187500,135,884.7656250000,,, +8.4511718750,135,884.7656250000,,, +8.4531250000,135,884.7656250000,,, +8.4550781250,135,884.7656250000,,, +8.4570312500,135,884.7656250000,,, +8.4589843750,135,884.7656250000,,, +8.4609375000,135,884.7656250000,,, +8.4628906250,135,884.7656250000,,, +8.4648437500,135,884.7656250000,,, +8.4667968750,135,884.7656250000,,, +8.4687500000,135,884.7656250000,,, +8.4707031250,135,884.7656250000,,, +8.4726562500,135,884.7656250000,,, +8.4746093750,135,884.7656250000,,, +8.4765625000,135,884.7656250000,,, +8.4785156250,135,884.7656250000,,, +8.4804687500,135,884.7656250000,,, +8.4824218750,135,884.7656250000,,, +8.4843750000,135,884.7656250000,,, +8.4863281250,135,884.7656250000,,, +8.4882812500,135,884.7656250000,,, +8.4902343750,135,884.7656250000,,, +8.4921875000,135,884.7656250000,,, +8.4941406250,135,884.7656250000,,, +8.4960937500,135,884.7656250000,,, +8.4980468750,135,884.7656250000,,, +8.5000000000,136,884.7656250000,,, +8.5019531250,136,884.7656250000,,, +8.5039062500,136,884.7656250000,,, +8.5058593750,136,884.7656250000,,, +8.5078125000,136,884.7656250000,,, +8.5097656250,136,884.7656250000,,, +8.5117187500,136,884.7656250000,,, +8.5136718750,136,884.7656250000,,, +8.5156250000,136,884.7656250000,,, +8.5175781250,136,884.7656250000,,, +8.5195312500,136,884.7656250000,,, +8.5214843750,136,884.7656250000,,, +8.5234375000,136,884.7656250000,,, +8.5253906250,136,884.7656250000,,, +8.5273437500,136,884.7656250000,,, +8.5292968750,136,884.7656250000,,, +8.5312500000,136,884.7656250000,,, +8.5332031250,136,884.7656250000,,, +8.5351562500,136,884.7656250000,,, +8.5371093750,136,884.7656250000,,, +8.5390625000,136,884.7656250000,,, +8.5410156250,136,884.7656250000,,, +8.5429687500,136,884.7656250000,,, +8.5449218750,136,884.7656250000,,, +8.5468750000,136,884.7656250000,,, +8.5488281250,136,884.7656250000,,, +8.5507812500,136,884.7656250000,,, +8.5527343750,136,884.7656250000,,, +8.5546875000,136,884.7656250000,,, +8.5566406250,136,884.7656250000,,, +8.5585937500,136,884.7656250000,,, +8.5605468750,136,884.7656250000,,, +8.5625000000,137,884.7656250000,,, +8.5644531250,137,884.7656250000,,, +8.5664062500,137,884.7656250000,,, +8.5683593750,137,884.7656250000,,, +8.5703125000,137,884.7656250000,,, +8.5722656250,137,884.7656250000,,, +8.5742187500,137,884.7656250000,,, +8.5761718750,137,884.7656250000,,, +8.5781250000,137,884.7656250000,,, +8.5800781250,137,884.7656250000,,, +8.5820312500,137,884.7656250000,,, +8.5839843750,137,884.7656250000,,, +8.5859375000,137,884.7656250000,,, +8.5878906250,137,884.7656250000,,, +8.5898437500,137,884.7656250000,,, +8.5917968750,137,884.7656250000,,, +8.5937500000,137,884.7656250000,,, +8.5957031250,137,884.7656250000,,, +8.5976562500,137,884.7656250000,,, +8.5996093750,137,884.7656250000,,, +8.6015625000,137,884.7656250000,,, +8.6035156250,137,884.7656250000,,, +8.6054687500,137,884.7656250000,,, +8.6074218750,137,884.7656250000,,, +8.6093750000,137,884.7656250000,,, +8.6113281250,137,884.7656250000,,, +8.6132812500,137,884.7656250000,,, +8.6152343750,137,884.7656250000,,, +8.6171875000,137,884.7656250000,,, +8.6191406250,137,884.7656250000,,, +8.6210937500,137,884.7656250000,,, +8.6230468750,137,884.7656250000,,, +8.6250000000,138,884.7656250000,,, +8.6269531250,138,884.7656250000,,, +8.6289062500,138,884.7656250000,,, +8.6308593750,138,884.7656250000,,, +8.6328125000,138,884.7656250000,,, +8.6347656250,138,884.7656250000,,, +8.6367187500,138,884.7656250000,,, +8.6386718750,138,884.7656250000,,, +8.6406250000,138,884.7656250000,,, +8.6425781250,138,884.7656250000,,, +8.6445312500,138,884.7656250000,,, +8.6464843750,138,884.7656250000,,, +8.6484375000,138,884.7656250000,,, +8.6503906250,138,884.7656250000,,, +8.6523437500,138,884.7656250000,,, +8.6542968750,138,884.7656250000,,, +8.6562500000,138,884.7656250000,,, +8.6582031250,138,884.7656250000,,, +8.6601562500,138,884.7656250000,,, +8.6621093750,138,884.7656250000,,, +8.6640625000,138,884.7656250000,,, +8.6660156250,138,884.7656250000,,, +8.6679687500,138,884.7656250000,,, +8.6699218750,138,884.7656250000,,, +8.6718750000,138,884.7656250000,,, +8.6738281250,138,884.7656250000,,, +8.6757812500,138,884.7656250000,,, +8.6777343750,138,884.7656250000,,, +8.6796875000,138,884.7656250000,,, +8.6816406250,138,884.7656250000,,, +8.6835937500,138,884.7656250000,,, +8.6855468750,138,884.7656250000,,, +8.6875000000,139,884.7656250000,,, +8.6894531250,139,884.7656250000,,, +8.6914062500,139,884.7656250000,,, +8.6933593750,139,884.7656250000,,, +8.6953125000,139,884.7656250000,,, +8.6972656250,139,884.7656250000,,, +8.6992187500,139,884.7656250000,,, +8.7011718750,139,884.7656250000,,, +8.7031250000,139,884.7656250000,,, +8.7050781250,139,884.7656250000,,, +8.7070312500,139,884.7656250000,,, +8.7089843750,139,884.7656250000,,, +8.7109375000,139,884.7656250000,,, +8.7128906250,139,884.7656250000,,, +8.7148437500,139,884.7656250000,,, +8.7167968750,139,884.7656250000,,, +8.7187500000,139,884.7656250000,,, +8.7207031250,139,884.7656250000,,, +8.7226562500,139,884.7656250000,,, +8.7246093750,139,884.7656250000,,, +8.7265625000,139,884.7656250000,,, +8.7285156250,139,884.7656250000,,, +8.7304687500,139,884.7656250000,,, +8.7324218750,139,884.7656250000,,, +8.7343750000,139,884.7656250000,,, +8.7363281250,139,884.7656250000,,, +8.7382812500,139,884.7656250000,,, +8.7402343750,139,884.7656250000,,, +8.7421875000,139,884.7656250000,,, +8.7441406250,139,884.7656250000,,, +8.7460937500,139,884.7656250000,,, +8.7480468750,139,884.7656250000,,, +8.7500000000,140,884.7656250000,,, +8.7519531250,140,884.7656250000,,, +8.7539062500,140,884.7656250000,,, +8.7558593750,140,884.7656250000,,, +8.7578125000,140,884.7656250000,,, +8.7597656250,140,884.7656250000,,, +8.7617187500,140,884.7656250000,,, +8.7636718750,140,884.7656250000,,, +8.7656250000,140,884.7656250000,,, +8.7675781250,140,884.7656250000,,, +8.7695312500,140,884.7656250000,,, +8.7714843750,140,884.7656250000,,, +8.7734375000,140,884.7656250000,,, +8.7753906250,140,884.7656250000,,, +8.7773437500,140,884.7656250000,,, +8.7792968750,140,884.7656250000,,, +8.7812500000,140,884.7656250000,,, +8.7832031250,140,884.7656250000,,, +8.7851562500,140,884.7656250000,,, +8.7871093750,140,884.7656250000,,, +8.7890625000,140,884.7656250000,,, +8.7910156250,140,884.7656250000,,, +8.7929687500,140,884.7656250000,,, +8.7949218750,140,884.7656250000,,, +8.7968750000,140,884.7656250000,,, +8.7988281250,140,884.7656250000,,, +8.8007812500,140,884.7656250000,,, +8.8027343750,140,884.7656250000,,, +8.8046875000,140,884.7656250000,,, +8.8066406250,140,884.7656250000,,, +8.8085937500,140,884.7656250000,,, +8.8105468750,140,884.7656250000,,, +8.8125000000,141,884.7656250000,,, +8.8144531250,141,884.7656250000,,, +8.8164062500,141,884.7656250000,,, +8.8183593750,141,884.7656250000,,, +8.8203125000,141,884.7656250000,,, +8.8222656250,141,884.7656250000,,, +8.8242187500,141,884.7656250000,,, +8.8261718750,141,884.7656250000,,, +8.8281250000,141,884.7656250000,,, +8.8300781250,141,884.7656250000,,, +8.8320312500,141,884.7656250000,,, +8.8339843750,141,884.7656250000,,, +8.8359375000,141,884.7656250000,,, +8.8378906250,141,884.7656250000,,, +8.8398437500,141,884.7656250000,,, +8.8417968750,141,884.7656250000,,, +8.8437500000,141,884.7656250000,,, +8.8457031250,141,884.7656250000,,, +8.8476562500,141,884.7656250000,,, +8.8496093750,141,884.7656250000,,, +8.8515625000,141,884.7656250000,,, +8.8535156250,141,884.7656250000,,, +8.8554687500,141,884.7656250000,,, +8.8574218750,141,884.7656250000,,, +8.8593750000,141,884.7656250000,,, +8.8613281250,141,884.7656250000,,, +8.8632812500,141,884.7656250000,,, +8.8652343750,141,884.7656250000,,, +8.8671875000,141,884.7656250000,,, +8.8691406250,141,884.7656250000,,, +8.8710937500,141,884.7656250000,,, +8.8730468750,141,884.7656250000,,, +8.8750000000,142,884.7656250000,,, +8.8769531250,142,884.7656250000,,, +8.8789062500,142,884.7656250000,,, +8.8808593750,142,884.7656250000,,, +8.8828125000,142,884.7656250000,,, +8.8847656250,142,884.7656250000,,, +8.8867187500,142,884.7656250000,,, +8.8886718750,142,884.7656250000,,, +8.8906250000,142,884.7656250000,,, +8.8925781250,142,884.7656250000,,, +8.8945312500,142,884.7656250000,,, +8.8964843750,142,884.7656250000,,, +8.8984375000,142,884.7656250000,,, +8.9003906250,142,884.7656250000,,, +8.9023437500,142,884.7656250000,,, +8.9042968750,142,884.7656250000,,, +8.9062500000,142,884.7656250000,,, +8.9082031250,142,884.7656250000,,, +8.9101562500,142,884.7656250000,,, +8.9121093750,142,884.7656250000,,, +8.9140625000,142,884.7656250000,,, +8.9160156250,142,884.7656250000,,, +8.9179687500,142,884.7656250000,,, +8.9199218750,142,884.7656250000,,, +8.9218750000,142,884.7656250000,,, +8.9238281250,142,884.7656250000,,, +8.9257812500,142,884.7656250000,,, +8.9277343750,142,884.7656250000,,, +8.9296875000,142,884.7656250000,,, +8.9316406250,142,884.7656250000,,, +8.9335937500,142,884.7656250000,,, +8.9355468750,142,884.7656250000,,, +8.9375000000,143,884.7656250000,,, +8.9394531250,143,884.7656250000,,, +8.9414062500,143,884.7656250000,,, +8.9433593750,143,884.7656250000,,, +8.9453125000,143,884.7656250000,,, +8.9472656250,143,884.7656250000,,, +8.9492187500,143,884.7656250000,,, +8.9511718750,143,884.7656250000,,, +8.9531250000,143,884.7656250000,,, +8.9550781250,143,884.7656250000,,, +8.9570312500,143,884.7656250000,,, +8.9589843750,143,884.7656250000,,, +8.9609375000,143,884.7656250000,,, +8.9628906250,143,884.7656250000,,, +8.9648437500,143,884.7656250000,,, +8.9667968750,143,884.7656250000,,, +8.9687500000,143,884.7656250000,,, +8.9707031250,143,884.7656250000,,, +8.9726562500,143,884.7656250000,,, +8.9746093750,143,884.7656250000,,, +8.9765625000,143,884.7656250000,,, +8.9785156250,143,884.7656250000,,, +8.9804687500,143,884.7656250000,,, +8.9824218750,143,884.7656250000,,, +8.9843750000,143,884.7656250000,,, +8.9863281250,143,884.7656250000,,, +8.9882812500,143,884.7656250000,,, +8.9902343750,143,884.7656250000,,, +8.9921875000,143,884.7656250000,,, +8.9941406250,143,884.7656250000,,, +8.9960937500,143,884.7656250000,,, +8.9980468750,143,884.7656250000,,, +9.0000000000,144,884.7656250000,,, +9.0019531250,144,884.7656250000,,, +9.0039062500,144,884.7656250000,,, +9.0058593750,144,884.7656250000,,, +9.0078125000,144,884.7656250000,,, +9.0097656250,144,884.7656250000,,, +9.0117187500,144,884.7656250000,,, +9.0136718750,144,884.7656250000,,, +9.0156250000,144,884.7656250000,,, +9.0175781250,144,884.7656250000,,, +9.0195312500,144,884.7656250000,,, +9.0214843750,144,884.7656250000,,, +9.0234375000,144,884.7656250000,,, +9.0253906250,144,884.7656250000,,, +9.0273437500,144,884.7656250000,,, +9.0292968750,144,884.7656250000,,, +9.0312500000,144,884.7656250000,,, +9.0332031250,144,884.7656250000,,, +9.0351562500,144,884.7656250000,,, +9.0371093750,144,884.7656250000,,, +9.0390625000,144,884.7656250000,,, +9.0410156250,144,884.7656250000,,, +9.0429687500,144,884.7656250000,,, +9.0449218750,144,884.7656250000,,, +9.0468750000,144,884.7656250000,,, +9.0488281250,144,884.7656250000,,, +9.0507812500,144,884.7656250000,,, +9.0527343750,144,884.7656250000,,, +9.0546875000,144,884.7656250000,,, +9.0566406250,144,884.7656250000,,, +9.0585937500,144,884.7656250000,,, +9.0605468750,144,884.7656250000,,, +9.0625000000,145,857.4218750000,,, +9.0644531250,145,857.4218750000,,, +9.0664062500,145,857.4218750000,,, +9.0683593750,145,857.4218750000,,, +9.0703125000,145,857.4218750000,,, +9.0722656250,145,857.4218750000,,, +9.0742187500,145,857.4218750000,,, +9.0761718750,145,857.4218750000,,, +9.0781250000,145,857.4218750000,,, +9.0800781250,145,857.4218750000,,, +9.0820312500,145,857.4218750000,,, +9.0839843750,145,857.4218750000,,, +9.0859375000,145,857.4218750000,,, +9.0878906250,145,857.4218750000,,, +9.0898437500,145,857.4218750000,,, +9.0917968750,145,857.4218750000,,, +9.0937500000,145,857.4218750000,,, +9.0957031250,145,857.4218750000,,, +9.0976562500,145,857.4218750000,,, +9.0996093750,145,857.4218750000,,, +9.1015625000,145,857.4218750000,,, +9.1035156250,145,857.4218750000,,, +9.1054687500,145,857.4218750000,,, +9.1074218750,145,857.4218750000,,, +9.1093750000,145,857.4218750000,,, +9.1113281250,145,857.4218750000,,, +9.1132812500,145,857.4218750000,,, +9.1152343750,145,857.4218750000,,, +9.1171875000,145,857.4218750000,,, +9.1191406250,145,857.4218750000,,, +9.1210937500,145,857.4218750000,,, +9.1230468750,145,857.4218750000,,, +9.1250000000,146,857.4218750000,,, +9.1269531250,146,857.4218750000,,, +9.1289062500,146,857.4218750000,,, +9.1308593750,146,857.4218750000,,, +9.1328125000,146,857.4218750000,,, +9.1347656250,146,857.4218750000,,, +9.1367187500,146,857.4218750000,,, +9.1386718750,146,857.4218750000,,, +9.1406250000,146,857.4218750000,,, +9.1425781250,146,857.4218750000,,, +9.1445312500,146,857.4218750000,,, +9.1464843750,146,857.4218750000,,, +9.1484375000,146,857.4218750000,,, +9.1503906250,146,857.4218750000,,, +9.1523437500,146,857.4218750000,,, +9.1542968750,146,857.4218750000,,, +9.1562500000,146,857.4218750000,,, +9.1582031250,146,857.4218750000,,, +9.1601562500,146,857.4218750000,,, +9.1621093750,146,857.4218750000,,, +9.1640625000,146,857.4218750000,,, +9.1660156250,146,857.4218750000,,, +9.1679687500,146,857.4218750000,,, +9.1699218750,146,857.4218750000,,, +9.1718750000,146,857.4218750000,,, +9.1738281250,146,857.4218750000,,, +9.1757812500,146,857.4218750000,,, +9.1777343750,146,857.4218750000,,, +9.1796875000,146,857.4218750000,,, +9.1816406250,146,857.4218750000,,, +9.1835937500,146,857.4218750000,,, +9.1855468750,146,857.4218750000,,, +9.1875000000,147,857.4218750000,,, +9.1894531250,147,857.4218750000,,, +9.1914062500,147,857.4218750000,,, +9.1933593750,147,857.4218750000,,, +9.1953125000,147,857.4218750000,,, +9.1972656250,147,857.4218750000,,, +9.1992187500,147,857.4218750000,,, +9.2011718750,147,857.4218750000,,, +9.2031250000,147,857.4218750000,,, +9.2050781250,147,857.4218750000,,, +9.2070312500,147,857.4218750000,,, +9.2089843750,147,857.4218750000,,, +9.2109375000,147,857.4218750000,,, +9.2128906250,147,857.4218750000,,, +9.2148437500,147,857.4218750000,,, +9.2167968750,147,857.4218750000,,, +9.2187500000,147,857.4218750000,,, +9.2207031250,147,857.4218750000,,, +9.2226562500,147,857.4218750000,,, +9.2246093750,147,857.4218750000,,, +9.2265625000,147,857.4218750000,,, +9.2285156250,147,857.4218750000,,, +9.2304687500,147,857.4218750000,,, +9.2324218750,147,857.4218750000,,, +9.2343750000,147,857.4218750000,,, +9.2363281250,147,857.4218750000,,, +9.2382812500,147,857.4218750000,,, +9.2402343750,147,857.4218750000,,, +9.2421875000,147,857.4218750000,,, +9.2441406250,147,857.4218750000,,, +9.2460937500,147,857.4218750000,,, +9.2480468750,147,857.4218750000,,, +9.2500000000,148,857.4218750000,,, +9.2519531250,148,857.4218750000,,, +9.2539062500,148,857.4218750000,,, +9.2558593750,148,857.4218750000,,, +9.2578125000,148,857.4218750000,,, +9.2597656250,148,857.4218750000,,, +9.2617187500,148,857.4218750000,,, +9.2636718750,148,857.4218750000,,, +9.2656250000,148,857.4218750000,,, +9.2675781250,148,857.4218750000,,, +9.2695312500,148,857.4218750000,,, +9.2714843750,148,857.4218750000,,, +9.2734375000,148,857.4218750000,,, +9.2753906250,148,857.4218750000,,, +9.2773437500,148,857.4218750000,,, +9.2792968750,148,857.4218750000,,, +9.2812500000,148,857.4218750000,,, +9.2832031250,148,857.4218750000,,, +9.2851562500,148,857.4218750000,,, +9.2871093750,148,857.4218750000,,, +9.2890625000,148,857.4218750000,,, +9.2910156250,148,857.4218750000,,, +9.2929687500,148,857.4218750000,,, +9.2949218750,148,857.4218750000,,, +9.2968750000,148,857.4218750000,,, +9.2988281250,148,857.4218750000,,, +9.3007812500,148,857.4218750000,,, +9.3027343750,148,857.4218750000,,, +9.3046875000,148,857.4218750000,,, +9.3066406250,148,857.4218750000,,, +9.3085937500,148,857.4218750000,,, +9.3105468750,148,857.4218750000,,, +9.3125000000,149,857.4218750000,,, +9.3144531250,149,857.4218750000,,, +9.3164062500,149,857.4218750000,,, +9.3183593750,149,857.4218750000,,, +9.3203125000,149,857.4218750000,,, +9.3222656250,149,857.4218750000,,, +9.3242187500,149,857.4218750000,,, +9.3261718750,149,857.4218750000,,, +9.3281250000,149,857.4218750000,,, +9.3300781250,149,857.4218750000,,, +9.3320312500,149,857.4218750000,,, +9.3339843750,149,857.4218750000,,, +9.3359375000,149,857.4218750000,,, +9.3378906250,149,857.4218750000,,, +9.3398437500,149,857.4218750000,,, +9.3417968750,149,857.4218750000,,, +9.3437500000,149,857.4218750000,,, +9.3457031250,149,857.4218750000,,, +9.3476562500,149,857.4218750000,,, +9.3496093750,149,857.4218750000,,, +9.3515625000,149,857.4218750000,,, +9.3535156250,149,857.4218750000,,, +9.3554687500,149,857.4218750000,,, +9.3574218750,149,857.4218750000,,, +9.3593750000,149,857.4218750000,,, +9.3613281250,149,857.4218750000,,, +9.3632812500,149,857.4218750000,,, +9.3652343750,149,857.4218750000,,, +9.3671875000,149,857.4218750000,,, +9.3691406250,149,857.4218750000,,, +9.3710937500,149,857.4218750000,,, +9.3730468750,149,857.4218750000,,, +9.3750000000,150,857.4218750000,,, +9.3769531250,150,857.4218750000,,, +9.3789062500,150,857.4218750000,,, +9.3808593750,150,857.4218750000,,, +9.3828125000,150,857.4218750000,,, +9.3847656250,150,857.4218750000,,, +9.3867187500,150,857.4218750000,,, +9.3886718750,150,857.4218750000,,, +9.3906250000,150,857.4218750000,,, +9.3925781250,150,857.4218750000,,, +9.3945312500,150,857.4218750000,,, +9.3964843750,150,857.4218750000,,, +9.3984375000,150,857.4218750000,,, +9.4003906250,150,857.4218750000,,, +9.4023437500,150,857.4218750000,,, +9.4042968750,150,857.4218750000,,, +9.4062500000,150,857.4218750000,,, +9.4082031250,150,857.4218750000,,, +9.4101562500,150,857.4218750000,,, +9.4121093750,150,857.4218750000,,, +9.4140625000,150,857.4218750000,,, +9.4160156250,150,857.4218750000,,, +9.4179687500,150,857.4218750000,,, +9.4199218750,150,857.4218750000,,, +9.4218750000,150,857.4218750000,,, +9.4238281250,150,857.4218750000,,, +9.4257812500,150,857.4218750000,,, +9.4277343750,150,857.4218750000,,, +9.4296875000,150,857.4218750000,,, +9.4316406250,150,857.4218750000,,, +9.4335937500,150,857.4218750000,,, +9.4355468750,150,857.4218750000,,, +9.4375000000,151,857.4218750000,,, +9.4394531250,151,857.4218750000,,, +9.4414062500,151,857.4218750000,,, +9.4433593750,151,857.4218750000,,, +9.4453125000,151,857.4218750000,,, +9.4472656250,151,857.4218750000,,, +9.4492187500,151,857.4218750000,,, +9.4511718750,151,857.4218750000,,, +9.4531250000,151,857.4218750000,,, +9.4550781250,151,857.4218750000,,, +9.4570312500,151,857.4218750000,,, +9.4589843750,151,857.4218750000,,, +9.4609375000,151,857.4218750000,,, +9.4628906250,151,857.4218750000,,, +9.4648437500,151,857.4218750000,,, +9.4667968750,151,857.4218750000,,, +9.4687500000,151,857.4218750000,,, +9.4707031250,151,857.4218750000,,, +9.4726562500,151,857.4218750000,,, +9.4746093750,151,857.4218750000,,, +9.4765625000,151,857.4218750000,,, +9.4785156250,151,857.4218750000,,, +9.4804687500,151,857.4218750000,,, +9.4824218750,151,857.4218750000,,, +9.4843750000,151,857.4218750000,,, +9.4863281250,151,857.4218750000,,, +9.4882812500,151,857.4218750000,,, +9.4902343750,151,857.4218750000,,, +9.4921875000,151,857.4218750000,,, +9.4941406250,151,857.4218750000,,, +9.4960937500,151,857.4218750000,,, +9.4980468750,151,857.4218750000,,, +9.5000000000,152,857.4218750000,,, +9.5019531250,152,857.4218750000,,, +9.5039062500,152,857.4218750000,,, +9.5058593750,152,857.4218750000,,, +9.5078125000,152,857.4218750000,,, +9.5097656250,152,857.4218750000,,, +9.5117187500,152,857.4218750000,,, +9.5136718750,152,857.4218750000,,, +9.5156250000,152,857.4218750000,,, +9.5175781250,152,857.4218750000,,, +9.5195312500,152,857.4218750000,,, +9.5214843750,152,857.4218750000,,, +9.5234375000,152,857.4218750000,,, +9.5253906250,152,857.4218750000,,, +9.5273437500,152,857.4218750000,,, +9.5292968750,152,857.4218750000,,, +9.5312500000,152,857.4218750000,,, +9.5332031250,152,857.4218750000,,, +9.5351562500,152,857.4218750000,,, +9.5371093750,152,857.4218750000,,, +9.5390625000,152,857.4218750000,,, +9.5410156250,152,857.4218750000,,, +9.5429687500,152,857.4218750000,,, +9.5449218750,152,857.4218750000,,, +9.5468750000,152,857.4218750000,,, +9.5488281250,152,857.4218750000,,, +9.5507812500,152,857.4218750000,,, +9.5527343750,152,857.4218750000,,, +9.5546875000,152,857.4218750000,,, +9.5566406250,152,857.4218750000,,, +9.5585937500,152,857.4218750000,,, +9.5605468750,152,857.4218750000,,, +9.5625000000,153,857.4218750000,,, +9.5644531250,153,857.4218750000,,, +9.5664062500,153,857.4218750000,,, +9.5683593750,153,857.4218750000,,, +9.5703125000,153,857.4218750000,,, +9.5722656250,153,857.4218750000,,, +9.5742187500,153,857.4218750000,,, +9.5761718750,153,857.4218750000,,, +9.5781250000,153,857.4218750000,,, +9.5800781250,153,857.4218750000,,, +9.5820312500,153,857.4218750000,,, +9.5839843750,153,857.4218750000,,, +9.5859375000,153,857.4218750000,,, +9.5878906250,153,857.4218750000,,, +9.5898437500,153,857.4218750000,,, +9.5917968750,153,857.4218750000,,, +9.5937500000,153,857.4218750000,,, +9.5957031250,153,857.4218750000,,, +9.5976562500,153,857.4218750000,,, +9.5996093750,153,857.4218750000,,, +9.6015625000,153,857.4218750000,,, +9.6035156250,153,857.4218750000,,, +9.6054687500,153,857.4218750000,,, +9.6074218750,153,857.4218750000,,, +9.6093750000,153,857.4218750000,,, +9.6113281250,153,857.4218750000,,, +9.6132812500,153,857.4218750000,,, +9.6152343750,153,857.4218750000,,, +9.6171875000,153,857.4218750000,,, +9.6191406250,153,857.4218750000,,, +9.6210937500,153,857.4218750000,,, +9.6230468750,153,857.4218750000,,, +9.6250000000,154,857.4218750000,,, +9.6269531250,154,857.4218750000,,, +9.6289062500,154,857.4218750000,,, +9.6308593750,154,857.4218750000,,, +9.6328125000,154,857.4218750000,,, +9.6347656250,154,857.4218750000,,, +9.6367187500,154,857.4218750000,,, +9.6386718750,154,857.4218750000,,, +9.6406250000,154,857.4218750000,,, +9.6425781250,154,857.4218750000,,, +9.6445312500,154,857.4218750000,,, +9.6464843750,154,857.4218750000,,, +9.6484375000,154,857.4218750000,,, +9.6503906250,154,857.4218750000,,, +9.6523437500,154,857.4218750000,,, +9.6542968750,154,857.4218750000,,, +9.6562500000,154,857.4218750000,,, +9.6582031250,154,857.4218750000,,, +9.6601562500,154,857.4218750000,,, +9.6621093750,154,857.4218750000,,, +9.6640625000,154,857.4218750000,,, +9.6660156250,154,857.4218750000,,, +9.6679687500,154,857.4218750000,,, +9.6699218750,154,857.4218750000,,, +9.6718750000,154,857.4218750000,,, +9.6738281250,154,857.4218750000,,, +9.6757812500,154,857.4218750000,,, +9.6777343750,154,857.4218750000,,, +9.6796875000,154,857.4218750000,,, +9.6816406250,154,857.4218750000,,, +9.6835937500,154,857.4218750000,,, +9.6855468750,154,857.4218750000,,, +9.6875000000,155,857.4218750000,,, +9.6894531250,155,857.4218750000,,, +9.6914062500,155,857.4218750000,,, +9.6933593750,155,857.4218750000,,, +9.6953125000,155,857.4218750000,,, +9.6972656250,155,857.4218750000,,, +9.6992187500,155,857.4218750000,,, +9.7011718750,155,857.4218750000,,, +9.7031250000,155,857.4218750000,,, +9.7050781250,155,857.4218750000,,, +9.7070312500,155,857.4218750000,,, +9.7089843750,155,857.4218750000,,, +9.7109375000,155,857.4218750000,,, +9.7128906250,155,857.4218750000,,, +9.7148437500,155,857.4218750000,,, +9.7167968750,155,857.4218750000,,, +9.7187500000,155,857.4218750000,,, +9.7207031250,155,857.4218750000,,, +9.7226562500,155,857.4218750000,,, +9.7246093750,155,857.4218750000,,, +9.7265625000,155,857.4218750000,,, +9.7285156250,155,857.4218750000,,, +9.7304687500,155,857.4218750000,,, +9.7324218750,155,857.4218750000,,, +9.7343750000,155,857.4218750000,,, +9.7363281250,155,857.4218750000,,, +9.7382812500,155,857.4218750000,,, +9.7402343750,155,857.4218750000,,, +9.7421875000,155,857.4218750000,,, +9.7441406250,155,857.4218750000,,, +9.7460937500,155,857.4218750000,,, +9.7480468750,155,857.4218750000,,, +9.7500000000,156,857.4218750000,,, +9.7519531250,156,857.4218750000,,, +9.7539062500,156,857.4218750000,,, +9.7558593750,156,857.4218750000,,, +9.7578125000,156,857.4218750000,,, +9.7597656250,156,857.4218750000,,, +9.7617187500,156,857.4218750000,,, +9.7636718750,156,857.4218750000,,, +9.7656250000,156,857.4218750000,,, +9.7675781250,156,857.4218750000,,, +9.7695312500,156,857.4218750000,,, +9.7714843750,156,857.4218750000,,, +9.7734375000,156,857.4218750000,,, +9.7753906250,156,857.4218750000,,, +9.7773437500,156,857.4218750000,,, +9.7792968750,156,857.4218750000,,, +9.7812500000,156,857.4218750000,,, +9.7832031250,156,857.4218750000,,, +9.7851562500,156,857.4218750000,,, +9.7871093750,156,857.4218750000,,, +9.7890625000,156,857.4218750000,,, +9.7910156250,156,857.4218750000,,, +9.7929687500,156,857.4218750000,,, +9.7949218750,156,857.4218750000,,, +9.7968750000,156,857.4218750000,,, +9.7988281250,156,857.4218750000,,, +9.8007812500,156,857.4218750000,,, +9.8027343750,156,857.4218750000,,, +9.8046875000,156,857.4218750000,,, +9.8066406250,156,857.4218750000,,, +9.8085937500,156,857.4218750000,,, +9.8105468750,156,857.4218750000,,, +9.8125000000,157,857.4218750000,,, +9.8144531250,157,857.4218750000,,, +9.8164062500,157,857.4218750000,,, +9.8183593750,157,857.4218750000,,, +9.8203125000,157,857.4218750000,,, +9.8222656250,157,857.4218750000,,, +9.8242187500,157,857.4218750000,,, +9.8261718750,157,857.4218750000,,, +9.8281250000,157,857.4218750000,,, +9.8300781250,157,857.4218750000,,, +9.8320312500,157,857.4218750000,,, +9.8339843750,157,857.4218750000,,, +9.8359375000,157,857.4218750000,,, +9.8378906250,157,857.4218750000,,, +9.8398437500,157,857.4218750000,,, +9.8417968750,157,857.4218750000,,, +9.8437500000,157,857.4218750000,,, +9.8457031250,157,857.4218750000,,, +9.8476562500,157,857.4218750000,,, +9.8496093750,157,857.4218750000,,, +9.8515625000,157,857.4218750000,,, +9.8535156250,157,857.4218750000,,, +9.8554687500,157,857.4218750000,,, +9.8574218750,157,857.4218750000,,, +9.8593750000,157,857.4218750000,,, +9.8613281250,157,857.4218750000,,, +9.8632812500,157,857.4218750000,,, +9.8652343750,157,857.4218750000,,, +9.8671875000,157,857.4218750000,,, +9.8691406250,157,857.4218750000,,, +9.8710937500,157,857.4218750000,,, +9.8730468750,157,857.4218750000,,, +9.8750000000,158,857.4218750000,,, +9.8769531250,158,857.4218750000,,, +9.8789062500,158,857.4218750000,,, +9.8808593750,158,857.4218750000,,, +9.8828125000,158,857.4218750000,,, +9.8847656250,158,857.4218750000,,, +9.8867187500,158,857.4218750000,,, +9.8886718750,158,857.4218750000,,, +9.8906250000,158,857.4218750000,,, +9.8925781250,158,857.4218750000,,, +9.8945312500,158,857.4218750000,,, +9.8964843750,158,857.4218750000,,, +9.8984375000,158,857.4218750000,,, +9.9003906250,158,857.4218750000,,, +9.9023437500,158,857.4218750000,,, +9.9042968750,158,857.4218750000,,, +9.9062500000,158,857.4218750000,,, +9.9082031250,158,857.4218750000,,, +9.9101562500,158,857.4218750000,,, +9.9121093750,158,857.4218750000,,, +9.9140625000,158,857.4218750000,,, +9.9160156250,158,857.4218750000,,, +9.9179687500,158,857.4218750000,,, +9.9199218750,158,857.4218750000,,, +9.9218750000,158,857.4218750000,,, +9.9238281250,158,857.4218750000,,, +9.9257812500,158,857.4218750000,,, +9.9277343750,158,857.4218750000,,, +9.9296875000,158,857.4218750000,,, +9.9316406250,158,857.4218750000,,, +9.9335937500,158,857.4218750000,,, +9.9355468750,158,857.4218750000,,, +9.9375000000,159,894.5312500000,,, +9.9394531250,159,894.5312500000,,, +9.9414062500,159,894.5312500000,,, +9.9433593750,159,894.5312500000,,, +9.9453125000,159,894.5312500000,,, +9.9472656250,159,894.5312500000,,, +9.9492187500,159,894.5312500000,,, +9.9511718750,159,894.5312500000,,, +9.9531250000,159,894.5312500000,,, +9.9550781250,159,894.5312500000,,, +9.9570312500,159,894.5312500000,,, +9.9589843750,159,894.5312500000,,, +9.9609375000,159,894.5312500000,,, +9.9628906250,159,894.5312500000,,, +9.9648437500,159,894.5312500000,,, +9.9667968750,159,894.5312500000,,, +9.9687500000,159,894.5312500000,,, +9.9707031250,159,894.5312500000,,, +9.9726562500,159,894.5312500000,,, +9.9746093750,159,894.5312500000,,, +9.9765625000,159,894.5312500000,,, +9.9785156250,159,894.5312500000,,, +9.9804687500,159,894.5312500000,,, +9.9824218750,159,894.5312500000,,, +9.9843750000,159,894.5312500000,,, +9.9863281250,159,894.5312500000,,, +9.9882812500,159,894.5312500000,,, +9.9902343750,159,894.5312500000,,, +9.9921875000,159,894.5312500000,,, +9.9941406250,159,894.5312500000,,, +9.9960937500,159,894.5312500000,,, +9.9980468750,159,894.5312500000,,, +10.0000000000,160,894.5312500000,,, +10.0019531250,160,894.5312500000,,, +10.0039062500,160,894.5312500000,,, +10.0058593750,160,894.5312500000,,, +10.0078125000,160,894.5312500000,,, +10.0097656250,160,894.5312500000,,, +10.0117187500,160,894.5312500000,,, +10.0136718750,160,894.5312500000,,, +10.0156250000,160,894.5312500000,,, +10.0175781250,160,894.5312500000,,, +10.0195312500,160,894.5312500000,,, +10.0214843750,160,894.5312500000,,, +10.0234375000,160,894.5312500000,,, +10.0253906250,160,894.5312500000,,, +10.0273437500,160,894.5312500000,,, +10.0292968750,160,894.5312500000,,, +10.0312500000,160,894.5312500000,,, +10.0332031250,160,894.5312500000,,, +10.0351562500,160,894.5312500000,,, +10.0371093750,160,894.5312500000,,, +10.0390625000,160,894.5312500000,,, +10.0410156250,160,894.5312500000,,, +10.0429687500,160,894.5312500000,,, +10.0449218750,160,894.5312500000,,, +10.0468750000,160,894.5312500000,,, +10.0488281250,160,894.5312500000,,, +10.0507812500,160,894.5312500000,,, +10.0527343750,160,894.5312500000,,, +10.0546875000,160,894.5312500000,,, +10.0566406250,160,894.5312500000,,, +10.0585937500,160,894.5312500000,,, +10.0605468750,160,894.5312500000,,, +10.0625000000,161,894.5312500000,,, +10.0644531250,161,894.5312500000,,, +10.0664062500,161,894.5312500000,,, +10.0683593750,161,894.5312500000,,, +10.0703125000,161,894.5312500000,,, +10.0722656250,161,894.5312500000,,, +10.0742187500,161,894.5312500000,,, +10.0761718750,161,894.5312500000,,, +10.0781250000,161,894.5312500000,,, +10.0800781250,161,894.5312500000,,, +10.0820312500,161,894.5312500000,,, +10.0839843750,161,894.5312500000,,, +10.0859375000,161,894.5312500000,,, +10.0878906250,161,894.5312500000,,, +10.0898437500,161,894.5312500000,,, +10.0917968750,161,894.5312500000,,, +10.0937500000,161,894.5312500000,,, +10.0957031250,161,894.5312500000,,, +10.0976562500,161,894.5312500000,,, +10.0996093750,161,894.5312500000,,, +10.1015625000,161,894.5312500000,,, +10.1035156250,161,894.5312500000,,, +10.1054687500,161,894.5312500000,,, +10.1074218750,161,894.5312500000,,, +10.1093750000,161,894.5312500000,,, +10.1113281250,161,894.5312500000,,, +10.1132812500,161,894.5312500000,,, +10.1152343750,161,894.5312500000,,, +10.1171875000,161,894.5312500000,,, +10.1191406250,161,894.5312500000,,, +10.1210937500,161,894.5312500000,,, +10.1230468750,161,894.5312500000,,, +10.1250000000,162,894.5312500000,,, +10.1269531250,162,894.5312500000,,, +10.1289062500,162,894.5312500000,,, +10.1308593750,162,894.5312500000,,, +10.1328125000,162,894.5312500000,,, +10.1347656250,162,894.5312500000,,, +10.1367187500,162,894.5312500000,,, +10.1386718750,162,894.5312500000,,, +10.1406250000,162,894.5312500000,,, +10.1425781250,162,894.5312500000,,, +10.1445312500,162,894.5312500000,,, +10.1464843750,162,894.5312500000,,, +10.1484375000,162,894.5312500000,,, +10.1503906250,162,894.5312500000,,, +10.1523437500,162,894.5312500000,,, +10.1542968750,162,894.5312500000,,, +10.1562500000,162,894.5312500000,,, +10.1582031250,162,894.5312500000,,, +10.1601562500,162,894.5312500000,,, +10.1621093750,162,894.5312500000,,, +10.1640625000,162,894.5312500000,,, +10.1660156250,162,894.5312500000,,, +10.1679687500,162,894.5312500000,,, +10.1699218750,162,894.5312500000,,, +10.1718750000,162,894.5312500000,,, +10.1738281250,162,894.5312500000,,, +10.1757812500,162,894.5312500000,,, +10.1777343750,162,894.5312500000,,, +10.1796875000,162,894.5312500000,,, +10.1816406250,162,894.5312500000,,, +10.1835937500,162,894.5312500000,,, +10.1855468750,162,894.5312500000,,, +10.1875000000,163,894.5312500000,,, +10.1894531250,163,894.5312500000,,, +10.1914062500,163,894.5312500000,,, +10.1933593750,163,894.5312500000,,, +10.1953125000,163,894.5312500000,,, +10.1972656250,163,894.5312500000,,, +10.1992187500,163,894.5312500000,,, +10.2011718750,163,894.5312500000,,, +10.2031250000,163,894.5312500000,,, +10.2050781250,163,894.5312500000,,, +10.2070312500,163,894.5312500000,,, +10.2089843750,163,894.5312500000,,, +10.2109375000,163,894.5312500000,,, +10.2128906250,163,894.5312500000,,, +10.2148437500,163,894.5312500000,,, +10.2167968750,163,894.5312500000,,, +10.2187500000,163,894.5312500000,,, +10.2207031250,163,894.5312500000,,, +10.2226562500,163,894.5312500000,,, +10.2246093750,163,894.5312500000,,, +10.2265625000,163,894.5312500000,,, +10.2285156250,163,894.5312500000,,, +10.2304687500,163,894.5312500000,,, +10.2324218750,163,894.5312500000,,, +10.2343750000,163,894.5312500000,,, +10.2363281250,163,894.5312500000,,, +10.2382812500,163,894.5312500000,,, +10.2402343750,163,894.5312500000,,, +10.2421875000,163,894.5312500000,,, +10.2441406250,163,894.5312500000,,, +10.2460937500,163,894.5312500000,,, +10.2480468750,163,894.5312500000,,, +10.2500000000,164,894.5312500000,,, +10.2519531250,164,894.5312500000,,, +10.2539062500,164,894.5312500000,,, +10.2558593750,164,894.5312500000,,, +10.2578125000,164,894.5312500000,,, +10.2597656250,164,894.5312500000,,, +10.2617187500,164,894.5312500000,,, +10.2636718750,164,894.5312500000,,, +10.2656250000,164,894.5312500000,,, +10.2675781250,164,894.5312500000,,, +10.2695312500,164,894.5312500000,,, +10.2714843750,164,894.5312500000,,, +10.2734375000,164,894.5312500000,,, +10.2753906250,164,894.5312500000,,, +10.2773437500,164,894.5312500000,,, +10.2792968750,164,894.5312500000,,, +10.2812500000,164,894.5312500000,,, +10.2832031250,164,894.5312500000,,, +10.2851562500,164,894.5312500000,,, +10.2871093750,164,894.5312500000,,, +10.2890625000,164,894.5312500000,,, +10.2910156250,164,894.5312500000,,, +10.2929687500,164,894.5312500000,,, +10.2949218750,164,894.5312500000,,, +10.2968750000,164,894.5312500000,,, +10.2988281250,164,894.5312500000,,, +10.3007812500,164,894.5312500000,,, +10.3027343750,164,894.5312500000,,, +10.3046875000,164,894.5312500000,,, +10.3066406250,164,894.5312500000,,, +10.3085937500,164,894.5312500000,,, +10.3105468750,164,894.5312500000,,, +10.3125000000,165,894.5312500000,,, +10.3144531250,165,894.5312500000,,, +10.3164062500,165,894.5312500000,,, +10.3183593750,165,894.5312500000,,, +10.3203125000,165,894.5312500000,,, +10.3222656250,165,894.5312500000,,, +10.3242187500,165,894.5312500000,,, +10.3261718750,165,894.5312500000,,, +10.3281250000,165,894.5312500000,,, +10.3300781250,165,894.5312500000,,, +10.3320312500,165,894.5312500000,,, +10.3339843750,165,894.5312500000,,, +10.3359375000,165,894.5312500000,,, +10.3378906250,165,894.5312500000,,, +10.3398437500,165,894.5312500000,,, +10.3417968750,165,894.5312500000,,, +10.3437500000,165,894.5312500000,,, +10.3457031250,165,894.5312500000,,, +10.3476562500,165,894.5312500000,,, +10.3496093750,165,894.5312500000,,, +10.3515625000,165,894.5312500000,,, +10.3535156250,165,894.5312500000,,, +10.3554687500,165,894.5312500000,,, +10.3574218750,165,894.5312500000,,, +10.3593750000,165,894.5312500000,,, +10.3613281250,165,894.5312500000,,, +10.3632812500,165,894.5312500000,,, +10.3652343750,165,894.5312500000,,, +10.3671875000,165,894.5312500000,,, +10.3691406250,165,894.5312500000,,, +10.3710937500,165,894.5312500000,,, +10.3730468750,165,894.5312500000,,, +10.3750000000,166,894.5312500000,,, +10.3769531250,166,894.5312500000,,, +10.3789062500,166,894.5312500000,,, +10.3808593750,166,894.5312500000,,, +10.3828125000,166,894.5312500000,,, +10.3847656250,166,894.5312500000,,, +10.3867187500,166,894.5312500000,,, +10.3886718750,166,894.5312500000,,, +10.3906250000,166,894.5312500000,,, +10.3925781250,166,894.5312500000,,, +10.3945312500,166,894.5312500000,,, +10.3964843750,166,894.5312500000,,, +10.3984375000,166,894.5312500000,,, +10.4003906250,166,894.5312500000,,, +10.4023437500,166,894.5312500000,,, +10.4042968750,166,894.5312500000,,, +10.4062500000,166,894.5312500000,,, +10.4082031250,166,894.5312500000,,, +10.4101562500,166,894.5312500000,,, +10.4121093750,166,894.5312500000,,, +10.4140625000,166,894.5312500000,,, +10.4160156250,166,894.5312500000,,, +10.4179687500,166,894.5312500000,,, +10.4199218750,166,894.5312500000,,, +10.4218750000,166,894.5312500000,,, +10.4238281250,166,894.5312500000,,, +10.4257812500,166,894.5312500000,,, +10.4277343750,166,894.5312500000,,, +10.4296875000,166,894.5312500000,,, +10.4316406250,166,894.5312500000,,, +10.4335937500,166,894.5312500000,,, +10.4355468750,166,894.5312500000,,, +10.4375000000,167,894.5312500000,,, +10.4394531250,167,894.5312500000,,, +10.4414062500,167,894.5312500000,,, +10.4433593750,167,894.5312500000,,, +10.4453125000,167,894.5312500000,,, +10.4472656250,167,894.5312500000,,, +10.4492187500,167,894.5312500000,,, +10.4511718750,167,894.5312500000,,, +10.4531250000,167,894.5312500000,,, +10.4550781250,167,894.5312500000,,, +10.4570312500,167,894.5312500000,,, +10.4589843750,167,894.5312500000,,, +10.4609375000,167,894.5312500000,,, +10.4628906250,167,894.5312500000,,, +10.4648437500,167,894.5312500000,,, +10.4667968750,167,894.5312500000,,, +10.4687500000,167,894.5312500000,,, +10.4707031250,167,894.5312500000,,, +10.4726562500,167,894.5312500000,,, +10.4746093750,167,894.5312500000,,, +10.4765625000,167,894.5312500000,,, +10.4785156250,167,894.5312500000,,, +10.4804687500,167,894.5312500000,,, +10.4824218750,167,894.5312500000,,, +10.4843750000,167,894.5312500000,,, +10.4863281250,167,894.5312500000,,, +10.4882812500,167,894.5312500000,,, +10.4902343750,167,894.5312500000,,, +10.4921875000,167,894.5312500000,,, +10.4941406250,167,894.5312500000,,, +10.4960937500,167,894.5312500000,,, +10.4980468750,167,894.5312500000,,, +10.5000000000,168,894.5312500000,,, +10.5019531250,168,894.5312500000,,, +10.5039062500,168,894.5312500000,,, +10.5058593750,168,894.5312500000,,, +10.5078125000,168,894.5312500000,,, +10.5097656250,168,894.5312500000,,, +10.5117187500,168,894.5312500000,,, +10.5136718750,168,894.5312500000,,, +10.5156250000,168,894.5312500000,,, +10.5175781250,168,894.5312500000,,, +10.5195312500,168,894.5312500000,,, +10.5214843750,168,894.5312500000,,, +10.5234375000,168,894.5312500000,,, +10.5253906250,168,894.5312500000,,, +10.5273437500,168,894.5312500000,,, +10.5292968750,168,894.5312500000,,, +10.5312500000,168,894.5312500000,,, +10.5332031250,168,894.5312500000,,, +10.5351562500,168,894.5312500000,,, +10.5371093750,168,894.5312500000,,, +10.5390625000,168,894.5312500000,,, +10.5410156250,168,894.5312500000,,, +10.5429687500,168,894.5312500000,,, +10.5449218750,168,894.5312500000,,, +10.5468750000,168,894.5312500000,,, +10.5488281250,168,894.5312500000,,, +10.5507812500,168,894.5312500000,,, +10.5527343750,168,894.5312500000,,, +10.5546875000,168,894.5312500000,,, +10.5566406250,168,894.5312500000,,, +10.5585937500,168,894.5312500000,,, +10.5605468750,168,894.5312500000,,, +10.5625000000,169,894.5312500000,,, +10.5644531250,169,894.5312500000,,, +10.5664062500,169,894.5312500000,,, +10.5683593750,169,894.5312500000,,, +10.5703125000,169,894.5312500000,,, +10.5722656250,169,894.5312500000,,, +10.5742187500,169,894.5312500000,,, +10.5761718750,169,894.5312500000,,, +10.5781250000,169,894.5312500000,,, +10.5800781250,169,894.5312500000,,, +10.5820312500,169,894.5312500000,,, +10.5839843750,169,894.5312500000,,, +10.5859375000,169,894.5312500000,,, +10.5878906250,169,894.5312500000,,, +10.5898437500,169,894.5312500000,,, +10.5917968750,169,894.5312500000,,, +10.5937500000,169,894.5312500000,,, +10.5957031250,169,894.5312500000,,, +10.5976562500,169,894.5312500000,,, +10.5996093750,169,894.5312500000,,, +10.6015625000,169,894.5312500000,,, +10.6035156250,169,894.5312500000,,, +10.6054687500,169,894.5312500000,,, +10.6074218750,169,894.5312500000,,, +10.6093750000,169,894.5312500000,,, +10.6113281250,169,894.5312500000,,, +10.6132812500,169,894.5312500000,,, +10.6152343750,169,894.5312500000,,, +10.6171875000,169,894.5312500000,,, +10.6191406250,169,894.5312500000,,, +10.6210937500,169,894.5312500000,,, +10.6230468750,169,894.5312500000,,, +10.6250000000,170,894.5312500000,,, +10.6269531250,170,894.5312500000,,, +10.6289062500,170,894.5312500000,,, +10.6308593750,170,894.5312500000,,, +10.6328125000,170,894.5312500000,,, +10.6347656250,170,894.5312500000,,, +10.6367187500,170,894.5312500000,,, +10.6386718750,170,894.5312500000,,, +10.6406250000,170,894.5312500000,,, +10.6425781250,170,894.5312500000,,, +10.6445312500,170,894.5312500000,,, +10.6464843750,170,894.5312500000,,, +10.6484375000,170,894.5312500000,,, +10.6503906250,170,894.5312500000,,, +10.6523437500,170,894.5312500000,,, +10.6542968750,170,894.5312500000,,, +10.6562500000,170,894.5312500000,,, +10.6582031250,170,894.5312500000,,, +10.6601562500,170,894.5312500000,,, +10.6621093750,170,894.5312500000,,, +10.6640625000,170,894.5312500000,,, +10.6660156250,170,894.5312500000,,, +10.6679687500,170,894.5312500000,,, +10.6699218750,170,894.5312500000,,, +10.6718750000,170,894.5312500000,,, +10.6738281250,170,894.5312500000,,, +10.6757812500,170,894.5312500000,,, +10.6777343750,170,894.5312500000,,, +10.6796875000,170,894.5312500000,,, +10.6816406250,170,894.5312500000,,, +10.6835937500,170,894.5312500000,,, +10.6855468750,170,894.5312500000,,, +10.6875000000,171,894.5312500000,,, +10.6894531250,171,894.5312500000,,, +10.6914062500,171,894.5312500000,,, +10.6933593750,171,894.5312500000,,, +10.6953125000,171,894.5312500000,,, +10.6972656250,171,894.5312500000,,, +10.6992187500,171,894.5312500000,,, +10.7011718750,171,894.5312500000,,, +10.7031250000,171,894.5312500000,,, +10.7050781250,171,894.5312500000,,, +10.7070312500,171,894.5312500000,,, +10.7089843750,171,894.5312500000,,, +10.7109375000,171,894.5312500000,,, +10.7128906250,171,894.5312500000,,, +10.7148437500,171,894.5312500000,,, +10.7167968750,171,894.5312500000,,, +10.7187500000,171,894.5312500000,,, +10.7207031250,171,894.5312500000,,, +10.7226562500,171,894.5312500000,,, +10.7246093750,171,894.5312500000,,, +10.7265625000,171,894.5312500000,,, +10.7285156250,171,894.5312500000,,, +10.7304687500,171,894.5312500000,,, +10.7324218750,171,894.5312500000,,, +10.7343750000,171,894.5312500000,,, +10.7363281250,171,894.5312500000,,, +10.7382812500,171,894.5312500000,,, +10.7402343750,171,894.5312500000,,, +10.7421875000,171,894.5312500000,,, +10.7441406250,171,894.5312500000,,, +10.7460937500,171,894.5312500000,,, +10.7480468750,171,894.5312500000,,, +10.7500000000,172,894.5312500000,,, +10.7519531250,172,894.5312500000,,, +10.7539062500,172,894.5312500000,,, +10.7558593750,172,894.5312500000,,, +10.7578125000,172,894.5312500000,,, +10.7597656250,172,894.5312500000,,, +10.7617187500,172,894.5312500000,,, +10.7636718750,172,894.5312500000,,, +10.7656250000,172,894.5312500000,,, +10.7675781250,172,894.5312500000,,, +10.7695312500,172,894.5312500000,,, +10.7714843750,172,894.5312500000,,, +10.7734375000,172,894.5312500000,,, +10.7753906250,172,894.5312500000,,, +10.7773437500,172,894.5312500000,,, +10.7792968750,172,894.5312500000,,, +10.7812500000,172,894.5312500000,,, +10.7832031250,172,894.5312500000,,, +10.7851562500,172,894.5312500000,,, +10.7871093750,172,894.5312500000,,, +10.7890625000,172,894.5312500000,,, +10.7910156250,172,894.5312500000,,, +10.7929687500,172,894.5312500000,,, +10.7949218750,172,894.5312500000,,, +10.7968750000,172,894.5312500000,,, +10.7988281250,172,894.5312500000,,, +10.8007812500,172,894.5312500000,,, +10.8027343750,172,894.5312500000,,, +10.8046875000,172,894.5312500000,,, +10.8066406250,172,894.5312500000,,, +10.8085937500,172,894.5312500000,,, +10.8105468750,172,894.5312500000,,, +10.8125000000,173,894.5312500000,,, +10.8144531250,173,894.5312500000,,, +10.8164062500,173,894.5312500000,,, +10.8183593750,173,894.5312500000,,, +10.8203125000,173,894.5312500000,,, +10.8222656250,173,894.5312500000,,, +10.8242187500,173,894.5312500000,,, +10.8261718750,173,894.5312500000,,, +10.8281250000,173,894.5312500000,,, +10.8300781250,173,894.5312500000,,, +10.8320312500,173,894.5312500000,,, +10.8339843750,173,894.5312500000,,, +10.8359375000,173,894.5312500000,,, +10.8378906250,173,894.5312500000,,, +10.8398437500,173,894.5312500000,,, +10.8417968750,173,894.5312500000,,, +10.8437500000,173,894.5312500000,,, +10.8457031250,173,894.5312500000,,, +10.8476562500,173,894.5312500000,,, +10.8496093750,173,894.5312500000,,, +10.8515625000,173,894.5312500000,,, +10.8535156250,173,894.5312500000,,, +10.8554687500,173,894.5312500000,,, +10.8574218750,173,894.5312500000,,, +10.8593750000,173,894.5312500000,,, +10.8613281250,173,894.5312500000,,, +10.8632812500,173,894.5312500000,,, +10.8652343750,173,894.5312500000,,, +10.8671875000,173,894.5312500000,,, +10.8691406250,173,894.5312500000,,, +10.8710937500,173,894.5312500000,,, +10.8730468750,173,894.5312500000,,, +10.8750000000,174,902.3437500000,,, +10.8769531250,174,902.3437500000,,, +10.8789062500,174,902.3437500000,,, +10.8808593750,174,902.3437500000,,, +10.8828125000,174,902.3437500000,,, +10.8847656250,174,902.3437500000,,, +10.8867187500,174,902.3437500000,,, +10.8886718750,174,902.3437500000,,, +10.8906250000,174,902.3437500000,,, +10.8925781250,174,902.3437500000,,, +10.8945312500,174,902.3437500000,,, +10.8964843750,174,902.3437500000,,, +10.8984375000,174,902.3437500000,,, +10.9003906250,174,902.3437500000,,, +10.9023437500,174,902.3437500000,,, +10.9042968750,174,902.3437500000,,, +10.9062500000,174,902.3437500000,,, +10.9082031250,174,902.3437500000,,, +10.9101562500,174,902.3437500000,,, +10.9121093750,174,902.3437500000,,, +10.9140625000,174,902.3437500000,,, +10.9160156250,174,902.3437500000,,, +10.9179687500,174,902.3437500000,,, +10.9199218750,174,902.3437500000,,, +10.9218750000,174,902.3437500000,,, +10.9238281250,174,902.3437500000,,, +10.9257812500,174,902.3437500000,,, +10.9277343750,174,902.3437500000,,, +10.9296875000,174,902.3437500000,,, +10.9316406250,174,902.3437500000,,, +10.9335937500,174,902.3437500000,,, +10.9355468750,174,902.3437500000,,, +10.9375000000,175,902.3437500000,,, +10.9394531250,175,902.3437500000,,, +10.9414062500,175,902.3437500000,,, +10.9433593750,175,902.3437500000,,, +10.9453125000,175,902.3437500000,,, +10.9472656250,175,902.3437500000,,, +10.9492187500,175,902.3437500000,,, +10.9511718750,175,902.3437500000,,, +10.9531250000,175,902.3437500000,,, +10.9550781250,175,902.3437500000,,, +10.9570312500,175,902.3437500000,,, +10.9589843750,175,902.3437500000,,, +10.9609375000,175,902.3437500000,,, +10.9628906250,175,902.3437500000,,, +10.9648437500,175,902.3437500000,,, +10.9667968750,175,902.3437500000,,, +10.9687500000,175,902.3437500000,,, +10.9707031250,175,902.3437500000,,, +10.9726562500,175,902.3437500000,,, +10.9746093750,175,902.3437500000,,, +10.9765625000,175,902.3437500000,,, +10.9785156250,175,902.3437500000,,, +10.9804687500,175,902.3437500000,,, +10.9824218750,175,902.3437500000,,, +10.9843750000,175,902.3437500000,,, +10.9863281250,175,902.3437500000,,, +10.9882812500,175,902.3437500000,,, +10.9902343750,175,902.3437500000,,, +10.9921875000,175,902.3437500000,,, +10.9941406250,175,902.3437500000,,, +10.9960937500,175,902.3437500000,,, +10.9980468750,175,902.3437500000,,, +11.0000000000,176,902.3437500000,,, +11.0019531250,176,902.3437500000,,, +11.0039062500,176,902.3437500000,,, +11.0058593750,176,902.3437500000,,, +11.0078125000,176,902.3437500000,,, +11.0097656250,176,902.3437500000,,, +11.0117187500,176,902.3437500000,,, +11.0136718750,176,902.3437500000,,, +11.0156250000,176,902.3437500000,,, +11.0175781250,176,902.3437500000,,, +11.0195312500,176,902.3437500000,,, +11.0214843750,176,902.3437500000,,, +11.0234375000,176,902.3437500000,,, +11.0253906250,176,902.3437500000,,, +11.0273437500,176,902.3437500000,,, +11.0292968750,176,902.3437500000,,, +11.0312500000,176,902.3437500000,,, +11.0332031250,176,902.3437500000,,, +11.0351562500,176,902.3437500000,,, +11.0371093750,176,902.3437500000,,, +11.0390625000,176,902.3437500000,,, +11.0410156250,176,902.3437500000,,, +11.0429687500,176,902.3437500000,,, +11.0449218750,176,902.3437500000,,, +11.0468750000,176,902.3437500000,,, +11.0488281250,176,902.3437500000,,, +11.0507812500,176,902.3437500000,,, +11.0527343750,176,902.3437500000,,, +11.0546875000,176,902.3437500000,,, +11.0566406250,176,902.3437500000,,, +11.0585937500,176,902.3437500000,,, +11.0605468750,176,902.3437500000,,, +11.0625000000,177,902.3437500000,,, +11.0644531250,177,902.3437500000,,, +11.0664062500,177,902.3437500000,,, +11.0683593750,177,902.3437500000,,, +11.0703125000,177,902.3437500000,,, +11.0722656250,177,902.3437500000,,, +11.0742187500,177,902.3437500000,,, +11.0761718750,177,902.3437500000,,, +11.0781250000,177,902.3437500000,,, +11.0800781250,177,902.3437500000,,, +11.0820312500,177,902.3437500000,,, +11.0839843750,177,902.3437500000,,, +11.0859375000,177,902.3437500000,,, +11.0878906250,177,902.3437500000,,, +11.0898437500,177,902.3437500000,,, +11.0917968750,177,902.3437500000,,, +11.0937500000,177,902.3437500000,,, +11.0957031250,177,902.3437500000,,, +11.0976562500,177,902.3437500000,,, +11.0996093750,177,902.3437500000,,, +11.1015625000,177,902.3437500000,,, +11.1035156250,177,902.3437500000,,, +11.1054687500,177,902.3437500000,,, +11.1074218750,177,902.3437500000,,, +11.1093750000,177,902.3437500000,,, +11.1113281250,177,902.3437500000,,, +11.1132812500,177,902.3437500000,,, +11.1152343750,177,902.3437500000,,, +11.1171875000,177,902.3437500000,,, +11.1191406250,177,902.3437500000,,, +11.1210937500,177,902.3437500000,,, +11.1230468750,177,902.3437500000,,, +11.1250000000,178,902.3437500000,,, +11.1269531250,178,902.3437500000,,, +11.1289062500,178,902.3437500000,,, +11.1308593750,178,902.3437500000,,, +11.1328125000,178,902.3437500000,,, +11.1347656250,178,902.3437500000,,, +11.1367187500,178,902.3437500000,,, +11.1386718750,178,902.3437500000,,, +11.1406250000,178,902.3437500000,,, +11.1425781250,178,902.3437500000,,, +11.1445312500,178,902.3437500000,,, +11.1464843750,178,902.3437500000,,, +11.1484375000,178,902.3437500000,,, +11.1503906250,178,902.3437500000,,, +11.1523437500,178,902.3437500000,,, +11.1542968750,178,902.3437500000,,, +11.1562500000,178,902.3437500000,,, +11.1582031250,178,902.3437500000,,, +11.1601562500,178,902.3437500000,,, +11.1621093750,178,902.3437500000,,, +11.1640625000,178,902.3437500000,,, +11.1660156250,178,902.3437500000,,, +11.1679687500,178,902.3437500000,,, +11.1699218750,178,902.3437500000,,, +11.1718750000,178,902.3437500000,,, +11.1738281250,178,902.3437500000,,, +11.1757812500,178,902.3437500000,,, +11.1777343750,178,902.3437500000,,, +11.1796875000,178,902.3437500000,,, +11.1816406250,178,902.3437500000,,, +11.1835937500,178,902.3437500000,,, +11.1855468750,178,902.3437500000,,, +11.1875000000,179,902.3437500000,,, +11.1894531250,179,902.3437500000,,, +11.1914062500,179,902.3437500000,,, +11.1933593750,179,902.3437500000,,, +11.1953125000,179,902.3437500000,,, +11.1972656250,179,902.3437500000,,, +11.1992187500,179,902.3437500000,,, +11.2011718750,179,902.3437500000,,, +11.2031250000,179,902.3437500000,,, +11.2050781250,179,902.3437500000,,, +11.2070312500,179,902.3437500000,,, +11.2089843750,179,902.3437500000,,, +11.2109375000,179,902.3437500000,,, +11.2128906250,179,902.3437500000,,, +11.2148437500,179,902.3437500000,,, +11.2167968750,179,902.3437500000,,, +11.2187500000,179,902.3437500000,,, +11.2207031250,179,902.3437500000,,, +11.2226562500,179,902.3437500000,,, +11.2246093750,179,902.3437500000,,, +11.2265625000,179,902.3437500000,,, +11.2285156250,179,902.3437500000,,, +11.2304687500,179,902.3437500000,,, +11.2324218750,179,902.3437500000,,, +11.2343750000,179,902.3437500000,,, +11.2363281250,179,902.3437500000,,, +11.2382812500,179,902.3437500000,,, +11.2402343750,179,902.3437500000,,, +11.2421875000,179,902.3437500000,,, +11.2441406250,179,902.3437500000,,, +11.2460937500,179,902.3437500000,,, +11.2480468750,179,902.3437500000,,, +11.2500000000,180,902.3437500000,,, +11.2519531250,180,902.3437500000,,, +11.2539062500,180,902.3437500000,,, +11.2558593750,180,902.3437500000,,, +11.2578125000,180,902.3437500000,,, +11.2597656250,180,902.3437500000,,, +11.2617187500,180,902.3437500000,,, +11.2636718750,180,902.3437500000,,, +11.2656250000,180,902.3437500000,,, +11.2675781250,180,902.3437500000,,, +11.2695312500,180,902.3437500000,,, +11.2714843750,180,902.3437500000,,, +11.2734375000,180,902.3437500000,,, +11.2753906250,180,902.3437500000,,, +11.2773437500,180,902.3437500000,,, +11.2792968750,180,902.3437500000,,, +11.2812500000,180,902.3437500000,,, +11.2832031250,180,902.3437500000,,, +11.2851562500,180,902.3437500000,,, +11.2871093750,180,902.3437500000,,, +11.2890625000,180,902.3437500000,,, +11.2910156250,180,902.3437500000,,, +11.2929687500,180,902.3437500000,,, +11.2949218750,180,902.3437500000,,, +11.2968750000,180,902.3437500000,,, +11.2988281250,180,902.3437500000,,, +11.3007812500,180,902.3437500000,,, +11.3027343750,180,902.3437500000,,, +11.3046875000,180,902.3437500000,,, +11.3066406250,180,902.3437500000,,, +11.3085937500,180,902.3437500000,,, +11.3105468750,180,902.3437500000,,, +11.3125000000,181,902.3437500000,,, +11.3144531250,181,902.3437500000,,, +11.3164062500,181,902.3437500000,,, +11.3183593750,181,902.3437500000,,, +11.3203125000,181,902.3437500000,,, +11.3222656250,181,902.3437500000,,, +11.3242187500,181,902.3437500000,,, +11.3261718750,181,902.3437500000,,, +11.3281250000,181,902.3437500000,,, +11.3300781250,181,902.3437500000,,, +11.3320312500,181,902.3437500000,,, +11.3339843750,181,902.3437500000,,, +11.3359375000,181,902.3437500000,,, +11.3378906250,181,902.3437500000,,, +11.3398437500,181,902.3437500000,,, +11.3417968750,181,902.3437500000,,, +11.3437500000,181,902.3437500000,,, +11.3457031250,181,902.3437500000,,, +11.3476562500,181,902.3437500000,,, +11.3496093750,181,902.3437500000,,, +11.3515625000,181,902.3437500000,,, +11.3535156250,181,902.3437500000,,, +11.3554687500,181,902.3437500000,,, +11.3574218750,181,902.3437500000,,, +11.3593750000,181,902.3437500000,,, +11.3613281250,181,902.3437500000,,, +11.3632812500,181,902.3437500000,,, +11.3652343750,181,902.3437500000,,, +11.3671875000,181,902.3437500000,,, +11.3691406250,181,902.3437500000,,, +11.3710937500,181,902.3437500000,,, +11.3730468750,181,902.3437500000,,, +11.3750000000,182,902.3437500000,,, +11.3769531250,182,902.3437500000,,, +11.3789062500,182,902.3437500000,,, +11.3808593750,182,902.3437500000,,, +11.3828125000,182,902.3437500000,,, +11.3847656250,182,902.3437500000,,, +11.3867187500,182,902.3437500000,,, +11.3886718750,182,902.3437500000,,, +11.3906250000,182,902.3437500000,,, +11.3925781250,182,902.3437500000,,, +11.3945312500,182,902.3437500000,,, +11.3964843750,182,902.3437500000,,, +11.3984375000,182,902.3437500000,,, +11.4003906250,182,902.3437500000,,, +11.4023437500,182,902.3437500000,,, +11.4042968750,182,902.3437500000,,, +11.4062500000,182,902.3437500000,,, +11.4082031250,182,902.3437500000,,, +11.4101562500,182,902.3437500000,,, +11.4121093750,182,902.3437500000,,, +11.4140625000,182,902.3437500000,,, +11.4160156250,182,902.3437500000,,, +11.4179687500,182,902.3437500000,,, +11.4199218750,182,902.3437500000,,, +11.4218750000,182,902.3437500000,,, +11.4238281250,182,902.3437500000,,, +11.4257812500,182,902.3437500000,,, +11.4277343750,182,902.3437500000,,, +11.4296875000,182,902.3437500000,,, +11.4316406250,182,902.3437500000,,, +11.4335937500,182,902.3437500000,,, +11.4355468750,182,902.3437500000,,, +11.4375000000,183,902.3437500000,,, +11.4394531250,183,902.3437500000,,, +11.4414062500,183,902.3437500000,,, +11.4433593750,183,902.3437500000,,, +11.4453125000,183,902.3437500000,,, +11.4472656250,183,902.3437500000,,, +11.4492187500,183,902.3437500000,,, +11.4511718750,183,902.3437500000,,, +11.4531250000,183,902.3437500000,,, +11.4550781250,183,902.3437500000,,, +11.4570312500,183,902.3437500000,,, +11.4589843750,183,902.3437500000,,, +11.4609375000,183,902.3437500000,,, +11.4628906250,183,902.3437500000,,, +11.4648437500,183,902.3437500000,,, +11.4667968750,183,902.3437500000,,, +11.4687500000,183,902.3437500000,,, +11.4707031250,183,902.3437500000,,, +11.4726562500,183,902.3437500000,,, +11.4746093750,183,902.3437500000,,, +11.4765625000,183,902.3437500000,,, +11.4785156250,183,902.3437500000,,, +11.4804687500,183,902.3437500000,,, +11.4824218750,183,902.3437500000,,, +11.4843750000,183,902.3437500000,,, +11.4863281250,183,902.3437500000,,, +11.4882812500,183,902.3437500000,,, +11.4902343750,183,902.3437500000,,, +11.4921875000,183,902.3437500000,,, +11.4941406250,183,902.3437500000,,, +11.4960937500,183,902.3437500000,,, +11.4980468750,183,902.3437500000,,, +11.5000000000,184,902.3437500000,,, +11.5019531250,184,902.3437500000,,, +11.5039062500,184,902.3437500000,,, +11.5058593750,184,902.3437500000,,, +11.5078125000,184,902.3437500000,,, +11.5097656250,184,902.3437500000,,, +11.5117187500,184,902.3437500000,,, +11.5136718750,184,902.3437500000,,, +11.5156250000,184,902.3437500000,,, +11.5175781250,184,902.3437500000,,, +11.5195312500,184,902.3437500000,,, +11.5214843750,184,902.3437500000,,, +11.5234375000,184,902.3437500000,,, +11.5253906250,184,902.3437500000,,, +11.5273437500,184,902.3437500000,,, +11.5292968750,184,902.3437500000,,, +11.5312500000,184,902.3437500000,,, +11.5332031250,184,902.3437500000,,, +11.5351562500,184,902.3437500000,,, +11.5371093750,184,902.3437500000,,, +11.5390625000,184,902.3437500000,,, +11.5410156250,184,902.3437500000,,, +11.5429687500,184,902.3437500000,,, +11.5449218750,184,902.3437500000,,, +11.5468750000,184,902.3437500000,,, +11.5488281250,184,902.3437500000,,, +11.5507812500,184,902.3437500000,,, +11.5527343750,184,902.3437500000,,, +11.5546875000,184,902.3437500000,,, +11.5566406250,184,902.3437500000,,, +11.5585937500,184,902.3437500000,,, +11.5605468750,184,902.3437500000,,, +11.5625000000,185,902.3437500000,,, +11.5644531250,185,902.3437500000,,, +11.5664062500,185,902.3437500000,,, +11.5683593750,185,902.3437500000,,, +11.5703125000,185,902.3437500000,,, +11.5722656250,185,902.3437500000,,, +11.5742187500,185,902.3437500000,,, +11.5761718750,185,902.3437500000,,, +11.5781250000,185,902.3437500000,,, +11.5800781250,185,902.3437500000,,, +11.5820312500,185,902.3437500000,,, +11.5839843750,185,902.3437500000,,, +11.5859375000,185,902.3437500000,,, +11.5878906250,185,902.3437500000,,, +11.5898437500,185,902.3437500000,,, +11.5917968750,185,902.3437500000,,, +11.5937500000,185,902.3437500000,,, +11.5957031250,185,902.3437500000,,, +11.5976562500,185,902.3437500000,,, +11.5996093750,185,902.3437500000,,, +11.6015625000,185,902.3437500000,,, +11.6035156250,185,902.3437500000,,, +11.6054687500,185,902.3437500000,,, +11.6074218750,185,902.3437500000,,, +11.6093750000,185,902.3437500000,,, +11.6113281250,185,902.3437500000,,, +11.6132812500,185,902.3437500000,,, +11.6152343750,185,902.3437500000,,, +11.6171875000,185,902.3437500000,,, +11.6191406250,185,902.3437500000,,, +11.6210937500,185,902.3437500000,,, +11.6230468750,185,902.3437500000,,, +11.6250000000,186,902.3437500000,,, +11.6269531250,186,902.3437500000,,, +11.6289062500,186,902.3437500000,,, +11.6308593750,186,902.3437500000,,, +11.6328125000,186,902.3437500000,,, +11.6347656250,186,902.3437500000,,, +11.6367187500,186,902.3437500000,,, +11.6386718750,186,902.3437500000,,, +11.6406250000,186,902.3437500000,,, +11.6425781250,186,902.3437500000,,, +11.6445312500,186,902.3437500000,,, +11.6464843750,186,902.3437500000,,, +11.6484375000,186,902.3437500000,,, +11.6503906250,186,902.3437500000,,, +11.6523437500,186,902.3437500000,,, +11.6542968750,186,902.3437500000,,, +11.6562500000,186,902.3437500000,,, +11.6582031250,186,902.3437500000,,, +11.6601562500,186,902.3437500000,,, +11.6621093750,186,902.3437500000,,, +11.6640625000,186,902.3437500000,,, +11.6660156250,186,902.3437500000,,, +11.6679687500,186,902.3437500000,,, +11.6699218750,186,902.3437500000,,, +11.6718750000,186,902.3437500000,,, +11.6738281250,186,902.3437500000,,, +11.6757812500,186,902.3437500000,,, +11.6777343750,186,902.3437500000,,, +11.6796875000,186,902.3437500000,,, +11.6816406250,186,902.3437500000,,, +11.6835937500,186,902.3437500000,,, +11.6855468750,186,902.3437500000,,, +11.6875000000,187,902.3437500000,,, +11.6894531250,187,902.3437500000,,, +11.6914062500,187,902.3437500000,,, +11.6933593750,187,902.3437500000,,, +11.6953125000,187,902.3437500000,,, +11.6972656250,187,902.3437500000,,, +11.6992187500,187,902.3437500000,,, +11.7011718750,187,902.3437500000,,, +11.7031250000,187,902.3437500000,,, +11.7050781250,187,902.3437500000,,, +11.7070312500,187,902.3437500000,,, +11.7089843750,187,902.3437500000,,, +11.7109375000,187,902.3437500000,,, +11.7128906250,187,902.3437500000,,, +11.7148437500,187,902.3437500000,,, +11.7167968750,187,902.3437500000,,, +11.7187500000,187,902.3437500000,,, +11.7207031250,187,902.3437500000,,, +11.7226562500,187,902.3437500000,,, +11.7246093750,187,902.3437500000,,, +11.7265625000,187,902.3437500000,,, +11.7285156250,187,902.3437500000,,, +11.7304687500,187,902.3437500000,,, +11.7324218750,187,902.3437500000,,, +11.7343750000,187,902.3437500000,,, +11.7363281250,187,902.3437500000,,, +11.7382812500,187,902.3437500000,,, +11.7402343750,187,902.3437500000,,, +11.7421875000,187,902.3437500000,,, +11.7441406250,187,902.3437500000,,, +11.7460937500,187,902.3437500000,,, +11.7480468750,187,902.3437500000,,, +11.7500000000,188,914.0625000000,,, +11.7519531250,188,914.0625000000,,, +11.7539062500,188,914.0625000000,,, +11.7558593750,188,914.0625000000,,, +11.7578125000,188,914.0625000000,,, +11.7597656250,188,914.0625000000,,, +11.7617187500,188,914.0625000000,,, +11.7636718750,188,914.0625000000,,, +11.7656250000,188,914.0625000000,,, +11.7675781250,188,914.0625000000,,, +11.7695312500,188,914.0625000000,,, +11.7714843750,188,914.0625000000,,, +11.7734375000,188,914.0625000000,,, +11.7753906250,188,914.0625000000,,, +11.7773437500,188,914.0625000000,,, +11.7792968750,188,914.0625000000,,, +11.7812500000,188,914.0625000000,,, +11.7832031250,188,914.0625000000,,, +11.7851562500,188,914.0625000000,,, +11.7871093750,188,914.0625000000,,, +11.7890625000,188,914.0625000000,,, +11.7910156250,188,914.0625000000,,, +11.7929687500,188,914.0625000000,,, +11.7949218750,188,914.0625000000,,, +11.7968750000,188,914.0625000000,,, +11.7988281250,188,914.0625000000,,, +11.8007812500,188,914.0625000000,,, +11.8027343750,188,914.0625000000,,, +11.8046875000,188,914.0625000000,,, +11.8066406250,188,914.0625000000,,, +11.8085937500,188,914.0625000000,,, +11.8105468750,188,914.0625000000,,, +11.8125000000,189,914.0625000000,,, +11.8144531250,189,914.0625000000,,, +11.8164062500,189,914.0625000000,,, +11.8183593750,189,914.0625000000,,, +11.8203125000,189,914.0625000000,,, +11.8222656250,189,914.0625000000,,, +11.8242187500,189,914.0625000000,,, +11.8261718750,189,914.0625000000,,, +11.8281250000,189,914.0625000000,,, +11.8300781250,189,914.0625000000,,, +11.8320312500,189,914.0625000000,,, +11.8339843750,189,914.0625000000,,, +11.8359375000,189,914.0625000000,,, +11.8378906250,189,914.0625000000,,, +11.8398437500,189,914.0625000000,,, +11.8417968750,189,914.0625000000,,, +11.8437500000,189,914.0625000000,,, +11.8457031250,189,914.0625000000,,, +11.8476562500,189,914.0625000000,,, +11.8496093750,189,914.0625000000,,, +11.8515625000,189,914.0625000000,,, +11.8535156250,189,914.0625000000,,, +11.8554687500,189,914.0625000000,,, +11.8574218750,189,914.0625000000,,, +11.8593750000,189,914.0625000000,,, +11.8613281250,189,914.0625000000,,, +11.8632812500,189,914.0625000000,,, +11.8652343750,189,914.0625000000,,, +11.8671875000,189,914.0625000000,,, +11.8691406250,189,914.0625000000,,, +11.8710937500,189,914.0625000000,,, +11.8730468750,189,914.0625000000,,, +11.8750000000,190,914.0625000000,,, +11.8769531250,190,914.0625000000,,, +11.8789062500,190,914.0625000000,,, +11.8808593750,190,914.0625000000,,, +11.8828125000,190,914.0625000000,,, +11.8847656250,190,914.0625000000,,, +11.8867187500,190,914.0625000000,,, +11.8886718750,190,914.0625000000,,, +11.8906250000,190,914.0625000000,,, +11.8925781250,190,914.0625000000,,, +11.8945312500,190,914.0625000000,,, +11.8964843750,190,914.0625000000,,, +11.8984375000,190,914.0625000000,,, +11.9003906250,190,914.0625000000,,, +11.9023437500,190,914.0625000000,,, +11.9042968750,190,914.0625000000,,, +11.9062500000,190,914.0625000000,,, +11.9082031250,190,914.0625000000,,, +11.9101562500,190,914.0625000000,,, +11.9121093750,190,914.0625000000,,, +11.9140625000,190,914.0625000000,,, +11.9160156250,190,914.0625000000,,, +11.9179687500,190,914.0625000000,,, +11.9199218750,190,914.0625000000,,, +11.9218750000,190,914.0625000000,,, +11.9238281250,190,914.0625000000,,, +11.9257812500,190,914.0625000000,,, +11.9277343750,190,914.0625000000,,, +11.9296875000,190,914.0625000000,,, +11.9316406250,190,914.0625000000,,, +11.9335937500,190,914.0625000000,,, +11.9355468750,190,914.0625000000,,, +11.9375000000,191,914.0625000000,,, +11.9394531250,191,914.0625000000,,, +11.9414062500,191,914.0625000000,,, +11.9433593750,191,914.0625000000,,, +11.9453125000,191,914.0625000000,,, +11.9472656250,191,914.0625000000,,, +11.9492187500,191,914.0625000000,,, +11.9511718750,191,914.0625000000,,, +11.9531250000,191,914.0625000000,,, +11.9550781250,191,914.0625000000,,, +11.9570312500,191,914.0625000000,,, +11.9589843750,191,914.0625000000,,, +11.9609375000,191,914.0625000000,,, +11.9628906250,191,914.0625000000,,, +11.9648437500,191,914.0625000000,,, +11.9667968750,191,914.0625000000,,, +11.9687500000,191,914.0625000000,,, +11.9707031250,191,914.0625000000,,, +11.9726562500,191,914.0625000000,,, +11.9746093750,191,914.0625000000,,, +11.9765625000,191,914.0625000000,,, +11.9785156250,191,914.0625000000,,, +11.9804687500,191,914.0625000000,,, +11.9824218750,191,914.0625000000,,, +11.9843750000,191,914.0625000000,,, +11.9863281250,191,914.0625000000,,, +11.9882812500,191,914.0625000000,,, +11.9902343750,191,914.0625000000,,, +11.9921875000,191,914.0625000000,,, +11.9941406250,191,914.0625000000,,, +11.9960937500,191,914.0625000000,,, +11.9980468750,191,914.0625000000,,, +12.0000000000,192,914.0625000000,,, +12.0019531250,192,914.0625000000,,, +12.0039062500,192,914.0625000000,,, +12.0058593750,192,914.0625000000,,, +12.0078125000,192,914.0625000000,,, +12.0097656250,192,914.0625000000,,, +12.0117187500,192,914.0625000000,,, +12.0136718750,192,914.0625000000,,, +12.0156250000,192,914.0625000000,,, +12.0175781250,192,914.0625000000,,, +12.0195312500,192,914.0625000000,,, +12.0214843750,192,914.0625000000,,, +12.0234375000,192,914.0625000000,,, +12.0253906250,192,914.0625000000,,, +12.0273437500,192,914.0625000000,,, +12.0292968750,192,914.0625000000,,, +12.0312500000,192,914.0625000000,,, +12.0332031250,192,914.0625000000,,, +12.0351562500,192,914.0625000000,,, +12.0371093750,192,914.0625000000,,, +12.0390625000,192,914.0625000000,,, +12.0410156250,192,914.0625000000,,, +12.0429687500,192,914.0625000000,,, +12.0449218750,192,914.0625000000,,, +12.0468750000,192,914.0625000000,,, +12.0488281250,192,914.0625000000,,, +12.0507812500,192,914.0625000000,,, +12.0527343750,192,914.0625000000,,, +12.0546875000,192,914.0625000000,,, +12.0566406250,192,914.0625000000,,, +12.0585937500,192,914.0625000000,,, +12.0605468750,192,914.0625000000,,, +12.0625000000,193,914.0625000000,,, +12.0644531250,193,914.0625000000,,, +12.0664062500,193,914.0625000000,,, +12.0683593750,193,914.0625000000,,, +12.0703125000,193,914.0625000000,,, +12.0722656250,193,914.0625000000,,, +12.0742187500,193,914.0625000000,,, +12.0761718750,193,914.0625000000,,, +12.0781250000,193,914.0625000000,,, +12.0800781250,193,914.0625000000,,, +12.0820312500,193,914.0625000000,,, +12.0839843750,193,914.0625000000,,, +12.0859375000,193,914.0625000000,,, +12.0878906250,193,914.0625000000,,, +12.0898437500,193,914.0625000000,,, +12.0917968750,193,914.0625000000,,, +12.0937500000,193,914.0625000000,,, +12.0957031250,193,914.0625000000,,, +12.0976562500,193,914.0625000000,,, +12.0996093750,193,914.0625000000,,, +12.1015625000,193,914.0625000000,,, +12.1035156250,193,914.0625000000,,, +12.1054687500,193,914.0625000000,,, +12.1074218750,193,914.0625000000,,, +12.1093750000,193,914.0625000000,,, +12.1113281250,193,914.0625000000,,, +12.1132812500,193,914.0625000000,,, +12.1152343750,193,914.0625000000,,, +12.1171875000,193,914.0625000000,,, +12.1191406250,193,914.0625000000,,, +12.1210937500,193,914.0625000000,,, +12.1230468750,193,914.0625000000,,, +12.1250000000,194,914.0625000000,,, +12.1269531250,194,914.0625000000,,, +12.1289062500,194,914.0625000000,,, +12.1308593750,194,914.0625000000,,, +12.1328125000,194,914.0625000000,,, +12.1347656250,194,914.0625000000,,, +12.1367187500,194,914.0625000000,,, +12.1386718750,194,914.0625000000,,, +12.1406250000,194,914.0625000000,,, +12.1425781250,194,914.0625000000,,, +12.1445312500,194,914.0625000000,,, +12.1464843750,194,914.0625000000,,, +12.1484375000,194,914.0625000000,,, +12.1503906250,194,914.0625000000,,, +12.1523437500,194,914.0625000000,,, +12.1542968750,194,914.0625000000,,, +12.1562500000,194,914.0625000000,,, +12.1582031250,194,914.0625000000,,, +12.1601562500,194,914.0625000000,,, +12.1621093750,194,914.0625000000,,, +12.1640625000,194,914.0625000000,,, +12.1660156250,194,914.0625000000,,, +12.1679687500,194,914.0625000000,,, +12.1699218750,194,914.0625000000,,, +12.1718750000,194,914.0625000000,,, +12.1738281250,194,914.0625000000,,, +12.1757812500,194,914.0625000000,,, +12.1777343750,194,914.0625000000,,, +12.1796875000,194,914.0625000000,,, +12.1816406250,194,914.0625000000,,, +12.1835937500,194,914.0625000000,,, +12.1855468750,194,914.0625000000,,, +12.1875000000,195,914.0625000000,,, +12.1894531250,195,914.0625000000,,, +12.1914062500,195,914.0625000000,,, +12.1933593750,195,914.0625000000,,, +12.1953125000,195,914.0625000000,,, +12.1972656250,195,914.0625000000,,, +12.1992187500,195,914.0625000000,,, +12.2011718750,195,914.0625000000,,, +12.2031250000,195,914.0625000000,,, +12.2050781250,195,914.0625000000,,, +12.2070312500,195,914.0625000000,,, +12.2089843750,195,914.0625000000,,, +12.2109375000,195,914.0625000000,,, +12.2128906250,195,914.0625000000,,, +12.2148437500,195,914.0625000000,,, +12.2167968750,195,914.0625000000,,, +12.2187500000,195,914.0625000000,,, +12.2207031250,195,914.0625000000,,, +12.2226562500,195,914.0625000000,,, +12.2246093750,195,914.0625000000,,, +12.2265625000,195,914.0625000000,,, +12.2285156250,195,914.0625000000,,, +12.2304687500,195,914.0625000000,,, +12.2324218750,195,914.0625000000,,, +12.2343750000,195,914.0625000000,,, +12.2363281250,195,914.0625000000,,, +12.2382812500,195,914.0625000000,,, +12.2402343750,195,914.0625000000,,, +12.2421875000,195,914.0625000000,,, +12.2441406250,195,914.0625000000,,, +12.2460937500,195,914.0625000000,,, +12.2480468750,195,914.0625000000,,, +12.2500000000,196,914.0625000000,,, +12.2519531250,196,914.0625000000,,, +12.2539062500,196,914.0625000000,,, +12.2558593750,196,914.0625000000,,, +12.2578125000,196,914.0625000000,,, +12.2597656250,196,914.0625000000,,, +12.2617187500,196,914.0625000000,,, +12.2636718750,196,914.0625000000,,, +12.2656250000,196,914.0625000000,,, +12.2675781250,196,914.0625000000,,, +12.2695312500,196,914.0625000000,,, +12.2714843750,196,914.0625000000,,, +12.2734375000,196,914.0625000000,,, +12.2753906250,196,914.0625000000,,, +12.2773437500,196,914.0625000000,,, +12.2792968750,196,914.0625000000,,, +12.2812500000,196,914.0625000000,,, +12.2832031250,196,914.0625000000,,, +12.2851562500,196,914.0625000000,,, +12.2871093750,196,914.0625000000,,, +12.2890625000,196,914.0625000000,,, +12.2910156250,196,914.0625000000,,, +12.2929687500,196,914.0625000000,,, +12.2949218750,196,914.0625000000,,, +12.2968750000,196,914.0625000000,,, +12.2988281250,196,914.0625000000,,, +12.3007812500,196,914.0625000000,,, +12.3027343750,196,914.0625000000,,, +12.3046875000,196,914.0625000000,,, +12.3066406250,196,914.0625000000,,, +12.3085937500,196,914.0625000000,,, +12.3105468750,196,914.0625000000,,, +12.3125000000,197,914.0625000000,,, +12.3144531250,197,914.0625000000,,, +12.3164062500,197,914.0625000000,,, +12.3183593750,197,914.0625000000,,, +12.3203125000,197,914.0625000000,,, +12.3222656250,197,914.0625000000,,, +12.3242187500,197,914.0625000000,,, +12.3261718750,197,914.0625000000,,, +12.3281250000,197,914.0625000000,,, +12.3300781250,197,914.0625000000,,, +12.3320312500,197,914.0625000000,,, +12.3339843750,197,914.0625000000,,, +12.3359375000,197,914.0625000000,,, +12.3378906250,197,914.0625000000,,, +12.3398437500,197,914.0625000000,,, +12.3417968750,197,914.0625000000,,, +12.3437500000,197,914.0625000000,,, +12.3457031250,197,914.0625000000,,, +12.3476562500,197,914.0625000000,,, +12.3496093750,197,914.0625000000,,, +12.3515625000,197,914.0625000000,,, +12.3535156250,197,914.0625000000,,, +12.3554687500,197,914.0625000000,,, +12.3574218750,197,914.0625000000,,, +12.3593750000,197,914.0625000000,,, +12.3613281250,197,914.0625000000,,, +12.3632812500,197,914.0625000000,,, +12.3652343750,197,914.0625000000,,, +12.3671875000,197,914.0625000000,,, +12.3691406250,197,914.0625000000,,, +12.3710937500,197,914.0625000000,,, +12.3730468750,197,914.0625000000,,, +12.3750000000,198,914.0625000000,,, +12.3769531250,198,914.0625000000,,, +12.3789062500,198,914.0625000000,,, +12.3808593750,198,914.0625000000,,, +12.3828125000,198,914.0625000000,,, +12.3847656250,198,914.0625000000,,, +12.3867187500,198,914.0625000000,,, +12.3886718750,198,914.0625000000,,, +12.3906250000,198,914.0625000000,,, +12.3925781250,198,914.0625000000,,, +12.3945312500,198,914.0625000000,,, +12.3964843750,198,914.0625000000,,, +12.3984375000,198,914.0625000000,,, +12.4003906250,198,914.0625000000,,, +12.4023437500,198,914.0625000000,,, +12.4042968750,198,914.0625000000,,, +12.4062500000,198,914.0625000000,,, +12.4082031250,198,914.0625000000,,, +12.4101562500,198,914.0625000000,,, +12.4121093750,198,914.0625000000,,, +12.4140625000,198,914.0625000000,,, +12.4160156250,198,914.0625000000,,, +12.4179687500,198,914.0625000000,,, +12.4199218750,198,914.0625000000,,, +12.4218750000,198,914.0625000000,,, +12.4238281250,198,914.0625000000,,, +12.4257812500,198,914.0625000000,,, +12.4277343750,198,914.0625000000,,, +12.4296875000,198,914.0625000000,,, +12.4316406250,198,914.0625000000,,, +12.4335937500,198,914.0625000000,,, +12.4355468750,198,914.0625000000,,, +12.4375000000,199,914.0625000000,,, +12.4394531250,199,914.0625000000,,, +12.4414062500,199,914.0625000000,,, +12.4433593750,199,914.0625000000,,, +12.4453125000,199,914.0625000000,,, +12.4472656250,199,914.0625000000,,, +12.4492187500,199,914.0625000000,,, +12.4511718750,199,914.0625000000,,, +12.4531250000,199,914.0625000000,,, +12.4550781250,199,914.0625000000,,, +12.4570312500,199,914.0625000000,,, +12.4589843750,199,914.0625000000,,, +12.4609375000,199,914.0625000000,,, +12.4628906250,199,914.0625000000,,, +12.4648437500,199,914.0625000000,,, +12.4667968750,199,914.0625000000,,, +12.4687500000,199,914.0625000000,,, +12.4707031250,199,914.0625000000,,, +12.4726562500,199,914.0625000000,,, +12.4746093750,199,914.0625000000,,, +12.4765625000,199,914.0625000000,,, +12.4785156250,199,914.0625000000,,, +12.4804687500,199,914.0625000000,,, +12.4824218750,199,914.0625000000,,, +12.4843750000,199,914.0625000000,,, +12.4863281250,199,914.0625000000,,, +12.4882812500,199,914.0625000000,,, +12.4902343750,199,914.0625000000,,, +12.4921875000,199,914.0625000000,,, +12.4941406250,199,914.0625000000,,, +12.4960937500,199,914.0625000000,,, +12.4980468750,199,914.0625000000,,, +12.5000000000,200,914.0625000000,,, +12.5019531250,200,914.0625000000,,, +12.5039062500,200,914.0625000000,,, +12.5058593750,200,914.0625000000,,, +12.5078125000,200,914.0625000000,,, +12.5097656250,200,914.0625000000,,, +12.5117187500,200,914.0625000000,,, +12.5136718750,200,914.0625000000,,, +12.5156250000,200,914.0625000000,,, +12.5175781250,200,914.0625000000,,, +12.5195312500,200,914.0625000000,,, +12.5214843750,200,914.0625000000,,, +12.5234375000,200,914.0625000000,,, +12.5253906250,200,914.0625000000,,, +12.5273437500,200,914.0625000000,,, +12.5292968750,200,914.0625000000,,, +12.5312500000,200,914.0625000000,,, +12.5332031250,200,914.0625000000,,, +12.5351562500,200,914.0625000000,,, +12.5371093750,200,914.0625000000,,, +12.5390625000,200,914.0625000000,,, +12.5410156250,200,914.0625000000,,, +12.5429687500,200,914.0625000000,,, +12.5449218750,200,914.0625000000,,, +12.5468750000,200,914.0625000000,,, +12.5488281250,200,914.0625000000,,, +12.5507812500,200,914.0625000000,,, +12.5527343750,200,914.0625000000,,, +12.5546875000,200,914.0625000000,,, +12.5566406250,200,914.0625000000,,, +12.5585937500,200,914.0625000000,,, +12.5605468750,200,914.0625000000,,, +12.5625000000,201,859.3750000000,,, +12.5644531250,201,859.3750000000,,, +12.5664062500,201,859.3750000000,,, +12.5683593750,201,859.3750000000,,, +12.5703125000,201,859.3750000000,,, +12.5722656250,201,859.3750000000,,, +12.5742187500,201,859.3750000000,,, +12.5761718750,201,859.3750000000,,, +12.5781250000,201,859.3750000000,,, +12.5800781250,201,859.3750000000,,, +12.5820312500,201,859.3750000000,,, +12.5839843750,201,859.3750000000,,, +12.5859375000,201,859.3750000000,,, +12.5878906250,201,859.3750000000,,, +12.5898437500,201,859.3750000000,,, +12.5917968750,201,859.3750000000,,, +12.5937500000,201,859.3750000000,,, +12.5957031250,201,859.3750000000,,, +12.5976562500,201,859.3750000000,,, +12.5996093750,201,859.3750000000,,, +12.6015625000,201,859.3750000000,,, +12.6035156250,201,859.3750000000,,, +12.6054687500,201,859.3750000000,,, +12.6074218750,201,859.3750000000,,, +12.6093750000,201,859.3750000000,,, +12.6113281250,201,859.3750000000,,, +12.6132812500,201,859.3750000000,,, +12.6152343750,201,859.3750000000,,, +12.6171875000,201,859.3750000000,,, +12.6191406250,201,859.3750000000,,, +12.6210937500,201,859.3750000000,,, +12.6230468750,201,859.3750000000,,, +12.6250000000,202,859.3750000000,,, +12.6269531250,202,859.3750000000,,, +12.6289062500,202,859.3750000000,,, +12.6308593750,202,859.3750000000,,, +12.6328125000,202,859.3750000000,,, +12.6347656250,202,859.3750000000,,, +12.6367187500,202,859.3750000000,,, +12.6386718750,202,859.3750000000,,, +12.6406250000,202,859.3750000000,,, +12.6425781250,202,859.3750000000,,, +12.6445312500,202,859.3750000000,,, +12.6464843750,202,859.3750000000,,, +12.6484375000,202,859.3750000000,,, +12.6503906250,202,859.3750000000,,, +12.6523437500,202,859.3750000000,,, +12.6542968750,202,859.3750000000,,, +12.6562500000,202,859.3750000000,,, +12.6582031250,202,859.3750000000,,, +12.6601562500,202,859.3750000000,,, +12.6621093750,202,859.3750000000,,, +12.6640625000,202,859.3750000000,,, +12.6660156250,202,859.3750000000,,, +12.6679687500,202,859.3750000000,,, +12.6699218750,202,859.3750000000,,, +12.6718750000,202,859.3750000000,,, +12.6738281250,202,859.3750000000,,, +12.6757812500,202,859.3750000000,,, +12.6777343750,202,859.3750000000,,, +12.6796875000,202,859.3750000000,,, +12.6816406250,202,859.3750000000,,, +12.6835937500,202,859.3750000000,,, +12.6855468750,202,859.3750000000,,, +12.6875000000,203,859.3750000000,,, +12.6894531250,203,859.3750000000,,, +12.6914062500,203,859.3750000000,,, +12.6933593750,203,859.3750000000,,, +12.6953125000,203,859.3750000000,,, +12.6972656250,203,859.3750000000,,, +12.6992187500,203,859.3750000000,,, +12.7011718750,203,859.3750000000,,, +12.7031250000,203,859.3750000000,,, +12.7050781250,203,859.3750000000,,, +12.7070312500,203,859.3750000000,,, +12.7089843750,203,859.3750000000,,, +12.7109375000,203,859.3750000000,,, +12.7128906250,203,859.3750000000,,, +12.7148437500,203,859.3750000000,,, +12.7167968750,203,859.3750000000,,, +12.7187500000,203,859.3750000000,,, +12.7207031250,203,859.3750000000,,, +12.7226562500,203,859.3750000000,,, +12.7246093750,203,859.3750000000,,, +12.7265625000,203,859.3750000000,,, +12.7285156250,203,859.3750000000,,, +12.7304687500,203,859.3750000000,,, +12.7324218750,203,859.3750000000,,, +12.7343750000,203,859.3750000000,,, +12.7363281250,203,859.3750000000,,, +12.7382812500,203,859.3750000000,,, +12.7402343750,203,859.3750000000,,, +12.7421875000,203,859.3750000000,,, +12.7441406250,203,859.3750000000,,, +12.7460937500,203,859.3750000000,,, +12.7480468750,203,859.3750000000,,, +12.7500000000,204,859.3750000000,,, +12.7519531250,204,859.3750000000,,, +12.7539062500,204,859.3750000000,,, +12.7558593750,204,859.3750000000,,, +12.7578125000,204,859.3750000000,,, +12.7597656250,204,859.3750000000,,, +12.7617187500,204,859.3750000000,,, +12.7636718750,204,859.3750000000,,, +12.7656250000,204,859.3750000000,,, +12.7675781250,204,859.3750000000,,, +12.7695312500,204,859.3750000000,,, +12.7714843750,204,859.3750000000,,, +12.7734375000,204,859.3750000000,,, +12.7753906250,204,859.3750000000,,, +12.7773437500,204,859.3750000000,,, +12.7792968750,204,859.3750000000,,, +12.7812500000,204,859.3750000000,,, +12.7832031250,204,859.3750000000,,, +12.7851562500,204,859.3750000000,,, +12.7871093750,204,859.3750000000,,, +12.7890625000,204,859.3750000000,,, +12.7910156250,204,859.3750000000,,, +12.7929687500,204,859.3750000000,,, +12.7949218750,204,859.3750000000,,, +12.7968750000,204,859.3750000000,,, +12.7988281250,204,859.3750000000,,, +12.8007812500,204,859.3750000000,,, +12.8027343750,204,859.3750000000,,, +12.8046875000,204,859.3750000000,,, +12.8066406250,204,859.3750000000,,, +12.8085937500,204,859.3750000000,,, +12.8105468750,204,859.3750000000,,, +12.8125000000,205,859.3750000000,,, +12.8144531250,205,859.3750000000,,, +12.8164062500,205,859.3750000000,,, +12.8183593750,205,859.3750000000,,, +12.8203125000,205,859.3750000000,,, +12.8222656250,205,859.3750000000,,, +12.8242187500,205,859.3750000000,,, +12.8261718750,205,859.3750000000,,, +12.8281250000,205,859.3750000000,,, +12.8300781250,205,859.3750000000,,, +12.8320312500,205,859.3750000000,,, +12.8339843750,205,859.3750000000,,, +12.8359375000,205,859.3750000000,,, +12.8378906250,205,859.3750000000,,, +12.8398437500,205,859.3750000000,,, +12.8417968750,205,859.3750000000,,, +12.8437500000,205,859.3750000000,,, +12.8457031250,205,859.3750000000,,, +12.8476562500,205,859.3750000000,,, +12.8496093750,205,859.3750000000,,, +12.8515625000,205,859.3750000000,,, +12.8535156250,205,859.3750000000,,, +12.8554687500,205,859.3750000000,,, +12.8574218750,205,859.3750000000,,, +12.8593750000,205,859.3750000000,,, +12.8613281250,205,859.3750000000,,, +12.8632812500,205,859.3750000000,,, +12.8652343750,205,859.3750000000,,, +12.8671875000,205,859.3750000000,,, +12.8691406250,205,859.3750000000,,, +12.8710937500,205,859.3750000000,,, +12.8730468750,205,859.3750000000,,, +12.8750000000,206,859.3750000000,,, +12.8769531250,206,859.3750000000,,, +12.8789062500,206,859.3750000000,,, +12.8808593750,206,859.3750000000,,, +12.8828125000,206,859.3750000000,,, +12.8847656250,206,859.3750000000,,, +12.8867187500,206,859.3750000000,,, +12.8886718750,206,859.3750000000,,, +12.8906250000,206,859.3750000000,,, +12.8925781250,206,859.3750000000,,, +12.8945312500,206,859.3750000000,,, +12.8964843750,206,859.3750000000,,, +12.8984375000,206,859.3750000000,,, +12.9003906250,206,859.3750000000,,, +12.9023437500,206,859.3750000000,,, +12.9042968750,206,859.3750000000,,, +12.9062500000,206,859.3750000000,,, +12.9082031250,206,859.3750000000,,, +12.9101562500,206,859.3750000000,,, +12.9121093750,206,859.3750000000,,, +12.9140625000,206,859.3750000000,,, +12.9160156250,206,859.3750000000,,, +12.9179687500,206,859.3750000000,,, +12.9199218750,206,859.3750000000,,, +12.9218750000,206,859.3750000000,,, +12.9238281250,206,859.3750000000,,, +12.9257812500,206,859.3750000000,,, +12.9277343750,206,859.3750000000,,, +12.9296875000,206,859.3750000000,,, +12.9316406250,206,859.3750000000,,, +12.9335937500,206,859.3750000000,,, +12.9355468750,206,859.3750000000,,, +12.9375000000,207,859.3750000000,,, +12.9394531250,207,859.3750000000,,, +12.9414062500,207,859.3750000000,,, +12.9433593750,207,859.3750000000,,, +12.9453125000,207,859.3750000000,,, +12.9472656250,207,859.3750000000,,, +12.9492187500,207,859.3750000000,,, +12.9511718750,207,859.3750000000,,, +12.9531250000,207,859.3750000000,,, +12.9550781250,207,859.3750000000,,, +12.9570312500,207,859.3750000000,,, +12.9589843750,207,859.3750000000,,, +12.9609375000,207,859.3750000000,,, +12.9628906250,207,859.3750000000,,, +12.9648437500,207,859.3750000000,,, +12.9667968750,207,859.3750000000,,, +12.9687500000,207,859.3750000000,,, +12.9707031250,207,859.3750000000,,, +12.9726562500,207,859.3750000000,,, +12.9746093750,207,859.3750000000,,, +12.9765625000,207,859.3750000000,,, +12.9785156250,207,859.3750000000,,, +12.9804687500,207,859.3750000000,,, +12.9824218750,207,859.3750000000,,, +12.9843750000,207,859.3750000000,,, +12.9863281250,207,859.3750000000,,, +12.9882812500,207,859.3750000000,,, +12.9902343750,207,859.3750000000,,, +12.9921875000,207,859.3750000000,,, +12.9941406250,207,859.3750000000,,, +12.9960937500,207,859.3750000000,,, +12.9980468750,207,859.3750000000,,, +13.0000000000,208,859.3750000000,,, +13.0019531250,208,859.3750000000,,, +13.0039062500,208,859.3750000000,,, +13.0058593750,208,859.3750000000,,, +13.0078125000,208,859.3750000000,,, +13.0097656250,208,859.3750000000,,, +13.0117187500,208,859.3750000000,,, +13.0136718750,208,859.3750000000,,, +13.0156250000,208,859.3750000000,,, +13.0175781250,208,859.3750000000,,, +13.0195312500,208,859.3750000000,,, +13.0214843750,208,859.3750000000,,, +13.0234375000,208,859.3750000000,,, +13.0253906250,208,859.3750000000,,, +13.0273437500,208,859.3750000000,,, +13.0292968750,208,859.3750000000,,, +13.0312500000,208,859.3750000000,,, +13.0332031250,208,859.3750000000,,, +13.0351562500,208,859.3750000000,,, +13.0371093750,208,859.3750000000,,, +13.0390625000,208,859.3750000000,,, +13.0410156250,208,859.3750000000,,, +13.0429687500,208,859.3750000000,,, +13.0449218750,208,859.3750000000,,, +13.0468750000,208,859.3750000000,,, +13.0488281250,208,859.3750000000,,, +13.0507812500,208,859.3750000000,,, +13.0527343750,208,859.3750000000,,, +13.0546875000,208,859.3750000000,,, +13.0566406250,208,859.3750000000,,, +13.0585937500,208,859.3750000000,,, +13.0605468750,208,859.3750000000,,, +13.0625000000,209,859.3750000000,,, +13.0644531250,209,859.3750000000,,, +13.0664062500,209,859.3750000000,,, +13.0683593750,209,859.3750000000,,, +13.0703125000,209,859.3750000000,,, +13.0722656250,209,859.3750000000,,, +13.0742187500,209,859.3750000000,,, +13.0761718750,209,859.3750000000,,, +13.0781250000,209,859.3750000000,,, +13.0800781250,209,859.3750000000,,, +13.0820312500,209,859.3750000000,,, +13.0839843750,209,859.3750000000,,, +13.0859375000,209,859.3750000000,,, +13.0878906250,209,859.3750000000,,, +13.0898437500,209,859.3750000000,,, +13.0917968750,209,859.3750000000,,, +13.0937500000,209,859.3750000000,,, +13.0957031250,209,859.3750000000,,, +13.0976562500,209,859.3750000000,,, +13.0996093750,209,859.3750000000,,, +13.1015625000,209,859.3750000000,,, +13.1035156250,209,859.3750000000,,, +13.1054687500,209,859.3750000000,,, +13.1074218750,209,859.3750000000,,, +13.1093750000,209,859.3750000000,,, +13.1113281250,209,859.3750000000,,, +13.1132812500,209,859.3750000000,,, +13.1152343750,209,859.3750000000,,, +13.1171875000,209,859.3750000000,,, +13.1191406250,209,859.3750000000,,, +13.1210937500,209,859.3750000000,,, +13.1230468750,209,859.3750000000,,, +13.1250000000,210,859.3750000000,,, +13.1269531250,210,859.3750000000,,, +13.1289062500,210,859.3750000000,,, +13.1308593750,210,859.3750000000,,, +13.1328125000,210,859.3750000000,,, +13.1347656250,210,859.3750000000,,, +13.1367187500,210,859.3750000000,,, +13.1386718750,210,859.3750000000,,, +13.1406250000,210,859.3750000000,,, +13.1425781250,210,859.3750000000,,, +13.1445312500,210,859.3750000000,,, +13.1464843750,210,859.3750000000,,, +13.1484375000,210,859.3750000000,,, +13.1503906250,210,859.3750000000,,, +13.1523437500,210,859.3750000000,,, +13.1542968750,210,859.3750000000,,, +13.1562500000,210,859.3750000000,,, +13.1582031250,210,859.3750000000,,, +13.1601562500,210,859.3750000000,,, +13.1621093750,210,859.3750000000,,, +13.1640625000,210,859.3750000000,,, +13.1660156250,210,859.3750000000,,, +13.1679687500,210,859.3750000000,,, +13.1699218750,210,859.3750000000,,, +13.1718750000,210,859.3750000000,,, +13.1738281250,210,859.3750000000,,, +13.1757812500,210,859.3750000000,,, +13.1777343750,210,859.3750000000,,, +13.1796875000,210,859.3750000000,,, +13.1816406250,210,859.3750000000,,, +13.1835937500,210,859.3750000000,,, +13.1855468750,210,859.3750000000,,, +13.1875000000,211,859.3750000000,,, +13.1894531250,211,859.3750000000,,, +13.1914062500,211,859.3750000000,,, +13.1933593750,211,859.3750000000,,, +13.1953125000,211,859.3750000000,,, +13.1972656250,211,859.3750000000,,, +13.1992187500,211,859.3750000000,,, +13.2011718750,211,859.3750000000,,, +13.2031250000,211,859.3750000000,,, +13.2050781250,211,859.3750000000,,, +13.2070312500,211,859.3750000000,,, +13.2089843750,211,859.3750000000,,, +13.2109375000,211,859.3750000000,,, +13.2128906250,211,859.3750000000,,, +13.2148437500,211,859.3750000000,,, +13.2167968750,211,859.3750000000,,, +13.2187500000,211,859.3750000000,,, +13.2207031250,211,859.3750000000,,, +13.2226562500,211,859.3750000000,,, +13.2246093750,211,859.3750000000,,, +13.2265625000,211,859.3750000000,,, +13.2285156250,211,859.3750000000,,, +13.2304687500,211,859.3750000000,,, +13.2324218750,211,859.3750000000,,, +13.2343750000,211,859.3750000000,,, +13.2363281250,211,859.3750000000,,, +13.2382812500,211,859.3750000000,,, +13.2402343750,211,859.3750000000,,, +13.2421875000,211,859.3750000000,,, +13.2441406250,211,859.3750000000,,, +13.2460937500,211,859.3750000000,,, +13.2480468750,211,859.3750000000,,, +13.2500000000,212,859.3750000000,,, +13.2519531250,212,859.3750000000,,, +13.2539062500,212,859.3750000000,,, +13.2558593750,212,859.3750000000,,, +13.2578125000,212,859.3750000000,,, +13.2597656250,212,859.3750000000,,, +13.2617187500,212,859.3750000000,,, +13.2636718750,212,859.3750000000,,, +13.2656250000,212,859.3750000000,,, +13.2675781250,212,859.3750000000,,, +13.2695312500,212,859.3750000000,,, +13.2714843750,212,859.3750000000,,, +13.2734375000,212,859.3750000000,,, +13.2753906250,212,859.3750000000,,, +13.2773437500,212,859.3750000000,,, +13.2792968750,212,859.3750000000,,, +13.2812500000,212,859.3750000000,,, +13.2832031250,212,859.3750000000,,, +13.2851562500,212,859.3750000000,,, +13.2871093750,212,859.3750000000,,, +13.2890625000,212,859.3750000000,,, +13.2910156250,212,859.3750000000,,, +13.2929687500,212,859.3750000000,,, +13.2949218750,212,859.3750000000,,, +13.2968750000,212,859.3750000000,,, +13.2988281250,212,859.3750000000,,, +13.3007812500,212,859.3750000000,,, +13.3027343750,212,859.3750000000,,, +13.3046875000,212,859.3750000000,,, +13.3066406250,212,859.3750000000,,, +13.3085937500,212,859.3750000000,,, +13.3105468750,212,859.3750000000,,, +13.3125000000,213,859.3750000000,,, +13.3144531250,213,859.3750000000,,, +13.3164062500,213,859.3750000000,,, +13.3183593750,213,859.3750000000,,, +13.3203125000,213,859.3750000000,,, +13.3222656250,213,859.3750000000,,, +13.3242187500,213,859.3750000000,,, +13.3261718750,213,859.3750000000,,, +13.3281250000,213,859.3750000000,,, +13.3300781250,213,859.3750000000,,, +13.3320312500,213,859.3750000000,,, +13.3339843750,213,859.3750000000,,, +13.3359375000,213,859.3750000000,,, +13.3378906250,213,859.3750000000,,, +13.3398437500,213,859.3750000000,,, +13.3417968750,213,859.3750000000,,, +13.3437500000,213,859.3750000000,,, +13.3457031250,213,859.3750000000,,, +13.3476562500,213,859.3750000000,,, +13.3496093750,213,859.3750000000,,, +13.3515625000,213,859.3750000000,,, +13.3535156250,213,859.3750000000,,, +13.3554687500,213,859.3750000000,,, +13.3574218750,213,859.3750000000,,, +13.3593750000,213,859.3750000000,,, +13.3613281250,213,859.3750000000,,, +13.3632812500,213,859.3750000000,,, +13.3652343750,213,859.3750000000,,, +13.3671875000,213,859.3750000000,,, +13.3691406250,213,859.3750000000,,, +13.3710937500,213,859.3750000000,,, +13.3730468750,213,859.3750000000,,, +13.3750000000,214,859.3750000000,,, +13.3769531250,214,859.3750000000,,, +13.3789062500,214,859.3750000000,,, +13.3808593750,214,859.3750000000,,, +13.3828125000,214,859.3750000000,,, +13.3847656250,214,859.3750000000,,, +13.3867187500,214,859.3750000000,,, +13.3886718750,214,859.3750000000,,, +13.3906250000,214,859.3750000000,,, +13.3925781250,214,859.3750000000,,, +13.3945312500,214,859.3750000000,,, +13.3964843750,214,859.3750000000,,, +13.3984375000,214,859.3750000000,,, +13.4003906250,214,859.3750000000,,, +13.4023437500,214,859.3750000000,,, +13.4042968750,214,859.3750000000,,, +13.4062500000,214,859.3750000000,,, +13.4082031250,214,859.3750000000,,, +13.4101562500,214,859.3750000000,,, +13.4121093750,214,859.3750000000,,, +13.4140625000,214,859.3750000000,,, +13.4160156250,214,859.3750000000,,, +13.4179687500,214,859.3750000000,,, +13.4199218750,214,859.3750000000,,, +13.4218750000,214,859.3750000000,,, +13.4238281250,214,859.3750000000,,, +13.4257812500,214,859.3750000000,,, +13.4277343750,214,859.3750000000,,, +13.4296875000,214,859.3750000000,,, +13.4316406250,214,859.3750000000,,, +13.4335937500,214,859.3750000000,,, +13.4355468750,214,859.3750000000,,, +13.4375000000,215,851.5625000000,,, +13.4394531250,215,851.5625000000,,, +13.4414062500,215,851.5625000000,,, +13.4433593750,215,851.5625000000,,, +13.4453125000,215,851.5625000000,,, +13.4472656250,215,851.5625000000,,, +13.4492187500,215,851.5625000000,,, +13.4511718750,215,851.5625000000,,, +13.4531250000,215,851.5625000000,,, +13.4550781250,215,851.5625000000,,, +13.4570312500,215,851.5625000000,,, +13.4589843750,215,851.5625000000,,, +13.4609375000,215,851.5625000000,,, +13.4628906250,215,851.5625000000,,, +13.4648437500,215,851.5625000000,,, +13.4667968750,215,851.5625000000,,, +13.4687500000,215,851.5625000000,,, +13.4707031250,215,851.5625000000,,, +13.4726562500,215,851.5625000000,,, +13.4746093750,215,851.5625000000,,, +13.4765625000,215,851.5625000000,,, +13.4785156250,215,851.5625000000,,, +13.4804687500,215,851.5625000000,,, +13.4824218750,215,851.5625000000,,, +13.4843750000,215,851.5625000000,,, +13.4863281250,215,851.5625000000,,, +13.4882812500,215,851.5625000000,,, +13.4902343750,215,851.5625000000,,, +13.4921875000,215,851.5625000000,,, +13.4941406250,215,851.5625000000,,, +13.4960937500,215,851.5625000000,,, +13.4980468750,215,851.5625000000,,, +13.5000000000,216,851.5625000000,,, +13.5019531250,216,851.5625000000,,, +13.5039062500,216,851.5625000000,,, +13.5058593750,216,851.5625000000,,, +13.5078125000,216,851.5625000000,,, +13.5097656250,216,851.5625000000,,, +13.5117187500,216,851.5625000000,,, +13.5136718750,216,851.5625000000,,, +13.5156250000,216,851.5625000000,,, +13.5175781250,216,851.5625000000,,, +13.5195312500,216,851.5625000000,,, +13.5214843750,216,851.5625000000,,, +13.5234375000,216,851.5625000000,,, +13.5253906250,216,851.5625000000,,, +13.5273437500,216,851.5625000000,,, +13.5292968750,216,851.5625000000,,, +13.5312500000,216,851.5625000000,,, +13.5332031250,216,851.5625000000,,, +13.5351562500,216,851.5625000000,,, +13.5371093750,216,851.5625000000,,, +13.5390625000,216,851.5625000000,,, +13.5410156250,216,851.5625000000,,, +13.5429687500,216,851.5625000000,,, +13.5449218750,216,851.5625000000,,, +13.5468750000,216,851.5625000000,,, +13.5488281250,216,851.5625000000,,, +13.5507812500,216,851.5625000000,,, +13.5527343750,216,851.5625000000,,, +13.5546875000,216,851.5625000000,,, +13.5566406250,216,851.5625000000,,, +13.5585937500,216,851.5625000000,,, +13.5605468750,216,851.5625000000,,, +13.5625000000,217,851.5625000000,,, +13.5644531250,217,851.5625000000,,, +13.5664062500,217,851.5625000000,,, +13.5683593750,217,851.5625000000,,, +13.5703125000,217,851.5625000000,,, +13.5722656250,217,851.5625000000,,, +13.5742187500,217,851.5625000000,,, +13.5761718750,217,851.5625000000,,, +13.5781250000,217,851.5625000000,,, +13.5800781250,217,851.5625000000,,, +13.5820312500,217,851.5625000000,,, +13.5839843750,217,851.5625000000,,, +13.5859375000,217,851.5625000000,,, +13.5878906250,217,851.5625000000,,, +13.5898437500,217,851.5625000000,,, +13.5917968750,217,851.5625000000,,, +13.5937500000,217,851.5625000000,,, +13.5957031250,217,851.5625000000,,, +13.5976562500,217,851.5625000000,,, +13.5996093750,217,851.5625000000,,, +13.6015625000,217,851.5625000000,,, +13.6035156250,217,851.5625000000,,, +13.6054687500,217,851.5625000000,,, +13.6074218750,217,851.5625000000,,, +13.6093750000,217,851.5625000000,,, +13.6113281250,217,851.5625000000,,, +13.6132812500,217,851.5625000000,,, +13.6152343750,217,851.5625000000,,, +13.6171875000,217,851.5625000000,,, +13.6191406250,217,851.5625000000,,, +13.6210937500,217,851.5625000000,,, +13.6230468750,217,851.5625000000,,, +13.6250000000,218,851.5625000000,,, +13.6269531250,218,851.5625000000,,, +13.6289062500,218,851.5625000000,,, +13.6308593750,218,851.5625000000,,, +13.6328125000,218,851.5625000000,,, +13.6347656250,218,851.5625000000,,, +13.6367187500,218,851.5625000000,,, +13.6386718750,218,851.5625000000,,, +13.6406250000,218,851.5625000000,,, +13.6425781250,218,851.5625000000,,, +13.6445312500,218,851.5625000000,,, +13.6464843750,218,851.5625000000,,, +13.6484375000,218,851.5625000000,,, +13.6503906250,218,851.5625000000,,, +13.6523437500,218,851.5625000000,,, +13.6542968750,218,851.5625000000,,, +13.6562500000,218,851.5625000000,,, +13.6582031250,218,851.5625000000,,, +13.6601562500,218,851.5625000000,,, +13.6621093750,218,851.5625000000,,, +13.6640625000,218,851.5625000000,,, +13.6660156250,218,851.5625000000,,, +13.6679687500,218,851.5625000000,,, +13.6699218750,218,851.5625000000,,, +13.6718750000,218,851.5625000000,,, +13.6738281250,218,851.5625000000,,, +13.6757812500,218,851.5625000000,,, +13.6777343750,218,851.5625000000,,, +13.6796875000,218,851.5625000000,,, +13.6816406250,218,851.5625000000,,, +13.6835937500,218,851.5625000000,,, +13.6855468750,218,851.5625000000,,, +13.6875000000,219,851.5625000000,,, +13.6894531250,219,851.5625000000,,, +13.6914062500,219,851.5625000000,,, +13.6933593750,219,851.5625000000,,, +13.6953125000,219,851.5625000000,,, +13.6972656250,219,851.5625000000,,, +13.6992187500,219,851.5625000000,,, +13.7011718750,219,851.5625000000,,, +13.7031250000,219,851.5625000000,,, +13.7050781250,219,851.5625000000,,, +13.7070312500,219,851.5625000000,,, +13.7089843750,219,851.5625000000,,, +13.7109375000,219,851.5625000000,,, +13.7128906250,219,851.5625000000,,, +13.7148437500,219,851.5625000000,,, +13.7167968750,219,851.5625000000,,, +13.7187500000,219,851.5625000000,,, +13.7207031250,219,851.5625000000,,, +13.7226562500,219,851.5625000000,,, +13.7246093750,219,851.5625000000,,, +13.7265625000,219,851.5625000000,,, +13.7285156250,219,851.5625000000,,, +13.7304687500,219,851.5625000000,,, +13.7324218750,219,851.5625000000,,, +13.7343750000,219,851.5625000000,,, +13.7363281250,219,851.5625000000,,, +13.7382812500,219,851.5625000000,,, +13.7402343750,219,851.5625000000,,, +13.7421875000,219,851.5625000000,,, +13.7441406250,219,851.5625000000,,, +13.7460937500,219,851.5625000000,,, +13.7480468750,219,851.5625000000,,, +13.7500000000,220,851.5625000000,,, +13.7519531250,220,851.5625000000,,, +13.7539062500,220,851.5625000000,,, +13.7558593750,220,851.5625000000,,, +13.7578125000,220,851.5625000000,,, +13.7597656250,220,851.5625000000,,, +13.7617187500,220,851.5625000000,,, +13.7636718750,220,851.5625000000,,, +13.7656250000,220,851.5625000000,,, +13.7675781250,220,851.5625000000,,, +13.7695312500,220,851.5625000000,,, +13.7714843750,220,851.5625000000,,, +13.7734375000,220,851.5625000000,,, +13.7753906250,220,851.5625000000,,, +13.7773437500,220,851.5625000000,,, +13.7792968750,220,851.5625000000,,, +13.7812500000,220,851.5625000000,,, +13.7832031250,220,851.5625000000,,, +13.7851562500,220,851.5625000000,,, +13.7871093750,220,851.5625000000,,, +13.7890625000,220,851.5625000000,,, +13.7910156250,220,851.5625000000,,, +13.7929687500,220,851.5625000000,,, +13.7949218750,220,851.5625000000,,, +13.7968750000,220,851.5625000000,,, +13.7988281250,220,851.5625000000,,, +13.8007812500,220,851.5625000000,,, +13.8027343750,220,851.5625000000,,, +13.8046875000,220,851.5625000000,,, +13.8066406250,220,851.5625000000,,, +13.8085937500,220,851.5625000000,,, +13.8105468750,220,851.5625000000,,, +13.8125000000,221,851.5625000000,,, +13.8144531250,221,851.5625000000,,, +13.8164062500,221,851.5625000000,,, +13.8183593750,221,851.5625000000,,, +13.8203125000,221,851.5625000000,,, +13.8222656250,221,851.5625000000,,, +13.8242187500,221,851.5625000000,,, +13.8261718750,221,851.5625000000,,, +13.8281250000,221,851.5625000000,,, +13.8300781250,221,851.5625000000,,, +13.8320312500,221,851.5625000000,,, +13.8339843750,221,851.5625000000,,, +13.8359375000,221,851.5625000000,,, +13.8378906250,221,851.5625000000,,, +13.8398437500,221,851.5625000000,,, +13.8417968750,221,851.5625000000,,, +13.8437500000,221,851.5625000000,,, +13.8457031250,221,851.5625000000,,, +13.8476562500,221,851.5625000000,,, +13.8496093750,221,851.5625000000,,, +13.8515625000,221,851.5625000000,,, +13.8535156250,221,851.5625000000,,, +13.8554687500,221,851.5625000000,,, +13.8574218750,221,851.5625000000,,, +13.8593750000,221,851.5625000000,,, +13.8613281250,221,851.5625000000,,, +13.8632812500,221,851.5625000000,,, +13.8652343750,221,851.5625000000,,, +13.8671875000,221,851.5625000000,,, +13.8691406250,221,851.5625000000,,, +13.8710937500,221,851.5625000000,,, +13.8730468750,221,851.5625000000,,, +13.8750000000,222,851.5625000000,,, +13.8769531250,222,851.5625000000,,, +13.8789062500,222,851.5625000000,,, +13.8808593750,222,851.5625000000,,, +13.8828125000,222,851.5625000000,,, +13.8847656250,222,851.5625000000,,, +13.8867187500,222,851.5625000000,,, +13.8886718750,222,851.5625000000,,, +13.8906250000,222,851.5625000000,,, +13.8925781250,222,851.5625000000,,, +13.8945312500,222,851.5625000000,,, +13.8964843750,222,851.5625000000,,, +13.8984375000,222,851.5625000000,,, +13.9003906250,222,851.5625000000,,, +13.9023437500,222,851.5625000000,,, +13.9042968750,222,851.5625000000,,, +13.9062500000,222,851.5625000000,,, +13.9082031250,222,851.5625000000,,, +13.9101562500,222,851.5625000000,,, +13.9121093750,222,851.5625000000,,, +13.9140625000,222,851.5625000000,,, +13.9160156250,222,851.5625000000,,, +13.9179687500,222,851.5625000000,,, +13.9199218750,222,851.5625000000,,, +13.9218750000,222,851.5625000000,,, +13.9238281250,222,851.5625000000,,, +13.9257812500,222,851.5625000000,,, +13.9277343750,222,851.5625000000,,, +13.9296875000,222,851.5625000000,,, +13.9316406250,222,851.5625000000,,, +13.9335937500,222,851.5625000000,,, +13.9355468750,222,851.5625000000,,, +13.9375000000,223,851.5625000000,,, +13.9394531250,223,851.5625000000,,, +13.9414062500,223,851.5625000000,,, +13.9433593750,223,851.5625000000,,, +13.9453125000,223,851.5625000000,,, +13.9472656250,223,851.5625000000,,, +13.9492187500,223,851.5625000000,,, +13.9511718750,223,851.5625000000,,, +13.9531250000,223,851.5625000000,,, +13.9550781250,223,851.5625000000,,, +13.9570312500,223,851.5625000000,,, +13.9589843750,223,851.5625000000,,, +13.9609375000,223,851.5625000000,,, +13.9628906250,223,851.5625000000,,, +13.9648437500,223,851.5625000000,,, +13.9667968750,223,851.5625000000,,, +13.9687500000,223,851.5625000000,,, +13.9707031250,223,851.5625000000,,, +13.9726562500,223,851.5625000000,,, +13.9746093750,223,851.5625000000,,, +13.9765625000,223,851.5625000000,,, +13.9785156250,223,851.5625000000,,, +13.9804687500,223,851.5625000000,,, +13.9824218750,223,851.5625000000,,, +13.9843750000,223,851.5625000000,,, +13.9863281250,223,851.5625000000,,, +13.9882812500,223,851.5625000000,,, +13.9902343750,223,851.5625000000,,, +13.9921875000,223,851.5625000000,,, +13.9941406250,223,851.5625000000,,, +13.9960937500,223,851.5625000000,,, +13.9980468750,223,851.5625000000,,, +14.0000000000,224,851.5625000000,,, +14.0019531250,224,851.5625000000,,, +14.0039062500,224,851.5625000000,,, +14.0058593750,224,851.5625000000,,, +14.0078125000,224,851.5625000000,,, +14.0097656250,224,851.5625000000,,, +14.0117187500,224,851.5625000000,,, +14.0136718750,224,851.5625000000,,, +14.0156250000,224,851.5625000000,,, +14.0175781250,224,851.5625000000,,, +14.0195312500,224,851.5625000000,,, +14.0214843750,224,851.5625000000,,, +14.0234375000,224,851.5625000000,,, +14.0253906250,224,851.5625000000,,, +14.0273437500,224,851.5625000000,,, +14.0292968750,224,851.5625000000,,, +14.0312500000,224,851.5625000000,,, +14.0332031250,224,851.5625000000,,, +14.0351562500,224,851.5625000000,,, +14.0371093750,224,851.5625000000,,, +14.0390625000,224,851.5625000000,,, +14.0410156250,224,851.5625000000,,, +14.0429687500,224,851.5625000000,,, +14.0449218750,224,851.5625000000,,, +14.0468750000,224,851.5625000000,,, +14.0488281250,224,851.5625000000,,, +14.0507812500,224,851.5625000000,,, +14.0527343750,224,851.5625000000,,, +14.0546875000,224,851.5625000000,,, +14.0566406250,224,851.5625000000,,, +14.0585937500,224,851.5625000000,,, +14.0605468750,224,851.5625000000,,, +14.0625000000,225,851.5625000000,,, +14.0644531250,225,851.5625000000,,, +14.0664062500,225,851.5625000000,,, +14.0683593750,225,851.5625000000,,, +14.0703125000,225,851.5625000000,,, +14.0722656250,225,851.5625000000,,, +14.0742187500,225,851.5625000000,,, +14.0761718750,225,851.5625000000,,, +14.0781250000,225,851.5625000000,,, +14.0800781250,225,851.5625000000,,, +14.0820312500,225,851.5625000000,,, +14.0839843750,225,851.5625000000,,, +14.0859375000,225,851.5625000000,,, +14.0878906250,225,851.5625000000,,, +14.0898437500,225,851.5625000000,,, +14.0917968750,225,851.5625000000,,, +14.0937500000,225,851.5625000000,,, +14.0957031250,225,851.5625000000,,, +14.0976562500,225,851.5625000000,,, +14.0996093750,225,851.5625000000,,, +14.1015625000,225,851.5625000000,,, +14.1035156250,225,851.5625000000,,, +14.1054687500,225,851.5625000000,,, +14.1074218750,225,851.5625000000,,, +14.1093750000,225,851.5625000000,,, +14.1113281250,225,851.5625000000,,, +14.1132812500,225,851.5625000000,,, +14.1152343750,225,851.5625000000,,, +14.1171875000,225,851.5625000000,,, +14.1191406250,225,851.5625000000,,, +14.1210937500,225,851.5625000000,,, +14.1230468750,225,851.5625000000,,, +14.1250000000,226,851.5625000000,,, +14.1269531250,226,851.5625000000,,, +14.1289062500,226,851.5625000000,,, +14.1308593750,226,851.5625000000,,, +14.1328125000,226,851.5625000000,,, +14.1347656250,226,851.5625000000,,, +14.1367187500,226,851.5625000000,,, +14.1386718750,226,851.5625000000,,, +14.1406250000,226,851.5625000000,,, +14.1425781250,226,851.5625000000,,, +14.1445312500,226,851.5625000000,,, +14.1464843750,226,851.5625000000,,, +14.1484375000,226,851.5625000000,,, +14.1503906250,226,851.5625000000,,, +14.1523437500,226,851.5625000000,,, +14.1542968750,226,851.5625000000,,, +14.1562500000,226,851.5625000000,,, +14.1582031250,226,851.5625000000,,, +14.1601562500,226,851.5625000000,,, +14.1621093750,226,851.5625000000,,, +14.1640625000,226,851.5625000000,,, +14.1660156250,226,851.5625000000,,, +14.1679687500,226,851.5625000000,,, +14.1699218750,226,851.5625000000,,, +14.1718750000,226,851.5625000000,,, +14.1738281250,226,851.5625000000,,, +14.1757812500,226,851.5625000000,,, +14.1777343750,226,851.5625000000,,, +14.1796875000,226,851.5625000000,,, +14.1816406250,226,851.5625000000,,, +14.1835937500,226,851.5625000000,,, +14.1855468750,226,851.5625000000,,, +14.1875000000,227,851.5625000000,,, +14.1894531250,227,851.5625000000,,, +14.1914062500,227,851.5625000000,,, +14.1933593750,227,851.5625000000,,, +14.1953125000,227,851.5625000000,,, +14.1972656250,227,851.5625000000,,, +14.1992187500,227,851.5625000000,,, +14.2011718750,227,851.5625000000,,, +14.2031250000,227,851.5625000000,,, +14.2050781250,227,851.5625000000,,, +14.2070312500,227,851.5625000000,,, +14.2089843750,227,851.5625000000,,, +14.2109375000,227,851.5625000000,,, +14.2128906250,227,851.5625000000,,, +14.2148437500,227,851.5625000000,,, +14.2167968750,227,851.5625000000,,, +14.2187500000,227,851.5625000000,,, +14.2207031250,227,851.5625000000,,, +14.2226562500,227,851.5625000000,,, +14.2246093750,227,851.5625000000,,, +14.2265625000,227,851.5625000000,,, +14.2285156250,227,851.5625000000,,, +14.2304687500,227,851.5625000000,,, +14.2324218750,227,851.5625000000,,, +14.2343750000,227,851.5625000000,,, +14.2363281250,227,851.5625000000,,, +14.2382812500,227,851.5625000000,,, +14.2402343750,227,851.5625000000,,, +14.2421875000,227,851.5625000000,,, +14.2441406250,227,851.5625000000,,, +14.2460937500,227,851.5625000000,,, +14.2480468750,227,851.5625000000,,, +14.2500000000,228,861.3281250000,,, +14.2519531250,228,861.3281250000,,, +14.2539062500,228,861.3281250000,,, +14.2558593750,228,861.3281250000,,, +14.2578125000,228,861.3281250000,,, +14.2597656250,228,861.3281250000,,, +14.2617187500,228,861.3281250000,,, +14.2636718750,228,861.3281250000,,, +14.2656250000,228,861.3281250000,,, +14.2675781250,228,861.3281250000,,, +14.2695312500,228,861.3281250000,,, +14.2714843750,228,861.3281250000,,, +14.2734375000,228,861.3281250000,,, +14.2753906250,228,861.3281250000,,, +14.2773437500,228,861.3281250000,,, +14.2792968750,228,861.3281250000,,, +14.2812500000,228,861.3281250000,,, +14.2832031250,228,861.3281250000,,, +14.2851562500,228,861.3281250000,,, +14.2871093750,228,861.3281250000,,, +14.2890625000,228,861.3281250000,,, +14.2910156250,228,861.3281250000,,, +14.2929687500,228,861.3281250000,,, +14.2949218750,228,861.3281250000,,, +14.2968750000,228,861.3281250000,,, +14.2988281250,228,861.3281250000,,, +14.3007812500,228,861.3281250000,,, +14.3027343750,228,861.3281250000,,, +14.3046875000,228,861.3281250000,,, +14.3066406250,228,861.3281250000,,, +14.3085937500,228,861.3281250000,,, +14.3105468750,228,861.3281250000,,, +14.3125000000,229,861.3281250000,,, +14.3144531250,229,861.3281250000,,, +14.3164062500,229,861.3281250000,,, +14.3183593750,229,861.3281250000,,, +14.3203125000,229,861.3281250000,,, +14.3222656250,229,861.3281250000,,, +14.3242187500,229,861.3281250000,,, +14.3261718750,229,861.3281250000,,, +14.3281250000,229,861.3281250000,,, +14.3300781250,229,861.3281250000,,, +14.3320312500,229,861.3281250000,,, +14.3339843750,229,861.3281250000,,, +14.3359375000,229,861.3281250000,,, +14.3378906250,229,861.3281250000,,, +14.3398437500,229,861.3281250000,,, +14.3417968750,229,861.3281250000,,, +14.3437500000,229,861.3281250000,,, +14.3457031250,229,861.3281250000,,, +14.3476562500,229,861.3281250000,,, +14.3496093750,229,861.3281250000,,, +14.3515625000,229,861.3281250000,,, +14.3535156250,229,861.3281250000,,, +14.3554687500,229,861.3281250000,,, +14.3574218750,229,861.3281250000,,, +14.3593750000,229,861.3281250000,,, +14.3613281250,229,861.3281250000,,, +14.3632812500,229,861.3281250000,,, +14.3652343750,229,861.3281250000,,, +14.3671875000,229,861.3281250000,,, +14.3691406250,229,861.3281250000,,, +14.3710937500,229,861.3281250000,,, +14.3730468750,229,861.3281250000,,, +14.3750000000,230,861.3281250000,,, +14.3769531250,230,861.3281250000,,, +14.3789062500,230,861.3281250000,,, +14.3808593750,230,861.3281250000,,, +14.3828125000,230,861.3281250000,,, +14.3847656250,230,861.3281250000,,, +14.3867187500,230,861.3281250000,,, +14.3886718750,230,861.3281250000,,, +14.3906250000,230,861.3281250000,,, +14.3925781250,230,861.3281250000,,, +14.3945312500,230,861.3281250000,,, +14.3964843750,230,861.3281250000,,, +14.3984375000,230,861.3281250000,,, +14.4003906250,230,861.3281250000,,, +14.4023437500,230,861.3281250000,,, +14.4042968750,230,861.3281250000,,, +14.4062500000,230,861.3281250000,,, +14.4082031250,230,861.3281250000,,, +14.4101562500,230,861.3281250000,,, +14.4121093750,230,861.3281250000,,, +14.4140625000,230,861.3281250000,,, +14.4160156250,230,861.3281250000,,, +14.4179687500,230,861.3281250000,,, +14.4199218750,230,861.3281250000,,, +14.4218750000,230,861.3281250000,,, +14.4238281250,230,861.3281250000,,, +14.4257812500,230,861.3281250000,,, +14.4277343750,230,861.3281250000,,, +14.4296875000,230,861.3281250000,,, +14.4316406250,230,861.3281250000,,, +14.4335937500,230,861.3281250000,,, +14.4355468750,230,861.3281250000,,, +14.4375000000,231,861.3281250000,,, +14.4394531250,231,861.3281250000,,, +14.4414062500,231,861.3281250000,,, +14.4433593750,231,861.3281250000,,, +14.4453125000,231,861.3281250000,,, +14.4472656250,231,861.3281250000,,, +14.4492187500,231,861.3281250000,,, +14.4511718750,231,861.3281250000,,, +14.4531250000,231,861.3281250000,,, +14.4550781250,231,861.3281250000,,, +14.4570312500,231,861.3281250000,,, +14.4589843750,231,861.3281250000,,, +14.4609375000,231,861.3281250000,,, +14.4628906250,231,861.3281250000,,, +14.4648437500,231,861.3281250000,,, +14.4667968750,231,861.3281250000,,, +14.4687500000,231,861.3281250000,,, +14.4707031250,231,861.3281250000,,, +14.4726562500,231,861.3281250000,,, +14.4746093750,231,861.3281250000,,, +14.4765625000,231,861.3281250000,,, +14.4785156250,231,861.3281250000,,, +14.4804687500,231,861.3281250000,,, +14.4824218750,231,861.3281250000,,, +14.4843750000,231,861.3281250000,,, +14.4863281250,231,861.3281250000,,, +14.4882812500,231,861.3281250000,,, +14.4902343750,231,861.3281250000,,, +14.4921875000,231,861.3281250000,,, +14.4941406250,231,861.3281250000,,, +14.4960937500,231,861.3281250000,,, +14.4980468750,231,861.3281250000,,, +14.5000000000,232,861.3281250000,,, +14.5019531250,232,861.3281250000,,, +14.5039062500,232,861.3281250000,,, +14.5058593750,232,861.3281250000,,, +14.5078125000,232,861.3281250000,,, +14.5097656250,232,861.3281250000,,, +14.5117187500,232,861.3281250000,,, +14.5136718750,232,861.3281250000,,, +14.5156250000,232,861.3281250000,,, +14.5175781250,232,861.3281250000,,, +14.5195312500,232,861.3281250000,,, +14.5214843750,232,861.3281250000,,, +14.5234375000,232,861.3281250000,,, +14.5253906250,232,861.3281250000,,, +14.5273437500,232,861.3281250000,,, +14.5292968750,232,861.3281250000,,, +14.5312500000,232,861.3281250000,,, +14.5332031250,232,861.3281250000,,, +14.5351562500,232,861.3281250000,,, +14.5371093750,232,861.3281250000,,, +14.5390625000,232,861.3281250000,,, +14.5410156250,232,861.3281250000,,, +14.5429687500,232,861.3281250000,,, +14.5449218750,232,861.3281250000,,, +14.5468750000,232,861.3281250000,,, +14.5488281250,232,861.3281250000,,, +14.5507812500,232,861.3281250000,,, +14.5527343750,232,861.3281250000,,, +14.5546875000,232,861.3281250000,,, +14.5566406250,232,861.3281250000,,, +14.5585937500,232,861.3281250000,,, +14.5605468750,232,861.3281250000,,, +14.5625000000,233,861.3281250000,,, +14.5644531250,233,861.3281250000,,, +14.5664062500,233,861.3281250000,,, +14.5683593750,233,861.3281250000,,, +14.5703125000,233,861.3281250000,,, +14.5722656250,233,861.3281250000,,, +14.5742187500,233,861.3281250000,,, +14.5761718750,233,861.3281250000,,, +14.5781250000,233,861.3281250000,,, +14.5800781250,233,861.3281250000,,, +14.5820312500,233,861.3281250000,,, +14.5839843750,233,861.3281250000,,, +14.5859375000,233,861.3281250000,,, +14.5878906250,233,861.3281250000,,, +14.5898437500,233,861.3281250000,,, +14.5917968750,233,861.3281250000,,, +14.5937500000,233,861.3281250000,,, +14.5957031250,233,861.3281250000,,, +14.5976562500,233,861.3281250000,,, +14.5996093750,233,861.3281250000,,, +14.6015625000,233,861.3281250000,,, +14.6035156250,233,861.3281250000,,, +14.6054687500,233,861.3281250000,,, +14.6074218750,233,861.3281250000,,, +14.6093750000,233,861.3281250000,,, +14.6113281250,233,861.3281250000,,, +14.6132812500,233,861.3281250000,,, +14.6152343750,233,861.3281250000,,, +14.6171875000,233,861.3281250000,,, +14.6191406250,233,861.3281250000,,, +14.6210937500,233,861.3281250000,,, +14.6230468750,233,861.3281250000,,, +14.6250000000,234,861.3281250000,,, +14.6269531250,234,861.3281250000,,, +14.6289062500,234,861.3281250000,,, +14.6308593750,234,861.3281250000,,, +14.6328125000,234,861.3281250000,,, +14.6347656250,234,861.3281250000,,, +14.6367187500,234,861.3281250000,,, +14.6386718750,234,861.3281250000,,, +14.6406250000,234,861.3281250000,,, +14.6425781250,234,861.3281250000,,, +14.6445312500,234,861.3281250000,,, +14.6464843750,234,861.3281250000,,, +14.6484375000,234,861.3281250000,,, +14.6503906250,234,861.3281250000,,, +14.6523437500,234,861.3281250000,,, +14.6542968750,234,861.3281250000,,, +14.6562500000,234,861.3281250000,,, +14.6582031250,234,861.3281250000,,, +14.6601562500,234,861.3281250000,,, +14.6621093750,234,861.3281250000,,, +14.6640625000,234,861.3281250000,,, +14.6660156250,234,861.3281250000,,, +14.6679687500,234,861.3281250000,,, +14.6699218750,234,861.3281250000,,, +14.6718750000,234,861.3281250000,,, +14.6738281250,234,861.3281250000,,, +14.6757812500,234,861.3281250000,,, +14.6777343750,234,861.3281250000,,, +14.6796875000,234,861.3281250000,,, +14.6816406250,234,861.3281250000,,, +14.6835937500,234,861.3281250000,,, +14.6855468750,234,861.3281250000,,, +14.6875000000,235,861.3281250000,,, +14.6894531250,235,861.3281250000,,, +14.6914062500,235,861.3281250000,,, +14.6933593750,235,861.3281250000,,, +14.6953125000,235,861.3281250000,,, +14.6972656250,235,861.3281250000,,, +14.6992187500,235,861.3281250000,,, +14.7011718750,235,861.3281250000,,, +14.7031250000,235,861.3281250000,,, +14.7050781250,235,861.3281250000,,, +14.7070312500,235,861.3281250000,,, +14.7089843750,235,861.3281250000,,, +14.7109375000,235,861.3281250000,,, +14.7128906250,235,861.3281250000,,, +14.7148437500,235,861.3281250000,,, +14.7167968750,235,861.3281250000,,, +14.7187500000,235,861.3281250000,,, +14.7207031250,235,861.3281250000,,, +14.7226562500,235,861.3281250000,,, +14.7246093750,235,861.3281250000,,, +14.7265625000,235,861.3281250000,,, +14.7285156250,235,861.3281250000,,, +14.7304687500,235,861.3281250000,,, +14.7324218750,235,861.3281250000,,, +14.7343750000,235,861.3281250000,,, +14.7363281250,235,861.3281250000,,, +14.7382812500,235,861.3281250000,,, +14.7402343750,235,861.3281250000,,, +14.7421875000,235,861.3281250000,,, +14.7441406250,235,861.3281250000,,, +14.7460937500,235,861.3281250000,,, +14.7480468750,235,861.3281250000,,, +14.7500000000,236,861.3281250000,,, +14.7519531250,236,861.3281250000,,, +14.7539062500,236,861.3281250000,,, +14.7558593750,236,861.3281250000,,, +14.7578125000,236,861.3281250000,,, +14.7597656250,236,861.3281250000,,, +14.7617187500,236,861.3281250000,,, +14.7636718750,236,861.3281250000,,, +14.7656250000,236,861.3281250000,,, +14.7675781250,236,861.3281250000,,, +14.7695312500,236,861.3281250000,,, +14.7714843750,236,861.3281250000,,, +14.7734375000,236,861.3281250000,,, +14.7753906250,236,861.3281250000,,, +14.7773437500,236,861.3281250000,,, +14.7792968750,236,861.3281250000,,, +14.7812500000,236,861.3281250000,,, +14.7832031250,236,861.3281250000,,, +14.7851562500,236,861.3281250000,,, +14.7871093750,236,861.3281250000,,, +14.7890625000,236,861.3281250000,,, +14.7910156250,236,861.3281250000,,, +14.7929687500,236,861.3281250000,,, +14.7949218750,236,861.3281250000,,, +14.7968750000,236,861.3281250000,,, +14.7988281250,236,861.3281250000,,, +14.8007812500,236,861.3281250000,,, +14.8027343750,236,861.3281250000,,, +14.8046875000,236,861.3281250000,,, +14.8066406250,236,861.3281250000,,, +14.8085937500,236,861.3281250000,,, +14.8105468750,236,861.3281250000,,, +14.8125000000,237,861.3281250000,,, +14.8144531250,237,861.3281250000,,, +14.8164062500,237,861.3281250000,,, +14.8183593750,237,861.3281250000,,, +14.8203125000,237,861.3281250000,,, +14.8222656250,237,861.3281250000,,, +14.8242187500,237,861.3281250000,,, +14.8261718750,237,861.3281250000,,, +14.8281250000,237,861.3281250000,,, +14.8300781250,237,861.3281250000,,, +14.8320312500,237,861.3281250000,,, +14.8339843750,237,861.3281250000,,, +14.8359375000,237,861.3281250000,,, +14.8378906250,237,861.3281250000,,, +14.8398437500,237,861.3281250000,,, +14.8417968750,237,861.3281250000,,, +14.8437500000,237,861.3281250000,,, +14.8457031250,237,861.3281250000,,, +14.8476562500,237,861.3281250000,,, +14.8496093750,237,861.3281250000,,, +14.8515625000,237,861.3281250000,,, +14.8535156250,237,861.3281250000,,, +14.8554687500,237,861.3281250000,,, +14.8574218750,237,861.3281250000,,, +14.8593750000,237,861.3281250000,,, +14.8613281250,237,861.3281250000,,, +14.8632812500,237,861.3281250000,,, +14.8652343750,237,861.3281250000,,, +14.8671875000,237,861.3281250000,,, +14.8691406250,237,861.3281250000,,, +14.8710937500,237,861.3281250000,,, +14.8730468750,237,861.3281250000,,, +14.8750000000,238,861.3281250000,,, +14.8769531250,238,861.3281250000,,, +14.8789062500,238,861.3281250000,,, +14.8808593750,238,861.3281250000,,, +14.8828125000,238,861.3281250000,,, +14.8847656250,238,861.3281250000,,, +14.8867187500,238,861.3281250000,,, +14.8886718750,238,861.3281250000,,, +14.8906250000,238,861.3281250000,,, +14.8925781250,238,861.3281250000,,, +14.8945312500,238,861.3281250000,,, +14.8964843750,238,861.3281250000,,, +14.8984375000,238,861.3281250000,,, +14.9003906250,238,861.3281250000,,, +14.9023437500,238,861.3281250000,,, +14.9042968750,238,861.3281250000,,, +14.9062500000,238,861.3281250000,,, +14.9082031250,238,861.3281250000,,, +14.9101562500,238,861.3281250000,,, +14.9121093750,238,861.3281250000,,, +14.9140625000,238,861.3281250000,,, +14.9160156250,238,861.3281250000,,, +14.9179687500,238,861.3281250000,,, +14.9199218750,238,861.3281250000,,, +14.9218750000,238,861.3281250000,,, +14.9238281250,238,861.3281250000,,, +14.9257812500,238,861.3281250000,,, +14.9277343750,238,861.3281250000,,, +14.9296875000,238,861.3281250000,,, +14.9316406250,238,861.3281250000,,, +14.9335937500,238,861.3281250000,,, +14.9355468750,238,861.3281250000,,, +14.9375000000,239,861.3281250000,,, +14.9394531250,239,861.3281250000,,, +14.9414062500,239,861.3281250000,,, +14.9433593750,239,861.3281250000,,, +14.9453125000,239,861.3281250000,,, +14.9472656250,239,861.3281250000,,, +14.9492187500,239,861.3281250000,,, +14.9511718750,239,861.3281250000,,, +14.9531250000,239,861.3281250000,,, +14.9550781250,239,861.3281250000,,, +14.9570312500,239,861.3281250000,,, +14.9589843750,239,861.3281250000,,, +14.9609375000,239,861.3281250000,,, +14.9628906250,239,861.3281250000,,, +14.9648437500,239,861.3281250000,,, +14.9667968750,239,861.3281250000,,, +14.9687500000,239,861.3281250000,,, +14.9707031250,239,861.3281250000,,, +14.9726562500,239,861.3281250000,,, +14.9746093750,239,861.3281250000,,, +14.9765625000,239,861.3281250000,,, +14.9785156250,239,861.3281250000,,, +14.9804687500,239,861.3281250000,,, +14.9824218750,239,861.3281250000,,, +14.9843750000,239,861.3281250000,,, +14.9863281250,239,861.3281250000,,, +14.9882812500,239,861.3281250000,,, +14.9902343750,239,861.3281250000,,, +14.9921875000,239,861.3281250000,,, +14.9941406250,239,861.3281250000,,, +14.9960937500,239,861.3281250000,,, +14.9980468750,239,861.3281250000,,, +15.0000000000,240,816.4062500000,,, +15.0019531250,240,816.4062500000,,, +15.0039062500,240,816.4062500000,,, +15.0058593750,240,816.4062500000,,, +15.0078125000,240,816.4062500000,,, +15.0097656250,240,816.4062500000,,, +15.0117187500,240,816.4062500000,,, +15.0136718750,240,816.4062500000,,, +15.0156250000,240,816.4062500000,,, +15.0175781250,240,816.4062500000,,, +15.0195312500,240,816.4062500000,,, +15.0214843750,240,816.4062500000,,, +15.0234375000,240,816.4062500000,,, +15.0253906250,240,816.4062500000,,, +15.0273437500,240,816.4062500000,,, +15.0292968750,240,816.4062500000,,, +15.0312500000,240,816.4062500000,,, +15.0332031250,240,816.4062500000,,, +15.0351562500,240,816.4062500000,,, +15.0371093750,240,816.4062500000,,, +15.0390625000,240,816.4062500000,,, +15.0410156250,240,816.4062500000,,, +15.0429687500,240,816.4062500000,,, +15.0449218750,240,816.4062500000,,, +15.0468750000,240,816.4062500000,,, +15.0488281250,240,816.4062500000,,, +15.0507812500,240,816.4062500000,,, +15.0527343750,240,816.4062500000,,, +15.0546875000,240,816.4062500000,,, +15.0566406250,240,816.4062500000,,, +15.0585937500,240,816.4062500000,,, +15.0605468750,240,816.4062500000,,, +15.0625000000,241,816.4062500000,,, +15.0644531250,241,816.4062500000,,, +15.0664062500,241,816.4062500000,,, +15.0683593750,241,816.4062500000,,, +15.0703125000,241,816.4062500000,,, +15.0722656250,241,816.4062500000,,, +15.0742187500,241,816.4062500000,,, +15.0761718750,241,816.4062500000,,, +15.0781250000,241,816.4062500000,,, +15.0800781250,241,816.4062500000,,, +15.0820312500,241,816.4062500000,,, +15.0839843750,241,816.4062500000,,, +15.0859375000,241,816.4062500000,,, +15.0878906250,241,816.4062500000,,, +15.0898437500,241,816.4062500000,,, +15.0917968750,241,816.4062500000,,, +15.0937500000,241,816.4062500000,,, +15.0957031250,241,816.4062500000,,, +15.0976562500,241,816.4062500000,,, +15.0996093750,241,816.4062500000,,, +15.1015625000,241,816.4062500000,,, +15.1035156250,241,816.4062500000,,, +15.1054687500,241,816.4062500000,,, +15.1074218750,241,816.4062500000,,, +15.1093750000,241,816.4062500000,,, +15.1113281250,241,816.4062500000,,, +15.1132812500,241,816.4062500000,,, +15.1152343750,241,816.4062500000,,, +15.1171875000,241,816.4062500000,,, +15.1191406250,241,816.4062500000,,, +15.1210937500,241,816.4062500000,,, +15.1230468750,241,816.4062500000,,, +15.1250000000,242,816.4062500000,,, +15.1269531250,242,816.4062500000,,, +15.1289062500,242,816.4062500000,,, +15.1308593750,242,816.4062500000,,, +15.1328125000,242,816.4062500000,,, +15.1347656250,242,816.4062500000,,, +15.1367187500,242,816.4062500000,,, +15.1386718750,242,816.4062500000,,, +15.1406250000,242,816.4062500000,,, +15.1425781250,242,816.4062500000,,, +15.1445312500,242,816.4062500000,,, +15.1464843750,242,816.4062500000,,, +15.1484375000,242,816.4062500000,,, +15.1503906250,242,816.4062500000,,, +15.1523437500,242,816.4062500000,,, +15.1542968750,242,816.4062500000,,, +15.1562500000,242,816.4062500000,,, +15.1582031250,242,816.4062500000,,, +15.1601562500,242,816.4062500000,,, +15.1621093750,242,816.4062500000,,, +15.1640625000,242,816.4062500000,,, +15.1660156250,242,816.4062500000,,, +15.1679687500,242,816.4062500000,,, +15.1699218750,242,816.4062500000,,, +15.1718750000,242,816.4062500000,,, +15.1738281250,242,816.4062500000,,, +15.1757812500,242,816.4062500000,,, +15.1777343750,242,816.4062500000,,, +15.1796875000,242,816.4062500000,,, +15.1816406250,242,816.4062500000,,, +15.1835937500,242,816.4062500000,,, +15.1855468750,242,816.4062500000,,, +15.1875000000,243,816.4062500000,,, +15.1894531250,243,816.4062500000,,, +15.1914062500,243,816.4062500000,,, +15.1933593750,243,816.4062500000,,, +15.1953125000,243,816.4062500000,,, +15.1972656250,243,816.4062500000,,, +15.1992187500,243,816.4062500000,,, +15.2011718750,243,816.4062500000,,, +15.2031250000,243,816.4062500000,,, +15.2050781250,243,816.4062500000,,, +15.2070312500,243,816.4062500000,,, +15.2089843750,243,816.4062500000,,, +15.2109375000,243,816.4062500000,,, +15.2128906250,243,816.4062500000,,, +15.2148437500,243,816.4062500000,,, +15.2167968750,243,816.4062500000,,, +15.2187500000,243,816.4062500000,,, +15.2207031250,243,816.4062500000,,, +15.2226562500,243,816.4062500000,,, +15.2246093750,243,816.4062500000,,, +15.2265625000,243,816.4062500000,,, +15.2285156250,243,816.4062500000,,, +15.2304687500,243,816.4062500000,,, +15.2324218750,243,816.4062500000,,, +15.2343750000,243,816.4062500000,,, +15.2363281250,243,816.4062500000,,, +15.2382812500,243,816.4062500000,,, +15.2402343750,243,816.4062500000,,, +15.2421875000,243,816.4062500000,,, +15.2441406250,243,816.4062500000,,, +15.2460937500,243,816.4062500000,,, +15.2480468750,243,816.4062500000,,, +15.2500000000,244,816.4062500000,,, +15.2519531250,244,816.4062500000,,, +15.2539062500,244,816.4062500000,,, +15.2558593750,244,816.4062500000,,, +15.2578125000,244,816.4062500000,,, +15.2597656250,244,816.4062500000,,, +15.2617187500,244,816.4062500000,,, +15.2636718750,244,816.4062500000,,, +15.2656250000,244,816.4062500000,,, +15.2675781250,244,816.4062500000,,, +15.2695312500,244,816.4062500000,,, +15.2714843750,244,816.4062500000,,, +15.2734375000,244,816.4062500000,,, +15.2753906250,244,816.4062500000,,, +15.2773437500,244,816.4062500000,,, +15.2792968750,244,816.4062500000,,, +15.2812500000,244,816.4062500000,,, +15.2832031250,244,816.4062500000,,, +15.2851562500,244,816.4062500000,,, +15.2871093750,244,816.4062500000,,, +15.2890625000,244,816.4062500000,,, +15.2910156250,244,816.4062500000,,, +15.2929687500,244,816.4062500000,,, +15.2949218750,244,816.4062500000,,, +15.2968750000,244,816.4062500000,,, +15.2988281250,244,816.4062500000,,, +15.3007812500,244,816.4062500000,,, +15.3027343750,244,816.4062500000,,, +15.3046875000,244,816.4062500000,,, +15.3066406250,244,816.4062500000,,, +15.3085937500,244,816.4062500000,,, +15.3105468750,244,816.4062500000,,, +15.3125000000,245,816.4062500000,,, +15.3144531250,245,816.4062500000,,, +15.3164062500,245,816.4062500000,,, +15.3183593750,245,816.4062500000,,, +15.3203125000,245,816.4062500000,,, +15.3222656250,245,816.4062500000,,, +15.3242187500,245,816.4062500000,,, +15.3261718750,245,816.4062500000,,, +15.3281250000,245,816.4062500000,,, +15.3300781250,245,816.4062500000,,, +15.3320312500,245,816.4062500000,,, +15.3339843750,245,816.4062500000,,, +15.3359375000,245,816.4062500000,,, +15.3378906250,245,816.4062500000,,, +15.3398437500,245,816.4062500000,,, +15.3417968750,245,816.4062500000,,, +15.3437500000,245,816.4062500000,,, +15.3457031250,245,816.4062500000,,, +15.3476562500,245,816.4062500000,,, +15.3496093750,245,816.4062500000,,, +15.3515625000,245,816.4062500000,,, +15.3535156250,245,816.4062500000,,, +15.3554687500,245,816.4062500000,,, +15.3574218750,245,816.4062500000,,, +15.3593750000,245,816.4062500000,,, +15.3613281250,245,816.4062500000,,, +15.3632812500,245,816.4062500000,,, +15.3652343750,245,816.4062500000,,, +15.3671875000,245,816.4062500000,,, +15.3691406250,245,816.4062500000,,, +15.3710937500,245,816.4062500000,,, +15.3730468750,245,816.4062500000,,, +15.3750000000,246,816.4062500000,,, +15.3769531250,246,816.4062500000,,, +15.3789062500,246,816.4062500000,,, +15.3808593750,246,816.4062500000,,, +15.3828125000,246,816.4062500000,,, +15.3847656250,246,816.4062500000,,, +15.3867187500,246,816.4062500000,,, +15.3886718750,246,816.4062500000,,, +15.3906250000,246,816.4062500000,,, +15.3925781250,246,816.4062500000,,, +15.3945312500,246,816.4062500000,,, +15.3964843750,246,816.4062500000,,, +15.3984375000,246,816.4062500000,,, +15.4003906250,246,816.4062500000,,, +15.4023437500,246,816.4062500000,,, +15.4042968750,246,816.4062500000,,, +15.4062500000,246,816.4062500000,,, +15.4082031250,246,816.4062500000,,, +15.4101562500,246,816.4062500000,,, +15.4121093750,246,816.4062500000,,, +15.4140625000,246,816.4062500000,,, +15.4160156250,246,816.4062500000,,, +15.4179687500,246,816.4062500000,,, +15.4199218750,246,816.4062500000,,, +15.4218750000,246,816.4062500000,,, +15.4238281250,246,816.4062500000,,, +15.4257812500,246,816.4062500000,,, +15.4277343750,246,816.4062500000,,, +15.4296875000,246,816.4062500000,,, +15.4316406250,246,816.4062500000,,, +15.4335937500,246,816.4062500000,,, +15.4355468750,246,816.4062500000,,, +15.4375000000,247,816.4062500000,,, +15.4394531250,247,816.4062500000,,, +15.4414062500,247,816.4062500000,,, +15.4433593750,247,816.4062500000,,, +15.4453125000,247,816.4062500000,,, +15.4472656250,247,816.4062500000,,, +15.4492187500,247,816.4062500000,,, +15.4511718750,247,816.4062500000,,, +15.4531250000,247,816.4062500000,,, +15.4550781250,247,816.4062500000,,, +15.4570312500,247,816.4062500000,,, +15.4589843750,247,816.4062500000,,, +15.4609375000,247,816.4062500000,,, +15.4628906250,247,816.4062500000,,, +15.4648437500,247,816.4062500000,,, +15.4667968750,247,816.4062500000,,, +15.4687500000,247,816.4062500000,,, +15.4707031250,247,816.4062500000,,, +15.4726562500,247,816.4062500000,,, +15.4746093750,247,816.4062500000,,, +15.4765625000,247,816.4062500000,,, +15.4785156250,247,816.4062500000,,, +15.4804687500,247,816.4062500000,,, +15.4824218750,247,816.4062500000,,, +15.4843750000,247,816.4062500000,,, +15.4863281250,247,816.4062500000,,, +15.4882812500,247,816.4062500000,,, +15.4902343750,247,816.4062500000,,, +15.4921875000,247,816.4062500000,,, +15.4941406250,247,816.4062500000,,, +15.4960937500,247,816.4062500000,,, +15.4980468750,247,816.4062500000,,, +15.5000000000,248,816.4062500000,,, +15.5019531250,248,816.4062500000,,, +15.5039062500,248,816.4062500000,,, +15.5058593750,248,816.4062500000,,, +15.5078125000,248,816.4062500000,,, +15.5097656250,248,816.4062500000,,, +15.5117187500,248,816.4062500000,,, +15.5136718750,248,816.4062500000,,, +15.5156250000,248,816.4062500000,,, +15.5175781250,248,816.4062500000,,, +15.5195312500,248,816.4062500000,,, +15.5214843750,248,816.4062500000,,, +15.5234375000,248,816.4062500000,,, +15.5253906250,248,816.4062500000,,, +15.5273437500,248,816.4062500000,,, +15.5292968750,248,816.4062500000,,, +15.5312500000,248,816.4062500000,,, +15.5332031250,248,816.4062500000,,, +15.5351562500,248,816.4062500000,,, +15.5371093750,248,816.4062500000,,, +15.5390625000,248,816.4062500000,,, +15.5410156250,248,816.4062500000,,, +15.5429687500,248,816.4062500000,,, +15.5449218750,248,816.4062500000,,, +15.5468750000,248,816.4062500000,,, +15.5488281250,248,816.4062500000,,, +15.5507812500,248,816.4062500000,,, +15.5527343750,248,816.4062500000,,, +15.5546875000,248,816.4062500000,,, +15.5566406250,248,816.4062500000,,, +15.5585937500,248,816.4062500000,,, +15.5605468750,248,816.4062500000,,, +15.5625000000,249,816.4062500000,,, +15.5644531250,249,816.4062500000,,, +15.5664062500,249,816.4062500000,,, +15.5683593750,249,816.4062500000,,, +15.5703125000,249,816.4062500000,,, +15.5722656250,249,816.4062500000,,, +15.5742187500,249,816.4062500000,,, +15.5761718750,249,816.4062500000,,, +15.5781250000,249,816.4062500000,,, +15.5800781250,249,816.4062500000,,, +15.5820312500,249,816.4062500000,,, +15.5839843750,249,816.4062500000,,, +15.5859375000,249,816.4062500000,,, +15.5878906250,249,816.4062500000,,, +15.5898437500,249,816.4062500000,,, +15.5917968750,249,816.4062500000,,, +15.5937500000,249,816.4062500000,,, +15.5957031250,249,816.4062500000,,, +15.5976562500,249,816.4062500000,,, +15.5996093750,249,816.4062500000,,, +15.6015625000,249,816.4062500000,,, +15.6035156250,249,816.4062500000,,, +15.6054687500,249,816.4062500000,,, +15.6074218750,249,816.4062500000,,, +15.6093750000,249,816.4062500000,,, +15.6113281250,249,816.4062500000,,, +15.6132812500,249,816.4062500000,,, +15.6152343750,249,816.4062500000,,, +15.6171875000,249,816.4062500000,,, +15.6191406250,249,816.4062500000,,, +15.6210937500,249,816.4062500000,,, +15.6230468750,249,816.4062500000,,, +15.6250000000,250,816.4062500000,,, +15.6269531250,250,816.4062500000,,, +15.6289062500,250,816.4062500000,,, +15.6308593750,250,816.4062500000,,, +15.6328125000,250,816.4062500000,,, +15.6347656250,250,816.4062500000,,, +15.6367187500,250,816.4062500000,,, +15.6386718750,250,816.4062500000,,, +15.6406250000,250,816.4062500000,,, +15.6425781250,250,816.4062500000,,, +15.6445312500,250,816.4062500000,,, +15.6464843750,250,816.4062500000,,, +15.6484375000,250,816.4062500000,,, +15.6503906250,250,816.4062500000,,, +15.6523437500,250,816.4062500000,,, +15.6542968750,250,816.4062500000,,, +15.6562500000,250,816.4062500000,,, +15.6582031250,250,816.4062500000,,, +15.6601562500,250,816.4062500000,,, +15.6621093750,250,816.4062500000,,, +15.6640625000,250,816.4062500000,,, +15.6660156250,250,816.4062500000,,, +15.6679687500,250,816.4062500000,,, +15.6699218750,250,816.4062500000,,, +15.6718750000,250,816.4062500000,,, +15.6738281250,250,816.4062500000,,, +15.6757812500,250,816.4062500000,,, +15.6777343750,250,816.4062500000,,, +15.6796875000,250,816.4062500000,,, +15.6816406250,250,816.4062500000,,, +15.6835937500,250,816.4062500000,,, +15.6855468750,250,816.4062500000,,, +15.6875000000,251,763.6718750000,,, +15.6894531250,251,763.6718750000,,, +15.6914062500,251,763.6718750000,,, +15.6933593750,251,763.6718750000,,, +15.6953125000,251,763.6718750000,,, +15.6972656250,251,763.6718750000,,, +15.6992187500,251,763.6718750000,,, +15.7011718750,251,763.6718750000,,, +15.7031250000,251,763.6718750000,,, +15.7050781250,251,763.6718750000,,, +15.7070312500,251,763.6718750000,,, +15.7089843750,251,763.6718750000,,, +15.7109375000,251,763.6718750000,,, +15.7128906250,251,763.6718750000,,, +15.7148437500,251,763.6718750000,,, +15.7167968750,251,763.6718750000,,, +15.7187500000,251,763.6718750000,,, +15.7207031250,251,763.6718750000,,, +15.7226562500,251,763.6718750000,,, +15.7246093750,251,763.6718750000,,, +15.7265625000,251,763.6718750000,,, +15.7285156250,251,763.6718750000,,, +15.7304687500,251,763.6718750000,,, +15.7324218750,251,763.6718750000,,, +15.7343750000,251,763.6718750000,,, +15.7363281250,251,763.6718750000,,, +15.7382812500,251,763.6718750000,,, +15.7402343750,251,763.6718750000,,, +15.7421875000,251,763.6718750000,,, +15.7441406250,251,763.6718750000,,, +15.7460937500,251,763.6718750000,,, +15.7480468750,251,763.6718750000,,, +15.7500000000,252,763.6718750000,,, +15.7519531250,252,763.6718750000,,, +15.7539062500,252,763.6718750000,,, +15.7558593750,252,763.6718750000,,, +15.7578125000,252,763.6718750000,,, +15.7597656250,252,763.6718750000,,, +15.7617187500,252,763.6718750000,,, +15.7636718750,252,763.6718750000,,, +15.7656250000,252,763.6718750000,,, +15.7675781250,252,763.6718750000,,, +15.7695312500,252,763.6718750000,,, +15.7714843750,252,763.6718750000,,, +15.7734375000,252,763.6718750000,,, +15.7753906250,252,763.6718750000,,, +15.7773437500,252,763.6718750000,,, +15.7792968750,252,763.6718750000,,, +15.7812500000,252,763.6718750000,,, +15.7832031250,252,763.6718750000,,, +15.7851562500,252,763.6718750000,,, +15.7871093750,252,763.6718750000,,, +15.7890625000,252,763.6718750000,,, +15.7910156250,252,763.6718750000,,, +15.7929687500,252,763.6718750000,,, +15.7949218750,252,763.6718750000,,, +15.7968750000,252,763.6718750000,,, +15.7988281250,252,763.6718750000,,, +15.8007812500,252,763.6718750000,,, +15.8027343750,252,763.6718750000,,, +15.8046875000,252,763.6718750000,,, +15.8066406250,252,763.6718750000,,, +15.8085937500,252,763.6718750000,,, +15.8105468750,252,763.6718750000,,, +15.8125000000,253,763.6718750000,,, +15.8144531250,253,763.6718750000,,, +15.8164062500,253,763.6718750000,,, +15.8183593750,253,763.6718750000,,, +15.8203125000,253,763.6718750000,,, +15.8222656250,253,763.6718750000,,, +15.8242187500,253,763.6718750000,,, +15.8261718750,253,763.6718750000,,, +15.8281250000,253,763.6718750000,,, +15.8300781250,253,763.6718750000,,, +15.8320312500,253,763.6718750000,,, +15.8339843750,253,763.6718750000,,, +15.8359375000,253,763.6718750000,,, +15.8378906250,253,763.6718750000,,, +15.8398437500,253,763.6718750000,,, +15.8417968750,253,763.6718750000,,, +15.8437500000,253,763.6718750000,,, +15.8457031250,253,763.6718750000,,, +15.8476562500,253,763.6718750000,,, +15.8496093750,253,763.6718750000,,, +15.8515625000,253,763.6718750000,,, +15.8535156250,253,763.6718750000,,, +15.8554687500,253,763.6718750000,,, +15.8574218750,253,763.6718750000,,, +15.8593750000,253,763.6718750000,,, +15.8613281250,253,763.6718750000,,, +15.8632812500,253,763.6718750000,,, +15.8652343750,253,763.6718750000,,, +15.8671875000,253,763.6718750000,,, +15.8691406250,253,763.6718750000,,, +15.8710937500,253,763.6718750000,,, +15.8730468750,253,763.6718750000,,, +15.8750000000,254,763.6718750000,,, +15.8769531250,254,763.6718750000,,, +15.8789062500,254,763.6718750000,,, +15.8808593750,254,763.6718750000,,, +15.8828125000,254,763.6718750000,,, +15.8847656250,254,763.6718750000,,, +15.8867187500,254,763.6718750000,,, +15.8886718750,254,763.6718750000,,, +15.8906250000,254,763.6718750000,,, +15.8925781250,254,763.6718750000,,, +15.8945312500,254,763.6718750000,,, +15.8964843750,254,763.6718750000,,, +15.8984375000,254,763.6718750000,,, +15.9003906250,254,763.6718750000,,, +15.9023437500,254,763.6718750000,,, +15.9042968750,254,763.6718750000,,, +15.9062500000,254,763.6718750000,,, +15.9082031250,254,763.6718750000,,, +15.9101562500,254,763.6718750000,,, +15.9121093750,254,763.6718750000,,, +15.9140625000,254,763.6718750000,,, +15.9160156250,254,763.6718750000,,, +15.9179687500,254,763.6718750000,,, +15.9199218750,254,763.6718750000,,, +15.9218750000,254,763.6718750000,,, +15.9238281250,254,763.6718750000,,, +15.9257812500,254,763.6718750000,,, +15.9277343750,254,763.6718750000,,, +15.9296875000,254,763.6718750000,,, +15.9316406250,254,763.6718750000,,, +15.9335937500,254,763.6718750000,,, +15.9355468750,254,763.6718750000,,, +15.9375000000,255,763.6718750000,,, +15.9394531250,255,763.6718750000,,, +15.9414062500,255,763.6718750000,,, +15.9433593750,255,763.6718750000,,, +15.9453125000,255,763.6718750000,,, +15.9472656250,255,763.6718750000,,, +15.9492187500,255,763.6718750000,,, +15.9511718750,255,763.6718750000,,, +15.9531250000,255,763.6718750000,,, +15.9550781250,255,763.6718750000,,, +15.9570312500,255,763.6718750000,,, +15.9589843750,255,763.6718750000,,, +15.9609375000,255,763.6718750000,,, +15.9628906250,255,763.6718750000,,, +15.9648437500,255,763.6718750000,,, +15.9667968750,255,763.6718750000,,, +15.9687500000,255,763.6718750000,,, +15.9707031250,255,763.6718750000,,, +15.9726562500,255,763.6718750000,,, +15.9746093750,255,763.6718750000,,, +15.9765625000,255,763.6718750000,,, +15.9785156250,255,763.6718750000,,, +15.9804687500,255,763.6718750000,,, +15.9824218750,255,763.6718750000,,, +15.9843750000,255,763.6718750000,,, +15.9863281250,255,763.6718750000,,, +15.9882812500,255,763.6718750000,,, +15.9902343750,255,763.6718750000,,, +15.9921875000,255,763.6718750000,,, +15.9941406250,255,763.6718750000,,, +15.9960937500,255,763.6718750000,,, +15.9980468750,255,763.6718750000,,, +16.0000000000,256,763.6718750000,,, +16.0019531250,256,763.6718750000,,, +16.0039062500,256,763.6718750000,,, +16.0058593750,256,763.6718750000,,, +16.0078125000,256,763.6718750000,,, +16.0097656250,256,763.6718750000,,, +16.0117187500,256,763.6718750000,,, +16.0136718750,256,763.6718750000,,, +16.0156250000,256,763.6718750000,,, +16.0175781250,256,763.6718750000,,, +16.0195312500,256,763.6718750000,,, +16.0214843750,256,763.6718750000,,, +16.0234375000,256,763.6718750000,,, +16.0253906250,256,763.6718750000,,, +16.0273437500,256,763.6718750000,,, +16.0292968750,256,763.6718750000,,, +16.0312500000,256,763.6718750000,,, +16.0332031250,256,763.6718750000,,, +16.0351562500,256,763.6718750000,,, +16.0371093750,256,763.6718750000,,, +16.0390625000,256,763.6718750000,,, +16.0410156250,256,763.6718750000,,, +16.0429687500,256,763.6718750000,,, +16.0449218750,256,763.6718750000,,, +16.0468750000,256,763.6718750000,,, +16.0488281250,256,763.6718750000,,, +16.0507812500,256,763.6718750000,,, +16.0527343750,256,763.6718750000,,, +16.0546875000,256,763.6718750000,,, +16.0566406250,256,763.6718750000,,, +16.0585937500,256,763.6718750000,,, +16.0605468750,256,763.6718750000,,, +16.0625000000,257,763.6718750000,,, +16.0644531250,257,763.6718750000,,, +16.0664062500,257,763.6718750000,,, +16.0683593750,257,763.6718750000,,, +16.0703125000,257,763.6718750000,,, +16.0722656250,257,763.6718750000,,, +16.0742187500,257,763.6718750000,,, +16.0761718750,257,763.6718750000,,, +16.0781250000,257,763.6718750000,,, +16.0800781250,257,763.6718750000,,, +16.0820312500,257,763.6718750000,,, +16.0839843750,257,763.6718750000,,, +16.0859375000,257,763.6718750000,,, +16.0878906250,257,763.6718750000,,, +16.0898437500,257,763.6718750000,,, +16.0917968750,257,763.6718750000,,, +16.0937500000,257,763.6718750000,,, +16.0957031250,257,763.6718750000,,, +16.0976562500,257,763.6718750000,,, +16.0996093750,257,763.6718750000,,, +16.1015625000,257,763.6718750000,,, +16.1035156250,257,763.6718750000,,, +16.1054687500,257,763.6718750000,,, +16.1074218750,257,763.6718750000,,, +16.1093750000,257,763.6718750000,,, +16.1113281250,257,763.6718750000,,, +16.1132812500,257,763.6718750000,,, +16.1152343750,257,763.6718750000,,, +16.1171875000,257,763.6718750000,,, +16.1191406250,257,763.6718750000,,, +16.1210937500,257,763.6718750000,,, +16.1230468750,257,763.6718750000,,, +16.1250000000,258,763.6718750000,,, +16.1269531250,258,763.6718750000,,, +16.1289062500,258,763.6718750000,,, +16.1308593750,258,763.6718750000,,, +16.1328125000,258,763.6718750000,,, +16.1347656250,258,763.6718750000,,, +16.1367187500,258,763.6718750000,,, +16.1386718750,258,763.6718750000,,, +16.1406250000,258,763.6718750000,,, +16.1425781250,258,763.6718750000,,, +16.1445312500,258,763.6718750000,,, +16.1464843750,258,763.6718750000,,, +16.1484375000,258,763.6718750000,,, +16.1503906250,258,763.6718750000,,, +16.1523437500,258,763.6718750000,,, +16.1542968750,258,763.6718750000,,, +16.1562500000,258,763.6718750000,,, +16.1582031250,258,763.6718750000,,, +16.1601562500,258,763.6718750000,,, +16.1621093750,258,763.6718750000,,, +16.1640625000,258,763.6718750000,,, +16.1660156250,258,763.6718750000,,, +16.1679687500,258,763.6718750000,,, +16.1699218750,258,763.6718750000,,, +16.1718750000,258,763.6718750000,,, +16.1738281250,258,763.6718750000,,, +16.1757812500,258,763.6718750000,,, +16.1777343750,258,763.6718750000,,, +16.1796875000,258,763.6718750000,,, +16.1816406250,258,763.6718750000,,, +16.1835937500,258,763.6718750000,,, +16.1855468750,258,763.6718750000,,, +16.1875000000,259,763.6718750000,,, +16.1894531250,259,763.6718750000,,, +16.1914062500,259,763.6718750000,,, +16.1933593750,259,763.6718750000,,, +16.1953125000,259,763.6718750000,,, +16.1972656250,259,763.6718750000,,, +16.1992187500,259,763.6718750000,,, +16.2011718750,259,763.6718750000,,, +16.2031250000,259,763.6718750000,,, +16.2050781250,259,763.6718750000,,, +16.2070312500,259,763.6718750000,,, +16.2089843750,259,763.6718750000,,, +16.2109375000,259,763.6718750000,,, +16.2128906250,259,763.6718750000,,, +16.2148437500,259,763.6718750000,,, +16.2167968750,259,763.6718750000,,, +16.2187500000,259,763.6718750000,,, +16.2207031250,259,763.6718750000,,, +16.2226562500,259,763.6718750000,,, +16.2246093750,259,763.6718750000,,, +16.2265625000,259,763.6718750000,,, +16.2285156250,259,763.6718750000,,, +16.2304687500,259,763.6718750000,,, +16.2324218750,259,763.6718750000,,, +16.2343750000,259,763.6718750000,,, +16.2363281250,259,763.6718750000,,, +16.2382812500,259,763.6718750000,,, +16.2402343750,259,763.6718750000,,, +16.2421875000,259,763.6718750000,,, +16.2441406250,259,763.6718750000,,, +16.2460937500,259,763.6718750000,,, +16.2480468750,259,763.6718750000,,, +16.2500000000,260,763.6718750000,,, +16.2519531250,260,763.6718750000,,, +16.2539062500,260,763.6718750000,,, +16.2558593750,260,763.6718750000,,, +16.2578125000,260,763.6718750000,,, +16.2597656250,260,763.6718750000,,, +16.2617187500,260,763.6718750000,,, +16.2636718750,260,763.6718750000,,, +16.2656250000,260,763.6718750000,,, +16.2675781250,260,763.6718750000,,, +16.2695312500,260,763.6718750000,,, +16.2714843750,260,763.6718750000,,, +16.2734375000,260,763.6718750000,,, +16.2753906250,260,763.6718750000,,, +16.2773437500,260,763.6718750000,,, +16.2792968750,260,763.6718750000,,, +16.2812500000,260,763.6718750000,,, +16.2832031250,260,763.6718750000,,, +16.2851562500,260,763.6718750000,,, +16.2871093750,260,763.6718750000,,, +16.2890625000,260,763.6718750000,,, +16.2910156250,260,763.6718750000,,, +16.2929687500,260,763.6718750000,,, +16.2949218750,260,763.6718750000,,, +16.2968750000,260,763.6718750000,,, +16.2988281250,260,763.6718750000,,, +16.3007812500,260,763.6718750000,,, +16.3027343750,260,763.6718750000,,, +16.3046875000,260,763.6718750000,,, +16.3066406250,260,763.6718750000,,, +16.3085937500,260,763.6718750000,,, +16.3105468750,260,763.6718750000,,, +16.3125000000,261,763.6718750000,,, +16.3144531250,261,763.6718750000,,, +16.3164062500,261,763.6718750000,,, +16.3183593750,261,763.6718750000,,, +16.3203125000,261,763.6718750000,,, +16.3222656250,261,763.6718750000,,, +16.3242187500,261,763.6718750000,,, +16.3261718750,261,763.6718750000,,, +16.3281250000,261,763.6718750000,,, +16.3300781250,261,763.6718750000,,, +16.3320312500,261,763.6718750000,,, +16.3339843750,261,763.6718750000,,, +16.3359375000,261,763.6718750000,,, +16.3378906250,261,763.6718750000,,, +16.3398437500,261,763.6718750000,,, +16.3417968750,261,763.6718750000,,, +16.3437500000,261,763.6718750000,,, +16.3457031250,261,763.6718750000,,, +16.3476562500,261,763.6718750000,,, +16.3496093750,261,763.6718750000,,, +16.3515625000,261,763.6718750000,,, +16.3535156250,261,763.6718750000,,, +16.3554687500,261,763.6718750000,,, +16.3574218750,261,763.6718750000,,, +16.3593750000,261,763.6718750000,,, +16.3613281250,261,763.6718750000,,, +16.3632812500,261,763.6718750000,,, +16.3652343750,261,763.6718750000,,, +16.3671875000,261,763.6718750000,,, +16.3691406250,261,763.6718750000,,, +16.3710937500,261,763.6718750000,,, +16.3730468750,261,763.6718750000,,, +16.3750000000,262,687.5000000000,,, +16.3769531250,262,687.5000000000,,, +16.3789062500,262,687.5000000000,,, +16.3808593750,262,687.5000000000,,, +16.3828125000,262,687.5000000000,,, +16.3847656250,262,687.5000000000,,, +16.3867187500,262,687.5000000000,,, +16.3886718750,262,687.5000000000,,, +16.3906250000,262,687.5000000000,,, +16.3925781250,262,687.5000000000,,, +16.3945312500,262,687.5000000000,,, +16.3964843750,262,687.5000000000,,, +16.3984375000,262,687.5000000000,,, +16.4003906250,262,687.5000000000,,, +16.4023437500,262,687.5000000000,,, +16.4042968750,262,687.5000000000,,, +16.4062500000,262,687.5000000000,,, +16.4082031250,262,687.5000000000,,, +16.4101562500,262,687.5000000000,,, +16.4121093750,262,687.5000000000,,, +16.4140625000,262,687.5000000000,,, +16.4160156250,262,687.5000000000,,, +16.4179687500,262,687.5000000000,,, +16.4199218750,262,687.5000000000,,, +16.4218750000,262,687.5000000000,,, +16.4238281250,262,687.5000000000,,, +16.4257812500,262,687.5000000000,,, +16.4277343750,262,687.5000000000,,, +16.4296875000,262,687.5000000000,,, +16.4316406250,262,687.5000000000,,, +16.4335937500,262,687.5000000000,,, +16.4355468750,262,687.5000000000,,, +16.4375000000,263,687.5000000000,,, +16.4394531250,263,687.5000000000,,, +16.4414062500,263,687.5000000000,,, +16.4433593750,263,687.5000000000,,, +16.4453125000,263,687.5000000000,,, +16.4472656250,263,687.5000000000,,, +16.4492187500,263,687.5000000000,,, +16.4511718750,263,687.5000000000,,, +16.4531250000,263,687.5000000000,,, +16.4550781250,263,687.5000000000,,, +16.4570312500,263,687.5000000000,,, +16.4589843750,263,687.5000000000,,, +16.4609375000,263,687.5000000000,,, +16.4628906250,263,687.5000000000,,, +16.4648437500,263,687.5000000000,,, +16.4667968750,263,687.5000000000,,, +16.4687500000,263,687.5000000000,,, +16.4707031250,263,687.5000000000,,, +16.4726562500,263,687.5000000000,,, +16.4746093750,263,687.5000000000,,, +16.4765625000,263,687.5000000000,,, +16.4785156250,263,687.5000000000,,, +16.4804687500,263,687.5000000000,,, +16.4824218750,263,687.5000000000,,, +16.4843750000,263,687.5000000000,,, +16.4863281250,263,687.5000000000,,, +16.4882812500,263,687.5000000000,,, +16.4902343750,263,687.5000000000,,, +16.4921875000,263,687.5000000000,,, +16.4941406250,263,687.5000000000,,, +16.4960937500,263,687.5000000000,,, +16.4980468750,263,687.5000000000,,, +16.5000000000,264,687.5000000000,,, +16.5019531250,264,687.5000000000,,, +16.5039062500,264,687.5000000000,,, +16.5058593750,264,687.5000000000,,, +16.5078125000,264,687.5000000000,,, +16.5097656250,264,687.5000000000,,, +16.5117187500,264,687.5000000000,,, +16.5136718750,264,687.5000000000,,, +16.5156250000,264,687.5000000000,,, +16.5175781250,264,687.5000000000,,, +16.5195312500,264,687.5000000000,,, +16.5214843750,264,687.5000000000,,, +16.5234375000,264,687.5000000000,,, +16.5253906250,264,687.5000000000,,, +16.5273437500,264,687.5000000000,,, +16.5292968750,264,687.5000000000,,, +16.5312500000,264,687.5000000000,,, +16.5332031250,264,687.5000000000,,, +16.5351562500,264,687.5000000000,,, +16.5371093750,264,687.5000000000,,, +16.5390625000,264,687.5000000000,,, +16.5410156250,264,687.5000000000,,, +16.5429687500,264,687.5000000000,,, +16.5449218750,264,687.5000000000,,, +16.5468750000,264,687.5000000000,,, +16.5488281250,264,687.5000000000,,, +16.5507812500,264,687.5000000000,,, +16.5527343750,264,687.5000000000,,, +16.5546875000,264,687.5000000000,,, +16.5566406250,264,687.5000000000,,, +16.5585937500,264,687.5000000000,,, +16.5605468750,264,687.5000000000,,, +16.5625000000,265,687.5000000000,,, +16.5644531250,265,687.5000000000,,, +16.5664062500,265,687.5000000000,,, +16.5683593750,265,687.5000000000,,, +16.5703125000,265,687.5000000000,,, +16.5722656250,265,687.5000000000,,, +16.5742187500,265,687.5000000000,,, +16.5761718750,265,687.5000000000,,, +16.5781250000,265,687.5000000000,,, +16.5800781250,265,687.5000000000,,, +16.5820312500,265,687.5000000000,,, +16.5839843750,265,687.5000000000,,, +16.5859375000,265,687.5000000000,,, +16.5878906250,265,687.5000000000,,, +16.5898437500,265,687.5000000000,,, +16.5917968750,265,687.5000000000,,, +16.5937500000,265,687.5000000000,,, +16.5957031250,265,687.5000000000,,, +16.5976562500,265,687.5000000000,,, +16.5996093750,265,687.5000000000,,, +16.6015625000,265,687.5000000000,,, +16.6035156250,265,687.5000000000,,, +16.6054687500,265,687.5000000000,,, +16.6074218750,265,687.5000000000,,, +16.6093750000,265,687.5000000000,,, +16.6113281250,265,687.5000000000,,, +16.6132812500,265,687.5000000000,,, +16.6152343750,265,687.5000000000,,, +16.6171875000,265,687.5000000000,,, +16.6191406250,265,687.5000000000,,, +16.6210937500,265,687.5000000000,,, +16.6230468750,265,687.5000000000,,, +16.6250000000,266,687.5000000000,,, +16.6269531250,266,687.5000000000,,, +16.6289062500,266,687.5000000000,,, +16.6308593750,266,687.5000000000,,, +16.6328125000,266,687.5000000000,,, +16.6347656250,266,687.5000000000,,, +16.6367187500,266,687.5000000000,,, +16.6386718750,266,687.5000000000,,, +16.6406250000,266,687.5000000000,,, +16.6425781250,266,687.5000000000,,, +16.6445312500,266,687.5000000000,,, +16.6464843750,266,687.5000000000,,, +16.6484375000,266,687.5000000000,,, +16.6503906250,266,687.5000000000,,, +16.6523437500,266,687.5000000000,,, +16.6542968750,266,687.5000000000,,, +16.6562500000,266,687.5000000000,,, +16.6582031250,266,687.5000000000,,, +16.6601562500,266,687.5000000000,,, +16.6621093750,266,687.5000000000,,, +16.6640625000,266,687.5000000000,,, +16.6660156250,266,687.5000000000,,, +16.6679687500,266,687.5000000000,,, +16.6699218750,266,687.5000000000,,, +16.6718750000,266,687.5000000000,,, +16.6738281250,266,687.5000000000,,, +16.6757812500,266,687.5000000000,,, +16.6777343750,266,687.5000000000,,, +16.6796875000,266,687.5000000000,,, +16.6816406250,266,687.5000000000,,, +16.6835937500,266,687.5000000000,,, +16.6855468750,266,687.5000000000,,, +16.6875000000,267,687.5000000000,,, +16.6894531250,267,687.5000000000,,, +16.6914062500,267,687.5000000000,,, +16.6933593750,267,687.5000000000,,, +16.6953125000,267,687.5000000000,,, +16.6972656250,267,687.5000000000,,, +16.6992187500,267,687.5000000000,,, +16.7011718750,267,687.5000000000,,, +16.7031250000,267,687.5000000000,,, +16.7050781250,267,687.5000000000,,, +16.7070312500,267,687.5000000000,,, +16.7089843750,267,687.5000000000,,, +16.7109375000,267,687.5000000000,,, +16.7128906250,267,687.5000000000,,, +16.7148437500,267,687.5000000000,,, +16.7167968750,267,687.5000000000,,, +16.7187500000,267,687.5000000000,,, +16.7207031250,267,687.5000000000,,, +16.7226562500,267,687.5000000000,,, +16.7246093750,267,687.5000000000,,, +16.7265625000,267,687.5000000000,,, +16.7285156250,267,687.5000000000,,, +16.7304687500,267,687.5000000000,,, +16.7324218750,267,687.5000000000,,, +16.7343750000,267,687.5000000000,,, +16.7363281250,267,687.5000000000,,, +16.7382812500,267,687.5000000000,,, +16.7402343750,267,687.5000000000,,, +16.7421875000,267,687.5000000000,,, +16.7441406250,267,687.5000000000,,, +16.7460937500,267,687.5000000000,,, +16.7480468750,267,687.5000000000,,, +16.7500000000,268,687.5000000000,,, +16.7519531250,268,687.5000000000,,, +16.7539062500,268,687.5000000000,,, +16.7558593750,268,687.5000000000,,, +16.7578125000,268,687.5000000000,,, +16.7597656250,268,687.5000000000,,, +16.7617187500,268,687.5000000000,,, +16.7636718750,268,687.5000000000,,, +16.7656250000,268,687.5000000000,,, +16.7675781250,268,687.5000000000,,, +16.7695312500,268,687.5000000000,,, +16.7714843750,268,687.5000000000,,, +16.7734375000,268,687.5000000000,,, +16.7753906250,268,687.5000000000,,, +16.7773437500,268,687.5000000000,,, +16.7792968750,268,687.5000000000,,, +16.7812500000,268,687.5000000000,,, +16.7832031250,268,687.5000000000,,, +16.7851562500,268,687.5000000000,,, +16.7871093750,268,687.5000000000,,, +16.7890625000,268,687.5000000000,,, +16.7910156250,268,687.5000000000,,, +16.7929687500,268,687.5000000000,,, +16.7949218750,268,687.5000000000,,, +16.7968750000,268,687.5000000000,,, +16.7988281250,268,687.5000000000,,, +16.8007812500,268,687.5000000000,,, +16.8027343750,268,687.5000000000,,, +16.8046875000,268,687.5000000000,,, +16.8066406250,268,687.5000000000,,, +16.8085937500,268,687.5000000000,,, +16.8105468750,268,687.5000000000,,, +16.8125000000,269,687.5000000000,,, +16.8144531250,269,687.5000000000,,, +16.8164062500,269,687.5000000000,,, +16.8183593750,269,687.5000000000,,, +16.8203125000,269,687.5000000000,,, +16.8222656250,269,687.5000000000,,, +16.8242187500,269,687.5000000000,,, +16.8261718750,269,687.5000000000,,, +16.8281250000,269,687.5000000000,,, +16.8300781250,269,687.5000000000,,, +16.8320312500,269,687.5000000000,,, +16.8339843750,269,687.5000000000,,, +16.8359375000,269,687.5000000000,,, +16.8378906250,269,687.5000000000,,, +16.8398437500,269,687.5000000000,,, +16.8417968750,269,687.5000000000,,, +16.8437500000,269,687.5000000000,,, +16.8457031250,269,687.5000000000,,, +16.8476562500,269,687.5000000000,,, +16.8496093750,269,687.5000000000,,, +16.8515625000,269,687.5000000000,,, +16.8535156250,269,687.5000000000,,, +16.8554687500,269,687.5000000000,,, +16.8574218750,269,687.5000000000,,, +16.8593750000,269,687.5000000000,,, +16.8613281250,269,687.5000000000,,, +16.8632812500,269,687.5000000000,,, +16.8652343750,269,687.5000000000,,, +16.8671875000,269,687.5000000000,,, +16.8691406250,269,687.5000000000,,, +16.8710937500,269,687.5000000000,,, +16.8730468750,269,687.5000000000,,, +16.8750000000,270,687.5000000000,,, +16.8769531250,270,687.5000000000,,, +16.8789062500,270,687.5000000000,,, +16.8808593750,270,687.5000000000,,, +16.8828125000,270,687.5000000000,,, +16.8847656250,270,687.5000000000,,, +16.8867187500,270,687.5000000000,,, +16.8886718750,270,687.5000000000,,, +16.8906250000,270,687.5000000000,,, +16.8925781250,270,687.5000000000,,, +16.8945312500,270,687.5000000000,,, +16.8964843750,270,687.5000000000,,, +16.8984375000,270,687.5000000000,,, +16.9003906250,270,687.5000000000,,, +16.9023437500,270,687.5000000000,,, +16.9042968750,270,687.5000000000,,, +16.9062500000,270,687.5000000000,,, +16.9082031250,270,687.5000000000,,, +16.9101562500,270,687.5000000000,,, +16.9121093750,270,687.5000000000,,, +16.9140625000,270,687.5000000000,,, +16.9160156250,270,687.5000000000,,, +16.9179687500,270,687.5000000000,,, +16.9199218750,270,687.5000000000,,, +16.9218750000,270,687.5000000000,,, +16.9238281250,270,687.5000000000,,, +16.9257812500,270,687.5000000000,,, +16.9277343750,270,687.5000000000,,, +16.9296875000,270,687.5000000000,,, +16.9316406250,270,687.5000000000,,, +16.9335937500,270,687.5000000000,,, +16.9355468750,270,687.5000000000,,, +16.9375000000,271,687.5000000000,,, +16.9394531250,271,687.5000000000,,, +16.9414062500,271,687.5000000000,,, +16.9433593750,271,687.5000000000,,, +16.9453125000,271,687.5000000000,,, +16.9472656250,271,687.5000000000,,, +16.9492187500,271,687.5000000000,,, +16.9511718750,271,687.5000000000,,, +16.9531250000,271,687.5000000000,,, +16.9550781250,271,687.5000000000,,, +16.9570312500,271,687.5000000000,,, +16.9589843750,271,687.5000000000,,, +16.9609375000,271,687.5000000000,,, +16.9628906250,271,687.5000000000,,, +16.9648437500,271,687.5000000000,,, +16.9667968750,271,687.5000000000,,, +16.9687500000,271,687.5000000000,,, +16.9707031250,271,687.5000000000,,, +16.9726562500,271,687.5000000000,,, +16.9746093750,271,687.5000000000,,, +16.9765625000,271,687.5000000000,,, +16.9785156250,271,687.5000000000,,, +16.9804687500,271,687.5000000000,,, +16.9824218750,271,687.5000000000,,, +16.9843750000,271,687.5000000000,,, +16.9863281250,271,687.5000000000,,, +16.9882812500,271,687.5000000000,,, +16.9902343750,271,687.5000000000,,, +16.9921875000,271,687.5000000000,,, +16.9941406250,271,687.5000000000,,, +16.9960937500,271,687.5000000000,,, +16.9980468750,271,687.5000000000,,, +17.0000000000,272,687.5000000000,,, +17.0019531250,272,687.5000000000,,, +17.0039062500,272,687.5000000000,,, +17.0058593750,272,687.5000000000,,, +17.0078125000,272,687.5000000000,,, +17.0097656250,272,687.5000000000,,, +17.0117187500,272,687.5000000000,,, +17.0136718750,272,687.5000000000,,, +17.0156250000,272,687.5000000000,,, +17.0175781250,272,687.5000000000,,, +17.0195312500,272,687.5000000000,,, +17.0214843750,272,687.5000000000,,, +17.0234375000,272,687.5000000000,,, +17.0253906250,272,687.5000000000,,, +17.0273437500,272,687.5000000000,,, +17.0292968750,272,687.5000000000,,, +17.0312500000,272,687.5000000000,,, +17.0332031250,272,687.5000000000,,, +17.0351562500,272,687.5000000000,,, +17.0371093750,272,687.5000000000,,, +17.0390625000,272,687.5000000000,,, +17.0410156250,272,687.5000000000,,, +17.0429687500,272,687.5000000000,,, +17.0449218750,272,687.5000000000,,, +17.0468750000,272,687.5000000000,,, +17.0488281250,272,687.5000000000,,, +17.0507812500,272,687.5000000000,,, +17.0527343750,272,687.5000000000,,, +17.0546875000,272,687.5000000000,,, +17.0566406250,272,687.5000000000,,, +17.0585937500,272,687.5000000000,,, +17.0605468750,272,687.5000000000,,, +17.0625000000,273,675.7812500000,,, +17.0644531250,273,675.7812500000,,, +17.0664062500,273,675.7812500000,,, +17.0683593750,273,675.7812500000,,, +17.0703125000,273,675.7812500000,,, +17.0722656250,273,675.7812500000,,, +17.0742187500,273,675.7812500000,,, +17.0761718750,273,675.7812500000,,, +17.0781250000,273,675.7812500000,,, +17.0800781250,273,675.7812500000,,, +17.0820312500,273,675.7812500000,,, +17.0839843750,273,675.7812500000,,, +17.0859375000,273,675.7812500000,,, +17.0878906250,273,675.7812500000,,, +17.0898437500,273,675.7812500000,,, +17.0917968750,273,675.7812500000,,, +17.0937500000,273,675.7812500000,,, +17.0957031250,273,675.7812500000,,, +17.0976562500,273,675.7812500000,,, +17.0996093750,273,675.7812500000,,, +17.1015625000,273,675.7812500000,,, +17.1035156250,273,675.7812500000,,, +17.1054687500,273,675.7812500000,,, +17.1074218750,273,675.7812500000,,, +17.1093750000,273,675.7812500000,,, +17.1113281250,273,675.7812500000,,, +17.1132812500,273,675.7812500000,,, +17.1152343750,273,675.7812500000,,, +17.1171875000,273,675.7812500000,,, +17.1191406250,273,675.7812500000,,, +17.1210937500,273,675.7812500000,,, +17.1230468750,273,675.7812500000,,, +17.1250000000,274,675.7812500000,,, +17.1269531250,274,675.7812500000,,, +17.1289062500,274,675.7812500000,,, +17.1308593750,274,675.7812500000,,, +17.1328125000,274,675.7812500000,,, +17.1347656250,274,675.7812500000,,, +17.1367187500,274,675.7812500000,,, +17.1386718750,274,675.7812500000,,, +17.1406250000,274,675.7812500000,,, +17.1425781250,274,675.7812500000,,, +17.1445312500,274,675.7812500000,,, +17.1464843750,274,675.7812500000,,, +17.1484375000,274,675.7812500000,,, +17.1503906250,274,675.7812500000,,, +17.1523437500,274,675.7812500000,,, +17.1542968750,274,675.7812500000,,, +17.1562500000,274,675.7812500000,,, +17.1582031250,274,675.7812500000,,, +17.1601562500,274,675.7812500000,,, +17.1621093750,274,675.7812500000,,, +17.1640625000,274,675.7812500000,,, +17.1660156250,274,675.7812500000,,, +17.1679687500,274,675.7812500000,,, +17.1699218750,274,675.7812500000,,, +17.1718750000,274,675.7812500000,,, +17.1738281250,274,675.7812500000,,, +17.1757812500,274,675.7812500000,,, +17.1777343750,274,675.7812500000,,, +17.1796875000,274,675.7812500000,,, +17.1816406250,274,675.7812500000,,, +17.1835937500,274,675.7812500000,,, +17.1855468750,274,675.7812500000,,, +17.1875000000,275,675.7812500000,,, +17.1894531250,275,675.7812500000,,, +17.1914062500,275,675.7812500000,,, +17.1933593750,275,675.7812500000,,, +17.1953125000,275,675.7812500000,,, +17.1972656250,275,675.7812500000,,, +17.1992187500,275,675.7812500000,,, +17.2011718750,275,675.7812500000,,, +17.2031250000,275,675.7812500000,,, +17.2050781250,275,675.7812500000,,, +17.2070312500,275,675.7812500000,,, +17.2089843750,275,675.7812500000,,, +17.2109375000,275,675.7812500000,,, +17.2128906250,275,675.7812500000,,, +17.2148437500,275,675.7812500000,,, +17.2167968750,275,675.7812500000,,, +17.2187500000,275,675.7812500000,,, +17.2207031250,275,675.7812500000,,, +17.2226562500,275,675.7812500000,,, +17.2246093750,275,675.7812500000,,, +17.2265625000,275,675.7812500000,,, +17.2285156250,275,675.7812500000,,, +17.2304687500,275,675.7812500000,,, +17.2324218750,275,675.7812500000,,, +17.2343750000,275,675.7812500000,,, +17.2363281250,275,675.7812500000,,, +17.2382812500,275,675.7812500000,,, +17.2402343750,275,675.7812500000,,, +17.2421875000,275,675.7812500000,,, +17.2441406250,275,675.7812500000,,, +17.2460937500,275,675.7812500000,,, +17.2480468750,275,675.7812500000,,, +17.2500000000,276,675.7812500000,,, +17.2519531250,276,675.7812500000,,, +17.2539062500,276,675.7812500000,,, +17.2558593750,276,675.7812500000,,, +17.2578125000,276,675.7812500000,,, +17.2597656250,276,675.7812500000,,, +17.2617187500,276,675.7812500000,,, +17.2636718750,276,675.7812500000,,, +17.2656250000,276,675.7812500000,,, +17.2675781250,276,675.7812500000,,, +17.2695312500,276,675.7812500000,,, +17.2714843750,276,675.7812500000,,, +17.2734375000,276,675.7812500000,,, +17.2753906250,276,675.7812500000,,, +17.2773437500,276,675.7812500000,,, +17.2792968750,276,675.7812500000,,, +17.2812500000,276,675.7812500000,,, +17.2832031250,276,675.7812500000,,, +17.2851562500,276,675.7812500000,,, +17.2871093750,276,675.7812500000,,, +17.2890625000,276,675.7812500000,,, +17.2910156250,276,675.7812500000,,, +17.2929687500,276,675.7812500000,,, +17.2949218750,276,675.7812500000,,, +17.2968750000,276,675.7812500000,,, +17.2988281250,276,675.7812500000,,, +17.3007812500,276,675.7812500000,,, +17.3027343750,276,675.7812500000,,, +17.3046875000,276,675.7812500000,,, +17.3066406250,276,675.7812500000,,, +17.3085937500,276,675.7812500000,,, +17.3105468750,276,675.7812500000,,, +17.3125000000,277,675.7812500000,,, +17.3144531250,277,675.7812500000,,, +17.3164062500,277,675.7812500000,,, +17.3183593750,277,675.7812500000,,, +17.3203125000,277,675.7812500000,,, +17.3222656250,277,675.7812500000,,, +17.3242187500,277,675.7812500000,,, +17.3261718750,277,675.7812500000,,, +17.3281250000,277,675.7812500000,,, +17.3300781250,277,675.7812500000,,, +17.3320312500,277,675.7812500000,,, +17.3339843750,277,675.7812500000,,, +17.3359375000,277,675.7812500000,,, +17.3378906250,277,675.7812500000,,, +17.3398437500,277,675.7812500000,,, +17.3417968750,277,675.7812500000,,, +17.3437500000,277,675.7812500000,,, +17.3457031250,277,675.7812500000,,, +17.3476562500,277,675.7812500000,,, +17.3496093750,277,675.7812500000,,, +17.3515625000,277,675.7812500000,,, +17.3535156250,277,675.7812500000,,, +17.3554687500,277,675.7812500000,,, +17.3574218750,277,675.7812500000,,, +17.3593750000,277,675.7812500000,,, +17.3613281250,277,675.7812500000,,, +17.3632812500,277,675.7812500000,,, +17.3652343750,277,675.7812500000,,, +17.3671875000,277,675.7812500000,,, +17.3691406250,277,675.7812500000,,, +17.3710937500,277,675.7812500000,,, +17.3730468750,277,675.7812500000,,, +17.3750000000,278,675.7812500000,,, +17.3769531250,278,675.7812500000,,, +17.3789062500,278,675.7812500000,,, +17.3808593750,278,675.7812500000,,, +17.3828125000,278,675.7812500000,,, +17.3847656250,278,675.7812500000,,, +17.3867187500,278,675.7812500000,,, +17.3886718750,278,675.7812500000,,, +17.3906250000,278,675.7812500000,,, +17.3925781250,278,675.7812500000,,, +17.3945312500,278,675.7812500000,,, +17.3964843750,278,675.7812500000,,, +17.3984375000,278,675.7812500000,,, +17.4003906250,278,675.7812500000,,, +17.4023437500,278,675.7812500000,,, +17.4042968750,278,675.7812500000,,, +17.4062500000,278,675.7812500000,,, +17.4082031250,278,675.7812500000,,, +17.4101562500,278,675.7812500000,,, +17.4121093750,278,675.7812500000,,, +17.4140625000,278,675.7812500000,,, +17.4160156250,278,675.7812500000,,, +17.4179687500,278,675.7812500000,,, +17.4199218750,278,675.7812500000,,, +17.4218750000,278,675.7812500000,,, +17.4238281250,278,675.7812500000,,, +17.4257812500,278,675.7812500000,,, +17.4277343750,278,675.7812500000,,, +17.4296875000,278,675.7812500000,,, +17.4316406250,278,675.7812500000,,, +17.4335937500,278,675.7812500000,,, +17.4355468750,278,675.7812500000,,, +17.4375000000,279,675.7812500000,,, +17.4394531250,279,675.7812500000,,, +17.4414062500,279,675.7812500000,,, +17.4433593750,279,675.7812500000,,, +17.4453125000,279,675.7812500000,,, +17.4472656250,279,675.7812500000,,, +17.4492187500,279,675.7812500000,,, +17.4511718750,279,675.7812500000,,, +17.4531250000,279,675.7812500000,,, +17.4550781250,279,675.7812500000,,, +17.4570312500,279,675.7812500000,,, +17.4589843750,279,675.7812500000,,, +17.4609375000,279,675.7812500000,,, +17.4628906250,279,675.7812500000,,, +17.4648437500,279,675.7812500000,,, +17.4667968750,279,675.7812500000,,, +17.4687500000,279,675.7812500000,,, +17.4707031250,279,675.7812500000,,, +17.4726562500,279,675.7812500000,,, +17.4746093750,279,675.7812500000,,, +17.4765625000,279,675.7812500000,,, +17.4785156250,279,675.7812500000,,, +17.4804687500,279,675.7812500000,,, +17.4824218750,279,675.7812500000,,, +17.4843750000,279,675.7812500000,,, +17.4863281250,279,675.7812500000,,, +17.4882812500,279,675.7812500000,,, +17.4902343750,279,675.7812500000,,, +17.4921875000,279,675.7812500000,,, +17.4941406250,279,675.7812500000,,, +17.4960937500,279,675.7812500000,,, +17.4980468750,279,675.7812500000,,, +17.5000000000,280,675.7812500000,,, +17.5019531250,280,675.7812500000,,, +17.5039062500,280,675.7812500000,,, +17.5058593750,280,675.7812500000,,, +17.5078125000,280,675.7812500000,,, +17.5097656250,280,675.7812500000,,, +17.5117187500,280,675.7812500000,,, +17.5136718750,280,675.7812500000,,, +17.5156250000,280,675.7812500000,,, +17.5175781250,280,675.7812500000,,, +17.5195312500,280,675.7812500000,,, +17.5214843750,280,675.7812500000,,, +17.5234375000,280,675.7812500000,,, +17.5253906250,280,675.7812500000,,, +17.5273437500,280,675.7812500000,,, +17.5292968750,280,675.7812500000,,, +17.5312500000,280,675.7812500000,,, +17.5332031250,280,675.7812500000,,, +17.5351562500,280,675.7812500000,,, +17.5371093750,280,675.7812500000,,, +17.5390625000,280,675.7812500000,,, +17.5410156250,280,675.7812500000,,, +17.5429687500,280,675.7812500000,,, +17.5449218750,280,675.7812500000,,, +17.5468750000,280,675.7812500000,,, +17.5488281250,280,675.7812500000,,, +17.5507812500,280,675.7812500000,,, +17.5527343750,280,675.7812500000,,, +17.5546875000,280,675.7812500000,,, +17.5566406250,280,675.7812500000,,, +17.5585937500,280,675.7812500000,,, +17.5605468750,280,675.7812500000,,, +17.5625000000,281,675.7812500000,,, +17.5644531250,281,675.7812500000,,, +17.5664062500,281,675.7812500000,,, +17.5683593750,281,675.7812500000,,, +17.5703125000,281,675.7812500000,,, +17.5722656250,281,675.7812500000,,, +17.5742187500,281,675.7812500000,,, +17.5761718750,281,675.7812500000,,, +17.5781250000,281,675.7812500000,,, +17.5800781250,281,675.7812500000,,, +17.5820312500,281,675.7812500000,,, +17.5839843750,281,675.7812500000,,, +17.5859375000,281,675.7812500000,,, +17.5878906250,281,675.7812500000,,, +17.5898437500,281,675.7812500000,,, +17.5917968750,281,675.7812500000,,, +17.5937500000,281,675.7812500000,,, +17.5957031250,281,675.7812500000,,, +17.5976562500,281,675.7812500000,,, +17.5996093750,281,675.7812500000,,, +17.6015625000,281,675.7812500000,,, +17.6035156250,281,675.7812500000,,, +17.6054687500,281,675.7812500000,,, +17.6074218750,281,675.7812500000,,, +17.6093750000,281,675.7812500000,,, +17.6113281250,281,675.7812500000,,, +17.6132812500,281,675.7812500000,,, +17.6152343750,281,675.7812500000,,, +17.6171875000,281,675.7812500000,,, +17.6191406250,281,675.7812500000,,, +17.6210937500,281,675.7812500000,,, +17.6230468750,281,675.7812500000,,, +17.6250000000,282,675.7812500000,,, +17.6269531250,282,675.7812500000,,, +17.6289062500,282,675.7812500000,,, +17.6308593750,282,675.7812500000,,, +17.6328125000,282,675.7812500000,,, +17.6347656250,282,675.7812500000,,, +17.6367187500,282,675.7812500000,,, +17.6386718750,282,675.7812500000,,, +17.6406250000,282,675.7812500000,,, +17.6425781250,282,675.7812500000,,, +17.6445312500,282,675.7812500000,,, +17.6464843750,282,675.7812500000,,, +17.6484375000,282,675.7812500000,,, +17.6503906250,282,675.7812500000,,, +17.6523437500,282,675.7812500000,,, +17.6542968750,282,675.7812500000,,, +17.6562500000,282,675.7812500000,,, +17.6582031250,282,675.7812500000,,, +17.6601562500,282,675.7812500000,,, +17.6621093750,282,675.7812500000,,, +17.6640625000,282,675.7812500000,,, +17.6660156250,282,675.7812500000,,, +17.6679687500,282,675.7812500000,,, +17.6699218750,282,675.7812500000,,, +17.6718750000,282,675.7812500000,,, +17.6738281250,282,675.7812500000,,, +17.6757812500,282,675.7812500000,,, +17.6777343750,282,675.7812500000,,, +17.6796875000,282,675.7812500000,,, +17.6816406250,282,675.7812500000,,, +17.6835937500,282,675.7812500000,,, +17.6855468750,282,675.7812500000,,, +17.6875000000,283,675.7812500000,,, +17.6894531250,283,675.7812500000,,, +17.6914062500,283,675.7812500000,,, +17.6933593750,283,675.7812500000,,, +17.6953125000,283,675.7812500000,,, +17.6972656250,283,675.7812500000,,, +17.6992187500,283,675.7812500000,,, +17.7011718750,283,675.7812500000,,, +17.7031250000,283,675.7812500000,,, +17.7050781250,283,675.7812500000,,, +17.7070312500,283,675.7812500000,,, +17.7089843750,283,675.7812500000,,, +17.7109375000,283,675.7812500000,,, +17.7128906250,283,675.7812500000,,, +17.7148437500,283,675.7812500000,,, +17.7167968750,283,675.7812500000,,, +17.7187500000,283,675.7812500000,,, +17.7207031250,283,675.7812500000,,, +17.7226562500,283,675.7812500000,,, +17.7246093750,283,675.7812500000,,, +17.7265625000,283,675.7812500000,,, +17.7285156250,283,675.7812500000,,, +17.7304687500,283,675.7812500000,,, +17.7324218750,283,675.7812500000,,, +17.7343750000,283,675.7812500000,,, +17.7363281250,283,675.7812500000,,, +17.7382812500,283,675.7812500000,,, +17.7402343750,283,675.7812500000,,, +17.7421875000,283,675.7812500000,,, +17.7441406250,283,675.7812500000,,, +17.7460937500,283,675.7812500000,,, +17.7480468750,283,675.7812500000,,, +17.7500000000,284,675.7812500000,,, +17.7519531250,284,675.7812500000,,, +17.7539062500,284,675.7812500000,,, +17.7558593750,284,675.7812500000,,, +17.7578125000,284,675.7812500000,,, +17.7597656250,284,675.7812500000,,, +17.7617187500,284,675.7812500000,,, +17.7636718750,284,675.7812500000,,, +17.7656250000,284,675.7812500000,,, +17.7675781250,284,675.7812500000,,, +17.7695312500,284,675.7812500000,,, +17.7714843750,284,675.7812500000,,, +17.7734375000,284,675.7812500000,,, +17.7753906250,284,675.7812500000,,, +17.7773437500,284,675.7812500000,,, +17.7792968750,284,675.7812500000,,, +17.7812500000,284,675.7812500000,,, +17.7832031250,284,675.7812500000,,, +17.7851562500,284,675.7812500000,,, +17.7871093750,284,675.7812500000,,, +17.7890625000,284,675.7812500000,,, +17.7910156250,284,675.7812500000,,, +17.7929687500,284,675.7812500000,,, +17.7949218750,284,675.7812500000,,, +17.7968750000,284,675.7812500000,,, +17.7988281250,284,675.7812500000,,, +17.8007812500,284,675.7812500000,,, +17.8027343750,284,675.7812500000,,, +17.8046875000,284,675.7812500000,,, +17.8066406250,284,675.7812500000,,, +17.8085937500,284,675.7812500000,,, +17.8105468750,284,675.7812500000,,, +17.8125000000,285,693.3593750000,,, +17.8144531250,285,693.3593750000,,, +17.8164062500,285,693.3593750000,,, +17.8183593750,285,693.3593750000,,, +17.8203125000,285,693.3593750000,,, +17.8222656250,285,693.3593750000,,, +17.8242187500,285,693.3593750000,,, +17.8261718750,285,693.3593750000,,, +17.8281250000,285,693.3593750000,,, +17.8300781250,285,693.3593750000,,, +17.8320312500,285,693.3593750000,,, +17.8339843750,285,693.3593750000,,, +17.8359375000,285,693.3593750000,,, +17.8378906250,285,693.3593750000,,, +17.8398437500,285,693.3593750000,,, +17.8417968750,285,693.3593750000,,, +17.8437500000,285,693.3593750000,,, +17.8457031250,285,693.3593750000,,, +17.8476562500,285,693.3593750000,,, +17.8496093750,285,693.3593750000,,, +17.8515625000,285,693.3593750000,,, +17.8535156250,285,693.3593750000,,, +17.8554687500,285,693.3593750000,,, +17.8574218750,285,693.3593750000,,, +17.8593750000,285,693.3593750000,,, +17.8613281250,285,693.3593750000,,, +17.8632812500,285,693.3593750000,,, +17.8652343750,285,693.3593750000,,, +17.8671875000,285,693.3593750000,,, +17.8691406250,285,693.3593750000,,, +17.8710937500,285,693.3593750000,,, +17.8730468750,285,693.3593750000,,, +17.8750000000,286,693.3593750000,,, +17.8769531250,286,693.3593750000,,, +17.8789062500,286,693.3593750000,,, +17.8808593750,286,693.3593750000,,, +17.8828125000,286,693.3593750000,,, +17.8847656250,286,693.3593750000,,, +17.8867187500,286,693.3593750000,,, +17.8886718750,286,693.3593750000,,, +17.8906250000,286,693.3593750000,,, +17.8925781250,286,693.3593750000,,, +17.8945312500,286,693.3593750000,,, +17.8964843750,286,693.3593750000,,, +17.8984375000,286,693.3593750000,,, +17.9003906250,286,693.3593750000,,, +17.9023437500,286,693.3593750000,,, +17.9042968750,286,693.3593750000,,, +17.9062500000,286,693.3593750000,,, +17.9082031250,286,693.3593750000,,, +17.9101562500,286,693.3593750000,,, +17.9121093750,286,693.3593750000,,, +17.9140625000,286,693.3593750000,,, +17.9160156250,286,693.3593750000,,, +17.9179687500,286,693.3593750000,,, +17.9199218750,286,693.3593750000,,, +17.9218750000,286,693.3593750000,,, +17.9238281250,286,693.3593750000,,, +17.9257812500,286,693.3593750000,,, +17.9277343750,286,693.3593750000,,, +17.9296875000,286,693.3593750000,,, +17.9316406250,286,693.3593750000,,, +17.9335937500,286,693.3593750000,,, +17.9355468750,286,693.3593750000,,, +17.9375000000,287,693.3593750000,,, +17.9394531250,287,693.3593750000,,, +17.9414062500,287,693.3593750000,,, +17.9433593750,287,693.3593750000,,, +17.9453125000,287,693.3593750000,,, +17.9472656250,287,693.3593750000,,, +17.9492187500,287,693.3593750000,,, +17.9511718750,287,693.3593750000,,, +17.9531250000,287,693.3593750000,,, +17.9550781250,287,693.3593750000,,, +17.9570312500,287,693.3593750000,,, +17.9589843750,287,693.3593750000,,, +17.9609375000,287,693.3593750000,,, +17.9628906250,287,693.3593750000,,, +17.9648437500,287,693.3593750000,,, +17.9667968750,287,693.3593750000,,, +17.9687500000,287,693.3593750000,,, +17.9707031250,287,693.3593750000,,, +17.9726562500,287,693.3593750000,,, +17.9746093750,287,693.3593750000,,, +17.9765625000,287,693.3593750000,,, +17.9785156250,287,693.3593750000,,, +17.9804687500,287,693.3593750000,,, +17.9824218750,287,693.3593750000,,, +17.9843750000,287,693.3593750000,,, +17.9863281250,287,693.3593750000,,, +17.9882812500,287,693.3593750000,,, +17.9902343750,287,693.3593750000,,, +17.9921875000,287,693.3593750000,,, +17.9941406250,287,693.3593750000,,, +17.9960937500,287,693.3593750000,,, +17.9980468750,287,693.3593750000,,, +18.0000000000,288,693.3593750000,,, +18.0019531250,288,693.3593750000,,, +18.0039062500,288,693.3593750000,,, +18.0058593750,288,693.3593750000,,, +18.0078125000,288,693.3593750000,,, +18.0097656250,288,693.3593750000,,, +18.0117187500,288,693.3593750000,,, +18.0136718750,288,693.3593750000,,, +18.0156250000,288,693.3593750000,,, +18.0175781250,288,693.3593750000,,, +18.0195312500,288,693.3593750000,,, +18.0214843750,288,693.3593750000,,, +18.0234375000,288,693.3593750000,,, +18.0253906250,288,693.3593750000,,, +18.0273437500,288,693.3593750000,,, +18.0292968750,288,693.3593750000,,, +18.0312500000,288,693.3593750000,,, +18.0332031250,288,693.3593750000,,, +18.0351562500,288,693.3593750000,,, +18.0371093750,288,693.3593750000,,, +18.0390625000,288,693.3593750000,,, +18.0410156250,288,693.3593750000,,, +18.0429687500,288,693.3593750000,,, +18.0449218750,288,693.3593750000,,, +18.0468750000,288,693.3593750000,,, +18.0488281250,288,693.3593750000,,, +18.0507812500,288,693.3593750000,,, +18.0527343750,288,693.3593750000,,, +18.0546875000,288,693.3593750000,,, +18.0566406250,288,693.3593750000,,, +18.0585937500,288,693.3593750000,,, +18.0605468750,288,693.3593750000,,, +18.0625000000,289,693.3593750000,,, +18.0644531250,289,693.3593750000,,, +18.0664062500,289,693.3593750000,,, +18.0683593750,289,693.3593750000,,, +18.0703125000,289,693.3593750000,,, +18.0722656250,289,693.3593750000,,, +18.0742187500,289,693.3593750000,,, +18.0761718750,289,693.3593750000,,, +18.0781250000,289,693.3593750000,,, +18.0800781250,289,693.3593750000,,, +18.0820312500,289,693.3593750000,,, +18.0839843750,289,693.3593750000,,, +18.0859375000,289,693.3593750000,,, +18.0878906250,289,693.3593750000,,, +18.0898437500,289,693.3593750000,,, +18.0917968750,289,693.3593750000,,, +18.0937500000,289,693.3593750000,,, +18.0957031250,289,693.3593750000,,, +18.0976562500,289,693.3593750000,,, +18.0996093750,289,693.3593750000,,, +18.1015625000,289,693.3593750000,,, +18.1035156250,289,693.3593750000,,, +18.1054687500,289,693.3593750000,,, +18.1074218750,289,693.3593750000,,, +18.1093750000,289,693.3593750000,,, +18.1113281250,289,693.3593750000,,, +18.1132812500,289,693.3593750000,,, +18.1152343750,289,693.3593750000,,, +18.1171875000,289,693.3593750000,,, +18.1191406250,289,693.3593750000,,, +18.1210937500,289,693.3593750000,,, +18.1230468750,289,693.3593750000,,, +18.1250000000,290,693.3593750000,,, +18.1269531250,290,693.3593750000,,, +18.1289062500,290,693.3593750000,,, +18.1308593750,290,693.3593750000,,, +18.1328125000,290,693.3593750000,,, +18.1347656250,290,693.3593750000,,, +18.1367187500,290,693.3593750000,,, +18.1386718750,290,693.3593750000,,, +18.1406250000,290,693.3593750000,,, +18.1425781250,290,693.3593750000,,, +18.1445312500,290,693.3593750000,,, +18.1464843750,290,693.3593750000,,, +18.1484375000,290,693.3593750000,,, +18.1503906250,290,693.3593750000,,, +18.1523437500,290,693.3593750000,,, +18.1542968750,290,693.3593750000,,, +18.1562500000,290,693.3593750000,,, +18.1582031250,290,693.3593750000,,, +18.1601562500,290,693.3593750000,,, +18.1621093750,290,693.3593750000,,, +18.1640625000,290,693.3593750000,,, +18.1660156250,290,693.3593750000,,, +18.1679687500,290,693.3593750000,,, +18.1699218750,290,693.3593750000,,, +18.1718750000,290,693.3593750000,,, +18.1738281250,290,693.3593750000,,, +18.1757812500,290,693.3593750000,,, +18.1777343750,290,693.3593750000,,, +18.1796875000,290,693.3593750000,,, +18.1816406250,290,693.3593750000,,, +18.1835937500,290,693.3593750000,,, +18.1855468750,290,693.3593750000,,, +18.1875000000,291,693.3593750000,,, +18.1894531250,291,693.3593750000,,, +18.1914062500,291,693.3593750000,,, +18.1933593750,291,693.3593750000,,, +18.1953125000,291,693.3593750000,,, +18.1972656250,291,693.3593750000,,, +18.1992187500,291,693.3593750000,,, +18.2011718750,291,693.3593750000,,, +18.2031250000,291,693.3593750000,,, +18.2050781250,291,693.3593750000,,, +18.2070312500,291,693.3593750000,,, +18.2089843750,291,693.3593750000,,, +18.2109375000,291,693.3593750000,,, +18.2128906250,291,693.3593750000,,, +18.2148437500,291,693.3593750000,,, +18.2167968750,291,693.3593750000,,, +18.2187500000,291,693.3593750000,,, +18.2207031250,291,693.3593750000,,, +18.2226562500,291,693.3593750000,,, +18.2246093750,291,693.3593750000,,, +18.2265625000,291,693.3593750000,,, +18.2285156250,291,693.3593750000,,, +18.2304687500,291,693.3593750000,,, +18.2324218750,291,693.3593750000,,, +18.2343750000,291,693.3593750000,,, +18.2363281250,291,693.3593750000,,, +18.2382812500,291,693.3593750000,,, +18.2402343750,291,693.3593750000,,, +18.2421875000,291,693.3593750000,,, +18.2441406250,291,693.3593750000,,, +18.2460937500,291,693.3593750000,,, +18.2480468750,291,693.3593750000,,, +18.2500000000,292,693.3593750000,,, +18.2519531250,292,693.3593750000,,, +18.2539062500,292,693.3593750000,,, +18.2558593750,292,693.3593750000,,, +18.2578125000,292,693.3593750000,,, +18.2597656250,292,693.3593750000,,, +18.2617187500,292,693.3593750000,,, +18.2636718750,292,693.3593750000,,, +18.2656250000,292,693.3593750000,,, +18.2675781250,292,693.3593750000,,, +18.2695312500,292,693.3593750000,,, +18.2714843750,292,693.3593750000,,, +18.2734375000,292,693.3593750000,,, +18.2753906250,292,693.3593750000,,, +18.2773437500,292,693.3593750000,,, +18.2792968750,292,693.3593750000,,, +18.2812500000,292,693.3593750000,,, +18.2832031250,292,693.3593750000,,, +18.2851562500,292,693.3593750000,,, +18.2871093750,292,693.3593750000,,, +18.2890625000,292,693.3593750000,,, +18.2910156250,292,693.3593750000,,, +18.2929687500,292,693.3593750000,,, +18.2949218750,292,693.3593750000,,, +18.2968750000,292,693.3593750000,,, +18.2988281250,292,693.3593750000,,, +18.3007812500,292,693.3593750000,,, +18.3027343750,292,693.3593750000,,, +18.3046875000,292,693.3593750000,,, +18.3066406250,292,693.3593750000,,, +18.3085937500,292,693.3593750000,,, +18.3105468750,292,693.3593750000,,, +18.3125000000,293,693.3593750000,,, +18.3144531250,293,693.3593750000,,, +18.3164062500,293,693.3593750000,,, +18.3183593750,293,693.3593750000,,, +18.3203125000,293,693.3593750000,,, +18.3222656250,293,693.3593750000,,, +18.3242187500,293,693.3593750000,,, +18.3261718750,293,693.3593750000,,, +18.3281250000,293,693.3593750000,,, +18.3300781250,293,693.3593750000,,, +18.3320312500,293,693.3593750000,,, +18.3339843750,293,693.3593750000,,, +18.3359375000,293,693.3593750000,,, +18.3378906250,293,693.3593750000,,, +18.3398437500,293,693.3593750000,,, +18.3417968750,293,693.3593750000,,, +18.3437500000,293,693.3593750000,,, +18.3457031250,293,693.3593750000,,, +18.3476562500,293,693.3593750000,,, +18.3496093750,293,693.3593750000,,, +18.3515625000,293,693.3593750000,,, +18.3535156250,293,693.3593750000,,, +18.3554687500,293,693.3593750000,,, +18.3574218750,293,693.3593750000,,, +18.3593750000,293,693.3593750000,,, +18.3613281250,293,693.3593750000,,, +18.3632812500,293,693.3593750000,,, +18.3652343750,293,693.3593750000,,, +18.3671875000,293,693.3593750000,,, +18.3691406250,293,693.3593750000,,, +18.3710937500,293,693.3593750000,,, +18.3730468750,293,693.3593750000,,, +18.3750000000,294,693.3593750000,,, +18.3769531250,294,693.3593750000,,, +18.3789062500,294,693.3593750000,,, +18.3808593750,294,693.3593750000,,, +18.3828125000,294,693.3593750000,,, +18.3847656250,294,693.3593750000,,, +18.3867187500,294,693.3593750000,,, +18.3886718750,294,693.3593750000,,, +18.3906250000,294,693.3593750000,,, +18.3925781250,294,693.3593750000,,, +18.3945312500,294,693.3593750000,,, +18.3964843750,294,693.3593750000,,, +18.3984375000,294,693.3593750000,,, +18.4003906250,294,693.3593750000,,, +18.4023437500,294,693.3593750000,,, +18.4042968750,294,693.3593750000,,, +18.4062500000,294,693.3593750000,,, +18.4082031250,294,693.3593750000,,, +18.4101562500,294,693.3593750000,,, +18.4121093750,294,693.3593750000,,, +18.4140625000,294,693.3593750000,,, +18.4160156250,294,693.3593750000,,, +18.4179687500,294,693.3593750000,,, +18.4199218750,294,693.3593750000,,, +18.4218750000,294,693.3593750000,,, +18.4238281250,294,693.3593750000,,, +18.4257812500,294,693.3593750000,,, +18.4277343750,294,693.3593750000,,, +18.4296875000,294,693.3593750000,,, +18.4316406250,294,693.3593750000,,, +18.4335937500,294,693.3593750000,,, +18.4355468750,294,693.3593750000,,, +18.4375000000,295,693.3593750000,,, +18.4394531250,295,693.3593750000,,, +18.4414062500,295,693.3593750000,,, +18.4433593750,295,693.3593750000,,, +18.4453125000,295,693.3593750000,,, +18.4472656250,295,693.3593750000,,, +18.4492187500,295,693.3593750000,,, +18.4511718750,295,693.3593750000,,, +18.4531250000,295,693.3593750000,,, +18.4550781250,295,693.3593750000,,, +18.4570312500,295,693.3593750000,,, +18.4589843750,295,693.3593750000,,, +18.4609375000,295,693.3593750000,,, +18.4628906250,295,693.3593750000,,, +18.4648437500,295,693.3593750000,,, +18.4667968750,295,693.3593750000,,, +18.4687500000,295,693.3593750000,,, +18.4707031250,295,693.3593750000,,, +18.4726562500,295,693.3593750000,,, +18.4746093750,295,693.3593750000,,, +18.4765625000,295,693.3593750000,,, +18.4785156250,295,693.3593750000,,, +18.4804687500,295,693.3593750000,,, +18.4824218750,295,693.3593750000,,, +18.4843750000,295,693.3593750000,,, +18.4863281250,295,693.3593750000,,, +18.4882812500,295,693.3593750000,,, +18.4902343750,295,693.3593750000,,, +18.4921875000,295,693.3593750000,,, +18.4941406250,295,693.3593750000,,, +18.4960937500,295,693.3593750000,,, +18.4980468750,295,693.3593750000,,, +18.5000000000,296,693.3593750000,,, +18.5019531250,296,693.3593750000,,, +18.5039062500,296,693.3593750000,,, +18.5058593750,296,693.3593750000,,, +18.5078125000,296,693.3593750000,,, +18.5097656250,296,693.3593750000,,, +18.5117187500,296,693.3593750000,,, +18.5136718750,296,693.3593750000,,, +18.5156250000,296,693.3593750000,,, +18.5175781250,296,693.3593750000,,, +18.5195312500,296,693.3593750000,,, +18.5214843750,296,693.3593750000,,, +18.5234375000,296,693.3593750000,,, +18.5253906250,296,693.3593750000,,, +18.5273437500,296,693.3593750000,,, +18.5292968750,296,693.3593750000,,, +18.5312500000,296,693.3593750000,,, +18.5332031250,296,693.3593750000,,, +18.5351562500,296,693.3593750000,,, +18.5371093750,296,693.3593750000,,, +18.5390625000,296,693.3593750000,,, +18.5410156250,296,693.3593750000,,, +18.5429687500,296,693.3593750000,,, +18.5449218750,296,693.3593750000,,, +18.5468750000,296,693.3593750000,,, +18.5488281250,296,693.3593750000,,, +18.5507812500,296,693.3593750000,,, +18.5527343750,296,693.3593750000,,, +18.5546875000,296,693.3593750000,,, +18.5566406250,296,693.3593750000,,, +18.5585937500,296,693.3593750000,,, +18.5605468750,296,693.3593750000,,, +18.5625000000,297,753.9062500000,,, +18.5644531250,297,753.9062500000,,, +18.5664062500,297,753.9062500000,,, +18.5683593750,297,753.9062500000,,, +18.5703125000,297,753.9062500000,,, +18.5722656250,297,753.9062500000,,, +18.5742187500,297,753.9062500000,,, +18.5761718750,297,753.9062500000,,, +18.5781250000,297,753.9062500000,,, +18.5800781250,297,753.9062500000,,, +18.5820312500,297,753.9062500000,,, +18.5839843750,297,753.9062500000,,, +18.5859375000,297,753.9062500000,,, +18.5878906250,297,753.9062500000,,, +18.5898437500,297,753.9062500000,,, +18.5917968750,297,753.9062500000,,, +18.5937500000,297,753.9062500000,,, +18.5957031250,297,753.9062500000,,, +18.5976562500,297,753.9062500000,,, +18.5996093750,297,753.9062500000,,, +18.6015625000,297,753.9062500000,,, +18.6035156250,297,753.9062500000,,, +18.6054687500,297,753.9062500000,,, +18.6074218750,297,753.9062500000,,, +18.6093750000,297,753.9062500000,,, +18.6113281250,297,753.9062500000,,, +18.6132812500,297,753.9062500000,,, +18.6152343750,297,753.9062500000,,, +18.6171875000,297,753.9062500000,,, +18.6191406250,297,753.9062500000,,, +18.6210937500,297,753.9062500000,,, +18.6230468750,297,753.9062500000,,, +18.6250000000,298,753.9062500000,,, +18.6269531250,298,753.9062500000,,, +18.6289062500,298,753.9062500000,,, +18.6308593750,298,753.9062500000,,, +18.6328125000,298,753.9062500000,,, +18.6347656250,298,753.9062500000,,, +18.6367187500,298,753.9062500000,,, +18.6386718750,298,753.9062500000,,, +18.6406250000,298,753.9062500000,,, +18.6425781250,298,753.9062500000,,, +18.6445312500,298,753.9062500000,,, +18.6464843750,298,753.9062500000,,, +18.6484375000,298,753.9062500000,,, +18.6503906250,298,753.9062500000,,, +18.6523437500,298,753.9062500000,,, +18.6542968750,298,753.9062500000,,, +18.6562500000,298,753.9062500000,,, +18.6582031250,298,753.9062500000,,, +18.6601562500,298,753.9062500000,,, +18.6621093750,298,753.9062500000,,, +18.6640625000,298,753.9062500000,,, +18.6660156250,298,753.9062500000,,, +18.6679687500,298,753.9062500000,,, +18.6699218750,298,753.9062500000,,, +18.6718750000,298,753.9062500000,,, +18.6738281250,298,753.9062500000,,, +18.6757812500,298,753.9062500000,,, +18.6777343750,298,753.9062500000,,, +18.6796875000,298,753.9062500000,,, +18.6816406250,298,753.9062500000,,, +18.6835937500,298,753.9062500000,,, +18.6855468750,298,753.9062500000,,, +18.6875000000,299,753.9062500000,,, +18.6894531250,299,753.9062500000,,, +18.6914062500,299,753.9062500000,,, +18.6933593750,299,753.9062500000,,, +18.6953125000,299,753.9062500000,,, +18.6972656250,299,753.9062500000,,, +18.6992187500,299,753.9062500000,,, +18.7011718750,299,753.9062500000,,, +18.7031250000,299,753.9062500000,,, +18.7050781250,299,753.9062500000,,, +18.7070312500,299,753.9062500000,,, +18.7089843750,299,753.9062500000,,, +18.7109375000,299,753.9062500000,,, +18.7128906250,299,753.9062500000,,, +18.7148437500,299,753.9062500000,,, +18.7167968750,299,753.9062500000,,, +18.7187500000,299,753.9062500000,,, +18.7207031250,299,753.9062500000,,, +18.7226562500,299,753.9062500000,,, +18.7246093750,299,753.9062500000,,, +18.7265625000,299,753.9062500000,,, +18.7285156250,299,753.9062500000,,, +18.7304687500,299,753.9062500000,,, +18.7324218750,299,753.9062500000,,, +18.7343750000,299,753.9062500000,,, +18.7363281250,299,753.9062500000,,, +18.7382812500,299,753.9062500000,,, +18.7402343750,299,753.9062500000,,, +18.7421875000,299,753.9062500000,,, +18.7441406250,299,753.9062500000,,, +18.7460937500,299,753.9062500000,,, +18.7480468750,299,753.9062500000,,, +18.7500000000,300,753.9062500000,,, +18.7519531250,300,753.9062500000,,, +18.7539062500,300,753.9062500000,,, +18.7558593750,300,753.9062500000,,, +18.7578125000,300,753.9062500000,,, +18.7597656250,300,753.9062500000,,, +18.7617187500,300,753.9062500000,,, +18.7636718750,300,753.9062500000,,, +18.7656250000,300,753.9062500000,,, +18.7675781250,300,753.9062500000,,, +18.7695312500,300,753.9062500000,,, +18.7714843750,300,753.9062500000,,, +18.7734375000,300,753.9062500000,,, +18.7753906250,300,753.9062500000,,, +18.7773437500,300,753.9062500000,,, +18.7792968750,300,753.9062500000,,, +18.7812500000,300,753.9062500000,,, +18.7832031250,300,753.9062500000,,, +18.7851562500,300,753.9062500000,,, +18.7871093750,300,753.9062500000,,, +18.7890625000,300,753.9062500000,,, +18.7910156250,300,753.9062500000,,, +18.7929687500,300,753.9062500000,,, +18.7949218750,300,753.9062500000,,, +18.7968750000,300,753.9062500000,,, +18.7988281250,300,753.9062500000,,, +18.8007812500,300,753.9062500000,,, +18.8027343750,300,753.9062500000,,, +18.8046875000,300,753.9062500000,,, +18.8066406250,300,753.9062500000,,, +18.8085937500,300,753.9062500000,,, +18.8105468750,300,753.9062500000,,, +18.8125000000,301,753.9062500000,,, +18.8144531250,301,753.9062500000,,, +18.8164062500,301,753.9062500000,,, +18.8183593750,301,753.9062500000,,, +18.8203125000,301,753.9062500000,,, +18.8222656250,301,753.9062500000,,, +18.8242187500,301,753.9062500000,,, +18.8261718750,301,753.9062500000,,, +18.8281250000,301,753.9062500000,,, +18.8300781250,301,753.9062500000,,, +18.8320312500,301,753.9062500000,,, +18.8339843750,301,753.9062500000,,, +18.8359375000,301,753.9062500000,,, +18.8378906250,301,753.9062500000,,, +18.8398437500,301,753.9062500000,,, +18.8417968750,301,753.9062500000,,, +18.8437500000,301,753.9062500000,,, +18.8457031250,301,753.9062500000,,, +18.8476562500,301,753.9062500000,,, +18.8496093750,301,753.9062500000,,, +18.8515625000,301,753.9062500000,,, +18.8535156250,301,753.9062500000,,, +18.8554687500,301,753.9062500000,,, +18.8574218750,301,753.9062500000,,, +18.8593750000,301,753.9062500000,,, +18.8613281250,301,753.9062500000,,, +18.8632812500,301,753.9062500000,,, +18.8652343750,301,753.9062500000,,, +18.8671875000,301,753.9062500000,,, +18.8691406250,301,753.9062500000,,, +18.8710937500,301,753.9062500000,,, +18.8730468750,301,753.9062500000,,, +18.8750000000,302,753.9062500000,,, +18.8769531250,302,753.9062500000,,, +18.8789062500,302,753.9062500000,,, +18.8808593750,302,753.9062500000,,, +18.8828125000,302,753.9062500000,,, +18.8847656250,302,753.9062500000,,, +18.8867187500,302,753.9062500000,,, +18.8886718750,302,753.9062500000,,, +18.8906250000,302,753.9062500000,,, +18.8925781250,302,753.9062500000,,, +18.8945312500,302,753.9062500000,,, +18.8964843750,302,753.9062500000,,, +18.8984375000,302,753.9062500000,,, +18.9003906250,302,753.9062500000,,, +18.9023437500,302,753.9062500000,,, +18.9042968750,302,753.9062500000,,, +18.9062500000,302,753.9062500000,,, +18.9082031250,302,753.9062500000,,, +18.9101562500,302,753.9062500000,,, +18.9121093750,302,753.9062500000,,, +18.9140625000,302,753.9062500000,,, +18.9160156250,302,753.9062500000,,, +18.9179687500,302,753.9062500000,,, +18.9199218750,302,753.9062500000,,, +18.9218750000,302,753.9062500000,,, +18.9238281250,302,753.9062500000,,, +18.9257812500,302,753.9062500000,,, +18.9277343750,302,753.9062500000,,, +18.9296875000,302,753.9062500000,,, +18.9316406250,302,753.9062500000,,, +18.9335937500,302,753.9062500000,,, +18.9355468750,302,753.9062500000,,, +18.9375000000,303,753.9062500000,,, +18.9394531250,303,753.9062500000,,, +18.9414062500,303,753.9062500000,,, +18.9433593750,303,753.9062500000,,, +18.9453125000,303,753.9062500000,,, +18.9472656250,303,753.9062500000,,, +18.9492187500,303,753.9062500000,,, +18.9511718750,303,753.9062500000,,, +18.9531250000,303,753.9062500000,,, +18.9550781250,303,753.9062500000,,, +18.9570312500,303,753.9062500000,,, +18.9589843750,303,753.9062500000,,, +18.9609375000,303,753.9062500000,,, +18.9628906250,303,753.9062500000,,, +18.9648437500,303,753.9062500000,,, +18.9667968750,303,753.9062500000,,, +18.9687500000,303,753.9062500000,,, +18.9707031250,303,753.9062500000,,, +18.9726562500,303,753.9062500000,,, +18.9746093750,303,753.9062500000,,, +18.9765625000,303,753.9062500000,,, +18.9785156250,303,753.9062500000,,, +18.9804687500,303,753.9062500000,,, +18.9824218750,303,753.9062500000,,, +18.9843750000,303,753.9062500000,,, +18.9863281250,303,753.9062500000,,, +18.9882812500,303,753.9062500000,,, +18.9902343750,303,753.9062500000,,, +18.9921875000,303,753.9062500000,,, +18.9941406250,303,753.9062500000,,, +18.9960937500,303,753.9062500000,,, +18.9980468750,303,753.9062500000,,, +19.0000000000,304,753.9062500000,,, +19.0019531250,304,753.9062500000,,, +19.0039062500,304,753.9062500000,,, +19.0058593750,304,753.9062500000,,, +19.0078125000,304,753.9062500000,,, +19.0097656250,304,753.9062500000,,, +19.0117187500,304,753.9062500000,,, +19.0136718750,304,753.9062500000,,, +19.0156250000,304,753.9062500000,,, +19.0175781250,304,753.9062500000,,, +19.0195312500,304,753.9062500000,,, +19.0214843750,304,753.9062500000,,, +19.0234375000,304,753.9062500000,,, +19.0253906250,304,753.9062500000,,, +19.0273437500,304,753.9062500000,,, +19.0292968750,304,753.9062500000,,, +19.0312500000,304,753.9062500000,,, +19.0332031250,304,753.9062500000,,, +19.0351562500,304,753.9062500000,,, +19.0371093750,304,753.9062500000,,, +19.0390625000,304,753.9062500000,,, +19.0410156250,304,753.9062500000,,, +19.0429687500,304,753.9062500000,,, +19.0449218750,304,753.9062500000,,, +19.0468750000,304,753.9062500000,,, +19.0488281250,304,753.9062500000,,, +19.0507812500,304,753.9062500000,,, +19.0527343750,304,753.9062500000,,, +19.0546875000,304,753.9062500000,,, +19.0566406250,304,753.9062500000,,, +19.0585937500,304,753.9062500000,,, +19.0605468750,304,753.9062500000,,, +19.0625000000,305,753.9062500000,,, +19.0644531250,305,753.9062500000,,, +19.0664062500,305,753.9062500000,,, +19.0683593750,305,753.9062500000,,, +19.0703125000,305,753.9062500000,,, +19.0722656250,305,753.9062500000,,, +19.0742187500,305,753.9062500000,,, +19.0761718750,305,753.9062500000,,, +19.0781250000,305,753.9062500000,,, +19.0800781250,305,753.9062500000,,, +19.0820312500,305,753.9062500000,,, +19.0839843750,305,753.9062500000,,, +19.0859375000,305,753.9062500000,,, +19.0878906250,305,753.9062500000,,, +19.0898437500,305,753.9062500000,,, +19.0917968750,305,753.9062500000,,, +19.0937500000,305,753.9062500000,,, +19.0957031250,305,753.9062500000,,, +19.0976562500,305,753.9062500000,,, +19.0996093750,305,753.9062500000,,, +19.1015625000,305,753.9062500000,,, +19.1035156250,305,753.9062500000,,, +19.1054687500,305,753.9062500000,,, +19.1074218750,305,753.9062500000,,, +19.1093750000,305,753.9062500000,,, +19.1113281250,305,753.9062500000,,, +19.1132812500,305,753.9062500000,,, +19.1152343750,305,753.9062500000,,, +19.1171875000,305,753.9062500000,,, +19.1191406250,305,753.9062500000,,, +19.1210937500,305,753.9062500000,,, +19.1230468750,305,753.9062500000,,, +19.1250000000,306,753.9062500000,,, +19.1269531250,306,753.9062500000,,, +19.1289062500,306,753.9062500000,,, +19.1308593750,306,753.9062500000,,, +19.1328125000,306,753.9062500000,,, +19.1347656250,306,753.9062500000,,, +19.1367187500,306,753.9062500000,,, +19.1386718750,306,753.9062500000,,, +19.1406250000,306,753.9062500000,,, +19.1425781250,306,753.9062500000,,, +19.1445312500,306,753.9062500000,,, +19.1464843750,306,753.9062500000,,, +19.1484375000,306,753.9062500000,,, +19.1503906250,306,753.9062500000,,, +19.1523437500,306,753.9062500000,,, +19.1542968750,306,753.9062500000,,, +19.1562500000,306,753.9062500000,,, +19.1582031250,306,753.9062500000,,, +19.1601562500,306,753.9062500000,,, +19.1621093750,306,753.9062500000,,, +19.1640625000,306,753.9062500000,,, +19.1660156250,306,753.9062500000,,, +19.1679687500,306,753.9062500000,,, +19.1699218750,306,753.9062500000,,, +19.1718750000,306,753.9062500000,,, +19.1738281250,306,753.9062500000,,, +19.1757812500,306,753.9062500000,,, +19.1777343750,306,753.9062500000,,, +19.1796875000,306,753.9062500000,,, +19.1816406250,306,753.9062500000,,, +19.1835937500,306,753.9062500000,,, +19.1855468750,306,753.9062500000,,, +19.1875000000,307,753.9062500000,,, +19.1894531250,307,753.9062500000,,, +19.1914062500,307,753.9062500000,,, +19.1933593750,307,753.9062500000,,, +19.1953125000,307,753.9062500000,,, +19.1972656250,307,753.9062500000,,, +19.1992187500,307,753.9062500000,,, +19.2011718750,307,753.9062500000,,, +19.2031250000,307,753.9062500000,,, +19.2050781250,307,753.9062500000,,, +19.2070312500,307,753.9062500000,,, +19.2089843750,307,753.9062500000,,, +19.2109375000,307,753.9062500000,,, +19.2128906250,307,753.9062500000,,, +19.2148437500,307,753.9062500000,,, +19.2167968750,307,753.9062500000,,, +19.2187500000,307,753.9062500000,,, +19.2207031250,307,753.9062500000,,, +19.2226562500,307,753.9062500000,,, +19.2246093750,307,753.9062500000,,, +19.2265625000,307,753.9062500000,,, +19.2285156250,307,753.9062500000,,, +19.2304687500,307,753.9062500000,,, +19.2324218750,307,753.9062500000,,, +19.2343750000,307,753.9062500000,,, +19.2363281250,307,753.9062500000,,, +19.2382812500,307,753.9062500000,,, +19.2402343750,307,753.9062500000,,, +19.2421875000,307,753.9062500000,,, +19.2441406250,307,753.9062500000,,, +19.2460937500,307,753.9062500000,,, +19.2480468750,307,753.9062500000,,, +19.2500000000,308,753.9062500000,,, +19.2519531250,308,753.9062500000,,, +19.2539062500,308,753.9062500000,,, +19.2558593750,308,753.9062500000,,, +19.2578125000,308,753.9062500000,,, +19.2597656250,308,753.9062500000,,, +19.2617187500,308,753.9062500000,,, +19.2636718750,308,753.9062500000,,, +19.2656250000,308,753.9062500000,,, +19.2675781250,308,753.9062500000,,, +19.2695312500,308,753.9062500000,,, +19.2714843750,308,753.9062500000,,, +19.2734375000,308,753.9062500000,,, +19.2753906250,308,753.9062500000,,, +19.2773437500,308,753.9062500000,,, +19.2792968750,308,753.9062500000,,, +19.2812500000,308,753.9062500000,,, +19.2832031250,308,753.9062500000,,, +19.2851562500,308,753.9062500000,,, +19.2871093750,308,753.9062500000,,, +19.2890625000,308,753.9062500000,,, +19.2910156250,308,753.9062500000,,, +19.2929687500,308,753.9062500000,,, +19.2949218750,308,753.9062500000,,, +19.2968750000,308,753.9062500000,,, +19.2988281250,308,753.9062500000,,, +19.3007812500,308,753.9062500000,,, +19.3027343750,308,753.9062500000,,, +19.3046875000,308,753.9062500000,,, +19.3066406250,308,753.9062500000,,, +19.3085937500,308,753.9062500000,,, +19.3105468750,308,753.9062500000,,, +19.3125000000,309,746.0937500000,,, +19.3144531250,309,746.0937500000,,, +19.3164062500,309,746.0937500000,,, +19.3183593750,309,746.0937500000,,, +19.3203125000,309,746.0937500000,,, +19.3222656250,309,746.0937500000,,, +19.3242187500,309,746.0937500000,,, +19.3261718750,309,746.0937500000,,, +19.3281250000,309,746.0937500000,,, +19.3300781250,309,746.0937500000,,, +19.3320312500,309,746.0937500000,,, +19.3339843750,309,746.0937500000,,, +19.3359375000,309,746.0937500000,,, +19.3378906250,309,746.0937500000,,, +19.3398437500,309,746.0937500000,,, +19.3417968750,309,746.0937500000,,, +19.3437500000,309,746.0937500000,,, +19.3457031250,309,746.0937500000,,, +19.3476562500,309,746.0937500000,,, +19.3496093750,309,746.0937500000,,, +19.3515625000,309,746.0937500000,,, +19.3535156250,309,746.0937500000,,, +19.3554687500,309,746.0937500000,,, +19.3574218750,309,746.0937500000,,, +19.3593750000,309,746.0937500000,,, +19.3613281250,309,746.0937500000,,, +19.3632812500,309,746.0937500000,,, +19.3652343750,309,746.0937500000,,, +19.3671875000,309,746.0937500000,,, +19.3691406250,309,746.0937500000,,, +19.3710937500,309,746.0937500000,,, +19.3730468750,309,746.0937500000,,, +19.3750000000,310,746.0937500000,,, +19.3769531250,310,746.0937500000,,, +19.3789062500,310,746.0937500000,,, +19.3808593750,310,746.0937500000,,, +19.3828125000,310,746.0937500000,,, +19.3847656250,310,746.0937500000,,, +19.3867187500,310,746.0937500000,,, +19.3886718750,310,746.0937500000,,, +19.3906250000,310,746.0937500000,,, +19.3925781250,310,746.0937500000,,, +19.3945312500,310,746.0937500000,,, +19.3964843750,310,746.0937500000,,, +19.3984375000,310,746.0937500000,,, +19.4003906250,310,746.0937500000,,, +19.4023437500,310,746.0937500000,,, +19.4042968750,310,746.0937500000,,, +19.4062500000,310,746.0937500000,,, +19.4082031250,310,746.0937500000,,, +19.4101562500,310,746.0937500000,,, +19.4121093750,310,746.0937500000,,, +19.4140625000,310,746.0937500000,,, +19.4160156250,310,746.0937500000,,, +19.4179687500,310,746.0937500000,,, +19.4199218750,310,746.0937500000,,, +19.4218750000,310,746.0937500000,,, +19.4238281250,310,746.0937500000,,, +19.4257812500,310,746.0937500000,,, +19.4277343750,310,746.0937500000,,, +19.4296875000,310,746.0937500000,,, +19.4316406250,310,746.0937500000,,, +19.4335937500,310,746.0937500000,,, +19.4355468750,310,746.0937500000,,, +19.4375000000,311,746.0937500000,,, +19.4394531250,311,746.0937500000,,, +19.4414062500,311,746.0937500000,,, +19.4433593750,311,746.0937500000,,, +19.4453125000,311,746.0937500000,,, +19.4472656250,311,746.0937500000,,, +19.4492187500,311,746.0937500000,,, +19.4511718750,311,746.0937500000,,, +19.4531250000,311,746.0937500000,,, +19.4550781250,311,746.0937500000,,, +19.4570312500,311,746.0937500000,,, +19.4589843750,311,746.0937500000,,, +19.4609375000,311,746.0937500000,,, +19.4628906250,311,746.0937500000,,, +19.4648437500,311,746.0937500000,,, +19.4667968750,311,746.0937500000,,, +19.4687500000,311,746.0937500000,,, +19.4707031250,311,746.0937500000,,, +19.4726562500,311,746.0937500000,,, +19.4746093750,311,746.0937500000,,, +19.4765625000,311,746.0937500000,,, +19.4785156250,311,746.0937500000,,, +19.4804687500,311,746.0937500000,,, +19.4824218750,311,746.0937500000,,, +19.4843750000,311,746.0937500000,,, +19.4863281250,311,746.0937500000,,, +19.4882812500,311,746.0937500000,,, +19.4902343750,311,746.0937500000,,, +19.4921875000,311,746.0937500000,,, +19.4941406250,311,746.0937500000,,, +19.4960937500,311,746.0937500000,,, +19.4980468750,311,746.0937500000,,, +19.5000000000,312,746.0937500000,,, +19.5019531250,312,746.0937500000,,, +19.5039062500,312,746.0937500000,,, +19.5058593750,312,746.0937500000,,, +19.5078125000,312,746.0937500000,,, +19.5097656250,312,746.0937500000,,, +19.5117187500,312,746.0937500000,,, +19.5136718750,312,746.0937500000,,, +19.5156250000,312,746.0937500000,,, +19.5175781250,312,746.0937500000,,, +19.5195312500,312,746.0937500000,,, +19.5214843750,312,746.0937500000,,, +19.5234375000,312,746.0937500000,,, +19.5253906250,312,746.0937500000,,, +19.5273437500,312,746.0937500000,,, +19.5292968750,312,746.0937500000,,, +19.5312500000,312,746.0937500000,,, +19.5332031250,312,746.0937500000,,, +19.5351562500,312,746.0937500000,,, +19.5371093750,312,746.0937500000,,, +19.5390625000,312,746.0937500000,,, +19.5410156250,312,746.0937500000,,, +19.5429687500,312,746.0937500000,,, +19.5449218750,312,746.0937500000,,, +19.5468750000,312,746.0937500000,,, +19.5488281250,312,746.0937500000,,, +19.5507812500,312,746.0937500000,,, +19.5527343750,312,746.0937500000,,, +19.5546875000,312,746.0937500000,,, +19.5566406250,312,746.0937500000,,, +19.5585937500,312,746.0937500000,,, +19.5605468750,312,746.0937500000,,, +19.5625000000,313,746.0937500000,,, +19.5644531250,313,746.0937500000,,, +19.5664062500,313,746.0937500000,,, +19.5683593750,313,746.0937500000,,, +19.5703125000,313,746.0937500000,,, +19.5722656250,313,746.0937500000,,, +19.5742187500,313,746.0937500000,,, +19.5761718750,313,746.0937500000,,, +19.5781250000,313,746.0937500000,,, +19.5800781250,313,746.0937500000,,, +19.5820312500,313,746.0937500000,,, +19.5839843750,313,746.0937500000,,, +19.5859375000,313,746.0937500000,,, +19.5878906250,313,746.0937500000,,, +19.5898437500,313,746.0937500000,,, +19.5917968750,313,746.0937500000,,, +19.5937500000,313,746.0937500000,,, +19.5957031250,313,746.0937500000,,, +19.5976562500,313,746.0937500000,,, +19.5996093750,313,746.0937500000,,, +19.6015625000,313,746.0937500000,,, +19.6035156250,313,746.0937500000,,, +19.6054687500,313,746.0937500000,,, +19.6074218750,313,746.0937500000,,, +19.6093750000,313,746.0937500000,,, +19.6113281250,313,746.0937500000,,, +19.6132812500,313,746.0937500000,,, +19.6152343750,313,746.0937500000,,, +19.6171875000,313,746.0937500000,,, +19.6191406250,313,746.0937500000,,, +19.6210937500,313,746.0937500000,,, +19.6230468750,313,746.0937500000,,, +19.6250000000,314,746.0937500000,,, +19.6269531250,314,746.0937500000,,, +19.6289062500,314,746.0937500000,,, +19.6308593750,314,746.0937500000,,, +19.6328125000,314,746.0937500000,,, +19.6347656250,314,746.0937500000,,, +19.6367187500,314,746.0937500000,,, +19.6386718750,314,746.0937500000,,, +19.6406250000,314,746.0937500000,,, +19.6425781250,314,746.0937500000,,, +19.6445312500,314,746.0937500000,,, +19.6464843750,314,746.0937500000,,, +19.6484375000,314,746.0937500000,,, +19.6503906250,314,746.0937500000,,, +19.6523437500,314,746.0937500000,,, +19.6542968750,314,746.0937500000,,, +19.6562500000,314,746.0937500000,,, +19.6582031250,314,746.0937500000,,, +19.6601562500,314,746.0937500000,,, +19.6621093750,314,746.0937500000,,, +19.6640625000,314,746.0937500000,,, +19.6660156250,314,746.0937500000,,, +19.6679687500,314,746.0937500000,,, +19.6699218750,314,746.0937500000,,, +19.6718750000,314,746.0937500000,,, +19.6738281250,314,746.0937500000,,, +19.6757812500,314,746.0937500000,,, +19.6777343750,314,746.0937500000,,, +19.6796875000,314,746.0937500000,,, +19.6816406250,314,746.0937500000,,, +19.6835937500,314,746.0937500000,,, +19.6855468750,314,746.0937500000,,, +19.6875000000,315,746.0937500000,,, +19.6894531250,315,746.0937500000,,, +19.6914062500,315,746.0937500000,,, +19.6933593750,315,746.0937500000,,, +19.6953125000,315,746.0937500000,,, +19.6972656250,315,746.0937500000,,, +19.6992187500,315,746.0937500000,,, +19.7011718750,315,746.0937500000,,, +19.7031250000,315,746.0937500000,,, +19.7050781250,315,746.0937500000,,, +19.7070312500,315,746.0937500000,,, +19.7089843750,315,746.0937500000,,, +19.7109375000,315,746.0937500000,,, +19.7128906250,315,746.0937500000,,, +19.7148437500,315,746.0937500000,,, +19.7167968750,315,746.0937500000,,, +19.7187500000,315,746.0937500000,,, +19.7207031250,315,746.0937500000,,, +19.7226562500,315,746.0937500000,,, +19.7246093750,315,746.0937500000,,, +19.7265625000,315,746.0937500000,,, +19.7285156250,315,746.0937500000,,, +19.7304687500,315,746.0937500000,,, +19.7324218750,315,746.0937500000,,, +19.7343750000,315,746.0937500000,,, +19.7363281250,315,746.0937500000,,, +19.7382812500,315,746.0937500000,,, +19.7402343750,315,746.0937500000,,, +19.7421875000,315,746.0937500000,,, +19.7441406250,315,746.0937500000,,, +19.7460937500,315,746.0937500000,,, +19.7480468750,315,746.0937500000,,, +19.7500000000,316,746.0937500000,,, +19.7519531250,316,746.0937500000,,, +19.7539062500,316,746.0937500000,,, +19.7558593750,316,746.0937500000,,, +19.7578125000,316,746.0937500000,,, +19.7597656250,316,746.0937500000,,, +19.7617187500,316,746.0937500000,,, +19.7636718750,316,746.0937500000,,, +19.7656250000,316,746.0937500000,,, +19.7675781250,316,746.0937500000,,, +19.7695312500,316,746.0937500000,,, +19.7714843750,316,746.0937500000,,, +19.7734375000,316,746.0937500000,,, +19.7753906250,316,746.0937500000,,, +19.7773437500,316,746.0937500000,,, +19.7792968750,316,746.0937500000,,, +19.7812500000,316,746.0937500000,,, +19.7832031250,316,746.0937500000,,, +19.7851562500,316,746.0937500000,,, +19.7871093750,316,746.0937500000,,, +19.7890625000,316,746.0937500000,,, +19.7910156250,316,746.0937500000,,, +19.7929687500,316,746.0937500000,,, +19.7949218750,316,746.0937500000,,, +19.7968750000,316,746.0937500000,,, +19.7988281250,316,746.0937500000,,, +19.8007812500,316,746.0937500000,,, +19.8027343750,316,746.0937500000,,, +19.8046875000,316,746.0937500000,,, +19.8066406250,316,746.0937500000,,, +19.8085937500,316,746.0937500000,,, +19.8105468750,316,746.0937500000,,, +19.8125000000,317,746.0937500000,,, +19.8144531250,317,746.0937500000,,, +19.8164062500,317,746.0937500000,,, +19.8183593750,317,746.0937500000,,, +19.8203125000,317,746.0937500000,,, +19.8222656250,317,746.0937500000,,, +19.8242187500,317,746.0937500000,,, +19.8261718750,317,746.0937500000,,, +19.8281250000,317,746.0937500000,,, +19.8300781250,317,746.0937500000,,, +19.8320312500,317,746.0937500000,,, +19.8339843750,317,746.0937500000,,, +19.8359375000,317,746.0937500000,,, +19.8378906250,317,746.0937500000,,, +19.8398437500,317,746.0937500000,,, +19.8417968750,317,746.0937500000,,, +19.8437500000,317,746.0937500000,,, +19.8457031250,317,746.0937500000,,, +19.8476562500,317,746.0937500000,,, +19.8496093750,317,746.0937500000,,, +19.8515625000,317,746.0937500000,,, +19.8535156250,317,746.0937500000,,, +19.8554687500,317,746.0937500000,,, +19.8574218750,317,746.0937500000,,, +19.8593750000,317,746.0937500000,,, +19.8613281250,317,746.0937500000,,, +19.8632812500,317,746.0937500000,,, +19.8652343750,317,746.0937500000,,, +19.8671875000,317,746.0937500000,,, +19.8691406250,317,746.0937500000,,, +19.8710937500,317,746.0937500000,,, +19.8730468750,317,746.0937500000,,, +19.8750000000,318,746.0937500000,,, +19.8769531250,318,746.0937500000,,, +19.8789062500,318,746.0937500000,,, +19.8808593750,318,746.0937500000,,, +19.8828125000,318,746.0937500000,,, +19.8847656250,318,746.0937500000,,, +19.8867187500,318,746.0937500000,,, +19.8886718750,318,746.0937500000,,, +19.8906250000,318,746.0937500000,,, +19.8925781250,318,746.0937500000,,, +19.8945312500,318,746.0937500000,,, +19.8964843750,318,746.0937500000,,, +19.8984375000,318,746.0937500000,,, +19.9003906250,318,746.0937500000,,, +19.9023437500,318,746.0937500000,,, +19.9042968750,318,746.0937500000,,, +19.9062500000,318,746.0937500000,,, +19.9082031250,318,746.0937500000,,, +19.9101562500,318,746.0937500000,,, +19.9121093750,318,746.0937500000,,, +19.9140625000,318,746.0937500000,,, +19.9160156250,318,746.0937500000,,, +19.9179687500,318,746.0937500000,,, +19.9199218750,318,746.0937500000,,, +19.9218750000,318,746.0937500000,,, +19.9238281250,318,746.0937500000,,, +19.9257812500,318,746.0937500000,,, +19.9277343750,318,746.0937500000,,, +19.9296875000,318,746.0937500000,,, +19.9316406250,318,746.0937500000,,, +19.9335937500,318,746.0937500000,,, +19.9355468750,318,746.0937500000,,, +19.9375000000,319,746.0937500000,,, +19.9394531250,319,746.0937500000,,, +19.9414062500,319,746.0937500000,,, +19.9433593750,319,746.0937500000,,, +19.9453125000,319,746.0937500000,,, +19.9472656250,319,746.0937500000,,, +19.9492187500,319,746.0937500000,,, +19.9511718750,319,746.0937500000,,, +19.9531250000,319,746.0937500000,,, +19.9550781250,319,746.0937500000,,, +19.9570312500,319,746.0937500000,,, +19.9589843750,319,746.0937500000,,, +19.9609375000,319,746.0937500000,,, +19.9628906250,319,746.0937500000,,, +19.9648437500,319,746.0937500000,,, +19.9667968750,319,746.0937500000,,, +19.9687500000,319,746.0937500000,,, +19.9707031250,319,746.0937500000,,, +19.9726562500,319,746.0937500000,,, +19.9746093750,319,746.0937500000,,, +19.9765625000,319,746.0937500000,,, +19.9785156250,319,746.0937500000,,, +19.9804687500,319,746.0937500000,,, +19.9824218750,319,746.0937500000,,, +19.9843750000,319,746.0937500000,,, +19.9863281250,319,746.0937500000,,, +19.9882812500,319,746.0937500000,,, +19.9902343750,319,746.0937500000,,, +19.9921875000,319,746.0937500000,,, +19.9941406250,319,746.0937500000,,, +19.9960937500,319,746.0937500000,,, +19.9980468750,319,746.0937500000,,, +20.0000000000,320,746.0937500000,,, +20.0019531250,320,746.0937500000,,, +20.0039062500,320,746.0937500000,,, +20.0058593750,320,746.0937500000,,, +20.0078125000,320,746.0937500000,,, +20.0097656250,320,746.0937500000,,, +20.0117187500,320,746.0937500000,,, +20.0136718750,320,746.0937500000,,, +20.0156250000,320,746.0937500000,,, +20.0175781250,320,746.0937500000,,, +20.0195312500,320,746.0937500000,,, +20.0214843750,320,746.0937500000,,, +20.0234375000,320,746.0937500000,,, +20.0253906250,320,746.0937500000,,, +20.0273437500,320,746.0937500000,,, +20.0292968750,320,746.0937500000,,, +20.0312500000,320,746.0937500000,,, +20.0332031250,320,746.0937500000,,, +20.0351562500,320,746.0937500000,,, +20.0371093750,320,746.0937500000,,, +20.0390625000,320,746.0937500000,,, +20.0410156250,320,746.0937500000,,, +20.0429687500,320,746.0937500000,,, +20.0449218750,320,746.0937500000,,, +20.0468750000,320,746.0937500000,,, +20.0488281250,320,746.0937500000,,, +20.0507812500,320,746.0937500000,,, +20.0527343750,320,746.0937500000,,, +20.0546875000,320,746.0937500000,,, +20.0566406250,320,746.0937500000,,, +20.0585937500,320,746.0937500000,,, +20.0605468750,320,746.0937500000,,, +20.0625000000,321,746.0937500000,,, +20.0644531250,321,746.0937500000,,, +20.0664062500,321,746.0937500000,,, +20.0683593750,321,746.0937500000,,, +20.0703125000,321,746.0937500000,,, +20.0722656250,321,746.0937500000,,, +20.0742187500,321,746.0937500000,,, +20.0761718750,321,746.0937500000,,, +20.0781250000,321,746.0937500000,,, +20.0800781250,321,746.0937500000,,, +20.0820312500,321,746.0937500000,,, +20.0839843750,321,746.0937500000,,, +20.0859375000,321,746.0937500000,,, +20.0878906250,321,746.0937500000,,, +20.0898437500,321,746.0937500000,,, +20.0917968750,321,746.0937500000,,, +20.0937500000,321,746.0937500000,,, +20.0957031250,321,746.0937500000,,, +20.0976562500,321,746.0937500000,,, +20.0996093750,321,746.0937500000,,, +20.1015625000,321,746.0937500000,,, +20.1035156250,321,746.0937500000,,, +20.1054687500,321,746.0937500000,,, +20.1074218750,321,746.0937500000,,, +20.1093750000,321,746.0937500000,,, +20.1113281250,321,746.0937500000,,, +20.1132812500,321,746.0937500000,,, +20.1152343750,321,746.0937500000,,, +20.1171875000,321,746.0937500000,,, +20.1191406250,321,746.0937500000,,, +20.1210937500,321,746.0937500000,,, +20.1230468750,321,746.0937500000,,, +20.1250000000,322,746.0937500000,,, +20.1269531250,322,746.0937500000,,, +20.1289062500,322,746.0937500000,,, +20.1308593750,322,746.0937500000,,, +20.1328125000,322,746.0937500000,,, +20.1347656250,322,746.0937500000,,, +20.1367187500,322,746.0937500000,,, +20.1386718750,322,746.0937500000,,, +20.1406250000,322,746.0937500000,,, +20.1425781250,322,746.0937500000,,, +20.1445312500,322,746.0937500000,,, +20.1464843750,322,746.0937500000,,, +20.1484375000,322,746.0937500000,,, +20.1503906250,322,746.0937500000,,, +20.1523437500,322,746.0937500000,,, +20.1542968750,322,746.0937500000,,, +20.1562500000,322,746.0937500000,,, +20.1582031250,322,746.0937500000,,, +20.1601562500,322,746.0937500000,,, +20.1621093750,322,746.0937500000,,, +20.1640625000,322,746.0937500000,,, +20.1660156250,322,746.0937500000,,, +20.1679687500,322,746.0937500000,,, +20.1699218750,322,746.0937500000,,, +20.1718750000,322,746.0937500000,,, +20.1738281250,322,746.0937500000,,, +20.1757812500,322,746.0937500000,,, +20.1777343750,322,746.0937500000,,, +20.1796875000,322,746.0937500000,,, +20.1816406250,322,746.0937500000,,, +20.1835937500,322,746.0937500000,,, +20.1855468750,322,746.0937500000,,, +20.1875000000,323,746.0937500000,,, +20.1894531250,323,746.0937500000,,, +20.1914062500,323,746.0937500000,,, +20.1933593750,323,746.0937500000,,, +20.1953125000,323,746.0937500000,,, +20.1972656250,323,746.0937500000,,, +20.1992187500,323,746.0937500000,,, +20.2011718750,323,746.0937500000,,, +20.2031250000,323,746.0937500000,,, +20.2050781250,323,746.0937500000,,, +20.2070312500,323,746.0937500000,,, +20.2089843750,323,746.0937500000,,, +20.2109375000,323,746.0937500000,,, +20.2128906250,323,746.0937500000,,, +20.2148437500,323,746.0937500000,,, +20.2167968750,323,746.0937500000,,, +20.2187500000,323,746.0937500000,,, +20.2207031250,323,746.0937500000,,, +20.2226562500,323,746.0937500000,,, +20.2246093750,323,746.0937500000,,, +20.2265625000,323,746.0937500000,,, +20.2285156250,323,746.0937500000,,, +20.2304687500,323,746.0937500000,,, +20.2324218750,323,746.0937500000,,, +20.2343750000,323,746.0937500000,,, +20.2363281250,323,746.0937500000,,, +20.2382812500,323,746.0937500000,,, +20.2402343750,323,746.0937500000,,, +20.2421875000,323,746.0937500000,,, +20.2441406250,323,746.0937500000,,, +20.2460937500,323,746.0937500000,,, +20.2480468750,323,746.0937500000,,, +20.2500000000,324,746.0937500000,,, +20.2519531250,324,746.0937500000,,, +20.2539062500,324,746.0937500000,,, +20.2558593750,324,746.0937500000,,, +20.2578125000,324,746.0937500000,,, +20.2597656250,324,746.0937500000,,, +20.2617187500,324,746.0937500000,,, +20.2636718750,324,746.0937500000,,, +20.2656250000,324,746.0937500000,,, +20.2675781250,324,746.0937500000,,, +20.2695312500,324,746.0937500000,,, +20.2714843750,324,746.0937500000,,, +20.2734375000,324,746.0937500000,,, +20.2753906250,324,746.0937500000,,, +20.2773437500,324,746.0937500000,,, +20.2792968750,324,746.0937500000,,, +20.2812500000,324,746.0937500000,,, +20.2832031250,324,746.0937500000,,, +20.2851562500,324,746.0937500000,,, +20.2871093750,324,746.0937500000,,, +20.2890625000,324,746.0937500000,,, +20.2910156250,324,746.0937500000,,, +20.2929687500,324,746.0937500000,,, +20.2949218750,324,746.0937500000,,, +20.2968750000,324,746.0937500000,,, +20.2988281250,324,746.0937500000,,, +20.3007812500,324,746.0937500000,,, +20.3027343750,324,746.0937500000,,, +20.3046875000,324,746.0937500000,,, +20.3066406250,324,746.0937500000,,, +20.3085937500,324,746.0937500000,,, +20.3105468750,324,746.0937500000,,, +20.3125000000,325,730.4687500000,,, +20.3144531250,325,730.4687500000,,, +20.3164062500,325,730.4687500000,,, +20.3183593750,325,730.4687500000,,, +20.3203125000,325,730.4687500000,,, +20.3222656250,325,730.4687500000,,, +20.3242187500,325,730.4687500000,,, +20.3261718750,325,730.4687500000,,, +20.3281250000,325,730.4687500000,,, +20.3300781250,325,730.4687500000,,, +20.3320312500,325,730.4687500000,,, +20.3339843750,325,730.4687500000,,, +20.3359375000,325,730.4687500000,,, +20.3378906250,325,730.4687500000,,, +20.3398437500,325,730.4687500000,,, +20.3417968750,325,730.4687500000,,, +20.3437500000,325,730.4687500000,,, +20.3457031250,325,730.4687500000,,, +20.3476562500,325,730.4687500000,,, +20.3496093750,325,730.4687500000,,, +20.3515625000,325,730.4687500000,,, +20.3535156250,325,730.4687500000,,, +20.3554687500,325,730.4687500000,,, +20.3574218750,325,730.4687500000,,, +20.3593750000,325,730.4687500000,,, +20.3613281250,325,730.4687500000,,, +20.3632812500,325,730.4687500000,,, +20.3652343750,325,730.4687500000,,, +20.3671875000,325,730.4687500000,,, +20.3691406250,325,730.4687500000,,, +20.3710937500,325,730.4687500000,,, +20.3730468750,325,730.4687500000,,, +20.3750000000,326,730.4687500000,,, +20.3769531250,326,730.4687500000,,, +20.3789062500,326,730.4687500000,,, +20.3808593750,326,730.4687500000,,, +20.3828125000,326,730.4687500000,,, +20.3847656250,326,730.4687500000,,, +20.3867187500,326,730.4687500000,,, +20.3886718750,326,730.4687500000,,, +20.3906250000,326,730.4687500000,,, +20.3925781250,326,730.4687500000,,, +20.3945312500,326,730.4687500000,,, +20.3964843750,326,730.4687500000,,, +20.3984375000,326,730.4687500000,,, +20.4003906250,326,730.4687500000,,, +20.4023437500,326,730.4687500000,,, +20.4042968750,326,730.4687500000,,, +20.4062500000,326,730.4687500000,,, +20.4082031250,326,730.4687500000,,, +20.4101562500,326,730.4687500000,,, +20.4121093750,326,730.4687500000,,, +20.4140625000,326,730.4687500000,,, +20.4160156250,326,730.4687500000,,, +20.4179687500,326,730.4687500000,,, +20.4199218750,326,730.4687500000,,, +20.4218750000,326,730.4687500000,,, +20.4238281250,326,730.4687500000,,, +20.4257812500,326,730.4687500000,,, +20.4277343750,326,730.4687500000,,, +20.4296875000,326,730.4687500000,,, +20.4316406250,326,730.4687500000,,, +20.4335937500,326,730.4687500000,,, +20.4355468750,326,730.4687500000,,, +20.4375000000,327,730.4687500000,,, +20.4394531250,327,730.4687500000,,, +20.4414062500,327,730.4687500000,,, +20.4433593750,327,730.4687500000,,, +20.4453125000,327,730.4687500000,,, +20.4472656250,327,730.4687500000,,, +20.4492187500,327,730.4687500000,,, +20.4511718750,327,730.4687500000,,, +20.4531250000,327,730.4687500000,,, +20.4550781250,327,730.4687500000,,, +20.4570312500,327,730.4687500000,,, +20.4589843750,327,730.4687500000,,, +20.4609375000,327,730.4687500000,,, +20.4628906250,327,730.4687500000,,, +20.4648437500,327,730.4687500000,,, +20.4667968750,327,730.4687500000,,, +20.4687500000,327,730.4687500000,,, +20.4707031250,327,730.4687500000,,, +20.4726562500,327,730.4687500000,,, +20.4746093750,327,730.4687500000,,, +20.4765625000,327,730.4687500000,,, +20.4785156250,327,730.4687500000,,, +20.4804687500,327,730.4687500000,,, +20.4824218750,327,730.4687500000,,, +20.4843750000,327,730.4687500000,,, +20.4863281250,327,730.4687500000,,, +20.4882812500,327,730.4687500000,,, +20.4902343750,327,730.4687500000,,, +20.4921875000,327,730.4687500000,,, +20.4941406250,327,730.4687500000,,, +20.4960937500,327,730.4687500000,,, +20.4980468750,327,730.4687500000,,, +20.5000000000,328,730.4687500000,,, +20.5019531250,328,730.4687500000,,, +20.5039062500,328,730.4687500000,,, +20.5058593750,328,730.4687500000,,, +20.5078125000,328,730.4687500000,,, +20.5097656250,328,730.4687500000,,, +20.5117187500,328,730.4687500000,,, +20.5136718750,328,730.4687500000,,, +20.5156250000,328,730.4687500000,,, +20.5175781250,328,730.4687500000,,, +20.5195312500,328,730.4687500000,,, +20.5214843750,328,730.4687500000,,, +20.5234375000,328,730.4687500000,,, +20.5253906250,328,730.4687500000,,, +20.5273437500,328,730.4687500000,,, +20.5292968750,328,730.4687500000,,, +20.5312500000,328,730.4687500000,,, +20.5332031250,328,730.4687500000,,, +20.5351562500,328,730.4687500000,,, +20.5371093750,328,730.4687500000,,, +20.5390625000,328,730.4687500000,,, +20.5410156250,328,730.4687500000,,, +20.5429687500,328,730.4687500000,,, +20.5449218750,328,730.4687500000,,, +20.5468750000,328,730.4687500000,,, +20.5488281250,328,730.4687500000,,, +20.5507812500,328,730.4687500000,,, +20.5527343750,328,730.4687500000,,, +20.5546875000,328,730.4687500000,,, +20.5566406250,328,730.4687500000,,, +20.5585937500,328,730.4687500000,,, +20.5605468750,328,730.4687500000,,, +20.5625000000,329,730.4687500000,,, +20.5644531250,329,730.4687500000,,, +20.5664062500,329,730.4687500000,,, +20.5683593750,329,730.4687500000,,, +20.5703125000,329,730.4687500000,,, +20.5722656250,329,730.4687500000,,, +20.5742187500,329,730.4687500000,,, +20.5761718750,329,730.4687500000,,, +20.5781250000,329,730.4687500000,,, +20.5800781250,329,730.4687500000,,, +20.5820312500,329,730.4687500000,,, +20.5839843750,329,730.4687500000,,, +20.5859375000,329,730.4687500000,,, +20.5878906250,329,730.4687500000,,, +20.5898437500,329,730.4687500000,,, +20.5917968750,329,730.4687500000,,, +20.5937500000,329,730.4687500000,,, +20.5957031250,329,730.4687500000,,, +20.5976562500,329,730.4687500000,,, +20.5996093750,329,730.4687500000,,, +20.6015625000,329,730.4687500000,,, +20.6035156250,329,730.4687500000,,, +20.6054687500,329,730.4687500000,,, +20.6074218750,329,730.4687500000,,, +20.6093750000,329,730.4687500000,,, +20.6113281250,329,730.4687500000,,, +20.6132812500,329,730.4687500000,,, +20.6152343750,329,730.4687500000,,, +20.6171875000,329,730.4687500000,,, +20.6191406250,329,730.4687500000,,, +20.6210937500,329,730.4687500000,,, +20.6230468750,329,730.4687500000,,, +20.6250000000,330,730.4687500000,,, +20.6269531250,330,730.4687500000,,, +20.6289062500,330,730.4687500000,,, +20.6308593750,330,730.4687500000,,, +20.6328125000,330,730.4687500000,,, +20.6347656250,330,730.4687500000,,, +20.6367187500,330,730.4687500000,,, +20.6386718750,330,730.4687500000,,, +20.6406250000,330,730.4687500000,,, +20.6425781250,330,730.4687500000,,, +20.6445312500,330,730.4687500000,,, +20.6464843750,330,730.4687500000,,, +20.6484375000,330,730.4687500000,,, +20.6503906250,330,730.4687500000,,, +20.6523437500,330,730.4687500000,,, +20.6542968750,330,730.4687500000,,, +20.6562500000,330,730.4687500000,,, +20.6582031250,330,730.4687500000,,, +20.6601562500,330,730.4687500000,,, +20.6621093750,330,730.4687500000,,, +20.6640625000,330,730.4687500000,,, +20.6660156250,330,730.4687500000,,, +20.6679687500,330,730.4687500000,,, +20.6699218750,330,730.4687500000,,, +20.6718750000,330,730.4687500000,,, +20.6738281250,330,730.4687500000,,, +20.6757812500,330,730.4687500000,,, +20.6777343750,330,730.4687500000,,, +20.6796875000,330,730.4687500000,,, +20.6816406250,330,730.4687500000,,, +20.6835937500,330,730.4687500000,,, +20.6855468750,330,730.4687500000,,, +20.6875000000,331,730.4687500000,,, +20.6894531250,331,730.4687500000,,, +20.6914062500,331,730.4687500000,,, +20.6933593750,331,730.4687500000,,, +20.6953125000,331,730.4687500000,,, +20.6972656250,331,730.4687500000,,, +20.6992187500,331,730.4687500000,,, +20.7011718750,331,730.4687500000,,, +20.7031250000,331,730.4687500000,,, +20.7050781250,331,730.4687500000,,, +20.7070312500,331,730.4687500000,,, +20.7089843750,331,730.4687500000,,, +20.7109375000,331,730.4687500000,,, +20.7128906250,331,730.4687500000,,, +20.7148437500,331,730.4687500000,,, +20.7167968750,331,730.4687500000,,, +20.7187500000,331,730.4687500000,,, +20.7207031250,331,730.4687500000,,, +20.7226562500,331,730.4687500000,,, +20.7246093750,331,730.4687500000,,, +20.7265625000,331,730.4687500000,,, +20.7285156250,331,730.4687500000,,, +20.7304687500,331,730.4687500000,,, +20.7324218750,331,730.4687500000,,, +20.7343750000,331,730.4687500000,,, +20.7363281250,331,730.4687500000,,, +20.7382812500,331,730.4687500000,,, +20.7402343750,331,730.4687500000,,, +20.7421875000,331,730.4687500000,,, +20.7441406250,331,730.4687500000,,, +20.7460937500,331,730.4687500000,,, +20.7480468750,331,730.4687500000,,, +20.7500000000,332,730.4687500000,,, +20.7519531250,332,730.4687500000,,, +20.7539062500,332,730.4687500000,,, +20.7558593750,332,730.4687500000,,, +20.7578125000,332,730.4687500000,,, +20.7597656250,332,730.4687500000,,, +20.7617187500,332,730.4687500000,,, +20.7636718750,332,730.4687500000,,, +20.7656250000,332,730.4687500000,,, +20.7675781250,332,730.4687500000,,, +20.7695312500,332,730.4687500000,,, +20.7714843750,332,730.4687500000,,, +20.7734375000,332,730.4687500000,,, +20.7753906250,332,730.4687500000,,, +20.7773437500,332,730.4687500000,,, +20.7792968750,332,730.4687500000,,, +20.7812500000,332,730.4687500000,,, +20.7832031250,332,730.4687500000,,, +20.7851562500,332,730.4687500000,,, +20.7871093750,332,730.4687500000,,, +20.7890625000,332,730.4687500000,,, +20.7910156250,332,730.4687500000,,, +20.7929687500,332,730.4687500000,,, +20.7949218750,332,730.4687500000,,, +20.7968750000,332,730.4687500000,,, +20.7988281250,332,730.4687500000,,, +20.8007812500,332,730.4687500000,,, +20.8027343750,332,730.4687500000,,, +20.8046875000,332,730.4687500000,,, +20.8066406250,332,730.4687500000,,, +20.8085937500,332,730.4687500000,,, +20.8105468750,332,730.4687500000,,, +20.8125000000,333,730.4687500000,,, +20.8144531250,333,730.4687500000,,, +20.8164062500,333,730.4687500000,,, +20.8183593750,333,730.4687500000,,, +20.8203125000,333,730.4687500000,,, +20.8222656250,333,730.4687500000,,, +20.8242187500,333,730.4687500000,,, +20.8261718750,333,730.4687500000,,, +20.8281250000,333,730.4687500000,,, +20.8300781250,333,730.4687500000,,, +20.8320312500,333,730.4687500000,,, +20.8339843750,333,730.4687500000,,, +20.8359375000,333,730.4687500000,,, +20.8378906250,333,730.4687500000,,, +20.8398437500,333,730.4687500000,,, +20.8417968750,333,730.4687500000,,, +20.8437500000,333,730.4687500000,,, +20.8457031250,333,730.4687500000,,, +20.8476562500,333,730.4687500000,,, +20.8496093750,333,730.4687500000,,, +20.8515625000,333,730.4687500000,,, +20.8535156250,333,730.4687500000,,, +20.8554687500,333,730.4687500000,,, +20.8574218750,333,730.4687500000,,, +20.8593750000,333,730.4687500000,,, +20.8613281250,333,730.4687500000,,, +20.8632812500,333,730.4687500000,,, +20.8652343750,333,730.4687500000,,, +20.8671875000,333,730.4687500000,,, +20.8691406250,333,730.4687500000,,, +20.8710937500,333,730.4687500000,,, +20.8730468750,333,730.4687500000,,, +20.8750000000,334,730.4687500000,,, +20.8769531250,334,730.4687500000,,, +20.8789062500,334,730.4687500000,,, +20.8808593750,334,730.4687500000,,, +20.8828125000,334,730.4687500000,,, +20.8847656250,334,730.4687500000,,, +20.8867187500,334,730.4687500000,,, +20.8886718750,334,730.4687500000,,, +20.8906250000,334,730.4687500000,,, +20.8925781250,334,730.4687500000,,, +20.8945312500,334,730.4687500000,,, +20.8964843750,334,730.4687500000,,, +20.8984375000,334,730.4687500000,,, +20.9003906250,334,730.4687500000,,, +20.9023437500,334,730.4687500000,,, +20.9042968750,334,730.4687500000,,, +20.9062500000,334,730.4687500000,,, +20.9082031250,334,730.4687500000,,, +20.9101562500,334,730.4687500000,,, +20.9121093750,334,730.4687500000,,, +20.9140625000,334,730.4687500000,,, +20.9160156250,334,730.4687500000,,, +20.9179687500,334,730.4687500000,,, +20.9199218750,334,730.4687500000,,, +20.9218750000,334,730.4687500000,,, +20.9238281250,334,730.4687500000,,, +20.9257812500,334,730.4687500000,,, +20.9277343750,334,730.4687500000,,, +20.9296875000,334,730.4687500000,,, +20.9316406250,334,730.4687500000,,, +20.9335937500,334,730.4687500000,,, +20.9355468750,334,730.4687500000,,, +20.9375000000,335,730.4687500000,,, +20.9394531250,335,730.4687500000,,, +20.9414062500,335,730.4687500000,,, +20.9433593750,335,730.4687500000,,, +20.9453125000,335,730.4687500000,,, +20.9472656250,335,730.4687500000,,, +20.9492187500,335,730.4687500000,,, +20.9511718750,335,730.4687500000,,, +20.9531250000,335,730.4687500000,,, +20.9550781250,335,730.4687500000,,, +20.9570312500,335,730.4687500000,,, +20.9589843750,335,730.4687500000,,, +20.9609375000,335,730.4687500000,,, +20.9628906250,335,730.4687500000,,, +20.9648437500,335,730.4687500000,,, +20.9667968750,335,730.4687500000,,, +20.9687500000,335,730.4687500000,,, +20.9707031250,335,730.4687500000,,, +20.9726562500,335,730.4687500000,,, +20.9746093750,335,730.4687500000,,, +20.9765625000,335,730.4687500000,,, +20.9785156250,335,730.4687500000,,, +20.9804687500,335,730.4687500000,,, +20.9824218750,335,730.4687500000,,, +20.9843750000,335,730.4687500000,,, +20.9863281250,335,730.4687500000,,, +20.9882812500,335,730.4687500000,,, +20.9902343750,335,730.4687500000,,, +20.9921875000,335,730.4687500000,,, +20.9941406250,335,730.4687500000,,, +20.9960937500,335,730.4687500000,,, +20.9980468750,335,730.4687500000,,, +21.0000000000,336,730.4687500000,,, +21.0019531250,336,730.4687500000,,, +21.0039062500,336,730.4687500000,,, +21.0058593750,336,730.4687500000,,, +21.0078125000,336,730.4687500000,,, +21.0097656250,336,730.4687500000,,, +21.0117187500,336,730.4687500000,,, +21.0136718750,336,730.4687500000,,, +21.0156250000,336,730.4687500000,,, +21.0175781250,336,730.4687500000,,, +21.0195312500,336,730.4687500000,,, +21.0214843750,336,730.4687500000,,, +21.0234375000,336,730.4687500000,,, +21.0253906250,336,730.4687500000,,, +21.0273437500,336,730.4687500000,,, +21.0292968750,336,730.4687500000,,, +21.0312500000,336,730.4687500000,,, +21.0332031250,336,730.4687500000,,, +21.0351562500,336,730.4687500000,,, +21.0371093750,336,730.4687500000,,, +21.0390625000,336,730.4687500000,,, +21.0410156250,336,730.4687500000,,, +21.0429687500,336,730.4687500000,,, +21.0449218750,336,730.4687500000,,, +21.0468750000,336,730.4687500000,,, +21.0488281250,336,730.4687500000,,, +21.0507812500,336,730.4687500000,,, +21.0527343750,336,730.4687500000,,, +21.0546875000,336,730.4687500000,,, +21.0566406250,336,730.4687500000,,, +21.0585937500,336,730.4687500000,,, +21.0605468750,336,730.4687500000,,, +21.0625000000,337,730.4687500000,,, +21.0644531250,337,730.4687500000,,, +21.0664062500,337,730.4687500000,,, +21.0683593750,337,730.4687500000,,, +21.0703125000,337,730.4687500000,,, +21.0722656250,337,730.4687500000,,, +21.0742187500,337,730.4687500000,,, +21.0761718750,337,730.4687500000,,, +21.0781250000,337,730.4687500000,,, +21.0800781250,337,730.4687500000,,, +21.0820312500,337,730.4687500000,,, +21.0839843750,337,730.4687500000,,, +21.0859375000,337,730.4687500000,,, +21.0878906250,337,730.4687500000,,, +21.0898437500,337,730.4687500000,,, +21.0917968750,337,730.4687500000,,, +21.0937500000,337,730.4687500000,,, +21.0957031250,337,730.4687500000,,, +21.0976562500,337,730.4687500000,,, +21.0996093750,337,730.4687500000,,, +21.1015625000,337,730.4687500000,,, +21.1035156250,337,730.4687500000,,, +21.1054687500,337,730.4687500000,,, +21.1074218750,337,730.4687500000,,, +21.1093750000,337,730.4687500000,,, +21.1113281250,337,730.4687500000,,, +21.1132812500,337,730.4687500000,,, +21.1152343750,337,730.4687500000,,, +21.1171875000,337,730.4687500000,,, +21.1191406250,337,730.4687500000,,, +21.1210937500,337,730.4687500000,,, +21.1230468750,337,730.4687500000,,, +21.1250000000,338,730.4687500000,,, +21.1269531250,338,730.4687500000,,, +21.1289062500,338,730.4687500000,,, +21.1308593750,338,730.4687500000,,, +21.1328125000,338,730.4687500000,,, +21.1347656250,338,730.4687500000,,, +21.1367187500,338,730.4687500000,,, +21.1386718750,338,730.4687500000,,, +21.1406250000,338,730.4687500000,,, +21.1425781250,338,730.4687500000,,, +21.1445312500,338,730.4687500000,,, +21.1464843750,338,730.4687500000,,, +21.1484375000,338,730.4687500000,,, +21.1503906250,338,730.4687500000,,, +21.1523437500,338,730.4687500000,,, +21.1542968750,338,730.4687500000,,, +21.1562500000,338,730.4687500000,,, +21.1582031250,338,730.4687500000,,, +21.1601562500,338,730.4687500000,,, +21.1621093750,338,730.4687500000,,, +21.1640625000,338,730.4687500000,,, +21.1660156250,338,730.4687500000,,, +21.1679687500,338,730.4687500000,,, +21.1699218750,338,730.4687500000,,, +21.1718750000,338,730.4687500000,,, +21.1738281250,338,730.4687500000,,, +21.1757812500,338,730.4687500000,,, +21.1777343750,338,730.4687500000,,, +21.1796875000,338,730.4687500000,,, +21.1816406250,338,730.4687500000,,, +21.1835937500,338,730.4687500000,,, +21.1855468750,338,730.4687500000,,, +21.1875000000,339,730.4687500000,,, +21.1894531250,339,730.4687500000,,, +21.1914062500,339,730.4687500000,,, +21.1933593750,339,730.4687500000,,, +21.1953125000,339,730.4687500000,,, +21.1972656250,339,730.4687500000,,, +21.1992187500,339,730.4687500000,,, +21.2011718750,339,730.4687500000,,, +21.2031250000,339,730.4687500000,,, +21.2050781250,339,730.4687500000,,, +21.2070312500,339,730.4687500000,,, +21.2089843750,339,730.4687500000,,, +21.2109375000,339,730.4687500000,,, +21.2128906250,339,730.4687500000,,, +21.2148437500,339,730.4687500000,,, +21.2167968750,339,730.4687500000,,, +21.2187500000,339,730.4687500000,,, +21.2207031250,339,730.4687500000,,, +21.2226562500,339,730.4687500000,,, +21.2246093750,339,730.4687500000,,, +21.2265625000,339,730.4687500000,,, +21.2285156250,339,730.4687500000,,, +21.2304687500,339,730.4687500000,,, +21.2324218750,339,730.4687500000,,, +21.2343750000,339,730.4687500000,,, +21.2363281250,339,730.4687500000,,, +21.2382812500,339,730.4687500000,,, +21.2402343750,339,730.4687500000,,, +21.2421875000,339,730.4687500000,,, +21.2441406250,339,730.4687500000,,, +21.2460937500,339,730.4687500000,,, +21.2480468750,339,730.4687500000,,, +21.2500000000,340,730.4687500000,,, +21.2519531250,340,730.4687500000,,, +21.2539062500,340,730.4687500000,,, +21.2558593750,340,730.4687500000,,, +21.2578125000,340,730.4687500000,,, +21.2597656250,340,730.4687500000,,, +21.2617187500,340,730.4687500000,,, +21.2636718750,340,730.4687500000,,, +21.2656250000,340,730.4687500000,,, +21.2675781250,340,730.4687500000,,, +21.2695312500,340,730.4687500000,,, +21.2714843750,340,730.4687500000,,, +21.2734375000,340,730.4687500000,,, +21.2753906250,340,730.4687500000,,, +21.2773437500,340,730.4687500000,,, +21.2792968750,340,730.4687500000,,, +21.2812500000,340,730.4687500000,,, +21.2832031250,340,730.4687500000,,, +21.2851562500,340,730.4687500000,,, +21.2871093750,340,730.4687500000,,, +21.2890625000,340,730.4687500000,,, +21.2910156250,340,730.4687500000,,, +21.2929687500,340,730.4687500000,,, +21.2949218750,340,730.4687500000,,, +21.2968750000,340,730.4687500000,,, +21.2988281250,340,730.4687500000,,, +21.3007812500,340,730.4687500000,,, +21.3027343750,340,730.4687500000,,, +21.3046875000,340,730.4687500000,,, +21.3066406250,340,730.4687500000,,, +21.3085937500,340,730.4687500000,,, +21.3105468750,340,730.4687500000,,, +21.3125000000,341,730.4687500000,,, +21.3144531250,341,730.4687500000,,, +21.3164062500,341,730.4687500000,,, +21.3183593750,341,730.4687500000,,, +21.3203125000,341,730.4687500000,,, +21.3222656250,341,730.4687500000,,, +21.3242187500,341,730.4687500000,,, +21.3261718750,341,730.4687500000,,, +21.3281250000,341,730.4687500000,,, +21.3300781250,341,730.4687500000,,, +21.3320312500,341,730.4687500000,,, +21.3339843750,341,730.4687500000,,, +21.3359375000,341,730.4687500000,,, +21.3378906250,341,730.4687500000,,, +21.3398437500,341,730.4687500000,,, +21.3417968750,341,730.4687500000,,, +21.3437500000,341,730.4687500000,,, +21.3457031250,341,730.4687500000,,, +21.3476562500,341,730.4687500000,,, +21.3496093750,341,730.4687500000,,, +21.3515625000,341,730.4687500000,,, +21.3535156250,341,730.4687500000,,, +21.3554687500,341,730.4687500000,,, +21.3574218750,341,730.4687500000,,, +21.3593750000,341,730.4687500000,,, +21.3613281250,341,730.4687500000,,, +21.3632812500,341,730.4687500000,,, +21.3652343750,341,730.4687500000,,, +21.3671875000,341,730.4687500000,,, +21.3691406250,341,730.4687500000,,, +21.3710937500,341,730.4687500000,,, +21.3730468750,341,730.4687500000,,, +21.3750000000,342,730.4687500000,,, +21.3769531250,342,730.4687500000,,, +21.3789062500,342,730.4687500000,,, +21.3808593750,342,730.4687500000,,, +21.3828125000,342,730.4687500000,,, +21.3847656250,342,730.4687500000,,, +21.3867187500,342,730.4687500000,,, +21.3886718750,342,730.4687500000,,, +21.3906250000,342,730.4687500000,,, +21.3925781250,342,730.4687500000,,, +21.3945312500,342,730.4687500000,,, +21.3964843750,342,730.4687500000,,, +21.3984375000,342,730.4687500000,,, +21.4003906250,342,730.4687500000,,, +21.4023437500,342,730.4687500000,,, +21.4042968750,342,730.4687500000,,, +21.4062500000,342,730.4687500000,,, +21.4082031250,342,730.4687500000,,, +21.4101562500,342,730.4687500000,,, +21.4121093750,342,730.4687500000,,, +21.4140625000,342,730.4687500000,,, +21.4160156250,342,730.4687500000,,, +21.4179687500,342,730.4687500000,,, +21.4199218750,342,730.4687500000,,, +21.4218750000,342,730.4687500000,,, +21.4238281250,342,730.4687500000,,, +21.4257812500,342,730.4687500000,,, +21.4277343750,342,730.4687500000,,, +21.4296875000,342,730.4687500000,,, +21.4316406250,342,730.4687500000,,, +21.4335937500,342,730.4687500000,,, +21.4355468750,342,730.4687500000,,, +21.4375000000,343,730.4687500000,,, +21.4394531250,343,730.4687500000,,, +21.4414062500,343,730.4687500000,,, +21.4433593750,343,730.4687500000,,, +21.4453125000,343,730.4687500000,,, +21.4472656250,343,730.4687500000,,, +21.4492187500,343,730.4687500000,,, +21.4511718750,343,730.4687500000,,, +21.4531250000,343,730.4687500000,,, +21.4550781250,343,730.4687500000,,, +21.4570312500,343,730.4687500000,,, +21.4589843750,343,730.4687500000,,, +21.4609375000,343,730.4687500000,,, +21.4628906250,343,730.4687500000,,, +21.4648437500,343,730.4687500000,,, +21.4667968750,343,730.4687500000,,, +21.4687500000,343,730.4687500000,,, +21.4707031250,343,730.4687500000,,, +21.4726562500,343,730.4687500000,,, +21.4746093750,343,730.4687500000,,, +21.4765625000,343,730.4687500000,,, +21.4785156250,343,730.4687500000,,, +21.4804687500,343,730.4687500000,,, +21.4824218750,343,730.4687500000,,, +21.4843750000,343,730.4687500000,,, +21.4863281250,343,730.4687500000,,, +21.4882812500,343,730.4687500000,,, +21.4902343750,343,730.4687500000,,, +21.4921875000,343,730.4687500000,,, +21.4941406250,343,730.4687500000,,, +21.4960937500,343,730.4687500000,,, +21.4980468750,343,730.4687500000,,, +21.5000000000,344,992.1875000000,,, +21.5019531250,344,992.1875000000,,, +21.5039062500,344,992.1875000000,,, +21.5058593750,344,992.1875000000,,, +21.5078125000,344,992.1875000000,,, +21.5097656250,344,992.1875000000,,, +21.5117187500,344,992.1875000000,,, +21.5136718750,344,992.1875000000,,, +21.5156250000,344,992.1875000000,,, +21.5175781250,344,992.1875000000,,, +21.5195312500,344,992.1875000000,,, +21.5214843750,344,992.1875000000,,, +21.5234375000,344,992.1875000000,,, +21.5253906250,344,992.1875000000,,, +21.5273437500,344,992.1875000000,,, +21.5292968750,344,992.1875000000,,, +21.5312500000,344,992.1875000000,,, +21.5332031250,344,992.1875000000,,, +21.5351562500,344,992.1875000000,,, +21.5371093750,344,992.1875000000,,, +21.5390625000,344,992.1875000000,,, +21.5410156250,344,992.1875000000,,, +21.5429687500,344,992.1875000000,,, +21.5449218750,344,992.1875000000,,, +21.5468750000,344,992.1875000000,,, +21.5488281250,344,992.1875000000,,, +21.5507812500,344,992.1875000000,,, +21.5527343750,344,992.1875000000,,, +21.5546875000,344,992.1875000000,,, +21.5566406250,344,992.1875000000,,, +21.5585937500,344,992.1875000000,,, +21.5605468750,344,992.1875000000,,, +21.5625000000,345,992.1875000000,,, +21.5644531250,345,992.1875000000,,, +21.5664062500,345,992.1875000000,,, +21.5683593750,345,992.1875000000,,, +21.5703125000,345,992.1875000000,,, +21.5722656250,345,992.1875000000,,, +21.5742187500,345,992.1875000000,,, +21.5761718750,345,992.1875000000,,, +21.5781250000,345,992.1875000000,,, +21.5800781250,345,992.1875000000,,, +21.5820312500,345,992.1875000000,,, +21.5839843750,345,992.1875000000,,, +21.5859375000,345,992.1875000000,,, +21.5878906250,345,992.1875000000,,, +21.5898437500,345,992.1875000000,,, +21.5917968750,345,992.1875000000,,, +21.5937500000,345,992.1875000000,,, +21.5957031250,345,992.1875000000,,, +21.5976562500,345,992.1875000000,,, +21.5996093750,345,992.1875000000,,, +21.6015625000,345,992.1875000000,,, +21.6035156250,345,992.1875000000,,, +21.6054687500,345,992.1875000000,,, +21.6074218750,345,992.1875000000,,, +21.6093750000,345,992.1875000000,,, +21.6113281250,345,992.1875000000,,, +21.6132812500,345,992.1875000000,,, +21.6152343750,345,992.1875000000,,, +21.6171875000,345,992.1875000000,,, +21.6191406250,345,992.1875000000,,, +21.6210937500,345,992.1875000000,,, +21.6230468750,345,992.1875000000,,, +21.6250000000,346,992.1875000000,,, +21.6269531250,346,992.1875000000,,, +21.6289062500,346,992.1875000000,,, +21.6308593750,346,992.1875000000,,, +21.6328125000,346,992.1875000000,,, +21.6347656250,346,992.1875000000,,, +21.6367187500,346,992.1875000000,,, +21.6386718750,346,992.1875000000,,, +21.6406250000,346,992.1875000000,,, +21.6425781250,346,992.1875000000,,, +21.6445312500,346,992.1875000000,,, +21.6464843750,346,992.1875000000,,, +21.6484375000,346,992.1875000000,,, +21.6503906250,346,992.1875000000,,, +21.6523437500,346,992.1875000000,,, +21.6542968750,346,992.1875000000,,, +21.6562500000,346,992.1875000000,,, +21.6582031250,346,992.1875000000,,, +21.6601562500,346,992.1875000000,,, +21.6621093750,346,992.1875000000,,, +21.6640625000,346,992.1875000000,,, +21.6660156250,346,992.1875000000,,, +21.6679687500,346,992.1875000000,,, +21.6699218750,346,992.1875000000,,, +21.6718750000,346,992.1875000000,,, +21.6738281250,346,992.1875000000,,, +21.6757812500,346,992.1875000000,,, +21.6777343750,346,992.1875000000,,, +21.6796875000,346,992.1875000000,,, +21.6816406250,346,992.1875000000,,, +21.6835937500,346,992.1875000000,,, +21.6855468750,346,992.1875000000,,, +21.6875000000,347,992.1875000000,,, +21.6894531250,347,992.1875000000,,, +21.6914062500,347,992.1875000000,,, +21.6933593750,347,992.1875000000,,, +21.6953125000,347,992.1875000000,,, +21.6972656250,347,992.1875000000,,, +21.6992187500,347,992.1875000000,,, +21.7011718750,347,992.1875000000,,, +21.7031250000,347,992.1875000000,,, +21.7050781250,347,992.1875000000,,, +21.7070312500,347,992.1875000000,,, +21.7089843750,347,992.1875000000,,, +21.7109375000,347,992.1875000000,,, +21.7128906250,347,992.1875000000,,, +21.7148437500,347,992.1875000000,,, +21.7167968750,347,992.1875000000,,, +21.7187500000,347,992.1875000000,,, +21.7207031250,347,992.1875000000,,, +21.7226562500,347,992.1875000000,,, +21.7246093750,347,992.1875000000,,, +21.7265625000,347,992.1875000000,,, +21.7285156250,347,992.1875000000,,, +21.7304687500,347,992.1875000000,,, +21.7324218750,347,992.1875000000,,, +21.7343750000,347,992.1875000000,,, +21.7363281250,347,992.1875000000,,, +21.7382812500,347,992.1875000000,,, +21.7402343750,347,992.1875000000,,, +21.7421875000,347,992.1875000000,,, +21.7441406250,347,992.1875000000,,, +21.7460937500,347,992.1875000000,,, +21.7480468750,347,992.1875000000,,, +21.7500000000,348,785.1562500000,,, +21.7519531250,348,785.1562500000,,, +21.7539062500,348,785.1562500000,,, +21.7558593750,348,785.1562500000,,, +21.7578125000,348,785.1562500000,,, +21.7597656250,348,785.1562500000,,, +21.7617187500,348,785.1562500000,,, +21.7636718750,348,785.1562500000,,, +21.7656250000,348,785.1562500000,,, +21.7675781250,348,785.1562500000,,, +21.7695312500,348,785.1562500000,,, +21.7714843750,348,785.1562500000,,, +21.7734375000,348,785.1562500000,,, +21.7753906250,348,785.1562500000,,, +21.7773437500,348,785.1562500000,,, +21.7792968750,348,785.1562500000,,, +21.7812500000,348,785.1562500000,,, +21.7832031250,348,785.1562500000,,, +21.7851562500,348,785.1562500000,,, +21.7871093750,348,785.1562500000,,, +21.7890625000,348,785.1562500000,,, +21.7910156250,348,785.1562500000,,, +21.7929687500,348,785.1562500000,,, +21.7949218750,348,785.1562500000,,, +21.7968750000,348,785.1562500000,,, +21.7988281250,348,785.1562500000,,, +21.8007812500,348,785.1562500000,,, +21.8027343750,348,785.1562500000,,, +21.8046875000,348,785.1562500000,,, +21.8066406250,348,785.1562500000,,, +21.8085937500,348,785.1562500000,,, +21.8105468750,348,785.1562500000,,, +21.8125000000,349,785.1562500000,,, +21.8144531250,349,785.1562500000,,, +21.8164062500,349,785.1562500000,,, +21.8183593750,349,785.1562500000,,, +21.8203125000,349,785.1562500000,,, +21.8222656250,349,785.1562500000,,, +21.8242187500,349,785.1562500000,,, +21.8261718750,349,785.1562500000,,, +21.8281250000,349,785.1562500000,,, +21.8300781250,349,785.1562500000,,, +21.8320312500,349,785.1562500000,,, +21.8339843750,349,785.1562500000,,, +21.8359375000,349,785.1562500000,,, +21.8378906250,349,785.1562500000,,, +21.8398437500,349,785.1562500000,,, +21.8417968750,349,785.1562500000,,, +21.8437500000,349,785.1562500000,,, +21.8457031250,349,785.1562500000,,, +21.8476562500,349,785.1562500000,,, +21.8496093750,349,785.1562500000,,, +21.8515625000,349,785.1562500000,,, +21.8535156250,349,785.1562500000,,, +21.8554687500,349,785.1562500000,,, +21.8574218750,349,785.1562500000,,, +21.8593750000,349,785.1562500000,,, +21.8613281250,349,785.1562500000,,, +21.8632812500,349,785.1562500000,,, +21.8652343750,349,785.1562500000,,, +21.8671875000,349,785.1562500000,,, +21.8691406250,349,785.1562500000,,, +21.8710937500,349,785.1562500000,,, +21.8730468750,349,785.1562500000,,, +21.8750000000,350,785.1562500000,,, +21.8769531250,350,785.1562500000,,, +21.8789062500,350,785.1562500000,,, +21.8808593750,350,785.1562500000,,, +21.8828125000,350,785.1562500000,,, +21.8847656250,350,785.1562500000,,, +21.8867187500,350,785.1562500000,,, +21.8886718750,350,785.1562500000,,, +21.8906250000,350,785.1562500000,,, +21.8925781250,350,785.1562500000,,, +21.8945312500,350,785.1562500000,,, +21.8964843750,350,785.1562500000,,, +21.8984375000,350,785.1562500000,,, +21.9003906250,350,785.1562500000,,, +21.9023437500,350,785.1562500000,,, +21.9042968750,350,785.1562500000,,, +21.9062500000,350,785.1562500000,,, +21.9082031250,350,785.1562500000,,, +21.9101562500,350,785.1562500000,,, +21.9121093750,350,785.1562500000,,, +21.9140625000,350,785.1562500000,,, +21.9160156250,350,785.1562500000,,, +21.9179687500,350,785.1562500000,,, +21.9199218750,350,785.1562500000,,, +21.9218750000,350,785.1562500000,,, +21.9238281250,350,785.1562500000,,, +21.9257812500,350,785.1562500000,,, +21.9277343750,350,785.1562500000,,, +21.9296875000,350,785.1562500000,,, +21.9316406250,350,785.1562500000,,, +21.9335937500,350,785.1562500000,,, +21.9355468750,350,785.1562500000,,, +21.9375000000,351,785.1562500000,,, +21.9394531250,351,785.1562500000,,, +21.9414062500,351,785.1562500000,,, +21.9433593750,351,785.1562500000,,, +21.9453125000,351,785.1562500000,,, +21.9472656250,351,785.1562500000,,, +21.9492187500,351,785.1562500000,,, +21.9511718750,351,785.1562500000,,, +21.9531250000,351,785.1562500000,,, +21.9550781250,351,785.1562500000,,, +21.9570312500,351,785.1562500000,,, +21.9589843750,351,785.1562500000,,, +21.9609375000,351,785.1562500000,,, +21.9628906250,351,785.1562500000,,, +21.9648437500,351,785.1562500000,,, +21.9667968750,351,785.1562500000,,, +21.9687500000,351,785.1562500000,,, +21.9707031250,351,785.1562500000,,, +21.9726562500,351,785.1562500000,,, +21.9746093750,351,785.1562500000,,, +21.9765625000,351,785.1562500000,,, +21.9785156250,351,785.1562500000,,, +21.9804687500,351,785.1562500000,,, +21.9824218750,351,785.1562500000,,, +21.9843750000,351,785.1562500000,,, +21.9863281250,351,785.1562500000,,, +21.9882812500,351,785.1562500000,,, +21.9902343750,351,785.1562500000,,, +21.9921875000,351,785.1562500000,,, +21.9941406250,351,785.1562500000,,, +21.9960937500,351,785.1562500000,,, +21.9980468750,351,785.1562500000,,, +22.0000000000,352,785.1562500000,,, +22.0019531250,352,785.1562500000,,, +22.0039062500,352,785.1562500000,,, +22.0058593750,352,785.1562500000,,, +22.0078125000,352,785.1562500000,,, +22.0097656250,352,785.1562500000,,, +22.0117187500,352,785.1562500000,,, +22.0136718750,352,785.1562500000,,, +22.0156250000,352,785.1562500000,,, +22.0175781250,352,785.1562500000,,, +22.0195312500,352,785.1562500000,,, +22.0214843750,352,785.1562500000,,, +22.0234375000,352,785.1562500000,,, +22.0253906250,352,785.1562500000,,, +22.0273437500,352,785.1562500000,,, +22.0292968750,352,785.1562500000,,, +22.0312500000,352,785.1562500000,,, +22.0332031250,352,785.1562500000,,, +22.0351562500,352,785.1562500000,,, +22.0371093750,352,785.1562500000,,, +22.0390625000,352,785.1562500000,,, +22.0410156250,352,785.1562500000,,, +22.0429687500,352,785.1562500000,,, +22.0449218750,352,785.1562500000,,, +22.0468750000,352,785.1562500000,,, +22.0488281250,352,785.1562500000,,, +22.0507812500,352,785.1562500000,,, +22.0527343750,352,785.1562500000,,, +22.0546875000,352,785.1562500000,,, +22.0566406250,352,785.1562500000,,, +22.0585937500,352,785.1562500000,,, +22.0605468750,352,785.1562500000,,, +22.0625000000,353,785.1562500000,,, +22.0644531250,353,785.1562500000,,, +22.0664062500,353,785.1562500000,,, +22.0683593750,353,785.1562500000,,, +22.0703125000,353,785.1562500000,,, +22.0722656250,353,785.1562500000,,, +22.0742187500,353,785.1562500000,,, +22.0761718750,353,785.1562500000,,, +22.0781250000,353,785.1562500000,,, +22.0800781250,353,785.1562500000,,, +22.0820312500,353,785.1562500000,,, +22.0839843750,353,785.1562500000,,, +22.0859375000,353,785.1562500000,,, +22.0878906250,353,785.1562500000,,, +22.0898437500,353,785.1562500000,,, +22.0917968750,353,785.1562500000,,, +22.0937500000,353,785.1562500000,,, +22.0957031250,353,785.1562500000,,, +22.0976562500,353,785.1562500000,,, +22.0996093750,353,785.1562500000,,, +22.1015625000,353,785.1562500000,,, +22.1035156250,353,785.1562500000,,, +22.1054687500,353,785.1562500000,,, +22.1074218750,353,785.1562500000,,, +22.1093750000,353,785.1562500000,,, +22.1113281250,353,785.1562500000,,, +22.1132812500,353,785.1562500000,,, +22.1152343750,353,785.1562500000,,, +22.1171875000,353,785.1562500000,,, +22.1191406250,353,785.1562500000,,, +22.1210937500,353,785.1562500000,,, +22.1230468750,353,785.1562500000,,, +22.1250000000,354,785.1562500000,,, +22.1269531250,354,785.1562500000,,, +22.1289062500,354,785.1562500000,,, +22.1308593750,354,785.1562500000,,, +22.1328125000,354,785.1562500000,,, +22.1347656250,354,785.1562500000,,, +22.1367187500,354,785.1562500000,,, +22.1386718750,354,785.1562500000,,, +22.1406250000,354,785.1562500000,,, +22.1425781250,354,785.1562500000,,, +22.1445312500,354,785.1562500000,,, +22.1464843750,354,785.1562500000,,, +22.1484375000,354,785.1562500000,,, +22.1503906250,354,785.1562500000,,, +22.1523437500,354,785.1562500000,,, +22.1542968750,354,785.1562500000,,, +22.1562500000,354,785.1562500000,,, +22.1582031250,354,785.1562500000,,, +22.1601562500,354,785.1562500000,,, +22.1621093750,354,785.1562500000,,, +22.1640625000,354,785.1562500000,,, +22.1660156250,354,785.1562500000,,, +22.1679687500,354,785.1562500000,,, +22.1699218750,354,785.1562500000,,, +22.1718750000,354,785.1562500000,,, +22.1738281250,354,785.1562500000,,, +22.1757812500,354,785.1562500000,,, +22.1777343750,354,785.1562500000,,, +22.1796875000,354,785.1562500000,,, +22.1816406250,354,785.1562500000,,, +22.1835937500,354,785.1562500000,,, +22.1855468750,354,785.1562500000,,, +22.1875000000,355,785.1562500000,,, +22.1894531250,355,785.1562500000,,, +22.1914062500,355,785.1562500000,,, +22.1933593750,355,785.1562500000,,, +22.1953125000,355,785.1562500000,,, +22.1972656250,355,785.1562500000,,, +22.1992187500,355,785.1562500000,,, +22.2011718750,355,785.1562500000,,, +22.2031250000,355,785.1562500000,,, +22.2050781250,355,785.1562500000,,, +22.2070312500,355,785.1562500000,,, +22.2089843750,355,785.1562500000,,, +22.2109375000,355,785.1562500000,,, +22.2128906250,355,785.1562500000,,, +22.2148437500,355,785.1562500000,,, +22.2167968750,355,785.1562500000,,, +22.2187500000,355,785.1562500000,,, +22.2207031250,355,785.1562500000,,, +22.2226562500,355,785.1562500000,,, +22.2246093750,355,785.1562500000,,, +22.2265625000,355,785.1562500000,,, +22.2285156250,355,785.1562500000,,, +22.2304687500,355,785.1562500000,,, +22.2324218750,355,785.1562500000,,, +22.2343750000,355,785.1562500000,,, +22.2363281250,355,785.1562500000,,, +22.2382812500,355,785.1562500000,,, +22.2402343750,355,785.1562500000,,, +22.2421875000,355,785.1562500000,,, +22.2441406250,355,785.1562500000,,, +22.2460937500,355,785.1562500000,,, +22.2480468750,355,785.1562500000,,, +22.2500000000,356,785.1562500000,,, +22.2519531250,356,785.1562500000,,, +22.2539062500,356,785.1562500000,,, +22.2558593750,356,785.1562500000,,, +22.2578125000,356,785.1562500000,,, +22.2597656250,356,785.1562500000,,, +22.2617187500,356,785.1562500000,,, +22.2636718750,356,785.1562500000,,, +22.2656250000,356,785.1562500000,,, +22.2675781250,356,785.1562500000,,, +22.2695312500,356,785.1562500000,,, +22.2714843750,356,785.1562500000,,, +22.2734375000,356,785.1562500000,,, +22.2753906250,356,785.1562500000,,, +22.2773437500,356,785.1562500000,,, +22.2792968750,356,785.1562500000,,, +22.2812500000,356,785.1562500000,,, +22.2832031250,356,785.1562500000,,, +22.2851562500,356,785.1562500000,,, +22.2871093750,356,785.1562500000,,, +22.2890625000,356,785.1562500000,,, +22.2910156250,356,785.1562500000,,, +22.2929687500,356,785.1562500000,,, +22.2949218750,356,785.1562500000,,, +22.2968750000,356,785.1562500000,,, +22.2988281250,356,785.1562500000,,, +22.3007812500,356,785.1562500000,,, +22.3027343750,356,785.1562500000,,, +22.3046875000,356,785.1562500000,,, +22.3066406250,356,785.1562500000,,, +22.3085937500,356,785.1562500000,,, +22.3105468750,356,785.1562500000,,, +22.3125000000,357,785.1562500000,,, +22.3144531250,357,785.1562500000,,, +22.3164062500,357,785.1562500000,,, +22.3183593750,357,785.1562500000,,, +22.3203125000,357,785.1562500000,,, +22.3222656250,357,785.1562500000,,, +22.3242187500,357,785.1562500000,,, +22.3261718750,357,785.1562500000,,, +22.3281250000,357,785.1562500000,,, +22.3300781250,357,785.1562500000,,, +22.3320312500,357,785.1562500000,,, +22.3339843750,357,785.1562500000,,, +22.3359375000,357,785.1562500000,,, +22.3378906250,357,785.1562500000,,, +22.3398437500,357,785.1562500000,,, +22.3417968750,357,785.1562500000,,, +22.3437500000,357,785.1562500000,,, +22.3457031250,357,785.1562500000,,, +22.3476562500,357,785.1562500000,,, +22.3496093750,357,785.1562500000,,, +22.3515625000,357,785.1562500000,,, +22.3535156250,357,785.1562500000,,, +22.3554687500,357,785.1562500000,,, +22.3574218750,357,785.1562500000,,, +22.3593750000,357,785.1562500000,,, +22.3613281250,357,785.1562500000,,, +22.3632812500,357,785.1562500000,,, +22.3652343750,357,785.1562500000,,, +22.3671875000,357,785.1562500000,,, +22.3691406250,357,785.1562500000,,, +22.3710937500,357,785.1562500000,,, +22.3730468750,357,785.1562500000,,, +22.3750000000,358,785.1562500000,,, +22.3769531250,358,785.1562500000,,, +22.3789062500,358,785.1562500000,,, +22.3808593750,358,785.1562500000,,, +22.3828125000,358,785.1562500000,,, +22.3847656250,358,785.1562500000,,, +22.3867187500,358,785.1562500000,,, +22.3886718750,358,785.1562500000,,, +22.3906250000,358,785.1562500000,,, +22.3925781250,358,785.1562500000,,, +22.3945312500,358,785.1562500000,,, +22.3964843750,358,785.1562500000,,, +22.3984375000,358,785.1562500000,,, +22.4003906250,358,785.1562500000,,, +22.4023437500,358,785.1562500000,,, +22.4042968750,358,785.1562500000,,, +22.4062500000,358,785.1562500000,,, +22.4082031250,358,785.1562500000,,, +22.4101562500,358,785.1562500000,,, +22.4121093750,358,785.1562500000,,, +22.4140625000,358,785.1562500000,,, +22.4160156250,358,785.1562500000,,, +22.4179687500,358,785.1562500000,,, +22.4199218750,358,785.1562500000,,, +22.4218750000,358,785.1562500000,,, +22.4238281250,358,785.1562500000,,, +22.4257812500,358,785.1562500000,,, +22.4277343750,358,785.1562500000,,, +22.4296875000,358,785.1562500000,,, +22.4316406250,358,785.1562500000,,, +22.4335937500,358,785.1562500000,,, +22.4355468750,358,785.1562500000,,, +22.4375000000,359,785.1562500000,,, +22.4394531250,359,785.1562500000,,, +22.4414062500,359,785.1562500000,,, +22.4433593750,359,785.1562500000,,, +22.4453125000,359,785.1562500000,,, +22.4472656250,359,785.1562500000,,, +22.4492187500,359,785.1562500000,,, +22.4511718750,359,785.1562500000,,, +22.4531250000,359,785.1562500000,,, +22.4550781250,359,785.1562500000,,, +22.4570312500,359,785.1562500000,,, +22.4589843750,359,785.1562500000,,, +22.4609375000,359,785.1562500000,,, +22.4628906250,359,785.1562500000,,, +22.4648437500,359,785.1562500000,,, +22.4667968750,359,785.1562500000,,, +22.4687500000,359,785.1562500000,,, +22.4707031250,359,785.1562500000,,, +22.4726562500,359,785.1562500000,,, +22.4746093750,359,785.1562500000,,, +22.4765625000,359,785.1562500000,,, +22.4785156250,359,785.1562500000,,, +22.4804687500,359,785.1562500000,,, +22.4824218750,359,785.1562500000,,, +22.4843750000,359,785.1562500000,,, +22.4863281250,359,785.1562500000,,, +22.4882812500,359,785.1562500000,,, +22.4902343750,359,785.1562500000,,, +22.4921875000,359,785.1562500000,,, +22.4941406250,359,785.1562500000,,, +22.4960937500,359,785.1562500000,,, +22.4980468750,359,785.1562500000,,, +22.5000000000,360,785.1562500000,,, +22.5019531250,360,785.1562500000,,, +22.5039062500,360,785.1562500000,,, +22.5058593750,360,785.1562500000,,, +22.5078125000,360,785.1562500000,,, +22.5097656250,360,785.1562500000,,, +22.5117187500,360,785.1562500000,,, +22.5136718750,360,785.1562500000,,, +22.5156250000,360,785.1562500000,,, +22.5175781250,360,785.1562500000,,, +22.5195312500,360,785.1562500000,,, +22.5214843750,360,785.1562500000,,, +22.5234375000,360,785.1562500000,,, +22.5253906250,360,785.1562500000,,, +22.5273437500,360,785.1562500000,,, +22.5292968750,360,785.1562500000,,, +22.5312500000,360,785.1562500000,,, +22.5332031250,360,785.1562500000,,, +22.5351562500,360,785.1562500000,,, +22.5371093750,360,785.1562500000,,, +22.5390625000,360,785.1562500000,,, +22.5410156250,360,785.1562500000,,, +22.5429687500,360,785.1562500000,,, +22.5449218750,360,785.1562500000,,, +22.5468750000,360,785.1562500000,,, +22.5488281250,360,785.1562500000,,, +22.5507812500,360,785.1562500000,,, +22.5527343750,360,785.1562500000,,, +22.5546875000,360,785.1562500000,,, +22.5566406250,360,785.1562500000,,, +22.5585937500,360,785.1562500000,,, +22.5605468750,360,785.1562500000,,, +22.5625000000,361,785.1562500000,,, +22.5644531250,361,785.1562500000,,, +22.5664062500,361,785.1562500000,,, +22.5683593750,361,785.1562500000,,, +22.5703125000,361,785.1562500000,,, +22.5722656250,361,785.1562500000,,, +22.5742187500,361,785.1562500000,,, +22.5761718750,361,785.1562500000,,, +22.5781250000,361,785.1562500000,,, +22.5800781250,361,785.1562500000,,, +22.5820312500,361,785.1562500000,,, +22.5839843750,361,785.1562500000,,, +22.5859375000,361,785.1562500000,,, +22.5878906250,361,785.1562500000,,, +22.5898437500,361,785.1562500000,,, +22.5917968750,361,785.1562500000,,, +22.5937500000,361,785.1562500000,,, +22.5957031250,361,785.1562500000,,, +22.5976562500,361,785.1562500000,,, +22.5996093750,361,785.1562500000,,, +22.6015625000,361,785.1562500000,,, +22.6035156250,361,785.1562500000,,, +22.6054687500,361,785.1562500000,,, +22.6074218750,361,785.1562500000,,, +22.6093750000,361,785.1562500000,,, +22.6113281250,361,785.1562500000,,, +22.6132812500,361,785.1562500000,,, +22.6152343750,361,785.1562500000,,, +22.6171875000,361,785.1562500000,,, +22.6191406250,361,785.1562500000,,, +22.6210937500,361,785.1562500000,,, +22.6230468750,361,785.1562500000,,, +22.6250000000,362,654.2968750000,,, +22.6269531250,362,654.2968750000,,, +22.6289062500,362,654.2968750000,,, +22.6308593750,362,654.2968750000,,, +22.6328125000,362,654.2968750000,,, +22.6347656250,362,654.2968750000,,, +22.6367187500,362,654.2968750000,,, +22.6386718750,362,654.2968750000,,, +22.6406250000,362,654.2968750000,,, +22.6425781250,362,654.2968750000,,, +22.6445312500,362,654.2968750000,,, +22.6464843750,362,654.2968750000,,, +22.6484375000,362,654.2968750000,,, +22.6503906250,362,654.2968750000,,, +22.6523437500,362,654.2968750000,,, +22.6542968750,362,654.2968750000,,, +22.6562500000,362,654.2968750000,,, +22.6582031250,362,654.2968750000,,, +22.6601562500,362,654.2968750000,,, +22.6621093750,362,654.2968750000,,, +22.6640625000,362,654.2968750000,,, +22.6660156250,362,654.2968750000,,, +22.6679687500,362,654.2968750000,,, +22.6699218750,362,654.2968750000,,, +22.6718750000,362,654.2968750000,,, +22.6738281250,362,654.2968750000,,, +22.6757812500,362,654.2968750000,,, +22.6777343750,362,654.2968750000,,, +22.6796875000,362,654.2968750000,,, +22.6816406250,362,654.2968750000,,, +22.6835937500,362,654.2968750000,,, +22.6855468750,362,654.2968750000,,, +22.6875000000,363,654.2968750000,,, +22.6894531250,363,654.2968750000,,, +22.6914062500,363,654.2968750000,,, +22.6933593750,363,654.2968750000,,, +22.6953125000,363,654.2968750000,,, +22.6972656250,363,654.2968750000,,, +22.6992187500,363,654.2968750000,,, +22.7011718750,363,654.2968750000,,, +22.7031250000,363,654.2968750000,,, +22.7050781250,363,654.2968750000,,, +22.7070312500,363,654.2968750000,,, +22.7089843750,363,654.2968750000,,, +22.7109375000,363,654.2968750000,,, +22.7128906250,363,654.2968750000,,, +22.7148437500,363,654.2968750000,,, +22.7167968750,363,654.2968750000,,, +22.7187500000,363,654.2968750000,,, +22.7207031250,363,654.2968750000,,, +22.7226562500,363,654.2968750000,,, +22.7246093750,363,654.2968750000,,, +22.7265625000,363,654.2968750000,,, +22.7285156250,363,654.2968750000,,, +22.7304687500,363,654.2968750000,,, +22.7324218750,363,654.2968750000,,, +22.7343750000,363,654.2968750000,,, +22.7363281250,363,654.2968750000,,, +22.7382812500,363,654.2968750000,,, +22.7402343750,363,654.2968750000,,, +22.7421875000,363,654.2968750000,,, +22.7441406250,363,654.2968750000,,, +22.7460937500,363,654.2968750000,,, +22.7480468750,363,654.2968750000,,, +22.7500000000,364,654.2968750000,,, +22.7519531250,364,654.2968750000,,, +22.7539062500,364,654.2968750000,,, +22.7558593750,364,654.2968750000,,, +22.7578125000,364,654.2968750000,,, +22.7597656250,364,654.2968750000,,, +22.7617187500,364,654.2968750000,,, +22.7636718750,364,654.2968750000,,, +22.7656250000,364,654.2968750000,,, +22.7675781250,364,654.2968750000,,, +22.7695312500,364,654.2968750000,,, +22.7714843750,364,654.2968750000,,, +22.7734375000,364,654.2968750000,,, +22.7753906250,364,654.2968750000,,, +22.7773437500,364,654.2968750000,,, +22.7792968750,364,654.2968750000,,, +22.7812500000,364,654.2968750000,,, +22.7832031250,364,654.2968750000,,, +22.7851562500,364,654.2968750000,,, +22.7871093750,364,654.2968750000,,, +22.7890625000,364,654.2968750000,,, +22.7910156250,364,654.2968750000,,, +22.7929687500,364,654.2968750000,,, +22.7949218750,364,654.2968750000,,, +22.7968750000,364,654.2968750000,,, +22.7988281250,364,654.2968750000,,, +22.8007812500,364,654.2968750000,,, +22.8027343750,364,654.2968750000,,, +22.8046875000,364,654.2968750000,,, +22.8066406250,364,654.2968750000,,, +22.8085937500,364,654.2968750000,,, +22.8105468750,364,654.2968750000,,, +22.8125000000,365,654.2968750000,,, +22.8144531250,365,654.2968750000,,, +22.8164062500,365,654.2968750000,,, +22.8183593750,365,654.2968750000,,, +22.8203125000,365,654.2968750000,,, +22.8222656250,365,654.2968750000,,, +22.8242187500,365,654.2968750000,,, +22.8261718750,365,654.2968750000,,, +22.8281250000,365,654.2968750000,,, +22.8300781250,365,654.2968750000,,, +22.8320312500,365,654.2968750000,,, +22.8339843750,365,654.2968750000,,, +22.8359375000,365,654.2968750000,,, +22.8378906250,365,654.2968750000,,, +22.8398437500,365,654.2968750000,,, +22.8417968750,365,654.2968750000,,, +22.8437500000,365,654.2968750000,,, +22.8457031250,365,654.2968750000,,, +22.8476562500,365,654.2968750000,,, +22.8496093750,365,654.2968750000,,, +22.8515625000,365,654.2968750000,,, +22.8535156250,365,654.2968750000,,, +22.8554687500,365,654.2968750000,,, +22.8574218750,365,654.2968750000,,, +22.8593750000,365,654.2968750000,,, +22.8613281250,365,654.2968750000,,, +22.8632812500,365,654.2968750000,,, +22.8652343750,365,654.2968750000,,, +22.8671875000,365,654.2968750000,,, +22.8691406250,365,654.2968750000,,, +22.8710937500,365,654.2968750000,,, +22.8730468750,365,654.2968750000,,, +22.8750000000,366,654.2968750000,,, +22.8769531250,366,654.2968750000,,, +22.8789062500,366,654.2968750000,,, +22.8808593750,366,654.2968750000,,, +22.8828125000,366,654.2968750000,,, +22.8847656250,366,654.2968750000,,, +22.8867187500,366,654.2968750000,,, +22.8886718750,366,654.2968750000,,, +22.8906250000,366,654.2968750000,,, +22.8925781250,366,654.2968750000,,, +22.8945312500,366,654.2968750000,,, +22.8964843750,366,654.2968750000,,, +22.8984375000,366,654.2968750000,,, +22.9003906250,366,654.2968750000,,, +22.9023437500,366,654.2968750000,,, +22.9042968750,366,654.2968750000,,, +22.9062500000,366,654.2968750000,,, +22.9082031250,366,654.2968750000,,, +22.9101562500,366,654.2968750000,,, +22.9121093750,366,654.2968750000,,, +22.9140625000,366,654.2968750000,,, +22.9160156250,366,654.2968750000,,, +22.9179687500,366,654.2968750000,,, +22.9199218750,366,654.2968750000,,, +22.9218750000,366,654.2968750000,,, +22.9238281250,366,654.2968750000,,, +22.9257812500,366,654.2968750000,,, +22.9277343750,366,654.2968750000,,, +22.9296875000,366,654.2968750000,,, +22.9316406250,366,654.2968750000,,, +22.9335937500,366,654.2968750000,,, +22.9355468750,366,654.2968750000,,, +22.9375000000,367,654.2968750000,,, +22.9394531250,367,654.2968750000,,, +22.9414062500,367,654.2968750000,,, +22.9433593750,367,654.2968750000,,, +22.9453125000,367,654.2968750000,,, +22.9472656250,367,654.2968750000,,, +22.9492187500,367,654.2968750000,,, +22.9511718750,367,654.2968750000,,, +22.9531250000,367,654.2968750000,,, +22.9550781250,367,654.2968750000,,, +22.9570312500,367,654.2968750000,,, +22.9589843750,367,654.2968750000,,, +22.9609375000,367,654.2968750000,,, +22.9628906250,367,654.2968750000,,, +22.9648437500,367,654.2968750000,,, +22.9667968750,367,654.2968750000,,, +22.9687500000,367,654.2968750000,,, +22.9707031250,367,654.2968750000,,, +22.9726562500,367,654.2968750000,,, +22.9746093750,367,654.2968750000,,, +22.9765625000,367,654.2968750000,,, +22.9785156250,367,654.2968750000,,, +22.9804687500,367,654.2968750000,,, +22.9824218750,367,654.2968750000,,, +22.9843750000,367,654.2968750000,,, +22.9863281250,367,654.2968750000,,, +22.9882812500,367,654.2968750000,,, +22.9902343750,367,654.2968750000,,, +22.9921875000,367,654.2968750000,,, +22.9941406250,367,654.2968750000,,, +22.9960937500,367,654.2968750000,,, +22.9980468750,367,654.2968750000,,, +23.0000000000,368,654.2968750000,,, +23.0019531250,368,654.2968750000,,, +23.0039062500,368,654.2968750000,,, +23.0058593750,368,654.2968750000,,, +23.0078125000,368,654.2968750000,,, +23.0097656250,368,654.2968750000,,, +23.0117187500,368,654.2968750000,,, +23.0136718750,368,654.2968750000,,, +23.0156250000,368,654.2968750000,,, +23.0175781250,368,654.2968750000,,, +23.0195312500,368,654.2968750000,,, +23.0214843750,368,654.2968750000,,, +23.0234375000,368,654.2968750000,,, +23.0253906250,368,654.2968750000,,, +23.0273437500,368,654.2968750000,,, +23.0292968750,368,654.2968750000,,, +23.0312500000,368,654.2968750000,,, +23.0332031250,368,654.2968750000,,, +23.0351562500,368,654.2968750000,,, +23.0371093750,368,654.2968750000,,, +23.0390625000,368,654.2968750000,,, +23.0410156250,368,654.2968750000,,, +23.0429687500,368,654.2968750000,,, +23.0449218750,368,654.2968750000,,, +23.0468750000,368,654.2968750000,,, +23.0488281250,368,654.2968750000,,, +23.0507812500,368,654.2968750000,,, +23.0527343750,368,654.2968750000,,, +23.0546875000,368,654.2968750000,,, +23.0566406250,368,654.2968750000,,, +23.0585937500,368,654.2968750000,,, +23.0605468750,368,654.2968750000,,, +23.0625000000,369,654.2968750000,,, +23.0644531250,369,654.2968750000,,, +23.0664062500,369,654.2968750000,,, +23.0683593750,369,654.2968750000,,, +23.0703125000,369,654.2968750000,,, +23.0722656250,369,654.2968750000,,, +23.0742187500,369,654.2968750000,,, +23.0761718750,369,654.2968750000,,, +23.0781250000,369,654.2968750000,,, +23.0800781250,369,654.2968750000,,, +23.0820312500,369,654.2968750000,,, +23.0839843750,369,654.2968750000,,, +23.0859375000,369,654.2968750000,,, +23.0878906250,369,654.2968750000,,, +23.0898437500,369,654.2968750000,,, +23.0917968750,369,654.2968750000,,, +23.0937500000,369,654.2968750000,,, +23.0957031250,369,654.2968750000,,, +23.0976562500,369,654.2968750000,,, +23.0996093750,369,654.2968750000,,, +23.1015625000,369,654.2968750000,,, +23.1035156250,369,654.2968750000,,, +23.1054687500,369,654.2968750000,,, +23.1074218750,369,654.2968750000,,, +23.1093750000,369,654.2968750000,,, +23.1113281250,369,654.2968750000,,, +23.1132812500,369,654.2968750000,,, +23.1152343750,369,654.2968750000,,, +23.1171875000,369,654.2968750000,,, +23.1191406250,369,654.2968750000,,, +23.1210937500,369,654.2968750000,,, +23.1230468750,369,654.2968750000,,, +23.1250000000,370,654.2968750000,,, +23.1269531250,370,654.2968750000,,, +23.1289062500,370,654.2968750000,,, +23.1308593750,370,654.2968750000,,, +23.1328125000,370,654.2968750000,,, +23.1347656250,370,654.2968750000,,, +23.1367187500,370,654.2968750000,,, +23.1386718750,370,654.2968750000,,, +23.1406250000,370,654.2968750000,,, +23.1425781250,370,654.2968750000,,, +23.1445312500,370,654.2968750000,,, +23.1464843750,370,654.2968750000,,, +23.1484375000,370,654.2968750000,,, +23.1503906250,370,654.2968750000,,, +23.1523437500,370,654.2968750000,,, +23.1542968750,370,654.2968750000,,, +23.1562500000,370,654.2968750000,,, +23.1582031250,370,654.2968750000,,, +23.1601562500,370,654.2968750000,,, +23.1621093750,370,654.2968750000,,, +23.1640625000,370,654.2968750000,,, +23.1660156250,370,654.2968750000,,, +23.1679687500,370,654.2968750000,,, +23.1699218750,370,654.2968750000,,, +23.1718750000,370,654.2968750000,,, +23.1738281250,370,654.2968750000,,, +23.1757812500,370,654.2968750000,,, +23.1777343750,370,654.2968750000,,, +23.1796875000,370,654.2968750000,,, +23.1816406250,370,654.2968750000,,, +23.1835937500,370,654.2968750000,,, +23.1855468750,370,654.2968750000,,, +23.1875000000,371,654.2968750000,,, +23.1894531250,371,654.2968750000,,, +23.1914062500,371,654.2968750000,,, +23.1933593750,371,654.2968750000,,, +23.1953125000,371,654.2968750000,,, +23.1972656250,371,654.2968750000,,, +23.1992187500,371,654.2968750000,,, +23.2011718750,371,654.2968750000,,, +23.2031250000,371,654.2968750000,,, +23.2050781250,371,654.2968750000,,, +23.2070312500,371,654.2968750000,,, +23.2089843750,371,654.2968750000,,, +23.2109375000,371,654.2968750000,,, +23.2128906250,371,654.2968750000,,, +23.2148437500,371,654.2968750000,,, +23.2167968750,371,654.2968750000,,, +23.2187500000,371,654.2968750000,,, +23.2207031250,371,654.2968750000,,, +23.2226562500,371,654.2968750000,,, +23.2246093750,371,654.2968750000,,, +23.2265625000,371,654.2968750000,,, +23.2285156250,371,654.2968750000,,, +23.2304687500,371,654.2968750000,,, +23.2324218750,371,654.2968750000,,, +23.2343750000,371,654.2968750000,,, +23.2363281250,371,654.2968750000,,, +23.2382812500,371,654.2968750000,,, +23.2402343750,371,654.2968750000,,, +23.2421875000,371,654.2968750000,,, +23.2441406250,371,654.2968750000,,, +23.2460937500,371,654.2968750000,,, +23.2480468750,371,654.2968750000,,, +23.2500000000,372,654.2968750000,,, +23.2519531250,372,654.2968750000,,, +23.2539062500,372,654.2968750000,,, +23.2558593750,372,654.2968750000,,, +23.2578125000,372,654.2968750000,,, +23.2597656250,372,654.2968750000,,, +23.2617187500,372,654.2968750000,,, +23.2636718750,372,654.2968750000,,, +23.2656250000,372,654.2968750000,,, +23.2675781250,372,654.2968750000,,, +23.2695312500,372,654.2968750000,,, +23.2714843750,372,654.2968750000,,, +23.2734375000,372,654.2968750000,,, +23.2753906250,372,654.2968750000,,, +23.2773437500,372,654.2968750000,,, +23.2792968750,372,654.2968750000,,, +23.2812500000,372,654.2968750000,,, +23.2832031250,372,654.2968750000,,, +23.2851562500,372,654.2968750000,,, +23.2871093750,372,654.2968750000,,, +23.2890625000,372,654.2968750000,,, +23.2910156250,372,654.2968750000,,, +23.2929687500,372,654.2968750000,,, +23.2949218750,372,654.2968750000,,, +23.2968750000,372,654.2968750000,,, +23.2988281250,372,654.2968750000,,, +23.3007812500,372,654.2968750000,,, +23.3027343750,372,654.2968750000,,, +23.3046875000,372,654.2968750000,,, +23.3066406250,372,654.2968750000,,, +23.3085937500,372,654.2968750000,,, +23.3105468750,372,654.2968750000,,, +23.3125000000,373,654.2968750000,,, +23.3144531250,373,654.2968750000,,, +23.3164062500,373,654.2968750000,,, +23.3183593750,373,654.2968750000,,, +23.3203125000,373,654.2968750000,,, +23.3222656250,373,654.2968750000,,, +23.3242187500,373,654.2968750000,,, +23.3261718750,373,654.2968750000,,, +23.3281250000,373,654.2968750000,,, +23.3300781250,373,654.2968750000,,, +23.3320312500,373,654.2968750000,,, +23.3339843750,373,654.2968750000,,, +23.3359375000,373,654.2968750000,,, +23.3378906250,373,654.2968750000,,, +23.3398437500,373,654.2968750000,,, +23.3417968750,373,654.2968750000,,, +23.3437500000,373,654.2968750000,,, +23.3457031250,373,654.2968750000,,, +23.3476562500,373,654.2968750000,,, +23.3496093750,373,654.2968750000,,, +23.3515625000,373,654.2968750000,,, +23.3535156250,373,654.2968750000,,, +23.3554687500,373,654.2968750000,,, +23.3574218750,373,654.2968750000,,, +23.3593750000,373,654.2968750000,,, +23.3613281250,373,654.2968750000,,, +23.3632812500,373,654.2968750000,,, +23.3652343750,373,654.2968750000,,, +23.3671875000,373,654.2968750000,,, +23.3691406250,373,654.2968750000,,, +23.3710937500,373,654.2968750000,,, +23.3730468750,373,654.2968750000,,, +23.3750000000,374,654.2968750000,,, +23.3769531250,374,654.2968750000,,, +23.3789062500,374,654.2968750000,,, +23.3808593750,374,654.2968750000,,, +23.3828125000,374,654.2968750000,,, +23.3847656250,374,654.2968750000,,, +23.3867187500,374,654.2968750000,,, +23.3886718750,374,654.2968750000,,, +23.3906250000,374,654.2968750000,,, +23.3925781250,374,654.2968750000,,, +23.3945312500,374,654.2968750000,,, +23.3964843750,374,654.2968750000,,, +23.3984375000,374,654.2968750000,,, +23.4003906250,374,654.2968750000,,, +23.4023437500,374,654.2968750000,,, +23.4042968750,374,654.2968750000,,, +23.4062500000,374,654.2968750000,,, +23.4082031250,374,654.2968750000,,, +23.4101562500,374,654.2968750000,,, +23.4121093750,374,654.2968750000,,, +23.4140625000,374,654.2968750000,,, +23.4160156250,374,654.2968750000,,, +23.4179687500,374,654.2968750000,,, +23.4199218750,374,654.2968750000,,, +23.4218750000,374,654.2968750000,,, +23.4238281250,374,654.2968750000,,, +23.4257812500,374,654.2968750000,,, +23.4277343750,374,654.2968750000,,, +23.4296875000,374,654.2968750000,,, +23.4316406250,374,654.2968750000,,, +23.4335937500,374,654.2968750000,,, +23.4355468750,374,654.2968750000,,, +23.4375000000,375,654.2968750000,,, +23.4394531250,375,654.2968750000,,, +23.4414062500,375,654.2968750000,,, +23.4433593750,375,654.2968750000,,, +23.4453125000,375,654.2968750000,,, +23.4472656250,375,654.2968750000,,, +23.4492187500,375,654.2968750000,,, +23.4511718750,375,654.2968750000,,, +23.4531250000,375,654.2968750000,,, +23.4550781250,375,654.2968750000,,, +23.4570312500,375,654.2968750000,,, +23.4589843750,375,654.2968750000,,, +23.4609375000,375,654.2968750000,,, +23.4628906250,375,654.2968750000,,, +23.4648437500,375,654.2968750000,,, +23.4667968750,375,654.2968750000,,, +23.4687500000,375,654.2968750000,,, +23.4707031250,375,654.2968750000,,, +23.4726562500,375,654.2968750000,,, +23.4746093750,375,654.2968750000,,, +23.4765625000,375,654.2968750000,,, +23.4785156250,375,654.2968750000,,, +23.4804687500,375,654.2968750000,,, +23.4824218750,375,654.2968750000,,, +23.4843750000,375,654.2968750000,,, +23.4863281250,375,654.2968750000,,, +23.4882812500,375,654.2968750000,,, +23.4902343750,375,654.2968750000,,, +23.4921875000,375,654.2968750000,,, +23.4941406250,375,654.2968750000,,, +23.4960937500,375,654.2968750000,,, +23.4980468750,375,654.2968750000,,, +23.5000000000,376,654.2968750000,,, +23.5019531250,376,654.2968750000,,, +23.5039062500,376,654.2968750000,,, +23.5058593750,376,654.2968750000,,, +23.5078125000,376,654.2968750000,,, +23.5097656250,376,654.2968750000,,, +23.5117187500,376,654.2968750000,,, +23.5136718750,376,654.2968750000,,, +23.5156250000,376,654.2968750000,,, +23.5175781250,376,654.2968750000,,, +23.5195312500,376,654.2968750000,,, +23.5214843750,376,654.2968750000,,, +23.5234375000,376,654.2968750000,,, +23.5253906250,376,654.2968750000,,, +23.5273437500,376,654.2968750000,,, +23.5292968750,376,654.2968750000,,, +23.5312500000,376,654.2968750000,,, +23.5332031250,376,654.2968750000,,, +23.5351562500,376,654.2968750000,,, +23.5371093750,376,654.2968750000,,, +23.5390625000,376,654.2968750000,,, +23.5410156250,376,654.2968750000,,, +23.5429687500,376,654.2968750000,,, +23.5449218750,376,654.2968750000,,, +23.5468750000,376,654.2968750000,,, +23.5488281250,376,654.2968750000,,, +23.5507812500,376,654.2968750000,,, +23.5527343750,376,654.2968750000,,, +23.5546875000,376,654.2968750000,,, +23.5566406250,376,654.2968750000,,, +23.5585937500,376,654.2968750000,,, +23.5605468750,376,654.2968750000,,, +23.5625000000,377,654.2968750000,,, +23.5644531250,377,654.2968750000,,, +23.5664062500,377,654.2968750000,,, +23.5683593750,377,654.2968750000,,, +23.5703125000,377,654.2968750000,,, +23.5722656250,377,654.2968750000,,, +23.5742187500,377,654.2968750000,,, +23.5761718750,377,654.2968750000,,, +23.5781250000,377,654.2968750000,,, +23.5800781250,377,654.2968750000,,, +23.5820312500,377,654.2968750000,,, +23.5839843750,377,654.2968750000,,, +23.5859375000,377,654.2968750000,,, +23.5878906250,377,654.2968750000,,, +23.5898437500,377,654.2968750000,,, +23.5917968750,377,654.2968750000,,, +23.5937500000,377,654.2968750000,,, +23.5957031250,377,654.2968750000,,, +23.5976562500,377,654.2968750000,,, +23.5996093750,377,654.2968750000,,, +23.6015625000,377,654.2968750000,,, +23.6035156250,377,654.2968750000,,, +23.6054687500,377,654.2968750000,,, +23.6074218750,377,654.2968750000,,, +23.6093750000,377,654.2968750000,,, +23.6113281250,377,654.2968750000,,, +23.6132812500,377,654.2968750000,,, +23.6152343750,377,654.2968750000,,, +23.6171875000,377,654.2968750000,,, +23.6191406250,377,654.2968750000,,, +23.6210937500,377,654.2968750000,,, +23.6230468750,377,654.2968750000,,, +23.6250000000,378,654.2968750000,,, +23.6269531250,378,654.2968750000,,, +23.6289062500,378,654.2968750000,,, +23.6308593750,378,654.2968750000,,, +23.6328125000,378,654.2968750000,,, +23.6347656250,378,654.2968750000,,, +23.6367187500,378,654.2968750000,,, +23.6386718750,378,654.2968750000,,, +23.6406250000,378,654.2968750000,,, +23.6425781250,378,654.2968750000,,, +23.6445312500,378,654.2968750000,,, +23.6464843750,378,654.2968750000,,, +23.6484375000,378,654.2968750000,,, +23.6503906250,378,654.2968750000,,, +23.6523437500,378,654.2968750000,,, +23.6542968750,378,654.2968750000,,, +23.6562500000,378,654.2968750000,,, +23.6582031250,378,654.2968750000,,, +23.6601562500,378,654.2968750000,,, +23.6621093750,378,654.2968750000,,, +23.6640625000,378,654.2968750000,,, +23.6660156250,378,654.2968750000,,, +23.6679687500,378,654.2968750000,,, +23.6699218750,378,654.2968750000,,, +23.6718750000,378,654.2968750000,,, +23.6738281250,378,654.2968750000,,, +23.6757812500,378,654.2968750000,,, +23.6777343750,378,654.2968750000,,, +23.6796875000,378,654.2968750000,,, +23.6816406250,378,654.2968750000,,, +23.6835937500,378,654.2968750000,,, +23.6855468750,378,654.2968750000,,, +23.6875000000,379,859.3750000000,,, +23.6894531250,379,859.3750000000,,, +23.6914062500,379,859.3750000000,,, +23.6933593750,379,859.3750000000,,, +23.6953125000,379,859.3750000000,,, +23.6972656250,379,859.3750000000,,, +23.6992187500,379,859.3750000000,,, +23.7011718750,379,859.3750000000,,, +23.7031250000,379,859.3750000000,,, +23.7050781250,379,859.3750000000,,, +23.7070312500,379,859.3750000000,,, +23.7089843750,379,859.3750000000,,, +23.7109375000,379,859.3750000000,,, +23.7128906250,379,859.3750000000,,, +23.7148437500,379,859.3750000000,,, +23.7167968750,379,859.3750000000,,, +23.7187500000,379,859.3750000000,,, +23.7207031250,379,859.3750000000,,, +23.7226562500,379,859.3750000000,,, +23.7246093750,379,859.3750000000,,, +23.7265625000,379,859.3750000000,,, +23.7285156250,379,859.3750000000,,, +23.7304687500,379,859.3750000000,,, +23.7324218750,379,859.3750000000,,, +23.7343750000,379,859.3750000000,,, +23.7363281250,379,859.3750000000,,, +23.7382812500,379,859.3750000000,,, +23.7402343750,379,859.3750000000,,, +23.7421875000,379,859.3750000000,,, +23.7441406250,379,859.3750000000,,, +23.7460937500,379,859.3750000000,,, +23.7480468750,379,859.3750000000,,, +23.7500000000,380,859.3750000000,,, +23.7519531250,380,859.3750000000,,, +23.7539062500,380,859.3750000000,,, +23.7558593750,380,859.3750000000,,, +23.7578125000,380,859.3750000000,,, +23.7597656250,380,859.3750000000,,, +23.7617187500,380,859.3750000000,,, +23.7636718750,380,859.3750000000,,, +23.7656250000,380,859.3750000000,,, +23.7675781250,380,859.3750000000,,, +23.7695312500,380,859.3750000000,,, +23.7714843750,380,859.3750000000,,, +23.7734375000,380,859.3750000000,,, +23.7753906250,380,859.3750000000,,, +23.7773437500,380,859.3750000000,,, +23.7792968750,380,859.3750000000,,, +23.7812500000,380,859.3750000000,,, +23.7832031250,380,859.3750000000,,, +23.7851562500,380,859.3750000000,,, +23.7871093750,380,859.3750000000,,, +23.7890625000,380,859.3750000000,,, +23.7910156250,380,859.3750000000,,, +23.7929687500,380,859.3750000000,,, +23.7949218750,380,859.3750000000,,, +23.7968750000,380,859.3750000000,,, +23.7988281250,380,859.3750000000,,, +23.8007812500,380,859.3750000000,,, +23.8027343750,380,859.3750000000,,, +23.8046875000,380,859.3750000000,,, +23.8066406250,380,859.3750000000,,, +23.8085937500,380,859.3750000000,,, +23.8105468750,380,859.3750000000,,, +23.8125000000,381,859.3750000000,,, +23.8144531250,381,859.3750000000,,, +23.8164062500,381,859.3750000000,,, +23.8183593750,381,859.3750000000,,, +23.8203125000,381,859.3750000000,,, +23.8222656250,381,859.3750000000,,, +23.8242187500,381,859.3750000000,,, +23.8261718750,381,859.3750000000,,, +23.8281250000,381,859.3750000000,,, +23.8300781250,381,859.3750000000,,, +23.8320312500,381,859.3750000000,,, +23.8339843750,381,859.3750000000,,, +23.8359375000,381,859.3750000000,,, +23.8378906250,381,859.3750000000,,, +23.8398437500,381,859.3750000000,,, +23.8417968750,381,859.3750000000,,, +23.8437500000,381,859.3750000000,,, +23.8457031250,381,859.3750000000,,, +23.8476562500,381,859.3750000000,,, +23.8496093750,381,859.3750000000,,, +23.8515625000,381,859.3750000000,,, +23.8535156250,381,859.3750000000,,, +23.8554687500,381,859.3750000000,,, +23.8574218750,381,859.3750000000,,, +23.8593750000,381,859.3750000000,,, +23.8613281250,381,859.3750000000,,, +23.8632812500,381,859.3750000000,,, +23.8652343750,381,859.3750000000,,, +23.8671875000,381,859.3750000000,,, +23.8691406250,381,859.3750000000,,, +23.8710937500,381,859.3750000000,,, +23.8730468750,381,859.3750000000,,, +23.8750000000,382,859.3750000000,,, +23.8769531250,382,859.3750000000,,, +23.8789062500,382,859.3750000000,,, +23.8808593750,382,859.3750000000,,, +23.8828125000,382,859.3750000000,,, +23.8847656250,382,859.3750000000,,, +23.8867187500,382,859.3750000000,,, +23.8886718750,382,859.3750000000,,, +23.8906250000,382,859.3750000000,,, +23.8925781250,382,859.3750000000,,, +23.8945312500,382,859.3750000000,,, +23.8964843750,382,859.3750000000,,, +23.8984375000,382,859.3750000000,,, +23.9003906250,382,859.3750000000,,, +23.9023437500,382,859.3750000000,,, +23.9042968750,382,859.3750000000,,, +23.9062500000,382,859.3750000000,,, +23.9082031250,382,859.3750000000,,, +23.9101562500,382,859.3750000000,,, +23.9121093750,382,859.3750000000,,, +23.9140625000,382,859.3750000000,,, +23.9160156250,382,859.3750000000,,, +23.9179687500,382,859.3750000000,,, +23.9199218750,382,859.3750000000,,, +23.9218750000,382,859.3750000000,,, +23.9238281250,382,859.3750000000,,, +23.9257812500,382,859.3750000000,,, +23.9277343750,382,859.3750000000,,, +23.9296875000,382,859.3750000000,,, +23.9316406250,382,859.3750000000,,, +23.9335937500,382,859.3750000000,,, +23.9355468750,382,859.3750000000,,, +23.9375000000,383,859.3750000000,,, +23.9394531250,383,859.3750000000,,, +23.9414062500,383,859.3750000000,,, +23.9433593750,383,859.3750000000,,, +23.9453125000,383,859.3750000000,,, +23.9472656250,383,859.3750000000,,, +23.9492187500,383,859.3750000000,,, +23.9511718750,383,859.3750000000,,, +23.9531250000,383,859.3750000000,,, +23.9550781250,383,859.3750000000,,, +23.9570312500,383,859.3750000000,,, +23.9589843750,383,859.3750000000,,, +23.9609375000,383,859.3750000000,,, +23.9628906250,383,859.3750000000,,, +23.9648437500,383,859.3750000000,,, +23.9667968750,383,859.3750000000,,, +23.9687500000,383,859.3750000000,,, +23.9707031250,383,859.3750000000,,, +23.9726562500,383,859.3750000000,,, +23.9746093750,383,859.3750000000,,, +23.9765625000,383,859.3750000000,,, +23.9785156250,383,859.3750000000,,, +23.9804687500,383,859.3750000000,,, +23.9824218750,383,859.3750000000,,, +23.9843750000,383,859.3750000000,,, +23.9863281250,383,859.3750000000,,, +23.9882812500,383,859.3750000000,,, +23.9902343750,383,859.3750000000,,, +23.9921875000,383,859.3750000000,,, +23.9941406250,383,859.3750000000,,, +23.9960937500,383,859.3750000000,,, +23.9980468750,383,859.3750000000,,, +24.0000000000,384,859.3750000000,,, +24.0019531250,384,859.3750000000,,, +24.0039062500,384,859.3750000000,,, +24.0058593750,384,859.3750000000,,, +24.0078125000,384,859.3750000000,,, +24.0097656250,384,859.3750000000,,, +24.0117187500,384,859.3750000000,,, +24.0136718750,384,859.3750000000,,, +24.0156250000,384,859.3750000000,,, +24.0175781250,384,859.3750000000,,, +24.0195312500,384,859.3750000000,,, +24.0214843750,384,859.3750000000,,, +24.0234375000,384,859.3750000000,,, +24.0253906250,384,859.3750000000,,, +24.0273437500,384,859.3750000000,,, +24.0292968750,384,859.3750000000,,, +24.0312500000,384,859.3750000000,,, +24.0332031250,384,859.3750000000,,, +24.0351562500,384,859.3750000000,,, +24.0371093750,384,859.3750000000,,, +24.0390625000,384,859.3750000000,,, +24.0410156250,384,859.3750000000,,, +24.0429687500,384,859.3750000000,,, +24.0449218750,384,859.3750000000,,, +24.0468750000,384,859.3750000000,,, +24.0488281250,384,859.3750000000,,, +24.0507812500,384,859.3750000000,,, +24.0527343750,384,859.3750000000,,, +24.0546875000,384,859.3750000000,,, +24.0566406250,384,859.3750000000,,, +24.0585937500,384,859.3750000000,,, +24.0605468750,384,859.3750000000,,, +24.0625000000,385,859.3750000000,,, +24.0644531250,385,859.3750000000,,, +24.0664062500,385,859.3750000000,,, +24.0683593750,385,859.3750000000,,, +24.0703125000,385,859.3750000000,,, +24.0722656250,385,859.3750000000,,, +24.0742187500,385,859.3750000000,,, +24.0761718750,385,859.3750000000,,, +24.0781250000,385,859.3750000000,,, +24.0800781250,385,859.3750000000,,, +24.0820312500,385,859.3750000000,,, +24.0839843750,385,859.3750000000,,, +24.0859375000,385,859.3750000000,,, +24.0878906250,385,859.3750000000,,, +24.0898437500,385,859.3750000000,,, +24.0917968750,385,859.3750000000,,, +24.0937500000,385,859.3750000000,,, +24.0957031250,385,859.3750000000,,, +24.0976562500,385,859.3750000000,,, +24.0996093750,385,859.3750000000,,, +24.1015625000,385,859.3750000000,,, +24.1035156250,385,859.3750000000,,, +24.1054687500,385,859.3750000000,,, +24.1074218750,385,859.3750000000,,, +24.1093750000,385,859.3750000000,,, +24.1113281250,385,859.3750000000,,, +24.1132812500,385,859.3750000000,,, +24.1152343750,385,859.3750000000,,, +24.1171875000,385,859.3750000000,,, +24.1191406250,385,859.3750000000,,, +24.1210937500,385,859.3750000000,,, +24.1230468750,385,859.3750000000,,, +24.1250000000,386,859.3750000000,,, +24.1269531250,386,859.3750000000,,, +24.1289062500,386,859.3750000000,,, +24.1308593750,386,859.3750000000,,, +24.1328125000,386,859.3750000000,,, +24.1347656250,386,859.3750000000,,, +24.1367187500,386,859.3750000000,,, +24.1386718750,386,859.3750000000,,, +24.1406250000,386,859.3750000000,,, +24.1425781250,386,859.3750000000,,, +24.1445312500,386,859.3750000000,,, +24.1464843750,386,859.3750000000,,, +24.1484375000,386,859.3750000000,,, +24.1503906250,386,859.3750000000,,, +24.1523437500,386,859.3750000000,,, +24.1542968750,386,859.3750000000,,, +24.1562500000,386,859.3750000000,,, +24.1582031250,386,859.3750000000,,, +24.1601562500,386,859.3750000000,,, +24.1621093750,386,859.3750000000,,, +24.1640625000,386,859.3750000000,,, +24.1660156250,386,859.3750000000,,, +24.1679687500,386,859.3750000000,,, +24.1699218750,386,859.3750000000,,, +24.1718750000,386,859.3750000000,,, +24.1738281250,386,859.3750000000,,, +24.1757812500,386,859.3750000000,,, +24.1777343750,386,859.3750000000,,, +24.1796875000,386,859.3750000000,,, +24.1816406250,386,859.3750000000,,, +24.1835937500,386,859.3750000000,,, +24.1855468750,386,859.3750000000,,, +24.1875000000,387,859.3750000000,,, +24.1894531250,387,859.3750000000,,, +24.1914062500,387,859.3750000000,,, +24.1933593750,387,859.3750000000,,, +24.1953125000,387,859.3750000000,,, +24.1972656250,387,859.3750000000,,, +24.1992187500,387,859.3750000000,,, +24.2011718750,387,859.3750000000,,, +24.2031250000,387,859.3750000000,,, +24.2050781250,387,859.3750000000,,, +24.2070312500,387,859.3750000000,,, +24.2089843750,387,859.3750000000,,, +24.2109375000,387,859.3750000000,,, +24.2128906250,387,859.3750000000,,, +24.2148437500,387,859.3750000000,,, +24.2167968750,387,859.3750000000,,, +24.2187500000,387,859.3750000000,,, +24.2207031250,387,859.3750000000,,, +24.2226562500,387,859.3750000000,,, +24.2246093750,387,859.3750000000,,, +24.2265625000,387,859.3750000000,,, +24.2285156250,387,859.3750000000,,, +24.2304687500,387,859.3750000000,,, +24.2324218750,387,859.3750000000,,, +24.2343750000,387,859.3750000000,,, +24.2363281250,387,859.3750000000,,, +24.2382812500,387,859.3750000000,,, +24.2402343750,387,859.3750000000,,, +24.2421875000,387,859.3750000000,,, +24.2441406250,387,859.3750000000,,, +24.2460937500,387,859.3750000000,,, +24.2480468750,387,859.3750000000,,, +24.2500000000,388,859.3750000000,,, +24.2519531250,388,859.3750000000,,, +24.2539062500,388,859.3750000000,,, +24.2558593750,388,859.3750000000,,, +24.2578125000,388,859.3750000000,,, +24.2597656250,388,859.3750000000,,, +24.2617187500,388,859.3750000000,,, +24.2636718750,388,859.3750000000,,, +24.2656250000,388,859.3750000000,,, +24.2675781250,388,859.3750000000,,, +24.2695312500,388,859.3750000000,,, +24.2714843750,388,859.3750000000,,, +24.2734375000,388,859.3750000000,,, +24.2753906250,388,859.3750000000,,, +24.2773437500,388,859.3750000000,,, +24.2792968750,388,859.3750000000,,, +24.2812500000,388,859.3750000000,,, +24.2832031250,388,859.3750000000,,, +24.2851562500,388,859.3750000000,,, +24.2871093750,388,859.3750000000,,, +24.2890625000,388,859.3750000000,,, +24.2910156250,388,859.3750000000,,, +24.2929687500,388,859.3750000000,,, +24.2949218750,388,859.3750000000,,, +24.2968750000,388,859.3750000000,,, +24.2988281250,388,859.3750000000,,, +24.3007812500,388,859.3750000000,,, +24.3027343750,388,859.3750000000,,, +24.3046875000,388,859.3750000000,,, +24.3066406250,388,859.3750000000,,, +24.3085937500,388,859.3750000000,,, +24.3105468750,388,859.3750000000,,, +24.3125000000,389,859.3750000000,,, +24.3144531250,389,859.3750000000,,, +24.3164062500,389,859.3750000000,,, +24.3183593750,389,859.3750000000,,, +24.3203125000,389,859.3750000000,,, +24.3222656250,389,859.3750000000,,, +24.3242187500,389,859.3750000000,,, +24.3261718750,389,859.3750000000,,, +24.3281250000,389,859.3750000000,,, +24.3300781250,389,859.3750000000,,, +24.3320312500,389,859.3750000000,,, +24.3339843750,389,859.3750000000,,, +24.3359375000,389,859.3750000000,,, +24.3378906250,389,859.3750000000,,, +24.3398437500,389,859.3750000000,,, +24.3417968750,389,859.3750000000,,, +24.3437500000,389,859.3750000000,,, +24.3457031250,389,859.3750000000,,, +24.3476562500,389,859.3750000000,,, +24.3496093750,389,859.3750000000,,, +24.3515625000,389,859.3750000000,,, +24.3535156250,389,859.3750000000,,, +24.3554687500,389,859.3750000000,,, +24.3574218750,389,859.3750000000,,, +24.3593750000,389,859.3750000000,,, +24.3613281250,389,859.3750000000,,, +24.3632812500,389,859.3750000000,,, +24.3652343750,389,859.3750000000,,, +24.3671875000,389,859.3750000000,,, +24.3691406250,389,859.3750000000,,, +24.3710937500,389,859.3750000000,,, +24.3730468750,389,859.3750000000,,, +24.3750000000,390,859.3750000000,,, +24.3769531250,390,859.3750000000,,, +24.3789062500,390,859.3750000000,,, +24.3808593750,390,859.3750000000,,, +24.3828125000,390,859.3750000000,,, +24.3847656250,390,859.3750000000,,, +24.3867187500,390,859.3750000000,,, +24.3886718750,390,859.3750000000,,, +24.3906250000,390,859.3750000000,,, +24.3925781250,390,859.3750000000,,, +24.3945312500,390,859.3750000000,,, +24.3964843750,390,859.3750000000,,, +24.3984375000,390,859.3750000000,,, +24.4003906250,390,859.3750000000,,, +24.4023437500,390,859.3750000000,,, +24.4042968750,390,859.3750000000,,, +24.4062500000,390,859.3750000000,,, +24.4082031250,390,859.3750000000,,, +24.4101562500,390,859.3750000000,,, +24.4121093750,390,859.3750000000,,, +24.4140625000,390,859.3750000000,,, +24.4160156250,390,859.3750000000,,, +24.4179687500,390,859.3750000000,,, +24.4199218750,390,859.3750000000,,, +24.4218750000,390,859.3750000000,,, +24.4238281250,390,859.3750000000,,, +24.4257812500,390,859.3750000000,,, +24.4277343750,390,859.3750000000,,, +24.4296875000,390,859.3750000000,,, +24.4316406250,390,859.3750000000,,, +24.4335937500,390,859.3750000000,,, +24.4355468750,390,859.3750000000,,, +24.4375000000,391,859.3750000000,,, +24.4394531250,391,859.3750000000,,, +24.4414062500,391,859.3750000000,,, +24.4433593750,391,859.3750000000,,, +24.4453125000,391,859.3750000000,,, +24.4472656250,391,859.3750000000,,, +24.4492187500,391,859.3750000000,,, +24.4511718750,391,859.3750000000,,, +24.4531250000,391,859.3750000000,,, +24.4550781250,391,859.3750000000,,, +24.4570312500,391,859.3750000000,,, +24.4589843750,391,859.3750000000,,, +24.4609375000,391,859.3750000000,,, +24.4628906250,391,859.3750000000,,, +24.4648437500,391,859.3750000000,,, +24.4667968750,391,859.3750000000,,, +24.4687500000,391,859.3750000000,,, +24.4707031250,391,859.3750000000,,, +24.4726562500,391,859.3750000000,,, +24.4746093750,391,859.3750000000,,, +24.4765625000,391,859.3750000000,,, +24.4785156250,391,859.3750000000,,, +24.4804687500,391,859.3750000000,,, +24.4824218750,391,859.3750000000,,, +24.4843750000,391,859.3750000000,,, +24.4863281250,391,859.3750000000,,, +24.4882812500,391,859.3750000000,,, +24.4902343750,391,859.3750000000,,, +24.4921875000,391,859.3750000000,,, +24.4941406250,391,859.3750000000,,, +24.4960937500,391,859.3750000000,,, +24.4980468750,391,859.3750000000,,, +24.5000000000,392,859.3750000000,,, +24.5019531250,392,859.3750000000,,, +24.5039062500,392,859.3750000000,,, +24.5058593750,392,859.3750000000,,, +24.5078125000,392,859.3750000000,,, +24.5097656250,392,859.3750000000,,, +24.5117187500,392,859.3750000000,,, +24.5136718750,392,859.3750000000,,, +24.5156250000,392,859.3750000000,,, +24.5175781250,392,859.3750000000,,, +24.5195312500,392,859.3750000000,,, +24.5214843750,392,859.3750000000,,, +24.5234375000,392,859.3750000000,,, +24.5253906250,392,859.3750000000,,, +24.5273437500,392,859.3750000000,,, +24.5292968750,392,859.3750000000,,, +24.5312500000,392,859.3750000000,,, +24.5332031250,392,859.3750000000,,, +24.5351562500,392,859.3750000000,,, +24.5371093750,392,859.3750000000,,, +24.5390625000,392,859.3750000000,,, +24.5410156250,392,859.3750000000,,, +24.5429687500,392,859.3750000000,,, +24.5449218750,392,859.3750000000,,, +24.5468750000,392,859.3750000000,,, +24.5488281250,392,859.3750000000,,, +24.5507812500,392,859.3750000000,,, +24.5527343750,392,859.3750000000,,, +24.5546875000,392,859.3750000000,,, +24.5566406250,392,859.3750000000,,, +24.5585937500,392,859.3750000000,,, +24.5605468750,392,859.3750000000,,, +24.5625000000,393,859.3750000000,,, +24.5644531250,393,859.3750000000,,, +24.5664062500,393,859.3750000000,,, +24.5683593750,393,859.3750000000,,, +24.5703125000,393,859.3750000000,,, +24.5722656250,393,859.3750000000,,, +24.5742187500,393,859.3750000000,,, +24.5761718750,393,859.3750000000,,, +24.5781250000,393,859.3750000000,,, +24.5800781250,393,859.3750000000,,, +24.5820312500,393,859.3750000000,,, +24.5839843750,393,859.3750000000,,, +24.5859375000,393,859.3750000000,,, +24.5878906250,393,859.3750000000,,, +24.5898437500,393,859.3750000000,,, +24.5917968750,393,859.3750000000,,, +24.5937500000,393,859.3750000000,,, +24.5957031250,393,859.3750000000,,, +24.5976562500,393,859.3750000000,,, +24.5996093750,393,859.3750000000,,, +24.6015625000,393,859.3750000000,,, +24.6035156250,393,859.3750000000,,, +24.6054687500,393,859.3750000000,,, +24.6074218750,393,859.3750000000,,, +24.6093750000,393,859.3750000000,,, +24.6113281250,393,859.3750000000,,, +24.6132812500,393,859.3750000000,,, +24.6152343750,393,859.3750000000,,, +24.6171875000,393,859.3750000000,,, +24.6191406250,393,859.3750000000,,, +24.6210937500,393,859.3750000000,,, +24.6230468750,393,859.3750000000,,, +24.6250000000,394,859.3750000000,,, +24.6269531250,394,859.3750000000,,, +24.6289062500,394,859.3750000000,,, +24.6308593750,394,859.3750000000,,, +24.6328125000,394,859.3750000000,,, +24.6347656250,394,859.3750000000,,, +24.6367187500,394,859.3750000000,,, +24.6386718750,394,859.3750000000,,, +24.6406250000,394,859.3750000000,,, +24.6425781250,394,859.3750000000,,, +24.6445312500,394,859.3750000000,,, +24.6464843750,394,859.3750000000,,, +24.6484375000,394,859.3750000000,,, +24.6503906250,394,859.3750000000,,, +24.6523437500,394,859.3750000000,,, +24.6542968750,394,859.3750000000,,, +24.6562500000,394,859.3750000000,,, +24.6582031250,394,859.3750000000,,, +24.6601562500,394,859.3750000000,,, +24.6621093750,394,859.3750000000,,, +24.6640625000,394,859.3750000000,,, +24.6660156250,394,859.3750000000,,, +24.6679687500,394,859.3750000000,,, +24.6699218750,394,859.3750000000,,, +24.6718750000,394,859.3750000000,,, +24.6738281250,394,859.3750000000,,, +24.6757812500,394,859.3750000000,,, +24.6777343750,394,859.3750000000,,, +24.6796875000,394,859.3750000000,,, +24.6816406250,394,859.3750000000,,, +24.6835937500,394,859.3750000000,,, +24.6855468750,394,859.3750000000,,, +24.6875000000,395,859.3750000000,,, +24.6894531250,395,859.3750000000,,, +24.6914062500,395,859.3750000000,,, +24.6933593750,395,859.3750000000,,, +24.6953125000,395,859.3750000000,,, +24.6972656250,395,859.3750000000,,, +24.6992187500,395,859.3750000000,,, +24.7011718750,395,859.3750000000,,, +24.7031250000,395,859.3750000000,,, +24.7050781250,395,859.3750000000,,, +24.7070312500,395,859.3750000000,,, +24.7089843750,395,859.3750000000,,, +24.7109375000,395,859.3750000000,,, +24.7128906250,395,859.3750000000,,, +24.7148437500,395,859.3750000000,,, +24.7167968750,395,859.3750000000,,, +24.7187500000,395,859.3750000000,,, +24.7207031250,395,859.3750000000,,, +24.7226562500,395,859.3750000000,,, +24.7246093750,395,859.3750000000,,, +24.7265625000,395,859.3750000000,,, +24.7285156250,395,859.3750000000,,, +24.7304687500,395,859.3750000000,,, +24.7324218750,395,859.3750000000,,, +24.7343750000,395,859.3750000000,,, +24.7363281250,395,859.3750000000,,, +24.7382812500,395,859.3750000000,,, +24.7402343750,395,859.3750000000,,, +24.7421875000,395,859.3750000000,,, +24.7441406250,395,859.3750000000,,, +24.7460937500,395,859.3750000000,,, +24.7480468750,395,859.3750000000,,, +24.7500000000,396,1087.8906250000,,, +24.7519531250,396,1087.8906250000,,, +24.7539062500,396,1087.8906250000,,, +24.7558593750,396,1087.8906250000,,, +24.7578125000,396,1087.8906250000,,, +24.7597656250,396,1087.8906250000,,, +24.7617187500,396,1087.8906250000,,, +24.7636718750,396,1087.8906250000,,, +24.7656250000,396,1087.8906250000,,, +24.7675781250,396,1087.8906250000,,, +24.7695312500,396,1087.8906250000,,, +24.7714843750,396,1087.8906250000,,, +24.7734375000,396,1087.8906250000,,, +24.7753906250,396,1087.8906250000,,, +24.7773437500,396,1087.8906250000,,, +24.7792968750,396,1087.8906250000,,, +24.7812500000,396,1087.8906250000,,, +24.7832031250,396,1087.8906250000,,, +24.7851562500,396,1087.8906250000,,, +24.7871093750,396,1087.8906250000,,, +24.7890625000,396,1087.8906250000,,, +24.7910156250,396,1087.8906250000,,, +24.7929687500,396,1087.8906250000,,, +24.7949218750,396,1087.8906250000,,, +24.7968750000,396,1087.8906250000,,, +24.7988281250,396,1087.8906250000,,, +24.8007812500,396,1087.8906250000,,, +24.8027343750,396,1087.8906250000,,, +24.8046875000,396,1087.8906250000,,, +24.8066406250,396,1087.8906250000,,, +24.8085937500,396,1087.8906250000,,, +24.8105468750,396,1087.8906250000,,, +24.8125000000,397,1087.8906250000,,, +24.8144531250,397,1087.8906250000,,, +24.8164062500,397,1087.8906250000,,, +24.8183593750,397,1087.8906250000,,, +24.8203125000,397,1087.8906250000,,, +24.8222656250,397,1087.8906250000,,, +24.8242187500,397,1087.8906250000,,, +24.8261718750,397,1087.8906250000,,, +24.8281250000,397,1087.8906250000,,, +24.8300781250,397,1087.8906250000,,, +24.8320312500,397,1087.8906250000,,, +24.8339843750,397,1087.8906250000,,, +24.8359375000,397,1087.8906250000,,, +24.8378906250,397,1087.8906250000,,, +24.8398437500,397,1087.8906250000,,, +24.8417968750,397,1087.8906250000,,, +24.8437500000,397,1087.8906250000,,, +24.8457031250,397,1087.8906250000,,, +24.8476562500,397,1087.8906250000,,, +24.8496093750,397,1087.8906250000,,, +24.8515625000,397,1087.8906250000,,, +24.8535156250,397,1087.8906250000,,, +24.8554687500,397,1087.8906250000,,, +24.8574218750,397,1087.8906250000,,, +24.8593750000,397,1087.8906250000,,, +24.8613281250,397,1087.8906250000,,, +24.8632812500,397,1087.8906250000,,, +24.8652343750,397,1087.8906250000,,, +24.8671875000,397,1087.8906250000,,, +24.8691406250,397,1087.8906250000,,, +24.8710937500,397,1087.8906250000,,, +24.8730468750,397,1087.8906250000,,, +24.8750000000,398,1087.8906250000,,, +24.8769531250,398,1087.8906250000,,, +24.8789062500,398,1087.8906250000,,, +24.8808593750,398,1087.8906250000,,, +24.8828125000,398,1087.8906250000,,, +24.8847656250,398,1087.8906250000,,, +24.8867187500,398,1087.8906250000,,, +24.8886718750,398,1087.8906250000,,, +24.8906250000,398,1087.8906250000,,, +24.8925781250,398,1087.8906250000,,, +24.8945312500,398,1087.8906250000,,, +24.8964843750,398,1087.8906250000,,, +24.8984375000,398,1087.8906250000,,, +24.9003906250,398,1087.8906250000,,, +24.9023437500,398,1087.8906250000,,, +24.9042968750,398,1087.8906250000,,, +24.9062500000,398,1087.8906250000,,, +24.9082031250,398,1087.8906250000,,, +24.9101562500,398,1087.8906250000,,, +24.9121093750,398,1087.8906250000,,, +24.9140625000,398,1087.8906250000,,, +24.9160156250,398,1087.8906250000,,, +24.9179687500,398,1087.8906250000,,, +24.9199218750,398,1087.8906250000,,, +24.9218750000,398,1087.8906250000,,, +24.9238281250,398,1087.8906250000,,, +24.9257812500,398,1087.8906250000,,, +24.9277343750,398,1087.8906250000,,, +24.9296875000,398,1087.8906250000,,, +24.9316406250,398,1087.8906250000,,, +24.9335937500,398,1087.8906250000,,, +24.9355468750,398,1087.8906250000,,, +24.9375000000,399,1087.8906250000,,, +24.9394531250,399,1087.8906250000,,, +24.9414062500,399,1087.8906250000,,, +24.9433593750,399,1087.8906250000,,, +24.9453125000,399,1087.8906250000,,, +24.9472656250,399,1087.8906250000,,, +24.9492187500,399,1087.8906250000,,, +24.9511718750,399,1087.8906250000,,, +24.9531250000,399,1087.8906250000,,, +24.9550781250,399,1087.8906250000,,, +24.9570312500,399,1087.8906250000,,, +24.9589843750,399,1087.8906250000,,, +24.9609375000,399,1087.8906250000,,, +24.9628906250,399,1087.8906250000,,, +24.9648437500,399,1087.8906250000,,, +24.9667968750,399,1087.8906250000,,, +24.9687500000,399,1087.8906250000,,, +24.9707031250,399,1087.8906250000,,, +24.9726562500,399,1087.8906250000,,, +24.9746093750,399,1087.8906250000,,, +24.9765625000,399,1087.8906250000,,, +24.9785156250,399,1087.8906250000,,, +24.9804687500,399,1087.8906250000,,, +24.9824218750,399,1087.8906250000,,, +24.9843750000,399,1087.8906250000,,, +24.9863281250,399,1087.8906250000,,, +24.9882812500,399,1087.8906250000,,, +24.9902343750,399,1087.8906250000,,, +24.9921875000,399,1087.8906250000,,, +24.9941406250,399,1087.8906250000,,, +24.9960937500,399,1087.8906250000,,, +24.9980468750,399,1087.8906250000,,, +25.0000000000,400,1087.8906250000,,, +25.0019531250,400,1087.8906250000,,, +25.0039062500,400,1087.8906250000,,, +25.0058593750,400,1087.8906250000,,, +25.0078125000,400,1087.8906250000,,, +25.0097656250,400,1087.8906250000,,, +25.0117187500,400,1087.8906250000,,, +25.0136718750,400,1087.8906250000,,, +25.0156250000,400,1087.8906250000,,, +25.0175781250,400,1087.8906250000,,, +25.0195312500,400,1087.8906250000,,, +25.0214843750,400,1087.8906250000,,, +25.0234375000,400,1087.8906250000,,, +25.0253906250,400,1087.8906250000,,, +25.0273437500,400,1087.8906250000,,, +25.0292968750,400,1087.8906250000,,, +25.0312500000,400,1087.8906250000,,, +25.0332031250,400,1087.8906250000,,, +25.0351562500,400,1087.8906250000,,, +25.0371093750,400,1087.8906250000,,, +25.0390625000,400,1087.8906250000,,, +25.0410156250,400,1087.8906250000,,, +25.0429687500,400,1087.8906250000,,, +25.0449218750,400,1087.8906250000,,, +25.0468750000,400,1087.8906250000,,, +25.0488281250,400,1087.8906250000,,, +25.0507812500,400,1087.8906250000,,, +25.0527343750,400,1087.8906250000,,, +25.0546875000,400,1087.8906250000,,, +25.0566406250,400,1087.8906250000,,, +25.0585937500,400,1087.8906250000,,, +25.0605468750,400,1087.8906250000,,, +25.0625000000,401,1087.8906250000,,, +25.0644531250,401,1087.8906250000,,, +25.0664062500,401,1087.8906250000,,, +25.0683593750,401,1087.8906250000,,, +25.0703125000,401,1087.8906250000,,, +25.0722656250,401,1087.8906250000,,, +25.0742187500,401,1087.8906250000,,, +25.0761718750,401,1087.8906250000,,, +25.0781250000,401,1087.8906250000,,, +25.0800781250,401,1087.8906250000,,, +25.0820312500,401,1087.8906250000,,, +25.0839843750,401,1087.8906250000,,, +25.0859375000,401,1087.8906250000,,, +25.0878906250,401,1087.8906250000,,, +25.0898437500,401,1087.8906250000,,, +25.0917968750,401,1087.8906250000,,, +25.0937500000,401,1087.8906250000,,, +25.0957031250,401,1087.8906250000,,, +25.0976562500,401,1087.8906250000,,, +25.0996093750,401,1087.8906250000,,, +25.1015625000,401,1087.8906250000,,, +25.1035156250,401,1087.8906250000,,, +25.1054687500,401,1087.8906250000,,, +25.1074218750,401,1087.8906250000,,, +25.1093750000,401,1087.8906250000,,, +25.1113281250,401,1087.8906250000,,, +25.1132812500,401,1087.8906250000,,, +25.1152343750,401,1087.8906250000,,, +25.1171875000,401,1087.8906250000,,, +25.1191406250,401,1087.8906250000,,, +25.1210937500,401,1087.8906250000,,, +25.1230468750,401,1087.8906250000,,, +25.1250000000,402,1087.8906250000,,, +25.1269531250,402,1087.8906250000,,, +25.1289062500,402,1087.8906250000,,, +25.1308593750,402,1087.8906250000,,, +25.1328125000,402,1087.8906250000,,, +25.1347656250,402,1087.8906250000,,, +25.1367187500,402,1087.8906250000,,, +25.1386718750,402,1087.8906250000,,, +25.1406250000,402,1087.8906250000,,, +25.1425781250,402,1087.8906250000,,, +25.1445312500,402,1087.8906250000,,, +25.1464843750,402,1087.8906250000,,, +25.1484375000,402,1087.8906250000,,, +25.1503906250,402,1087.8906250000,,, +25.1523437500,402,1087.8906250000,,, +25.1542968750,402,1087.8906250000,,, +25.1562500000,402,1087.8906250000,,, +25.1582031250,402,1087.8906250000,,, +25.1601562500,402,1087.8906250000,,, +25.1621093750,402,1087.8906250000,,, +25.1640625000,402,1087.8906250000,,, +25.1660156250,402,1087.8906250000,,, +25.1679687500,402,1087.8906250000,,, +25.1699218750,402,1087.8906250000,,, +25.1718750000,402,1087.8906250000,,, +25.1738281250,402,1087.8906250000,,, +25.1757812500,402,1087.8906250000,,, +25.1777343750,402,1087.8906250000,,, +25.1796875000,402,1087.8906250000,,, +25.1816406250,402,1087.8906250000,,, +25.1835937500,402,1087.8906250000,,, +25.1855468750,402,1087.8906250000,,, +25.1875000000,403,1087.8906250000,,, +25.1894531250,403,1087.8906250000,,, +25.1914062500,403,1087.8906250000,,, +25.1933593750,403,1087.8906250000,,, +25.1953125000,403,1087.8906250000,,, +25.1972656250,403,1087.8906250000,,, +25.1992187500,403,1087.8906250000,,, +25.2011718750,403,1087.8906250000,,, +25.2031250000,403,1087.8906250000,,, +25.2050781250,403,1087.8906250000,,, +25.2070312500,403,1087.8906250000,,, +25.2089843750,403,1087.8906250000,,, +25.2109375000,403,1087.8906250000,,, +25.2128906250,403,1087.8906250000,,, +25.2148437500,403,1087.8906250000,,, +25.2167968750,403,1087.8906250000,,, +25.2187500000,403,1087.8906250000,,, +25.2207031250,403,1087.8906250000,,, +25.2226562500,403,1087.8906250000,,, +25.2246093750,403,1087.8906250000,,, +25.2265625000,403,1087.8906250000,,, +25.2285156250,403,1087.8906250000,,, +25.2304687500,403,1087.8906250000,,, +25.2324218750,403,1087.8906250000,,, +25.2343750000,403,1087.8906250000,,, +25.2363281250,403,1087.8906250000,,, +25.2382812500,403,1087.8906250000,,, +25.2402343750,403,1087.8906250000,,, +25.2421875000,403,1087.8906250000,,, +25.2441406250,403,1087.8906250000,,, +25.2460937500,403,1087.8906250000,,, +25.2480468750,403,1087.8906250000,,, +25.2500000000,404,1087.8906250000,,, +25.2519531250,404,1087.8906250000,,, +25.2539062500,404,1087.8906250000,,, +25.2558593750,404,1087.8906250000,,, +25.2578125000,404,1087.8906250000,,, +25.2597656250,404,1087.8906250000,,, +25.2617187500,404,1087.8906250000,,, +25.2636718750,404,1087.8906250000,,, +25.2656250000,404,1087.8906250000,,, +25.2675781250,404,1087.8906250000,,, +25.2695312500,404,1087.8906250000,,, +25.2714843750,404,1087.8906250000,,, +25.2734375000,404,1087.8906250000,,, +25.2753906250,404,1087.8906250000,,, +25.2773437500,404,1087.8906250000,,, +25.2792968750,404,1087.8906250000,,, +25.2812500000,404,1087.8906250000,,, +25.2832031250,404,1087.8906250000,,, +25.2851562500,404,1087.8906250000,,, +25.2871093750,404,1087.8906250000,,, +25.2890625000,404,1087.8906250000,,, +25.2910156250,404,1087.8906250000,,, +25.2929687500,404,1087.8906250000,,, +25.2949218750,404,1087.8906250000,,, +25.2968750000,404,1087.8906250000,,, +25.2988281250,404,1087.8906250000,,, +25.3007812500,404,1087.8906250000,,, +25.3027343750,404,1087.8906250000,,, +25.3046875000,404,1087.8906250000,,, +25.3066406250,404,1087.8906250000,,, +25.3085937500,404,1087.8906250000,,, +25.3105468750,404,1087.8906250000,,, +25.3125000000,405,1087.8906250000,,, +25.3144531250,405,1087.8906250000,,, +25.3164062500,405,1087.8906250000,,, +25.3183593750,405,1087.8906250000,,, +25.3203125000,405,1087.8906250000,,, +25.3222656250,405,1087.8906250000,,, +25.3242187500,405,1087.8906250000,,, +25.3261718750,405,1087.8906250000,,, +25.3281250000,405,1087.8906250000,,, +25.3300781250,405,1087.8906250000,,, +25.3320312500,405,1087.8906250000,,, +25.3339843750,405,1087.8906250000,,, +25.3359375000,405,1087.8906250000,,, +25.3378906250,405,1087.8906250000,,, +25.3398437500,405,1087.8906250000,,, +25.3417968750,405,1087.8906250000,,, +25.3437500000,405,1087.8906250000,,, +25.3457031250,405,1087.8906250000,,, +25.3476562500,405,1087.8906250000,,, +25.3496093750,405,1087.8906250000,,, +25.3515625000,405,1087.8906250000,,, +25.3535156250,405,1087.8906250000,,, +25.3554687500,405,1087.8906250000,,, +25.3574218750,405,1087.8906250000,,, +25.3593750000,405,1087.8906250000,,, +25.3613281250,405,1087.8906250000,,, +25.3632812500,405,1087.8906250000,,, +25.3652343750,405,1087.8906250000,,, +25.3671875000,405,1087.8906250000,,, +25.3691406250,405,1087.8906250000,,, +25.3710937500,405,1087.8906250000,,, +25.3730468750,405,1087.8906250000,,, +25.3750000000,406,1087.8906250000,,, +25.3769531250,406,1087.8906250000,,, +25.3789062500,406,1087.8906250000,,, +25.3808593750,406,1087.8906250000,,, +25.3828125000,406,1087.8906250000,,, +25.3847656250,406,1087.8906250000,,, +25.3867187500,406,1087.8906250000,,, +25.3886718750,406,1087.8906250000,,, +25.3906250000,406,1087.8906250000,,, +25.3925781250,406,1087.8906250000,,, +25.3945312500,406,1087.8906250000,,, +25.3964843750,406,1087.8906250000,,, +25.3984375000,406,1087.8906250000,,, +25.4003906250,406,1087.8906250000,,, +25.4023437500,406,1087.8906250000,,, +25.4042968750,406,1087.8906250000,,, +25.4062500000,406,1087.8906250000,,, +25.4082031250,406,1087.8906250000,,, +25.4101562500,406,1087.8906250000,,, +25.4121093750,406,1087.8906250000,,, +25.4140625000,406,1087.8906250000,,, +25.4160156250,406,1087.8906250000,,, +25.4179687500,406,1087.8906250000,,, +25.4199218750,406,1087.8906250000,,, +25.4218750000,406,1087.8906250000,,, +25.4238281250,406,1087.8906250000,,, +25.4257812500,406,1087.8906250000,,, +25.4277343750,406,1087.8906250000,,, +25.4296875000,406,1087.8906250000,,, +25.4316406250,406,1087.8906250000,,, +25.4335937500,406,1087.8906250000,,, +25.4355468750,406,1087.8906250000,,, +25.4375000000,407,1087.8906250000,,, +25.4394531250,407,1087.8906250000,,, +25.4414062500,407,1087.8906250000,,, +25.4433593750,407,1087.8906250000,,, +25.4453125000,407,1087.8906250000,,, +25.4472656250,407,1087.8906250000,,, +25.4492187500,407,1087.8906250000,,, +25.4511718750,407,1087.8906250000,,, +25.4531250000,407,1087.8906250000,,, +25.4550781250,407,1087.8906250000,,, +25.4570312500,407,1087.8906250000,,, +25.4589843750,407,1087.8906250000,,, +25.4609375000,407,1087.8906250000,,, +25.4628906250,407,1087.8906250000,,, +25.4648437500,407,1087.8906250000,,, +25.4667968750,407,1087.8906250000,,, +25.4687500000,407,1087.8906250000,,, +25.4707031250,407,1087.8906250000,,, +25.4726562500,407,1087.8906250000,,, +25.4746093750,407,1087.8906250000,,, +25.4765625000,407,1087.8906250000,,, +25.4785156250,407,1087.8906250000,,, +25.4804687500,407,1087.8906250000,,, +25.4824218750,407,1087.8906250000,,, +25.4843750000,407,1087.8906250000,,, +25.4863281250,407,1087.8906250000,,, +25.4882812500,407,1087.8906250000,,, +25.4902343750,407,1087.8906250000,,, +25.4921875000,407,1087.8906250000,,, +25.4941406250,407,1087.8906250000,,, +25.4960937500,407,1087.8906250000,,, +25.4980468750,407,1087.8906250000,,, +25.5000000000,408,1087.8906250000,,, +25.5019531250,408,1087.8906250000,,, +25.5039062500,408,1087.8906250000,,, +25.5058593750,408,1087.8906250000,,, +25.5078125000,408,1087.8906250000,,, +25.5097656250,408,1087.8906250000,,, +25.5117187500,408,1087.8906250000,,, +25.5136718750,408,1087.8906250000,,, +25.5156250000,408,1087.8906250000,,, +25.5175781250,408,1087.8906250000,,, +25.5195312500,408,1087.8906250000,,, +25.5214843750,408,1087.8906250000,,, +25.5234375000,408,1087.8906250000,,, +25.5253906250,408,1087.8906250000,,, +25.5273437500,408,1087.8906250000,,, +25.5292968750,408,1087.8906250000,,, +25.5312500000,408,1087.8906250000,,, +25.5332031250,408,1087.8906250000,,, +25.5351562500,408,1087.8906250000,,, +25.5371093750,408,1087.8906250000,,, +25.5390625000,408,1087.8906250000,,, +25.5410156250,408,1087.8906250000,,, +25.5429687500,408,1087.8906250000,,, +25.5449218750,408,1087.8906250000,,, +25.5468750000,408,1087.8906250000,,, +25.5488281250,408,1087.8906250000,,, +25.5507812500,408,1087.8906250000,,, +25.5527343750,408,1087.8906250000,,, +25.5546875000,408,1087.8906250000,,, +25.5566406250,408,1087.8906250000,,, +25.5585937500,408,1087.8906250000,,, +25.5605468750,408,1087.8906250000,,, +25.5625000000,409,1087.8906250000,,, +25.5644531250,409,1087.8906250000,,, +25.5664062500,409,1087.8906250000,,, +25.5683593750,409,1087.8906250000,,, +25.5703125000,409,1087.8906250000,,, +25.5722656250,409,1087.8906250000,,, +25.5742187500,409,1087.8906250000,,, +25.5761718750,409,1087.8906250000,,, +25.5781250000,409,1087.8906250000,,, +25.5800781250,409,1087.8906250000,,, +25.5820312500,409,1087.8906250000,,, +25.5839843750,409,1087.8906250000,,, +25.5859375000,409,1087.8906250000,,, +25.5878906250,409,1087.8906250000,,, +25.5898437500,409,1087.8906250000,,, +25.5917968750,409,1087.8906250000,,, +25.5937500000,409,1087.8906250000,,, +25.5957031250,409,1087.8906250000,,, +25.5976562500,409,1087.8906250000,,, +25.5996093750,409,1087.8906250000,,, +25.6015625000,409,1087.8906250000,,, +25.6035156250,409,1087.8906250000,,, +25.6054687500,409,1087.8906250000,,, +25.6074218750,409,1087.8906250000,,, +25.6093750000,409,1087.8906250000,,, +25.6113281250,409,1087.8906250000,,, +25.6132812500,409,1087.8906250000,,, +25.6152343750,409,1087.8906250000,,, +25.6171875000,409,1087.8906250000,,, +25.6191406250,409,1087.8906250000,,, +25.6210937500,409,1087.8906250000,,, +25.6230468750,409,1087.8906250000,,, +25.6250000000,410,1087.8906250000,,, +25.6269531250,410,1087.8906250000,,, +25.6289062500,410,1087.8906250000,,, +25.6308593750,410,1087.8906250000,,, +25.6328125000,410,1087.8906250000,,, +25.6347656250,410,1087.8906250000,,, +25.6367187500,410,1087.8906250000,,, +25.6386718750,410,1087.8906250000,,, +25.6406250000,410,1087.8906250000,,, +25.6425781250,410,1087.8906250000,,, +25.6445312500,410,1087.8906250000,,, +25.6464843750,410,1087.8906250000,,, +25.6484375000,410,1087.8906250000,,, +25.6503906250,410,1087.8906250000,,, +25.6523437500,410,1087.8906250000,,, +25.6542968750,410,1087.8906250000,,, +25.6562500000,410,1087.8906250000,,, +25.6582031250,410,1087.8906250000,,, +25.6601562500,410,1087.8906250000,,, +25.6621093750,410,1087.8906250000,,, +25.6640625000,410,1087.8906250000,,, +25.6660156250,410,1087.8906250000,,, +25.6679687500,410,1087.8906250000,,, +25.6699218750,410,1087.8906250000,,, +25.6718750000,410,1087.8906250000,,, +25.6738281250,410,1087.8906250000,,, +25.6757812500,410,1087.8906250000,,, +25.6777343750,410,1087.8906250000,,, +25.6796875000,410,1087.8906250000,,, +25.6816406250,410,1087.8906250000,,, +25.6835937500,410,1087.8906250000,,, +25.6855468750,410,1087.8906250000,,, +25.6875000000,411,1087.8906250000,,, +25.6894531250,411,1087.8906250000,,, +25.6914062500,411,1087.8906250000,,, +25.6933593750,411,1087.8906250000,,, +25.6953125000,411,1087.8906250000,,, +25.6972656250,411,1087.8906250000,,, +25.6992187500,411,1087.8906250000,,, +25.7011718750,411,1087.8906250000,,, +25.7031250000,411,1087.8906250000,,, +25.7050781250,411,1087.8906250000,,, +25.7070312500,411,1087.8906250000,,, +25.7089843750,411,1087.8906250000,,, +25.7109375000,411,1087.8906250000,,, +25.7128906250,411,1087.8906250000,,, +25.7148437500,411,1087.8906250000,,, +25.7167968750,411,1087.8906250000,,, +25.7187500000,411,1087.8906250000,,, +25.7207031250,411,1087.8906250000,,, +25.7226562500,411,1087.8906250000,,, +25.7246093750,411,1087.8906250000,,, +25.7265625000,411,1087.8906250000,,, +25.7285156250,411,1087.8906250000,,, +25.7304687500,411,1087.8906250000,,, +25.7324218750,411,1087.8906250000,,, +25.7343750000,411,1087.8906250000,,, +25.7363281250,411,1087.8906250000,,, +25.7382812500,411,1087.8906250000,,, +25.7402343750,411,1087.8906250000,,, +25.7421875000,411,1087.8906250000,,, +25.7441406250,411,1087.8906250000,,, +25.7460937500,411,1087.8906250000,,, +25.7480468750,411,1087.8906250000,,, +25.7500000000,412,1048.8281250000,,, +25.7519531250,412,1048.8281250000,,, +25.7539062500,412,1048.8281250000,,, +25.7558593750,412,1048.8281250000,,, +25.7578125000,412,1048.8281250000,,, +25.7597656250,412,1048.8281250000,,, +25.7617187500,412,1048.8281250000,,, +25.7636718750,412,1048.8281250000,,, +25.7656250000,412,1048.8281250000,,, +25.7675781250,412,1048.8281250000,,, +25.7695312500,412,1048.8281250000,,, +25.7714843750,412,1048.8281250000,,, +25.7734375000,412,1048.8281250000,,, +25.7753906250,412,1048.8281250000,,, +25.7773437500,412,1048.8281250000,,, +25.7792968750,412,1048.8281250000,,, +25.7812500000,412,1048.8281250000,,, +25.7832031250,412,1048.8281250000,,, +25.7851562500,412,1048.8281250000,,, +25.7871093750,412,1048.8281250000,,, +25.7890625000,412,1048.8281250000,,, +25.7910156250,412,1048.8281250000,,, +25.7929687500,412,1048.8281250000,,, +25.7949218750,412,1048.8281250000,,, +25.7968750000,412,1048.8281250000,,, +25.7988281250,412,1048.8281250000,,, +25.8007812500,412,1048.8281250000,,, +25.8027343750,412,1048.8281250000,,, +25.8046875000,412,1048.8281250000,,, +25.8066406250,412,1048.8281250000,,, +25.8085937500,412,1048.8281250000,,, +25.8105468750,412,1048.8281250000,,, +25.8125000000,413,1048.8281250000,,, +25.8144531250,413,1048.8281250000,,, +25.8164062500,413,1048.8281250000,,, +25.8183593750,413,1048.8281250000,,, +25.8203125000,413,1048.8281250000,,, +25.8222656250,413,1048.8281250000,,, +25.8242187500,413,1048.8281250000,,, +25.8261718750,413,1048.8281250000,,, +25.8281250000,413,1048.8281250000,,, +25.8300781250,413,1048.8281250000,,, +25.8320312500,413,1048.8281250000,,, +25.8339843750,413,1048.8281250000,,, +25.8359375000,413,1048.8281250000,,, +25.8378906250,413,1048.8281250000,,, +25.8398437500,413,1048.8281250000,,, +25.8417968750,413,1048.8281250000,,, +25.8437500000,413,1048.8281250000,,, +25.8457031250,413,1048.8281250000,,, +25.8476562500,413,1048.8281250000,,, +25.8496093750,413,1048.8281250000,,, +25.8515625000,413,1048.8281250000,,, +25.8535156250,413,1048.8281250000,,, +25.8554687500,413,1048.8281250000,,, +25.8574218750,413,1048.8281250000,,, +25.8593750000,413,1048.8281250000,,, +25.8613281250,413,1048.8281250000,,, +25.8632812500,413,1048.8281250000,,, +25.8652343750,413,1048.8281250000,,, +25.8671875000,413,1048.8281250000,,, +25.8691406250,413,1048.8281250000,,, +25.8710937500,413,1048.8281250000,,, +25.8730468750,413,1048.8281250000,,, +25.8750000000,414,1048.8281250000,,, +25.8769531250,414,1048.8281250000,,, +25.8789062500,414,1048.8281250000,,, +25.8808593750,414,1048.8281250000,,, +25.8828125000,414,1048.8281250000,,, +25.8847656250,414,1048.8281250000,,, +25.8867187500,414,1048.8281250000,,, +25.8886718750,414,1048.8281250000,,, +25.8906250000,414,1048.8281250000,,, +25.8925781250,414,1048.8281250000,,, +25.8945312500,414,1048.8281250000,,, +25.8964843750,414,1048.8281250000,,, +25.8984375000,414,1048.8281250000,,, +25.9003906250,414,1048.8281250000,,, +25.9023437500,414,1048.8281250000,,, +25.9042968750,414,1048.8281250000,,, +25.9062500000,414,1048.8281250000,,, +25.9082031250,414,1048.8281250000,,, +25.9101562500,414,1048.8281250000,,, +25.9121093750,414,1048.8281250000,,, +25.9140625000,414,1048.8281250000,,, +25.9160156250,414,1048.8281250000,,, +25.9179687500,414,1048.8281250000,,, +25.9199218750,414,1048.8281250000,,, +25.9218750000,414,1048.8281250000,,, +25.9238281250,414,1048.8281250000,,, +25.9257812500,414,1048.8281250000,,, +25.9277343750,414,1048.8281250000,,, +25.9296875000,414,1048.8281250000,,, +25.9316406250,414,1048.8281250000,,, +25.9335937500,414,1048.8281250000,,, +25.9355468750,414,1048.8281250000,,, +25.9375000000,415,1048.8281250000,,, +25.9394531250,415,1048.8281250000,,, +25.9414062500,415,1048.8281250000,,, +25.9433593750,415,1048.8281250000,,, +25.9453125000,415,1048.8281250000,,, +25.9472656250,415,1048.8281250000,,, +25.9492187500,415,1048.8281250000,,, +25.9511718750,415,1048.8281250000,,, +25.9531250000,415,1048.8281250000,,, +25.9550781250,415,1048.8281250000,,, +25.9570312500,415,1048.8281250000,,, +25.9589843750,415,1048.8281250000,,, +25.9609375000,415,1048.8281250000,,, +25.9628906250,415,1048.8281250000,,, +25.9648437500,415,1048.8281250000,,, +25.9667968750,415,1048.8281250000,,, +25.9687500000,415,1048.8281250000,,, +25.9707031250,415,1048.8281250000,,, +25.9726562500,415,1048.8281250000,,, +25.9746093750,415,1048.8281250000,,, +25.9765625000,415,1048.8281250000,,, +25.9785156250,415,1048.8281250000,,, +25.9804687500,415,1048.8281250000,,, +25.9824218750,415,1048.8281250000,,, +25.9843750000,415,1048.8281250000,,, +25.9863281250,415,1048.8281250000,,, +25.9882812500,415,1048.8281250000,,, +25.9902343750,415,1048.8281250000,,, +25.9921875000,415,1048.8281250000,,, +25.9941406250,415,1048.8281250000,,, +25.9960937500,415,1048.8281250000,,, +25.9980468750,415,1048.8281250000,,, +26.0000000000,416,1048.8281250000,,, +26.0019531250,416,1048.8281250000,,, +26.0039062500,416,1048.8281250000,,, +26.0058593750,416,1048.8281250000,,, +26.0078125000,416,1048.8281250000,,, +26.0097656250,416,1048.8281250000,,, +26.0117187500,416,1048.8281250000,,, +26.0136718750,416,1048.8281250000,,, +26.0156250000,416,1048.8281250000,,, +26.0175781250,416,1048.8281250000,,, +26.0195312500,416,1048.8281250000,,, +26.0214843750,416,1048.8281250000,,, +26.0234375000,416,1048.8281250000,,, +26.0253906250,416,1048.8281250000,,, +26.0273437500,416,1048.8281250000,,, +26.0292968750,416,1048.8281250000,,, +26.0312500000,416,1048.8281250000,,, +26.0332031250,416,1048.8281250000,,, +26.0351562500,416,1048.8281250000,,, +26.0371093750,416,1048.8281250000,,, +26.0390625000,416,1048.8281250000,,, +26.0410156250,416,1048.8281250000,,, +26.0429687500,416,1048.8281250000,,, +26.0449218750,416,1048.8281250000,,, +26.0468750000,416,1048.8281250000,,, +26.0488281250,416,1048.8281250000,,, +26.0507812500,416,1048.8281250000,,, +26.0527343750,416,1048.8281250000,,, +26.0546875000,416,1048.8281250000,,, +26.0566406250,416,1048.8281250000,,, +26.0585937500,416,1048.8281250000,,, +26.0605468750,416,1048.8281250000,,, +26.0625000000,417,1048.8281250000,,, +26.0644531250,417,1048.8281250000,,, +26.0664062500,417,1048.8281250000,,, +26.0683593750,417,1048.8281250000,,, +26.0703125000,417,1048.8281250000,,, +26.0722656250,417,1048.8281250000,,, +26.0742187500,417,1048.8281250000,,, +26.0761718750,417,1048.8281250000,,, +26.0781250000,417,1048.8281250000,,, +26.0800781250,417,1048.8281250000,,, +26.0820312500,417,1048.8281250000,,, +26.0839843750,417,1048.8281250000,,, +26.0859375000,417,1048.8281250000,,, +26.0878906250,417,1048.8281250000,,, +26.0898437500,417,1048.8281250000,,, +26.0917968750,417,1048.8281250000,,, +26.0937500000,417,1048.8281250000,,, +26.0957031250,417,1048.8281250000,,, +26.0976562500,417,1048.8281250000,,, +26.0996093750,417,1048.8281250000,,, +26.1015625000,417,1048.8281250000,,, +26.1035156250,417,1048.8281250000,,, +26.1054687500,417,1048.8281250000,,, +26.1074218750,417,1048.8281250000,,, +26.1093750000,417,1048.8281250000,,, +26.1113281250,417,1048.8281250000,,, +26.1132812500,417,1048.8281250000,,, +26.1152343750,417,1048.8281250000,,, +26.1171875000,417,1048.8281250000,,, +26.1191406250,417,1048.8281250000,,, +26.1210937500,417,1048.8281250000,,, +26.1230468750,417,1048.8281250000,,, +26.1250000000,418,1048.8281250000,,, +26.1269531250,418,1048.8281250000,,, +26.1289062500,418,1048.8281250000,,, +26.1308593750,418,1048.8281250000,,, +26.1328125000,418,1048.8281250000,,, +26.1347656250,418,1048.8281250000,,, +26.1367187500,418,1048.8281250000,,, +26.1386718750,418,1048.8281250000,,, +26.1406250000,418,1048.8281250000,,, +26.1425781250,418,1048.8281250000,,, +26.1445312500,418,1048.8281250000,,, +26.1464843750,418,1048.8281250000,,, +26.1484375000,418,1048.8281250000,,, +26.1503906250,418,1048.8281250000,,, +26.1523437500,418,1048.8281250000,,, +26.1542968750,418,1048.8281250000,,, +26.1562500000,418,1048.8281250000,,, +26.1582031250,418,1048.8281250000,,, +26.1601562500,418,1048.8281250000,,, +26.1621093750,418,1048.8281250000,,, +26.1640625000,418,1048.8281250000,,, +26.1660156250,418,1048.8281250000,,, +26.1679687500,418,1048.8281250000,,, +26.1699218750,418,1048.8281250000,,, +26.1718750000,418,1048.8281250000,,, +26.1738281250,418,1048.8281250000,,, +26.1757812500,418,1048.8281250000,,, +26.1777343750,418,1048.8281250000,,, +26.1796875000,418,1048.8281250000,,, +26.1816406250,418,1048.8281250000,,, +26.1835937500,418,1048.8281250000,,, +26.1855468750,418,1048.8281250000,,, +26.1875000000,419,1048.8281250000,,, +26.1894531250,419,1048.8281250000,,, +26.1914062500,419,1048.8281250000,,, +26.1933593750,419,1048.8281250000,,, +26.1953125000,419,1048.8281250000,,, +26.1972656250,419,1048.8281250000,,, +26.1992187500,419,1048.8281250000,,, +26.2011718750,419,1048.8281250000,,, +26.2031250000,419,1048.8281250000,,, +26.2050781250,419,1048.8281250000,,, +26.2070312500,419,1048.8281250000,,, +26.2089843750,419,1048.8281250000,,, +26.2109375000,419,1048.8281250000,,, +26.2128906250,419,1048.8281250000,,, +26.2148437500,419,1048.8281250000,,, +26.2167968750,419,1048.8281250000,,, +26.2187500000,419,1048.8281250000,,, +26.2207031250,419,1048.8281250000,,, +26.2226562500,419,1048.8281250000,,, +26.2246093750,419,1048.8281250000,,, +26.2265625000,419,1048.8281250000,,, +26.2285156250,419,1048.8281250000,,, +26.2304687500,419,1048.8281250000,,, +26.2324218750,419,1048.8281250000,,, +26.2343750000,419,1048.8281250000,,, +26.2363281250,419,1048.8281250000,,, +26.2382812500,419,1048.8281250000,,, +26.2402343750,419,1048.8281250000,,, +26.2421875000,419,1048.8281250000,,, +26.2441406250,419,1048.8281250000,,, +26.2460937500,419,1048.8281250000,,, +26.2480468750,419,1048.8281250000,,, +26.2500000000,420,1048.8281250000,,, +26.2519531250,420,1048.8281250000,,, +26.2539062500,420,1048.8281250000,,, +26.2558593750,420,1048.8281250000,,, +26.2578125000,420,1048.8281250000,,, +26.2597656250,420,1048.8281250000,,, +26.2617187500,420,1048.8281250000,,, +26.2636718750,420,1048.8281250000,,, +26.2656250000,420,1048.8281250000,,, +26.2675781250,420,1048.8281250000,,, +26.2695312500,420,1048.8281250000,,, +26.2714843750,420,1048.8281250000,,, +26.2734375000,420,1048.8281250000,,, +26.2753906250,420,1048.8281250000,,, +26.2773437500,420,1048.8281250000,,, +26.2792968750,420,1048.8281250000,,, +26.2812500000,420,1048.8281250000,,, +26.2832031250,420,1048.8281250000,,, +26.2851562500,420,1048.8281250000,,, +26.2871093750,420,1048.8281250000,,, +26.2890625000,420,1048.8281250000,,, +26.2910156250,420,1048.8281250000,,, +26.2929687500,420,1048.8281250000,,, +26.2949218750,420,1048.8281250000,,, +26.2968750000,420,1048.8281250000,,, +26.2988281250,420,1048.8281250000,,, +26.3007812500,420,1048.8281250000,,, +26.3027343750,420,1048.8281250000,,, +26.3046875000,420,1048.8281250000,,, +26.3066406250,420,1048.8281250000,,, +26.3085937500,420,1048.8281250000,,, +26.3105468750,420,1048.8281250000,,, +26.3125000000,421,1048.8281250000,,, +26.3144531250,421,1048.8281250000,,, +26.3164062500,421,1048.8281250000,,, +26.3183593750,421,1048.8281250000,,, +26.3203125000,421,1048.8281250000,,, +26.3222656250,421,1048.8281250000,,, +26.3242187500,421,1048.8281250000,,, +26.3261718750,421,1048.8281250000,,, +26.3281250000,421,1048.8281250000,,, +26.3300781250,421,1048.8281250000,,, +26.3320312500,421,1048.8281250000,,, +26.3339843750,421,1048.8281250000,,, +26.3359375000,421,1048.8281250000,,, +26.3378906250,421,1048.8281250000,,, +26.3398437500,421,1048.8281250000,,, +26.3417968750,421,1048.8281250000,,, +26.3437500000,421,1048.8281250000,,, +26.3457031250,421,1048.8281250000,,, +26.3476562500,421,1048.8281250000,,, +26.3496093750,421,1048.8281250000,,, +26.3515625000,421,1048.8281250000,,, +26.3535156250,421,1048.8281250000,,, +26.3554687500,421,1048.8281250000,,, +26.3574218750,421,1048.8281250000,,, +26.3593750000,421,1048.8281250000,,, +26.3613281250,421,1048.8281250000,,, +26.3632812500,421,1048.8281250000,,, +26.3652343750,421,1048.8281250000,,, +26.3671875000,421,1048.8281250000,,, +26.3691406250,421,1048.8281250000,,, +26.3710937500,421,1048.8281250000,,, +26.3730468750,421,1048.8281250000,,, +26.3750000000,422,1048.8281250000,,, +26.3769531250,422,1048.8281250000,,, +26.3789062500,422,1048.8281250000,,, +26.3808593750,422,1048.8281250000,,, +26.3828125000,422,1048.8281250000,,, +26.3847656250,422,1048.8281250000,,, +26.3867187500,422,1048.8281250000,,, +26.3886718750,422,1048.8281250000,,, +26.3906250000,422,1048.8281250000,,, +26.3925781250,422,1048.8281250000,,, +26.3945312500,422,1048.8281250000,,, +26.3964843750,422,1048.8281250000,,, +26.3984375000,422,1048.8281250000,,, +26.4003906250,422,1048.8281250000,,, +26.4023437500,422,1048.8281250000,,, +26.4042968750,422,1048.8281250000,,, +26.4062500000,422,1048.8281250000,,, +26.4082031250,422,1048.8281250000,,, +26.4101562500,422,1048.8281250000,,, +26.4121093750,422,1048.8281250000,,, +26.4140625000,422,1048.8281250000,,, +26.4160156250,422,1048.8281250000,,, +26.4179687500,422,1048.8281250000,,, +26.4199218750,422,1048.8281250000,,, +26.4218750000,422,1048.8281250000,,, +26.4238281250,422,1048.8281250000,,, +26.4257812500,422,1048.8281250000,,, +26.4277343750,422,1048.8281250000,,, +26.4296875000,422,1048.8281250000,,, +26.4316406250,422,1048.8281250000,,, +26.4335937500,422,1048.8281250000,,, +26.4355468750,422,1048.8281250000,,, +26.4375000000,423,1048.8281250000,,, +26.4394531250,423,1048.8281250000,,, +26.4414062500,423,1048.8281250000,,, +26.4433593750,423,1048.8281250000,,, +26.4453125000,423,1048.8281250000,,, +26.4472656250,423,1048.8281250000,,, +26.4492187500,423,1048.8281250000,,, +26.4511718750,423,1048.8281250000,,, +26.4531250000,423,1048.8281250000,,, +26.4550781250,423,1048.8281250000,,, +26.4570312500,423,1048.8281250000,,, +26.4589843750,423,1048.8281250000,,, +26.4609375000,423,1048.8281250000,,, +26.4628906250,423,1048.8281250000,,, +26.4648437500,423,1048.8281250000,,, +26.4667968750,423,1048.8281250000,,, +26.4687500000,423,1048.8281250000,,, +26.4707031250,423,1048.8281250000,,, +26.4726562500,423,1048.8281250000,,, +26.4746093750,423,1048.8281250000,,, +26.4765625000,423,1048.8281250000,,, +26.4785156250,423,1048.8281250000,,, +26.4804687500,423,1048.8281250000,,, +26.4824218750,423,1048.8281250000,,, +26.4843750000,423,1048.8281250000,,, +26.4863281250,423,1048.8281250000,,, +26.4882812500,423,1048.8281250000,,, +26.4902343750,423,1048.8281250000,,, +26.4921875000,423,1048.8281250000,,, +26.4941406250,423,1048.8281250000,,, +26.4960937500,423,1048.8281250000,,, +26.4980468750,423,1048.8281250000,,, +26.5000000000,424,1048.8281250000,,, +26.5019531250,424,1048.8281250000,,, +26.5039062500,424,1048.8281250000,,, +26.5058593750,424,1048.8281250000,,, +26.5078125000,424,1048.8281250000,,, +26.5097656250,424,1048.8281250000,,, +26.5117187500,424,1048.8281250000,,, +26.5136718750,424,1048.8281250000,,, +26.5156250000,424,1048.8281250000,,, +26.5175781250,424,1048.8281250000,,, +26.5195312500,424,1048.8281250000,,, +26.5214843750,424,1048.8281250000,,, +26.5234375000,424,1048.8281250000,,, +26.5253906250,424,1048.8281250000,,, +26.5273437500,424,1048.8281250000,,, +26.5292968750,424,1048.8281250000,,, +26.5312500000,424,1048.8281250000,,, +26.5332031250,424,1048.8281250000,,, +26.5351562500,424,1048.8281250000,,, +26.5371093750,424,1048.8281250000,,, +26.5390625000,424,1048.8281250000,,, +26.5410156250,424,1048.8281250000,,, +26.5429687500,424,1048.8281250000,,, +26.5449218750,424,1048.8281250000,,, +26.5468750000,424,1048.8281250000,,, +26.5488281250,424,1048.8281250000,,, +26.5507812500,424,1048.8281250000,,, +26.5527343750,424,1048.8281250000,,, +26.5546875000,424,1048.8281250000,,, +26.5566406250,424,1048.8281250000,,, +26.5585937500,424,1048.8281250000,,, +26.5605468750,424,1048.8281250000,,, +26.5625000000,425,1048.8281250000,,, +26.5644531250,425,1048.8281250000,,, +26.5664062500,425,1048.8281250000,,, +26.5683593750,425,1048.8281250000,,, +26.5703125000,425,1048.8281250000,,, +26.5722656250,425,1048.8281250000,,, +26.5742187500,425,1048.8281250000,,, +26.5761718750,425,1048.8281250000,,, +26.5781250000,425,1048.8281250000,,, +26.5800781250,425,1048.8281250000,,, +26.5820312500,425,1048.8281250000,,, +26.5839843750,425,1048.8281250000,,, +26.5859375000,425,1048.8281250000,,, +26.5878906250,425,1048.8281250000,,, +26.5898437500,425,1048.8281250000,,, +26.5917968750,425,1048.8281250000,,, +26.5937500000,425,1048.8281250000,,, +26.5957031250,425,1048.8281250000,,, +26.5976562500,425,1048.8281250000,,, +26.5996093750,425,1048.8281250000,,, +26.6015625000,425,1048.8281250000,,, +26.6035156250,425,1048.8281250000,,, +26.6054687500,425,1048.8281250000,,, +26.6074218750,425,1048.8281250000,,, +26.6093750000,425,1048.8281250000,,, +26.6113281250,425,1048.8281250000,,, +26.6132812500,425,1048.8281250000,,, +26.6152343750,425,1048.8281250000,,, +26.6171875000,425,1048.8281250000,,, +26.6191406250,425,1048.8281250000,,, +26.6210937500,425,1048.8281250000,,, +26.6230468750,425,1048.8281250000,,, +26.6250000000,426,1048.8281250000,,, +26.6269531250,426,1048.8281250000,,, +26.6289062500,426,1048.8281250000,,, +26.6308593750,426,1048.8281250000,,, +26.6328125000,426,1048.8281250000,,, +26.6347656250,426,1048.8281250000,,, +26.6367187500,426,1048.8281250000,,, +26.6386718750,426,1048.8281250000,,, +26.6406250000,426,1048.8281250000,,, +26.6425781250,426,1048.8281250000,,, +26.6445312500,426,1048.8281250000,,, +26.6464843750,426,1048.8281250000,,, +26.6484375000,426,1048.8281250000,,, +26.6503906250,426,1048.8281250000,,, +26.6523437500,426,1048.8281250000,,, +26.6542968750,426,1048.8281250000,,, +26.6562500000,426,1048.8281250000,,, +26.6582031250,426,1048.8281250000,,, +26.6601562500,426,1048.8281250000,,, +26.6621093750,426,1048.8281250000,,, +26.6640625000,426,1048.8281250000,,, +26.6660156250,426,1048.8281250000,,, +26.6679687500,426,1048.8281250000,,, +26.6699218750,426,1048.8281250000,,, +26.6718750000,426,1048.8281250000,,, +26.6738281250,426,1048.8281250000,,, +26.6757812500,426,1048.8281250000,,, +26.6777343750,426,1048.8281250000,,, +26.6796875000,426,1048.8281250000,,, +26.6816406250,426,1048.8281250000,,, +26.6835937500,426,1048.8281250000,,, +26.6855468750,426,1048.8281250000,,, +26.6875000000,427,1007.8125000000,,, +26.6894531250,427,1007.8125000000,,, +26.6914062500,427,1007.8125000000,,, +26.6933593750,427,1007.8125000000,,, +26.6953125000,427,1007.8125000000,,, +26.6972656250,427,1007.8125000000,,, +26.6992187500,427,1007.8125000000,,, +26.7011718750,427,1007.8125000000,,, +26.7031250000,427,1007.8125000000,,, +26.7050781250,427,1007.8125000000,,, +26.7070312500,427,1007.8125000000,,, +26.7089843750,427,1007.8125000000,,, +26.7109375000,427,1007.8125000000,,, +26.7128906250,427,1007.8125000000,,, +26.7148437500,427,1007.8125000000,,, +26.7167968750,427,1007.8125000000,,, +26.7187500000,427,1007.8125000000,,, +26.7207031250,427,1007.8125000000,,, +26.7226562500,427,1007.8125000000,,, +26.7246093750,427,1007.8125000000,,, +26.7265625000,427,1007.8125000000,,, +26.7285156250,427,1007.8125000000,,, +26.7304687500,427,1007.8125000000,,, +26.7324218750,427,1007.8125000000,,, +26.7343750000,427,1007.8125000000,,, +26.7363281250,427,1007.8125000000,,, +26.7382812500,427,1007.8125000000,,, +26.7402343750,427,1007.8125000000,,, +26.7421875000,427,1007.8125000000,,, +26.7441406250,427,1007.8125000000,,, +26.7460937500,427,1007.8125000000,,, +26.7480468750,427,1007.8125000000,,, +26.7500000000,428,1007.8125000000,,, +26.7519531250,428,1007.8125000000,,, +26.7539062500,428,1007.8125000000,,, +26.7558593750,428,1007.8125000000,,, +26.7578125000,428,1007.8125000000,,, +26.7597656250,428,1007.8125000000,,, +26.7617187500,428,1007.8125000000,,, +26.7636718750,428,1007.8125000000,,, +26.7656250000,428,1007.8125000000,,, +26.7675781250,428,1007.8125000000,,, +26.7695312500,428,1007.8125000000,,, +26.7714843750,428,1007.8125000000,,, +26.7734375000,428,1007.8125000000,,, +26.7753906250,428,1007.8125000000,,, +26.7773437500,428,1007.8125000000,,, +26.7792968750,428,1007.8125000000,,, +26.7812500000,428,1007.8125000000,,, +26.7832031250,428,1007.8125000000,,, +26.7851562500,428,1007.8125000000,,, +26.7871093750,428,1007.8125000000,,, +26.7890625000,428,1007.8125000000,,, +26.7910156250,428,1007.8125000000,,, +26.7929687500,428,1007.8125000000,,, +26.7949218750,428,1007.8125000000,,, +26.7968750000,428,1007.8125000000,,, +26.7988281250,428,1007.8125000000,,, +26.8007812500,428,1007.8125000000,,, +26.8027343750,428,1007.8125000000,,, +26.8046875000,428,1007.8125000000,,, +26.8066406250,428,1007.8125000000,,, +26.8085937500,428,1007.8125000000,,, +26.8105468750,428,1007.8125000000,,, +26.8125000000,429,1007.8125000000,,, +26.8144531250,429,1007.8125000000,,, +26.8164062500,429,1007.8125000000,,, +26.8183593750,429,1007.8125000000,,, +26.8203125000,429,1007.8125000000,,, +26.8222656250,429,1007.8125000000,,, +26.8242187500,429,1007.8125000000,,, +26.8261718750,429,1007.8125000000,,, +26.8281250000,429,1007.8125000000,,, +26.8300781250,429,1007.8125000000,,, +26.8320312500,429,1007.8125000000,,, +26.8339843750,429,1007.8125000000,,, +26.8359375000,429,1007.8125000000,,, +26.8378906250,429,1007.8125000000,,, +26.8398437500,429,1007.8125000000,,, +26.8417968750,429,1007.8125000000,,, +26.8437500000,429,1007.8125000000,,, +26.8457031250,429,1007.8125000000,,, +26.8476562500,429,1007.8125000000,,, +26.8496093750,429,1007.8125000000,,, +26.8515625000,429,1007.8125000000,,, +26.8535156250,429,1007.8125000000,,, +26.8554687500,429,1007.8125000000,,, +26.8574218750,429,1007.8125000000,,, +26.8593750000,429,1007.8125000000,,, +26.8613281250,429,1007.8125000000,,, +26.8632812500,429,1007.8125000000,,, +26.8652343750,429,1007.8125000000,,, +26.8671875000,429,1007.8125000000,,, +26.8691406250,429,1007.8125000000,,, +26.8710937500,429,1007.8125000000,,, +26.8730468750,429,1007.8125000000,,, +26.8750000000,430,1007.8125000000,,, +26.8769531250,430,1007.8125000000,,, +26.8789062500,430,1007.8125000000,,, +26.8808593750,430,1007.8125000000,,, +26.8828125000,430,1007.8125000000,,, +26.8847656250,430,1007.8125000000,,, +26.8867187500,430,1007.8125000000,,, +26.8886718750,430,1007.8125000000,,, +26.8906250000,430,1007.8125000000,,, +26.8925781250,430,1007.8125000000,,, +26.8945312500,430,1007.8125000000,,, +26.8964843750,430,1007.8125000000,,, +26.8984375000,430,1007.8125000000,,, +26.9003906250,430,1007.8125000000,,, +26.9023437500,430,1007.8125000000,,, +26.9042968750,430,1007.8125000000,,, +26.9062500000,430,1007.8125000000,,, +26.9082031250,430,1007.8125000000,,, +26.9101562500,430,1007.8125000000,,, +26.9121093750,430,1007.8125000000,,, +26.9140625000,430,1007.8125000000,,, +26.9160156250,430,1007.8125000000,,, +26.9179687500,430,1007.8125000000,,, +26.9199218750,430,1007.8125000000,,, +26.9218750000,430,1007.8125000000,,, +26.9238281250,430,1007.8125000000,,, +26.9257812500,430,1007.8125000000,,, +26.9277343750,430,1007.8125000000,,, +26.9296875000,430,1007.8125000000,,, +26.9316406250,430,1007.8125000000,,, +26.9335937500,430,1007.8125000000,,, +26.9355468750,430,1007.8125000000,,, +26.9375000000,431,1007.8125000000,,, +26.9394531250,431,1007.8125000000,,, +26.9414062500,431,1007.8125000000,,, +26.9433593750,431,1007.8125000000,,, +26.9453125000,431,1007.8125000000,,, +26.9472656250,431,1007.8125000000,,, +26.9492187500,431,1007.8125000000,,, +26.9511718750,431,1007.8125000000,,, +26.9531250000,431,1007.8125000000,,, +26.9550781250,431,1007.8125000000,,, +26.9570312500,431,1007.8125000000,,, +26.9589843750,431,1007.8125000000,,, +26.9609375000,431,1007.8125000000,,, +26.9628906250,431,1007.8125000000,,, +26.9648437500,431,1007.8125000000,,, +26.9667968750,431,1007.8125000000,,, +26.9687500000,431,1007.8125000000,,, +26.9707031250,431,1007.8125000000,,, +26.9726562500,431,1007.8125000000,,, +26.9746093750,431,1007.8125000000,,, +26.9765625000,431,1007.8125000000,,, +26.9785156250,431,1007.8125000000,,, +26.9804687500,431,1007.8125000000,,, +26.9824218750,431,1007.8125000000,,, +26.9843750000,431,1007.8125000000,,, +26.9863281250,431,1007.8125000000,,, +26.9882812500,431,1007.8125000000,,, +26.9902343750,431,1007.8125000000,,, +26.9921875000,431,1007.8125000000,,, +26.9941406250,431,1007.8125000000,,, +26.9960937500,431,1007.8125000000,,, +26.9980468750,431,1007.8125000000,,, +27.0000000000,432,1007.8125000000,,, +27.0019531250,432,1007.8125000000,,, +27.0039062500,432,1007.8125000000,,, +27.0058593750,432,1007.8125000000,,, +27.0078125000,432,1007.8125000000,,, +27.0097656250,432,1007.8125000000,,, +27.0117187500,432,1007.8125000000,,, +27.0136718750,432,1007.8125000000,,, +27.0156250000,432,1007.8125000000,,, +27.0175781250,432,1007.8125000000,,, +27.0195312500,432,1007.8125000000,,, +27.0214843750,432,1007.8125000000,,, +27.0234375000,432,1007.8125000000,,, +27.0253906250,432,1007.8125000000,,, +27.0273437500,432,1007.8125000000,,, +27.0292968750,432,1007.8125000000,,, +27.0312500000,432,1007.8125000000,,, +27.0332031250,432,1007.8125000000,,, +27.0351562500,432,1007.8125000000,,, +27.0371093750,432,1007.8125000000,,, +27.0390625000,432,1007.8125000000,,, +27.0410156250,432,1007.8125000000,,, +27.0429687500,432,1007.8125000000,,, +27.0449218750,432,1007.8125000000,,, +27.0468750000,432,1007.8125000000,,, +27.0488281250,432,1007.8125000000,,, +27.0507812500,432,1007.8125000000,,, +27.0527343750,432,1007.8125000000,,, +27.0546875000,432,1007.8125000000,,, +27.0566406250,432,1007.8125000000,,, +27.0585937500,432,1007.8125000000,,, +27.0605468750,432,1007.8125000000,,, +27.0625000000,433,1007.8125000000,,, +27.0644531250,433,1007.8125000000,,, +27.0664062500,433,1007.8125000000,,, +27.0683593750,433,1007.8125000000,,, +27.0703125000,433,1007.8125000000,,, +27.0722656250,433,1007.8125000000,,, +27.0742187500,433,1007.8125000000,,, +27.0761718750,433,1007.8125000000,,, +27.0781250000,433,1007.8125000000,,, +27.0800781250,433,1007.8125000000,,, +27.0820312500,433,1007.8125000000,,, +27.0839843750,433,1007.8125000000,,, +27.0859375000,433,1007.8125000000,,, +27.0878906250,433,1007.8125000000,,, +27.0898437500,433,1007.8125000000,,, +27.0917968750,433,1007.8125000000,,, +27.0937500000,433,1007.8125000000,,, +27.0957031250,433,1007.8125000000,,, +27.0976562500,433,1007.8125000000,,, +27.0996093750,433,1007.8125000000,,, +27.1015625000,433,1007.8125000000,,, +27.1035156250,433,1007.8125000000,,, +27.1054687500,433,1007.8125000000,,, +27.1074218750,433,1007.8125000000,,, +27.1093750000,433,1007.8125000000,,, +27.1113281250,433,1007.8125000000,,, +27.1132812500,433,1007.8125000000,,, +27.1152343750,433,1007.8125000000,,, +27.1171875000,433,1007.8125000000,,, +27.1191406250,433,1007.8125000000,,, +27.1210937500,433,1007.8125000000,,, +27.1230468750,433,1007.8125000000,,, +27.1250000000,434,1007.8125000000,,, +27.1269531250,434,1007.8125000000,,, +27.1289062500,434,1007.8125000000,,, +27.1308593750,434,1007.8125000000,,, +27.1328125000,434,1007.8125000000,,, +27.1347656250,434,1007.8125000000,,, +27.1367187500,434,1007.8125000000,,, +27.1386718750,434,1007.8125000000,,, +27.1406250000,434,1007.8125000000,,, +27.1425781250,434,1007.8125000000,,, +27.1445312500,434,1007.8125000000,,, +27.1464843750,434,1007.8125000000,,, +27.1484375000,434,1007.8125000000,,, +27.1503906250,434,1007.8125000000,,, +27.1523437500,434,1007.8125000000,,, +27.1542968750,434,1007.8125000000,,, +27.1562500000,434,1007.8125000000,,, +27.1582031250,434,1007.8125000000,,, +27.1601562500,434,1007.8125000000,,, +27.1621093750,434,1007.8125000000,,, +27.1640625000,434,1007.8125000000,,, +27.1660156250,434,1007.8125000000,,, +27.1679687500,434,1007.8125000000,,, +27.1699218750,434,1007.8125000000,,, +27.1718750000,434,1007.8125000000,,, +27.1738281250,434,1007.8125000000,,, +27.1757812500,434,1007.8125000000,,, +27.1777343750,434,1007.8125000000,,, +27.1796875000,434,1007.8125000000,,, +27.1816406250,434,1007.8125000000,,, +27.1835937500,434,1007.8125000000,,, +27.1855468750,434,1007.8125000000,,, +27.1875000000,435,1007.8125000000,,, +27.1894531250,435,1007.8125000000,,, +27.1914062500,435,1007.8125000000,,, +27.1933593750,435,1007.8125000000,,, +27.1953125000,435,1007.8125000000,,, +27.1972656250,435,1007.8125000000,,, +27.1992187500,435,1007.8125000000,,, +27.2011718750,435,1007.8125000000,,, +27.2031250000,435,1007.8125000000,,, +27.2050781250,435,1007.8125000000,,, +27.2070312500,435,1007.8125000000,,, +27.2089843750,435,1007.8125000000,,, +27.2109375000,435,1007.8125000000,,, +27.2128906250,435,1007.8125000000,,, +27.2148437500,435,1007.8125000000,,, +27.2167968750,435,1007.8125000000,,, +27.2187500000,435,1007.8125000000,,, +27.2207031250,435,1007.8125000000,,, +27.2226562500,435,1007.8125000000,,, +27.2246093750,435,1007.8125000000,,, +27.2265625000,435,1007.8125000000,,, +27.2285156250,435,1007.8125000000,,, +27.2304687500,435,1007.8125000000,,, +27.2324218750,435,1007.8125000000,,, +27.2343750000,435,1007.8125000000,,, +27.2363281250,435,1007.8125000000,,, +27.2382812500,435,1007.8125000000,,, +27.2402343750,435,1007.8125000000,,, +27.2421875000,435,1007.8125000000,,, +27.2441406250,435,1007.8125000000,,, +27.2460937500,435,1007.8125000000,,, +27.2480468750,435,1007.8125000000,,, +27.2500000000,436,1007.8125000000,,, +27.2519531250,436,1007.8125000000,,, +27.2539062500,436,1007.8125000000,,, +27.2558593750,436,1007.8125000000,,, +27.2578125000,436,1007.8125000000,,, +27.2597656250,436,1007.8125000000,,, +27.2617187500,436,1007.8125000000,,, +27.2636718750,436,1007.8125000000,,, +27.2656250000,436,1007.8125000000,,, +27.2675781250,436,1007.8125000000,,, +27.2695312500,436,1007.8125000000,,, +27.2714843750,436,1007.8125000000,,, +27.2734375000,436,1007.8125000000,,, +27.2753906250,436,1007.8125000000,,, +27.2773437500,436,1007.8125000000,,, +27.2792968750,436,1007.8125000000,,, +27.2812500000,436,1007.8125000000,,, +27.2832031250,436,1007.8125000000,,, +27.2851562500,436,1007.8125000000,,, +27.2871093750,436,1007.8125000000,,, +27.2890625000,436,1007.8125000000,,, +27.2910156250,436,1007.8125000000,,, +27.2929687500,436,1007.8125000000,,, +27.2949218750,436,1007.8125000000,,, +27.2968750000,436,1007.8125000000,,, +27.2988281250,436,1007.8125000000,,, +27.3007812500,436,1007.8125000000,,, +27.3027343750,436,1007.8125000000,,, +27.3046875000,436,1007.8125000000,,, +27.3066406250,436,1007.8125000000,,, +27.3085937500,436,1007.8125000000,,, +27.3105468750,436,1007.8125000000,,, +27.3125000000,437,1007.8125000000,,, +27.3144531250,437,1007.8125000000,,, +27.3164062500,437,1007.8125000000,,, +27.3183593750,437,1007.8125000000,,, +27.3203125000,437,1007.8125000000,,, +27.3222656250,437,1007.8125000000,,, +27.3242187500,437,1007.8125000000,,, +27.3261718750,437,1007.8125000000,,, +27.3281250000,437,1007.8125000000,,, +27.3300781250,437,1007.8125000000,,, +27.3320312500,437,1007.8125000000,,, +27.3339843750,437,1007.8125000000,,, +27.3359375000,437,1007.8125000000,,, +27.3378906250,437,1007.8125000000,,, +27.3398437500,437,1007.8125000000,,, +27.3417968750,437,1007.8125000000,,, +27.3437500000,437,1007.8125000000,,, +27.3457031250,437,1007.8125000000,,, +27.3476562500,437,1007.8125000000,,, +27.3496093750,437,1007.8125000000,,, +27.3515625000,437,1007.8125000000,,, +27.3535156250,437,1007.8125000000,,, +27.3554687500,437,1007.8125000000,,, +27.3574218750,437,1007.8125000000,,, +27.3593750000,437,1007.8125000000,,, +27.3613281250,437,1007.8125000000,,, +27.3632812500,437,1007.8125000000,,, +27.3652343750,437,1007.8125000000,,, +27.3671875000,437,1007.8125000000,,, +27.3691406250,437,1007.8125000000,,, +27.3710937500,437,1007.8125000000,,, +27.3730468750,437,1007.8125000000,,, +27.3750000000,438,1007.8125000000,,, +27.3769531250,438,1007.8125000000,,, +27.3789062500,438,1007.8125000000,,, +27.3808593750,438,1007.8125000000,,, +27.3828125000,438,1007.8125000000,,, +27.3847656250,438,1007.8125000000,,, +27.3867187500,438,1007.8125000000,,, +27.3886718750,438,1007.8125000000,,, +27.3906250000,438,1007.8125000000,,, +27.3925781250,438,1007.8125000000,,, +27.3945312500,438,1007.8125000000,,, +27.3964843750,438,1007.8125000000,,, +27.3984375000,438,1007.8125000000,,, +27.4003906250,438,1007.8125000000,,, +27.4023437500,438,1007.8125000000,,, +27.4042968750,438,1007.8125000000,,, +27.4062500000,438,1007.8125000000,,, +27.4082031250,438,1007.8125000000,,, +27.4101562500,438,1007.8125000000,,, +27.4121093750,438,1007.8125000000,,, +27.4140625000,438,1007.8125000000,,, +27.4160156250,438,1007.8125000000,,, +27.4179687500,438,1007.8125000000,,, +27.4199218750,438,1007.8125000000,,, +27.4218750000,438,1007.8125000000,,, +27.4238281250,438,1007.8125000000,,, +27.4257812500,438,1007.8125000000,,, +27.4277343750,438,1007.8125000000,,, +27.4296875000,438,1007.8125000000,,, +27.4316406250,438,1007.8125000000,,, +27.4335937500,438,1007.8125000000,,, +27.4355468750,438,1007.8125000000,,, +27.4375000000,439,1007.8125000000,,, +27.4394531250,439,1007.8125000000,,, +27.4414062500,439,1007.8125000000,,, +27.4433593750,439,1007.8125000000,,, +27.4453125000,439,1007.8125000000,,, +27.4472656250,439,1007.8125000000,,, +27.4492187500,439,1007.8125000000,,, +27.4511718750,439,1007.8125000000,,, +27.4531250000,439,1007.8125000000,,, +27.4550781250,439,1007.8125000000,,, +27.4570312500,439,1007.8125000000,,, +27.4589843750,439,1007.8125000000,,, +27.4609375000,439,1007.8125000000,,, +27.4628906250,439,1007.8125000000,,, +27.4648437500,439,1007.8125000000,,, +27.4667968750,439,1007.8125000000,,, +27.4687500000,439,1007.8125000000,,, +27.4707031250,439,1007.8125000000,,, +27.4726562500,439,1007.8125000000,,, +27.4746093750,439,1007.8125000000,,, +27.4765625000,439,1007.8125000000,,, +27.4785156250,439,1007.8125000000,,, +27.4804687500,439,1007.8125000000,,, +27.4824218750,439,1007.8125000000,,, +27.4843750000,439,1007.8125000000,,, +27.4863281250,439,1007.8125000000,,, +27.4882812500,439,1007.8125000000,,, +27.4902343750,439,1007.8125000000,,, +27.4921875000,439,1007.8125000000,,, +27.4941406250,439,1007.8125000000,,, +27.4960937500,439,1007.8125000000,,, +27.4980468750,439,1007.8125000000,,, +27.5000000000,440,941.4062500000,,, +27.5019531250,440,941.4062500000,,, +27.5039062500,440,941.4062500000,,, +27.5058593750,440,941.4062500000,,, +27.5078125000,440,941.4062500000,,, +27.5097656250,440,941.4062500000,,, +27.5117187500,440,941.4062500000,,, +27.5136718750,440,941.4062500000,,, +27.5156250000,440,941.4062500000,,, +27.5175781250,440,941.4062500000,,, +27.5195312500,440,941.4062500000,,, +27.5214843750,440,941.4062500000,,, +27.5234375000,440,941.4062500000,,, +27.5253906250,440,941.4062500000,,, +27.5273437500,440,941.4062500000,,, +27.5292968750,440,941.4062500000,,, +27.5312500000,440,941.4062500000,,, +27.5332031250,440,941.4062500000,,, +27.5351562500,440,941.4062500000,,, +27.5371093750,440,941.4062500000,,, +27.5390625000,440,941.4062500000,,, +27.5410156250,440,941.4062500000,,, +27.5429687500,440,941.4062500000,,, +27.5449218750,440,941.4062500000,,, +27.5468750000,440,941.4062500000,,, +27.5488281250,440,941.4062500000,,, +27.5507812500,440,941.4062500000,,, +27.5527343750,440,941.4062500000,,, +27.5546875000,440,941.4062500000,,, +27.5566406250,440,941.4062500000,,, +27.5585937500,440,941.4062500000,,, +27.5605468750,440,941.4062500000,,, +27.5625000000,441,941.4062500000,,, +27.5644531250,441,941.4062500000,,, +27.5664062500,441,941.4062500000,,, +27.5683593750,441,941.4062500000,,, +27.5703125000,441,941.4062500000,,, +27.5722656250,441,941.4062500000,,, +27.5742187500,441,941.4062500000,,, +27.5761718750,441,941.4062500000,,, +27.5781250000,441,941.4062500000,,, +27.5800781250,441,941.4062500000,,, +27.5820312500,441,941.4062500000,,, +27.5839843750,441,941.4062500000,,, +27.5859375000,441,941.4062500000,,, +27.5878906250,441,941.4062500000,,, +27.5898437500,441,941.4062500000,,, +27.5917968750,441,941.4062500000,,, +27.5937500000,441,941.4062500000,,, +27.5957031250,441,941.4062500000,,, +27.5976562500,441,941.4062500000,,, +27.5996093750,441,941.4062500000,,, +27.6015625000,441,941.4062500000,,, +27.6035156250,441,941.4062500000,,, +27.6054687500,441,941.4062500000,,, +27.6074218750,441,941.4062500000,,, +27.6093750000,441,941.4062500000,,, +27.6113281250,441,941.4062500000,,, +27.6132812500,441,941.4062500000,,, +27.6152343750,441,941.4062500000,,, +27.6171875000,441,941.4062500000,,, +27.6191406250,441,941.4062500000,,, +27.6210937500,441,941.4062500000,,, +27.6230468750,441,941.4062500000,,, +27.6250000000,442,941.4062500000,,, +27.6269531250,442,941.4062500000,,, +27.6289062500,442,941.4062500000,,, +27.6308593750,442,941.4062500000,,, +27.6328125000,442,941.4062500000,,, +27.6347656250,442,941.4062500000,,, +27.6367187500,442,941.4062500000,,, +27.6386718750,442,941.4062500000,,, +27.6406250000,442,941.4062500000,,, +27.6425781250,442,941.4062500000,,, +27.6445312500,442,941.4062500000,,, +27.6464843750,442,941.4062500000,,, +27.6484375000,442,941.4062500000,,, +27.6503906250,442,941.4062500000,,, +27.6523437500,442,941.4062500000,,, +27.6542968750,442,941.4062500000,,, +27.6562500000,442,941.4062500000,,, +27.6582031250,442,941.4062500000,,, +27.6601562500,442,941.4062500000,,, +27.6621093750,442,941.4062500000,,, +27.6640625000,442,941.4062500000,,, +27.6660156250,442,941.4062500000,,, +27.6679687500,442,941.4062500000,,, +27.6699218750,442,941.4062500000,,, +27.6718750000,442,941.4062500000,,, +27.6738281250,442,941.4062500000,,, +27.6757812500,442,941.4062500000,,, +27.6777343750,442,941.4062500000,,, +27.6796875000,442,941.4062500000,,, +27.6816406250,442,941.4062500000,,, +27.6835937500,442,941.4062500000,,, +27.6855468750,442,941.4062500000,,, +27.6875000000,443,941.4062500000,,, +27.6894531250,443,941.4062500000,,, +27.6914062500,443,941.4062500000,,, +27.6933593750,443,941.4062500000,,, +27.6953125000,443,941.4062500000,,, +27.6972656250,443,941.4062500000,,, +27.6992187500,443,941.4062500000,,, +27.7011718750,443,941.4062500000,,, +27.7031250000,443,941.4062500000,,, +27.7050781250,443,941.4062500000,,, +27.7070312500,443,941.4062500000,,, +27.7089843750,443,941.4062500000,,, +27.7109375000,443,941.4062500000,,, +27.7128906250,443,941.4062500000,,, +27.7148437500,443,941.4062500000,,, +27.7167968750,443,941.4062500000,,, +27.7187500000,443,941.4062500000,,, +27.7207031250,443,941.4062500000,,, +27.7226562500,443,941.4062500000,,, +27.7246093750,443,941.4062500000,,, +27.7265625000,443,941.4062500000,,, +27.7285156250,443,941.4062500000,,, +27.7304687500,443,941.4062500000,,, +27.7324218750,443,941.4062500000,,, +27.7343750000,443,941.4062500000,,, +27.7363281250,443,941.4062500000,,, +27.7382812500,443,941.4062500000,,, +27.7402343750,443,941.4062500000,,, +27.7421875000,443,941.4062500000,,, +27.7441406250,443,941.4062500000,,, +27.7460937500,443,941.4062500000,,, +27.7480468750,443,941.4062500000,,, +27.7500000000,444,941.4062500000,,, +27.7519531250,444,941.4062500000,,, +27.7539062500,444,941.4062500000,,, +27.7558593750,444,941.4062500000,,, +27.7578125000,444,941.4062500000,,, +27.7597656250,444,941.4062500000,,, +27.7617187500,444,941.4062500000,,, +27.7636718750,444,941.4062500000,,, +27.7656250000,444,941.4062500000,,, +27.7675781250,444,941.4062500000,,, +27.7695312500,444,941.4062500000,,, +27.7714843750,444,941.4062500000,,, +27.7734375000,444,941.4062500000,,, +27.7753906250,444,941.4062500000,,, +27.7773437500,444,941.4062500000,,, +27.7792968750,444,941.4062500000,,, +27.7812500000,444,941.4062500000,,, +27.7832031250,444,941.4062500000,,, +27.7851562500,444,941.4062500000,,, +27.7871093750,444,941.4062500000,,, +27.7890625000,444,941.4062500000,,, +27.7910156250,444,941.4062500000,,, +27.7929687500,444,941.4062500000,,, +27.7949218750,444,941.4062500000,,, +27.7968750000,444,941.4062500000,,, +27.7988281250,444,941.4062500000,,, +27.8007812500,444,941.4062500000,,, +27.8027343750,444,941.4062500000,,, +27.8046875000,444,941.4062500000,,, +27.8066406250,444,941.4062500000,,, +27.8085937500,444,941.4062500000,,, +27.8105468750,444,941.4062500000,,, +27.8125000000,445,941.4062500000,,, +27.8144531250,445,941.4062500000,,, +27.8164062500,445,941.4062500000,,, +27.8183593750,445,941.4062500000,,, +27.8203125000,445,941.4062500000,,, +27.8222656250,445,941.4062500000,,, +27.8242187500,445,941.4062500000,,, +27.8261718750,445,941.4062500000,,, +27.8281250000,445,941.4062500000,,, +27.8300781250,445,941.4062500000,,, +27.8320312500,445,941.4062500000,,, +27.8339843750,445,941.4062500000,,, +27.8359375000,445,941.4062500000,,, +27.8378906250,445,941.4062500000,,, +27.8398437500,445,941.4062500000,,, +27.8417968750,445,941.4062500000,,, +27.8437500000,445,941.4062500000,,, +27.8457031250,445,941.4062500000,,, +27.8476562500,445,941.4062500000,,, +27.8496093750,445,941.4062500000,,, +27.8515625000,445,941.4062500000,,, +27.8535156250,445,941.4062500000,,, +27.8554687500,445,941.4062500000,,, +27.8574218750,445,941.4062500000,,, +27.8593750000,445,941.4062500000,,, +27.8613281250,445,941.4062500000,,, +27.8632812500,445,941.4062500000,,, +27.8652343750,445,941.4062500000,,, +27.8671875000,445,941.4062500000,,, +27.8691406250,445,941.4062500000,,, +27.8710937500,445,941.4062500000,,, +27.8730468750,445,941.4062500000,,, +27.8750000000,446,941.4062500000,,, +27.8769531250,446,941.4062500000,,, +27.8789062500,446,941.4062500000,,, +27.8808593750,446,941.4062500000,,, +27.8828125000,446,941.4062500000,,, +27.8847656250,446,941.4062500000,,, +27.8867187500,446,941.4062500000,,, +27.8886718750,446,941.4062500000,,, +27.8906250000,446,941.4062500000,,, +27.8925781250,446,941.4062500000,,, +27.8945312500,446,941.4062500000,,, +27.8964843750,446,941.4062500000,,, +27.8984375000,446,941.4062500000,,, +27.9003906250,446,941.4062500000,,, +27.9023437500,446,941.4062500000,,, +27.9042968750,446,941.4062500000,,, +27.9062500000,446,941.4062500000,,, +27.9082031250,446,941.4062500000,,, +27.9101562500,446,941.4062500000,,, +27.9121093750,446,941.4062500000,,, +27.9140625000,446,941.4062500000,,, +27.9160156250,446,941.4062500000,,, +27.9179687500,446,941.4062500000,,, +27.9199218750,446,941.4062500000,,, +27.9218750000,446,941.4062500000,,, +27.9238281250,446,941.4062500000,,, +27.9257812500,446,941.4062500000,,, +27.9277343750,446,941.4062500000,,, +27.9296875000,446,941.4062500000,,, +27.9316406250,446,941.4062500000,,, +27.9335937500,446,941.4062500000,,, +27.9355468750,446,941.4062500000,,, +27.9375000000,447,941.4062500000,,, +27.9394531250,447,941.4062500000,,, +27.9414062500,447,941.4062500000,,, +27.9433593750,447,941.4062500000,,, +27.9453125000,447,941.4062500000,,, +27.9472656250,447,941.4062500000,,, +27.9492187500,447,941.4062500000,,, +27.9511718750,447,941.4062500000,,, +27.9531250000,447,941.4062500000,,, +27.9550781250,447,941.4062500000,,, +27.9570312500,447,941.4062500000,,, +27.9589843750,447,941.4062500000,,, +27.9609375000,447,941.4062500000,,, +27.9628906250,447,941.4062500000,,, +27.9648437500,447,941.4062500000,,, +27.9667968750,447,941.4062500000,,, +27.9687500000,447,941.4062500000,,, +27.9707031250,447,941.4062500000,,, +27.9726562500,447,941.4062500000,,, +27.9746093750,447,941.4062500000,,, +27.9765625000,447,941.4062500000,,, +27.9785156250,447,941.4062500000,,, +27.9804687500,447,941.4062500000,,, +27.9824218750,447,941.4062500000,,, +27.9843750000,447,941.4062500000,,, +27.9863281250,447,941.4062500000,,, +27.9882812500,447,941.4062500000,,, +27.9902343750,447,941.4062500000,,, +27.9921875000,447,941.4062500000,,, +27.9941406250,447,941.4062500000,,, +27.9960937500,447,941.4062500000,,, +27.9980468750,447,941.4062500000,,, +28.0000000000,448,941.4062500000,,, +28.0019531250,448,941.4062500000,,, +28.0039062500,448,941.4062500000,,, +28.0058593750,448,941.4062500000,,, +28.0078125000,448,941.4062500000,,, +28.0097656250,448,941.4062500000,,, +28.0117187500,448,941.4062500000,,, +28.0136718750,448,941.4062500000,,, +28.0156250000,448,941.4062500000,,, +28.0175781250,448,941.4062500000,,, +28.0195312500,448,941.4062500000,,, +28.0214843750,448,941.4062500000,,, +28.0234375000,448,941.4062500000,,, +28.0253906250,448,941.4062500000,,, +28.0273437500,448,941.4062500000,,, +28.0292968750,448,941.4062500000,,, +28.0312500000,448,941.4062500000,,, +28.0332031250,448,941.4062500000,,, +28.0351562500,448,941.4062500000,,, +28.0371093750,448,941.4062500000,,, +28.0390625000,448,941.4062500000,,, +28.0410156250,448,941.4062500000,,, +28.0429687500,448,941.4062500000,,, +28.0449218750,448,941.4062500000,,, +28.0468750000,448,941.4062500000,,, +28.0488281250,448,941.4062500000,,, +28.0507812500,448,941.4062500000,,, +28.0527343750,448,941.4062500000,,, +28.0546875000,448,941.4062500000,,, +28.0566406250,448,941.4062500000,,, +28.0585937500,448,941.4062500000,,, +28.0605468750,448,941.4062500000,,, +28.0625000000,449,941.4062500000,,, +28.0644531250,449,941.4062500000,,, +28.0664062500,449,941.4062500000,,, +28.0683593750,449,941.4062500000,,, +28.0703125000,449,941.4062500000,,, +28.0722656250,449,941.4062500000,,, +28.0742187500,449,941.4062500000,,, +28.0761718750,449,941.4062500000,,, +28.0781250000,449,941.4062500000,,, +28.0800781250,449,941.4062500000,,, +28.0820312500,449,941.4062500000,,, +28.0839843750,449,941.4062500000,,, +28.0859375000,449,941.4062500000,,, +28.0878906250,449,941.4062500000,,, +28.0898437500,449,941.4062500000,,, +28.0917968750,449,941.4062500000,,, +28.0937500000,449,941.4062500000,,, +28.0957031250,449,941.4062500000,,, +28.0976562500,449,941.4062500000,,, +28.0996093750,449,941.4062500000,,, +28.1015625000,449,941.4062500000,,, +28.1035156250,449,941.4062500000,,, +28.1054687500,449,941.4062500000,,, +28.1074218750,449,941.4062500000,,, +28.1093750000,449,941.4062500000,,, +28.1113281250,449,941.4062500000,,, +28.1132812500,449,941.4062500000,,, +28.1152343750,449,941.4062500000,,, +28.1171875000,449,941.4062500000,,, +28.1191406250,449,941.4062500000,,, +28.1210937500,449,941.4062500000,,, +28.1230468750,449,941.4062500000,,, +28.1250000000,450,941.4062500000,,, +28.1269531250,450,941.4062500000,,, +28.1289062500,450,941.4062500000,,, +28.1308593750,450,941.4062500000,,, +28.1328125000,450,941.4062500000,,, +28.1347656250,450,941.4062500000,,, +28.1367187500,450,941.4062500000,,, +28.1386718750,450,941.4062500000,,, +28.1406250000,450,941.4062500000,,, +28.1425781250,450,941.4062500000,,, +28.1445312500,450,941.4062500000,,, +28.1464843750,450,941.4062500000,,, +28.1484375000,450,941.4062500000,,, +28.1503906250,450,941.4062500000,,, +28.1523437500,450,941.4062500000,,, +28.1542968750,450,941.4062500000,,, +28.1562500000,450,941.4062500000,,, +28.1582031250,450,941.4062500000,,, +28.1601562500,450,941.4062500000,,, +28.1621093750,450,941.4062500000,,, +28.1640625000,450,941.4062500000,,, +28.1660156250,450,941.4062500000,,, +28.1679687500,450,941.4062500000,,, +28.1699218750,450,941.4062500000,,, +28.1718750000,450,941.4062500000,,, +28.1738281250,450,941.4062500000,,, +28.1757812500,450,941.4062500000,,, +28.1777343750,450,941.4062500000,,, +28.1796875000,450,941.4062500000,,, +28.1816406250,450,941.4062500000,,, +28.1835937500,450,941.4062500000,,, +28.1855468750,450,941.4062500000,,, +28.1875000000,451,941.4062500000,,, +28.1894531250,451,941.4062500000,,, +28.1914062500,451,941.4062500000,,, +28.1933593750,451,941.4062500000,,, +28.1953125000,451,941.4062500000,,, +28.1972656250,451,941.4062500000,,, +28.1992187500,451,941.4062500000,,, +28.2011718750,451,941.4062500000,,, +28.2031250000,451,941.4062500000,,, +28.2050781250,451,941.4062500000,,, +28.2070312500,451,941.4062500000,,, +28.2089843750,451,941.4062500000,,, +28.2109375000,451,941.4062500000,,, +28.2128906250,451,941.4062500000,,, +28.2148437500,451,941.4062500000,,, +28.2167968750,451,941.4062500000,,, +28.2187500000,451,941.4062500000,,, +28.2207031250,451,941.4062500000,,, +28.2226562500,451,941.4062500000,,, +28.2246093750,451,941.4062500000,,, +28.2265625000,451,941.4062500000,,, +28.2285156250,451,941.4062500000,,, +28.2304687500,451,941.4062500000,,, +28.2324218750,451,941.4062500000,,, +28.2343750000,451,941.4062500000,,, +28.2363281250,451,941.4062500000,,, +28.2382812500,451,941.4062500000,,, +28.2402343750,451,941.4062500000,,, +28.2421875000,451,941.4062500000,,, +28.2441406250,451,941.4062500000,,, +28.2460937500,451,941.4062500000,,, +28.2480468750,451,941.4062500000,,, +28.2500000000,452,941.4062500000,,, +28.2519531250,452,941.4062500000,,, +28.2539062500,452,941.4062500000,,, +28.2558593750,452,941.4062500000,,, +28.2578125000,452,941.4062500000,,, +28.2597656250,452,941.4062500000,,, +28.2617187500,452,941.4062500000,,, +28.2636718750,452,941.4062500000,,, +28.2656250000,452,941.4062500000,,, +28.2675781250,452,941.4062500000,,, +28.2695312500,452,941.4062500000,,, +28.2714843750,452,941.4062500000,,, +28.2734375000,452,941.4062500000,,, +28.2753906250,452,941.4062500000,,, +28.2773437500,452,941.4062500000,,, +28.2792968750,452,941.4062500000,,, +28.2812500000,452,941.4062500000,,, +28.2832031250,452,941.4062500000,,, +28.2851562500,452,941.4062500000,,, +28.2871093750,452,941.4062500000,,, +28.2890625000,452,941.4062500000,,, +28.2910156250,452,941.4062500000,,, +28.2929687500,452,941.4062500000,,, +28.2949218750,452,941.4062500000,,, +28.2968750000,452,941.4062500000,,, +28.2988281250,452,941.4062500000,,, +28.3007812500,452,941.4062500000,,, +28.3027343750,452,941.4062500000,,, +28.3046875000,452,941.4062500000,,, +28.3066406250,452,941.4062500000,,, +28.3085937500,452,941.4062500000,,, +28.3105468750,452,941.4062500000,,, +28.3125000000,453,826.1718750000,,, +28.3144531250,453,826.1718750000,,, +28.3164062500,453,826.1718750000,,, +28.3183593750,453,826.1718750000,,, +28.3203125000,453,826.1718750000,,, +28.3222656250,453,826.1718750000,,, +28.3242187500,453,826.1718750000,,, +28.3261718750,453,826.1718750000,,, +28.3281250000,453,826.1718750000,,, +28.3300781250,453,826.1718750000,,, +28.3320312500,453,826.1718750000,,, +28.3339843750,453,826.1718750000,,, +28.3359375000,453,826.1718750000,,, +28.3378906250,453,826.1718750000,,, +28.3398437500,453,826.1718750000,,, +28.3417968750,453,826.1718750000,,, +28.3437500000,453,826.1718750000,,, +28.3457031250,453,826.1718750000,,, +28.3476562500,453,826.1718750000,,, +28.3496093750,453,826.1718750000,,, +28.3515625000,453,826.1718750000,,, +28.3535156250,453,826.1718750000,,, +28.3554687500,453,826.1718750000,,, +28.3574218750,453,826.1718750000,,, +28.3593750000,453,826.1718750000,,, +28.3613281250,453,826.1718750000,,, +28.3632812500,453,826.1718750000,,, +28.3652343750,453,826.1718750000,,, +28.3671875000,453,826.1718750000,,, +28.3691406250,453,826.1718750000,,, +28.3710937500,453,826.1718750000,,, +28.3730468750,453,826.1718750000,,, +28.3750000000,454,826.1718750000,,, +28.3769531250,454,826.1718750000,,, +28.3789062500,454,826.1718750000,,, +28.3808593750,454,826.1718750000,,, +28.3828125000,454,826.1718750000,,, +28.3847656250,454,826.1718750000,,, +28.3867187500,454,826.1718750000,,, +28.3886718750,454,826.1718750000,,, +28.3906250000,454,826.1718750000,,, +28.3925781250,454,826.1718750000,,, +28.3945312500,454,826.1718750000,,, +28.3964843750,454,826.1718750000,,, +28.3984375000,454,826.1718750000,,, +28.4003906250,454,826.1718750000,,, +28.4023437500,454,826.1718750000,,, +28.4042968750,454,826.1718750000,,, +28.4062500000,454,826.1718750000,,, +28.4082031250,454,826.1718750000,,, +28.4101562500,454,826.1718750000,,, +28.4121093750,454,826.1718750000,,, +28.4140625000,454,826.1718750000,,, +28.4160156250,454,826.1718750000,,, +28.4179687500,454,826.1718750000,,, +28.4199218750,454,826.1718750000,,, +28.4218750000,454,826.1718750000,,, +28.4238281250,454,826.1718750000,,, +28.4257812500,454,826.1718750000,,, +28.4277343750,454,826.1718750000,,, +28.4296875000,454,826.1718750000,,, +28.4316406250,454,826.1718750000,,, +28.4335937500,454,826.1718750000,,, +28.4355468750,454,826.1718750000,,, +28.4375000000,455,826.1718750000,,, +28.4394531250,455,826.1718750000,,, +28.4414062500,455,826.1718750000,,, +28.4433593750,455,826.1718750000,,, +28.4453125000,455,826.1718750000,,, +28.4472656250,455,826.1718750000,,, +28.4492187500,455,826.1718750000,,, +28.4511718750,455,826.1718750000,,, +28.4531250000,455,826.1718750000,,, +28.4550781250,455,826.1718750000,,, +28.4570312500,455,826.1718750000,,, +28.4589843750,455,826.1718750000,,, +28.4609375000,455,826.1718750000,,, +28.4628906250,455,826.1718750000,,, +28.4648437500,455,826.1718750000,,, +28.4667968750,455,826.1718750000,,, +28.4687500000,455,826.1718750000,,, +28.4707031250,455,826.1718750000,,, +28.4726562500,455,826.1718750000,,, +28.4746093750,455,826.1718750000,,, +28.4765625000,455,826.1718750000,,, +28.4785156250,455,826.1718750000,,, +28.4804687500,455,826.1718750000,,, +28.4824218750,455,826.1718750000,,, +28.4843750000,455,826.1718750000,,, +28.4863281250,455,826.1718750000,,, +28.4882812500,455,826.1718750000,,, +28.4902343750,455,826.1718750000,,, +28.4921875000,455,826.1718750000,,, +28.4941406250,455,826.1718750000,,, +28.4960937500,455,826.1718750000,,, +28.4980468750,455,826.1718750000,,, +28.5000000000,456,826.1718750000,,, +28.5019531250,456,826.1718750000,,, +28.5039062500,456,826.1718750000,,, +28.5058593750,456,826.1718750000,,, +28.5078125000,456,826.1718750000,,, +28.5097656250,456,826.1718750000,,, +28.5117187500,456,826.1718750000,,, +28.5136718750,456,826.1718750000,,, +28.5156250000,456,826.1718750000,,, +28.5175781250,456,826.1718750000,,, +28.5195312500,456,826.1718750000,,, +28.5214843750,456,826.1718750000,,, +28.5234375000,456,826.1718750000,,, +28.5253906250,456,826.1718750000,,, +28.5273437500,456,826.1718750000,,, +28.5292968750,456,826.1718750000,,, +28.5312500000,456,826.1718750000,,, +28.5332031250,456,826.1718750000,,, +28.5351562500,456,826.1718750000,,, +28.5371093750,456,826.1718750000,,, +28.5390625000,456,826.1718750000,,, +28.5410156250,456,826.1718750000,,, +28.5429687500,456,826.1718750000,,, +28.5449218750,456,826.1718750000,,, +28.5468750000,456,826.1718750000,,, +28.5488281250,456,826.1718750000,,, +28.5507812500,456,826.1718750000,,, +28.5527343750,456,826.1718750000,,, +28.5546875000,456,826.1718750000,,, +28.5566406250,456,826.1718750000,,, +28.5585937500,456,826.1718750000,,, +28.5605468750,456,826.1718750000,,, +28.5625000000,457,826.1718750000,,, +28.5644531250,457,826.1718750000,,, +28.5664062500,457,826.1718750000,,, +28.5683593750,457,826.1718750000,,, +28.5703125000,457,826.1718750000,,, +28.5722656250,457,826.1718750000,,, +28.5742187500,457,826.1718750000,,, +28.5761718750,457,826.1718750000,,, +28.5781250000,457,826.1718750000,,, +28.5800781250,457,826.1718750000,,, +28.5820312500,457,826.1718750000,,, +28.5839843750,457,826.1718750000,,, +28.5859375000,457,826.1718750000,,, +28.5878906250,457,826.1718750000,,, +28.5898437500,457,826.1718750000,,, +28.5917968750,457,826.1718750000,,, +28.5937500000,457,826.1718750000,,, +28.5957031250,457,826.1718750000,,, +28.5976562500,457,826.1718750000,,, +28.5996093750,457,826.1718750000,,, +28.6015625000,457,826.1718750000,,, +28.6035156250,457,826.1718750000,,, +28.6054687500,457,826.1718750000,,, +28.6074218750,457,826.1718750000,,, +28.6093750000,457,826.1718750000,,, +28.6113281250,457,826.1718750000,,, +28.6132812500,457,826.1718750000,,, +28.6152343750,457,826.1718750000,,, +28.6171875000,457,826.1718750000,,, +28.6191406250,457,826.1718750000,,, +28.6210937500,457,826.1718750000,,, +28.6230468750,457,826.1718750000,,, +28.6250000000,458,826.1718750000,,, +28.6269531250,458,826.1718750000,,, +28.6289062500,458,826.1718750000,,, +28.6308593750,458,826.1718750000,,, +28.6328125000,458,826.1718750000,,, +28.6347656250,458,826.1718750000,,, +28.6367187500,458,826.1718750000,,, +28.6386718750,458,826.1718750000,,, +28.6406250000,458,826.1718750000,,, +28.6425781250,458,826.1718750000,,, +28.6445312500,458,826.1718750000,,, +28.6464843750,458,826.1718750000,,, +28.6484375000,458,826.1718750000,,, +28.6503906250,458,826.1718750000,,, +28.6523437500,458,826.1718750000,,, +28.6542968750,458,826.1718750000,,, +28.6562500000,458,826.1718750000,,, +28.6582031250,458,826.1718750000,,, +28.6601562500,458,826.1718750000,,, +28.6621093750,458,826.1718750000,,, +28.6640625000,458,826.1718750000,,, +28.6660156250,458,826.1718750000,,, +28.6679687500,458,826.1718750000,,, +28.6699218750,458,826.1718750000,,, +28.6718750000,458,826.1718750000,,, +28.6738281250,458,826.1718750000,,, +28.6757812500,458,826.1718750000,,, +28.6777343750,458,826.1718750000,,, +28.6796875000,458,826.1718750000,,, +28.6816406250,458,826.1718750000,,, +28.6835937500,458,826.1718750000,,, +28.6855468750,458,826.1718750000,,, +28.6875000000,459,826.1718750000,,, +28.6894531250,459,826.1718750000,,, +28.6914062500,459,826.1718750000,,, +28.6933593750,459,826.1718750000,,, +28.6953125000,459,826.1718750000,,, +28.6972656250,459,826.1718750000,,, +28.6992187500,459,826.1718750000,,, +28.7011718750,459,826.1718750000,,, +28.7031250000,459,826.1718750000,,, +28.7050781250,459,826.1718750000,,, +28.7070312500,459,826.1718750000,,, +28.7089843750,459,826.1718750000,,, +28.7109375000,459,826.1718750000,,, +28.7128906250,459,826.1718750000,,, +28.7148437500,459,826.1718750000,,, +28.7167968750,459,826.1718750000,,, +28.7187500000,459,826.1718750000,,, +28.7207031250,459,826.1718750000,,, +28.7226562500,459,826.1718750000,,, +28.7246093750,459,826.1718750000,,, +28.7265625000,459,826.1718750000,,, +28.7285156250,459,826.1718750000,,, +28.7304687500,459,826.1718750000,,, +28.7324218750,459,826.1718750000,,, +28.7343750000,459,826.1718750000,,, +28.7363281250,459,826.1718750000,,, +28.7382812500,459,826.1718750000,,, +28.7402343750,459,826.1718750000,,, +28.7421875000,459,826.1718750000,,, +28.7441406250,459,826.1718750000,,, +28.7460937500,459,826.1718750000,,, +28.7480468750,459,826.1718750000,,, +28.7500000000,460,826.1718750000,,, +28.7519531250,460,826.1718750000,,, +28.7539062500,460,826.1718750000,,, +28.7558593750,460,826.1718750000,,, +28.7578125000,460,826.1718750000,,, +28.7597656250,460,826.1718750000,,, +28.7617187500,460,826.1718750000,,, +28.7636718750,460,826.1718750000,,, +28.7656250000,460,826.1718750000,,, +28.7675781250,460,826.1718750000,,, +28.7695312500,460,826.1718750000,,, +28.7714843750,460,826.1718750000,,, +28.7734375000,460,826.1718750000,,, +28.7753906250,460,826.1718750000,,, +28.7773437500,460,826.1718750000,,, +28.7792968750,460,826.1718750000,,, +28.7812500000,460,826.1718750000,,, +28.7832031250,460,826.1718750000,,, +28.7851562500,460,826.1718750000,,, +28.7871093750,460,826.1718750000,,, +28.7890625000,460,826.1718750000,,, +28.7910156250,460,826.1718750000,,, +28.7929687500,460,826.1718750000,,, +28.7949218750,460,826.1718750000,,, +28.7968750000,460,826.1718750000,,, +28.7988281250,460,826.1718750000,,, +28.8007812500,460,826.1718750000,,, +28.8027343750,460,826.1718750000,,, +28.8046875000,460,826.1718750000,,, +28.8066406250,460,826.1718750000,,, +28.8085937500,460,826.1718750000,,, +28.8105468750,460,826.1718750000,,, +28.8125000000,461,826.1718750000,,, +28.8144531250,461,826.1718750000,,, +28.8164062500,461,826.1718750000,,, +28.8183593750,461,826.1718750000,,, +28.8203125000,461,826.1718750000,,, +28.8222656250,461,826.1718750000,,, +28.8242187500,461,826.1718750000,,, +28.8261718750,461,826.1718750000,,, +28.8281250000,461,826.1718750000,,, +28.8300781250,461,826.1718750000,,, +28.8320312500,461,826.1718750000,,, +28.8339843750,461,826.1718750000,,, +28.8359375000,461,826.1718750000,,, +28.8378906250,461,826.1718750000,,, +28.8398437500,461,826.1718750000,,, +28.8417968750,461,826.1718750000,,, +28.8437500000,461,826.1718750000,,, +28.8457031250,461,826.1718750000,,, +28.8476562500,461,826.1718750000,,, +28.8496093750,461,826.1718750000,,, +28.8515625000,461,826.1718750000,,, +28.8535156250,461,826.1718750000,,, +28.8554687500,461,826.1718750000,,, +28.8574218750,461,826.1718750000,,, +28.8593750000,461,826.1718750000,,, +28.8613281250,461,826.1718750000,,, +28.8632812500,461,826.1718750000,,, +28.8652343750,461,826.1718750000,,, +28.8671875000,461,826.1718750000,,, +28.8691406250,461,826.1718750000,,, +28.8710937500,461,826.1718750000,,, +28.8730468750,461,826.1718750000,,, +28.8750000000,462,826.1718750000,,, +28.8769531250,462,826.1718750000,,, +28.8789062500,462,826.1718750000,,, +28.8808593750,462,826.1718750000,,, +28.8828125000,462,826.1718750000,,, +28.8847656250,462,826.1718750000,,, +28.8867187500,462,826.1718750000,,, +28.8886718750,462,826.1718750000,,, +28.8906250000,462,826.1718750000,,, +28.8925781250,462,826.1718750000,,, +28.8945312500,462,826.1718750000,,, +28.8964843750,462,826.1718750000,,, +28.8984375000,462,826.1718750000,,, +28.9003906250,462,826.1718750000,,, +28.9023437500,462,826.1718750000,,, +28.9042968750,462,826.1718750000,,, +28.9062500000,462,826.1718750000,,, +28.9082031250,462,826.1718750000,,, +28.9101562500,462,826.1718750000,,, +28.9121093750,462,826.1718750000,,, +28.9140625000,462,826.1718750000,,, +28.9160156250,462,826.1718750000,,, +28.9179687500,462,826.1718750000,,, +28.9199218750,462,826.1718750000,,, +28.9218750000,462,826.1718750000,,, +28.9238281250,462,826.1718750000,,, +28.9257812500,462,826.1718750000,,, +28.9277343750,462,826.1718750000,,, +28.9296875000,462,826.1718750000,,, +28.9316406250,462,826.1718750000,,, +28.9335937500,462,826.1718750000,,, +28.9355468750,462,826.1718750000,,, +28.9375000000,463,826.1718750000,,, +28.9394531250,463,826.1718750000,,, +28.9414062500,463,826.1718750000,,, +28.9433593750,463,826.1718750000,,, +28.9453125000,463,826.1718750000,,, +28.9472656250,463,826.1718750000,,, +28.9492187500,463,826.1718750000,,, +28.9511718750,463,826.1718750000,,, +28.9531250000,463,826.1718750000,,, +28.9550781250,463,826.1718750000,,, +28.9570312500,463,826.1718750000,,, +28.9589843750,463,826.1718750000,,, +28.9609375000,463,826.1718750000,,, +28.9628906250,463,826.1718750000,,, +28.9648437500,463,826.1718750000,,, +28.9667968750,463,826.1718750000,,, +28.9687500000,463,826.1718750000,,, +28.9707031250,463,826.1718750000,,, +28.9726562500,463,826.1718750000,,, +28.9746093750,463,826.1718750000,,, +28.9765625000,463,826.1718750000,,, +28.9785156250,463,826.1718750000,,, +28.9804687500,463,826.1718750000,,, +28.9824218750,463,826.1718750000,,, +28.9843750000,463,826.1718750000,,, +28.9863281250,463,826.1718750000,,, +28.9882812500,463,826.1718750000,,, +28.9902343750,463,826.1718750000,,, +28.9921875000,463,826.1718750000,,, +28.9941406250,463,826.1718750000,,, +28.9960937500,463,826.1718750000,,, +28.9980468750,463,826.1718750000,,, +29.0000000000,464,826.1718750000,,, +29.0019531250,464,826.1718750000,,, +29.0039062500,464,826.1718750000,,, +29.0058593750,464,826.1718750000,,, +29.0078125000,464,826.1718750000,,, +29.0097656250,464,826.1718750000,,, +29.0117187500,464,826.1718750000,,, +29.0136718750,464,826.1718750000,,, +29.0156250000,464,826.1718750000,,, +29.0175781250,464,826.1718750000,,, +29.0195312500,464,826.1718750000,,, +29.0214843750,464,826.1718750000,,, +29.0234375000,464,826.1718750000,,, +29.0253906250,464,826.1718750000,,, +29.0273437500,464,826.1718750000,,, +29.0292968750,464,826.1718750000,,, +29.0312500000,464,826.1718750000,,, +29.0332031250,464,826.1718750000,,, +29.0351562500,464,826.1718750000,,, +29.0371093750,464,826.1718750000,,, +29.0390625000,464,826.1718750000,,, +29.0410156250,464,826.1718750000,,, +29.0429687500,464,826.1718750000,,, +29.0449218750,464,826.1718750000,,, +29.0468750000,464,826.1718750000,,, +29.0488281250,464,826.1718750000,,, +29.0507812500,464,826.1718750000,,, +29.0527343750,464,826.1718750000,,, +29.0546875000,464,826.1718750000,,, +29.0566406250,464,826.1718750000,,, +29.0585937500,464,826.1718750000,,, +29.0605468750,464,826.1718750000,,, +29.0625000000,465,826.1718750000,,, +29.0644531250,465,826.1718750000,,, +29.0664062500,465,826.1718750000,,, +29.0683593750,465,826.1718750000,,, +29.0703125000,465,826.1718750000,,, +29.0722656250,465,826.1718750000,,, +29.0742187500,465,826.1718750000,,, +29.0761718750,465,826.1718750000,,, +29.0781250000,465,826.1718750000,,, +29.0800781250,465,826.1718750000,,, +29.0820312500,465,826.1718750000,,, +29.0839843750,465,826.1718750000,,, +29.0859375000,465,826.1718750000,,, +29.0878906250,465,826.1718750000,,, +29.0898437500,465,826.1718750000,,, +29.0917968750,465,826.1718750000,,, +29.0937500000,465,826.1718750000,,, +29.0957031250,465,826.1718750000,,, +29.0976562500,465,826.1718750000,,, +29.0996093750,465,826.1718750000,,, +29.1015625000,465,826.1718750000,,, +29.1035156250,465,826.1718750000,,, +29.1054687500,465,826.1718750000,,, +29.1074218750,465,826.1718750000,,, +29.1093750000,465,826.1718750000,,, +29.1113281250,465,826.1718750000,,, +29.1132812500,465,826.1718750000,,, +29.1152343750,465,826.1718750000,,, +29.1171875000,465,826.1718750000,,, +29.1191406250,465,826.1718750000,,, +29.1210937500,465,826.1718750000,,, +29.1230468750,465,826.1718750000,,, +29.1250000000,466,796.8750000000,,, +29.1269531250,466,796.8750000000,,, +29.1289062500,466,796.8750000000,,, +29.1308593750,466,796.8750000000,,, +29.1328125000,466,796.8750000000,,, +29.1347656250,466,796.8750000000,,, +29.1367187500,466,796.8750000000,,, +29.1386718750,466,796.8750000000,,, +29.1406250000,466,796.8750000000,,, +29.1425781250,466,796.8750000000,,, +29.1445312500,466,796.8750000000,,, +29.1464843750,466,796.8750000000,,, +29.1484375000,466,796.8750000000,,, +29.1503906250,466,796.8750000000,,, +29.1523437500,466,796.8750000000,,, +29.1542968750,466,796.8750000000,,, +29.1562500000,466,796.8750000000,,, +29.1582031250,466,796.8750000000,,, +29.1601562500,466,796.8750000000,,, +29.1621093750,466,796.8750000000,,, +29.1640625000,466,796.8750000000,,, +29.1660156250,466,796.8750000000,,, +29.1679687500,466,796.8750000000,,, +29.1699218750,466,796.8750000000,,, +29.1718750000,466,796.8750000000,,, +29.1738281250,466,796.8750000000,,, +29.1757812500,466,796.8750000000,,, +29.1777343750,466,796.8750000000,,, +29.1796875000,466,796.8750000000,,, +29.1816406250,466,796.8750000000,,, +29.1835937500,466,796.8750000000,,, +29.1855468750,466,796.8750000000,,, +29.1875000000,467,796.8750000000,,, +29.1894531250,467,796.8750000000,,, +29.1914062500,467,796.8750000000,,, +29.1933593750,467,796.8750000000,,, +29.1953125000,467,796.8750000000,,, +29.1972656250,467,796.8750000000,,, +29.1992187500,467,796.8750000000,,, +29.2011718750,467,796.8750000000,,, +29.2031250000,467,796.8750000000,,, +29.2050781250,467,796.8750000000,,, +29.2070312500,467,796.8750000000,,, +29.2089843750,467,796.8750000000,,, +29.2109375000,467,796.8750000000,,, +29.2128906250,467,796.8750000000,,, +29.2148437500,467,796.8750000000,,, +29.2167968750,467,796.8750000000,,, +29.2187500000,467,796.8750000000,,, +29.2207031250,467,796.8750000000,,, +29.2226562500,467,796.8750000000,,, +29.2246093750,467,796.8750000000,,, +29.2265625000,467,796.8750000000,,, +29.2285156250,467,796.8750000000,,, +29.2304687500,467,796.8750000000,,, +29.2324218750,467,796.8750000000,,, +29.2343750000,467,796.8750000000,,, +29.2363281250,467,796.8750000000,,, +29.2382812500,467,796.8750000000,,, +29.2402343750,467,796.8750000000,,, +29.2421875000,467,796.8750000000,,, +29.2441406250,467,796.8750000000,,, +29.2460937500,467,796.8750000000,,, +29.2480468750,467,796.8750000000,,, +29.2500000000,468,796.8750000000,,, +29.2519531250,468,796.8750000000,,, +29.2539062500,468,796.8750000000,,, +29.2558593750,468,796.8750000000,,, +29.2578125000,468,796.8750000000,,, +29.2597656250,468,796.8750000000,,, +29.2617187500,468,796.8750000000,,, +29.2636718750,468,796.8750000000,,, +29.2656250000,468,796.8750000000,,, +29.2675781250,468,796.8750000000,,, +29.2695312500,468,796.8750000000,,, +29.2714843750,468,796.8750000000,,, +29.2734375000,468,796.8750000000,,, +29.2753906250,468,796.8750000000,,, +29.2773437500,468,796.8750000000,,, +29.2792968750,468,796.8750000000,,, +29.2812500000,468,796.8750000000,,, +29.2832031250,468,796.8750000000,,, +29.2851562500,468,796.8750000000,,, +29.2871093750,468,796.8750000000,,, +29.2890625000,468,796.8750000000,,, +29.2910156250,468,796.8750000000,,, +29.2929687500,468,796.8750000000,,, +29.2949218750,468,796.8750000000,,, +29.2968750000,468,796.8750000000,,, +29.2988281250,468,796.8750000000,,, +29.3007812500,468,796.8750000000,,, +29.3027343750,468,796.8750000000,,, +29.3046875000,468,796.8750000000,,, +29.3066406250,468,796.8750000000,,, +29.3085937500,468,796.8750000000,,, +29.3105468750,468,796.8750000000,,, +29.3125000000,469,796.8750000000,,, +29.3144531250,469,796.8750000000,,, +29.3164062500,469,796.8750000000,,, +29.3183593750,469,796.8750000000,,, +29.3203125000,469,796.8750000000,,, +29.3222656250,469,796.8750000000,,, +29.3242187500,469,796.8750000000,,, +29.3261718750,469,796.8750000000,,, +29.3281250000,469,796.8750000000,,, +29.3300781250,469,796.8750000000,,, +29.3320312500,469,796.8750000000,,, +29.3339843750,469,796.8750000000,,, +29.3359375000,469,796.8750000000,,, +29.3378906250,469,796.8750000000,,, +29.3398437500,469,796.8750000000,,, +29.3417968750,469,796.8750000000,,, +29.3437500000,469,796.8750000000,,, +29.3457031250,469,796.8750000000,,, +29.3476562500,469,796.8750000000,,, +29.3496093750,469,796.8750000000,,, +29.3515625000,469,796.8750000000,,, +29.3535156250,469,796.8750000000,,, +29.3554687500,469,796.8750000000,,, +29.3574218750,469,796.8750000000,,, +29.3593750000,469,796.8750000000,,, +29.3613281250,469,796.8750000000,,, +29.3632812500,469,796.8750000000,,, +29.3652343750,469,796.8750000000,,, +29.3671875000,469,796.8750000000,,, +29.3691406250,469,796.8750000000,,, +29.3710937500,469,796.8750000000,,, +29.3730468750,469,796.8750000000,,, +29.3750000000,470,796.8750000000,,, +29.3769531250,470,796.8750000000,,, +29.3789062500,470,796.8750000000,,, +29.3808593750,470,796.8750000000,,, +29.3828125000,470,796.8750000000,,, +29.3847656250,470,796.8750000000,,, +29.3867187500,470,796.8750000000,,, +29.3886718750,470,796.8750000000,,, +29.3906250000,470,796.8750000000,,, +29.3925781250,470,796.8750000000,,, +29.3945312500,470,796.8750000000,,, +29.3964843750,470,796.8750000000,,, +29.3984375000,470,796.8750000000,,, +29.4003906250,470,796.8750000000,,, +29.4023437500,470,796.8750000000,,, +29.4042968750,470,796.8750000000,,, +29.4062500000,470,796.8750000000,,, +29.4082031250,470,796.8750000000,,, +29.4101562500,470,796.8750000000,,, +29.4121093750,470,796.8750000000,,, +29.4140625000,470,796.8750000000,,, +29.4160156250,470,796.8750000000,,, +29.4179687500,470,796.8750000000,,, +29.4199218750,470,796.8750000000,,, +29.4218750000,470,796.8750000000,,, +29.4238281250,470,796.8750000000,,, +29.4257812500,470,796.8750000000,,, +29.4277343750,470,796.8750000000,,, +29.4296875000,470,796.8750000000,,, +29.4316406250,470,796.8750000000,,, +29.4335937500,470,796.8750000000,,, +29.4355468750,470,796.8750000000,,, +29.4375000000,471,796.8750000000,,, +29.4394531250,471,796.8750000000,,, +29.4414062500,471,796.8750000000,,, +29.4433593750,471,796.8750000000,,, +29.4453125000,471,796.8750000000,,, +29.4472656250,471,796.8750000000,,, +29.4492187500,471,796.8750000000,,, +29.4511718750,471,796.8750000000,,, +29.4531250000,471,796.8750000000,,, +29.4550781250,471,796.8750000000,,, +29.4570312500,471,796.8750000000,,, +29.4589843750,471,796.8750000000,,, +29.4609375000,471,796.8750000000,,, +29.4628906250,471,796.8750000000,,, +29.4648437500,471,796.8750000000,,, +29.4667968750,471,796.8750000000,,, +29.4687500000,471,796.8750000000,,, +29.4707031250,471,796.8750000000,,, +29.4726562500,471,796.8750000000,,, +29.4746093750,471,796.8750000000,,, +29.4765625000,471,796.8750000000,,, +29.4785156250,471,796.8750000000,,, +29.4804687500,471,796.8750000000,,, +29.4824218750,471,796.8750000000,,, +29.4843750000,471,796.8750000000,,, +29.4863281250,471,796.8750000000,,, +29.4882812500,471,796.8750000000,,, +29.4902343750,471,796.8750000000,,, +29.4921875000,471,796.8750000000,,, +29.4941406250,471,796.8750000000,,, +29.4960937500,471,796.8750000000,,, +29.4980468750,471,796.8750000000,,, +29.5000000000,472,796.8750000000,,, +29.5019531250,472,796.8750000000,,, +29.5039062500,472,796.8750000000,,, +29.5058593750,472,796.8750000000,,, +29.5078125000,472,796.8750000000,,, +29.5097656250,472,796.8750000000,,, +29.5117187500,472,796.8750000000,,, +29.5136718750,472,796.8750000000,,, +29.5156250000,472,796.8750000000,,, +29.5175781250,472,796.8750000000,,, +29.5195312500,472,796.8750000000,,, +29.5214843750,472,796.8750000000,,, +29.5234375000,472,796.8750000000,,, +29.5253906250,472,796.8750000000,,, +29.5273437500,472,796.8750000000,,, +29.5292968750,472,796.8750000000,,, +29.5312500000,472,796.8750000000,,, +29.5332031250,472,796.8750000000,,, +29.5351562500,472,796.8750000000,,, +29.5371093750,472,796.8750000000,,, +29.5390625000,472,796.8750000000,,, +29.5410156250,472,796.8750000000,,, +29.5429687500,472,796.8750000000,,, +29.5449218750,472,796.8750000000,,, +29.5468750000,472,796.8750000000,,, +29.5488281250,472,796.8750000000,,, +29.5507812500,472,796.8750000000,,, +29.5527343750,472,796.8750000000,,, +29.5546875000,472,796.8750000000,,, +29.5566406250,472,796.8750000000,,, +29.5585937500,472,796.8750000000,,, +29.5605468750,472,796.8750000000,,, +29.5625000000,473,796.8750000000,,, +29.5644531250,473,796.8750000000,,, +29.5664062500,473,796.8750000000,,, +29.5683593750,473,796.8750000000,,, +29.5703125000,473,796.8750000000,,, +29.5722656250,473,796.8750000000,,, +29.5742187500,473,796.8750000000,,, +29.5761718750,473,796.8750000000,,, +29.5781250000,473,796.8750000000,,, +29.5800781250,473,796.8750000000,,, +29.5820312500,473,796.8750000000,,, +29.5839843750,473,796.8750000000,,, +29.5859375000,473,796.8750000000,,, +29.5878906250,473,796.8750000000,,, +29.5898437500,473,796.8750000000,,, +29.5917968750,473,796.8750000000,,, +29.5937500000,473,796.8750000000,,, +29.5957031250,473,796.8750000000,,, +29.5976562500,473,796.8750000000,,, +29.5996093750,473,796.8750000000,,, +29.6015625000,473,796.8750000000,,, +29.6035156250,473,796.8750000000,,, +29.6054687500,473,796.8750000000,,, +29.6074218750,473,796.8750000000,,, +29.6093750000,473,796.8750000000,,, +29.6113281250,473,796.8750000000,,, +29.6132812500,473,796.8750000000,,, +29.6152343750,473,796.8750000000,,, +29.6171875000,473,796.8750000000,,, +29.6191406250,473,796.8750000000,,, +29.6210937500,473,796.8750000000,,, +29.6230468750,473,796.8750000000,,, +29.6250000000,474,796.8750000000,,, +29.6269531250,474,796.8750000000,,, +29.6289062500,474,796.8750000000,,, +29.6308593750,474,796.8750000000,,, +29.6328125000,474,796.8750000000,,, +29.6347656250,474,796.8750000000,,, +29.6367187500,474,796.8750000000,,, +29.6386718750,474,796.8750000000,,, +29.6406250000,474,796.8750000000,,, +29.6425781250,474,796.8750000000,,, +29.6445312500,474,796.8750000000,,, +29.6464843750,474,796.8750000000,,, +29.6484375000,474,796.8750000000,,, +29.6503906250,474,796.8750000000,,, +29.6523437500,474,796.8750000000,,, +29.6542968750,474,796.8750000000,,, +29.6562500000,474,796.8750000000,,, +29.6582031250,474,796.8750000000,,, +29.6601562500,474,796.8750000000,,, +29.6621093750,474,796.8750000000,,, +29.6640625000,474,796.8750000000,,, +29.6660156250,474,796.8750000000,,, +29.6679687500,474,796.8750000000,,, +29.6699218750,474,796.8750000000,,, +29.6718750000,474,796.8750000000,,, +29.6738281250,474,796.8750000000,,, +29.6757812500,474,796.8750000000,,, +29.6777343750,474,796.8750000000,,, +29.6796875000,474,796.8750000000,,, +29.6816406250,474,796.8750000000,,, +29.6835937500,474,796.8750000000,,, +29.6855468750,474,796.8750000000,,, +29.6875000000,475,796.8750000000,,, +29.6894531250,475,796.8750000000,,, +29.6914062500,475,796.8750000000,,, +29.6933593750,475,796.8750000000,,, +29.6953125000,475,796.8750000000,,, +29.6972656250,475,796.8750000000,,, +29.6992187500,475,796.8750000000,,, +29.7011718750,475,796.8750000000,,, +29.7031250000,475,796.8750000000,,, +29.7050781250,475,796.8750000000,,, +29.7070312500,475,796.8750000000,,, +29.7089843750,475,796.8750000000,,, +29.7109375000,475,796.8750000000,,, +29.7128906250,475,796.8750000000,,, +29.7148437500,475,796.8750000000,,, +29.7167968750,475,796.8750000000,,, +29.7187500000,475,796.8750000000,,, +29.7207031250,475,796.8750000000,,, +29.7226562500,475,796.8750000000,,, +29.7246093750,475,796.8750000000,,, +29.7265625000,475,796.8750000000,,, +29.7285156250,475,796.8750000000,,, +29.7304687500,475,796.8750000000,,, +29.7324218750,475,796.8750000000,,, +29.7343750000,475,796.8750000000,,, +29.7363281250,475,796.8750000000,,, +29.7382812500,475,796.8750000000,,, +29.7402343750,475,796.8750000000,,, +29.7421875000,475,796.8750000000,,, +29.7441406250,475,796.8750000000,,, +29.7460937500,475,796.8750000000,,, +29.7480468750,475,796.8750000000,,, +29.7500000000,476,796.8750000000,,, +29.7519531250,476,796.8750000000,,, +29.7539062500,476,796.8750000000,,, +29.7558593750,476,796.8750000000,,, +29.7578125000,476,796.8750000000,,, +29.7597656250,476,796.8750000000,,, +29.7617187500,476,796.8750000000,,, +29.7636718750,476,796.8750000000,,, +29.7656250000,476,796.8750000000,,, +29.7675781250,476,796.8750000000,,, +29.7695312500,476,796.8750000000,,, +29.7714843750,476,796.8750000000,,, +29.7734375000,476,796.8750000000,,, +29.7753906250,476,796.8750000000,,, +29.7773437500,476,796.8750000000,,, +29.7792968750,476,796.8750000000,,, +29.7812500000,476,796.8750000000,,, +29.7832031250,476,796.8750000000,,, +29.7851562500,476,796.8750000000,,, +29.7871093750,476,796.8750000000,,, +29.7890625000,476,796.8750000000,,, +29.7910156250,476,796.8750000000,,, +29.7929687500,476,796.8750000000,,, +29.7949218750,476,796.8750000000,,, +29.7968750000,476,796.8750000000,,, +29.7988281250,476,796.8750000000,,, +29.8007812500,476,796.8750000000,,, +29.8027343750,476,796.8750000000,,, +29.8046875000,476,796.8750000000,,, +29.8066406250,476,796.8750000000,,, +29.8085937500,476,796.8750000000,,, +29.8105468750,476,796.8750000000,,, +29.8125000000,477,796.8750000000,,, +29.8144531250,477,796.8750000000,,, +29.8164062500,477,796.8750000000,,, +29.8183593750,477,796.8750000000,,, +29.8203125000,477,796.8750000000,,, +29.8222656250,477,796.8750000000,,, +29.8242187500,477,796.8750000000,,, +29.8261718750,477,796.8750000000,,, +29.8281250000,477,796.8750000000,,, +29.8300781250,477,796.8750000000,,, +29.8320312500,477,796.8750000000,,, +29.8339843750,477,796.8750000000,,, +29.8359375000,477,796.8750000000,,, +29.8378906250,477,796.8750000000,,, +29.8398437500,477,796.8750000000,,, +29.8417968750,477,796.8750000000,,, +29.8437500000,477,796.8750000000,,, +29.8457031250,477,796.8750000000,,, +29.8476562500,477,796.8750000000,,, +29.8496093750,477,796.8750000000,,, +29.8515625000,477,796.8750000000,,, +29.8535156250,477,796.8750000000,,, +29.8554687500,477,796.8750000000,,, +29.8574218750,477,796.8750000000,,, +29.8593750000,477,796.8750000000,,, +29.8613281250,477,796.8750000000,,, +29.8632812500,477,796.8750000000,,, +29.8652343750,477,796.8750000000,,, +29.8671875000,477,796.8750000000,,, +29.8691406250,477,796.8750000000,,, +29.8710937500,477,796.8750000000,,, +29.8730468750,477,796.8750000000,,, +29.8750000000,478,796.8750000000,,, +29.8769531250,478,796.8750000000,,, +29.8789062500,478,796.8750000000,,, +29.8808593750,478,796.8750000000,,, +29.8828125000,478,796.8750000000,,, +29.8847656250,478,796.8750000000,,, +29.8867187500,478,796.8750000000,,, +29.8886718750,478,796.8750000000,,, +29.8906250000,478,796.8750000000,,, +29.8925781250,478,796.8750000000,,, +29.8945312500,478,796.8750000000,,, +29.8964843750,478,796.8750000000,,, +29.8984375000,478,796.8750000000,,, +29.9003906250,478,796.8750000000,,, +29.9023437500,478,796.8750000000,,, +29.9042968750,478,796.8750000000,,, +29.9062500000,478,796.8750000000,,, +29.9082031250,478,796.8750000000,,, +29.9101562500,478,796.8750000000,,, +29.9121093750,478,796.8750000000,,, +29.9140625000,478,796.8750000000,,, +29.9160156250,478,796.8750000000,,, +29.9179687500,478,796.8750000000,,, +29.9199218750,478,796.8750000000,,, +29.9218750000,478,796.8750000000,,, +29.9238281250,478,796.8750000000,,, +29.9257812500,478,796.8750000000,,, +29.9277343750,478,796.8750000000,,, +29.9296875000,478,796.8750000000,,, +29.9316406250,478,796.8750000000,,, +29.9335937500,478,796.8750000000,,, +29.9355468750,478,796.8750000000,,, +29.9375000000,479,796.8750000000,,, +29.9394531250,479,796.8750000000,,, +29.9414062500,479,796.8750000000,,, +29.9433593750,479,796.8750000000,,, +29.9453125000,479,796.8750000000,,, +29.9472656250,479,796.8750000000,,, +29.9492187500,479,796.8750000000,,, +29.9511718750,479,796.8750000000,,, +29.9531250000,479,796.8750000000,,, +29.9550781250,479,796.8750000000,,, +29.9570312500,479,796.8750000000,,, +29.9589843750,479,796.8750000000,,, +29.9609375000,479,796.8750000000,,, +29.9628906250,479,796.8750000000,,, +29.9648437500,479,796.8750000000,,, +29.9667968750,479,796.8750000000,,, +29.9687500000,479,796.8750000000,,, +29.9707031250,479,796.8750000000,,, +29.9726562500,479,796.8750000000,,, +29.9746093750,479,796.8750000000,,, +29.9765625000,479,796.8750000000,,, +29.9785156250,479,796.8750000000,,, +29.9804687500,479,796.8750000000,,, +29.9824218750,479,796.8750000000,,, +29.9843750000,479,796.8750000000,,, +29.9863281250,479,796.8750000000,,, +29.9882812500,479,796.8750000000,,, +29.9902343750,479,796.8750000000,,, +29.9921875000,479,796.8750000000,,, +29.9941406250,479,796.8750000000,,, +29.9960937500,479,796.8750000000,,, +29.9980468750,479,796.8750000000,,, +30.0000000000,480,814.4531250000,,, +30.0019531250,480,814.4531250000,,, +30.0039062500,480,814.4531250000,,, +30.0058593750,480,814.4531250000,,, +30.0078125000,480,814.4531250000,,, +30.0097656250,480,814.4531250000,,, +30.0117187500,480,814.4531250000,,, +30.0136718750,480,814.4531250000,,, +30.0156250000,480,814.4531250000,,, +30.0175781250,480,814.4531250000,,, +30.0195312500,480,814.4531250000,,, +30.0214843750,480,814.4531250000,,, +30.0234375000,480,814.4531250000,,, +30.0253906250,480,814.4531250000,,, +30.0273437500,480,814.4531250000,,, +30.0292968750,480,814.4531250000,,, +30.0312500000,480,814.4531250000,,, +30.0332031250,480,814.4531250000,,, +30.0351562500,480,814.4531250000,,, +30.0371093750,480,814.4531250000,,, +30.0390625000,480,814.4531250000,,, +30.0410156250,480,814.4531250000,,, +30.0429687500,480,814.4531250000,,, +30.0449218750,480,814.4531250000,,, +30.0468750000,480,814.4531250000,,, +30.0488281250,480,814.4531250000,,, +30.0507812500,480,814.4531250000,,, +30.0527343750,480,814.4531250000,,, +30.0546875000,480,814.4531250000,,, +30.0566406250,480,814.4531250000,,, +30.0585937500,480,814.4531250000,,, +30.0605468750,480,814.4531250000,,, +30.0625000000,481,814.4531250000,,, +30.0644531250,481,814.4531250000,,, +30.0664062500,481,814.4531250000,,, +30.0683593750,481,814.4531250000,,, +30.0703125000,481,814.4531250000,,, +30.0722656250,481,814.4531250000,,, +30.0742187500,481,814.4531250000,,, +30.0761718750,481,814.4531250000,,, +30.0781250000,481,814.4531250000,,, +30.0800781250,481,814.4531250000,,, +30.0820312500,481,814.4531250000,,, +30.0839843750,481,814.4531250000,,, +30.0859375000,481,814.4531250000,,, +30.0878906250,481,814.4531250000,,, +30.0898437500,481,814.4531250000,,, +30.0917968750,481,814.4531250000,,, +30.0937500000,481,814.4531250000,,, +30.0957031250,481,814.4531250000,,, +30.0976562500,481,814.4531250000,,, +30.0996093750,481,814.4531250000,,, +30.1015625000,481,814.4531250000,,, +30.1035156250,481,814.4531250000,,, +30.1054687500,481,814.4531250000,,, +30.1074218750,481,814.4531250000,,, +30.1093750000,481,814.4531250000,,, +30.1113281250,481,814.4531250000,,, +30.1132812500,481,814.4531250000,,, +30.1152343750,481,814.4531250000,,, +30.1171875000,481,814.4531250000,,, +30.1191406250,481,814.4531250000,,, +30.1210937500,481,814.4531250000,,, +30.1230468750,481,814.4531250000,,, +30.1250000000,482,814.4531250000,,, +30.1269531250,482,814.4531250000,,, +30.1289062500,482,814.4531250000,,, +30.1308593750,482,814.4531250000,,, +30.1328125000,482,814.4531250000,,, +30.1347656250,482,814.4531250000,,, +30.1367187500,482,814.4531250000,,, +30.1386718750,482,814.4531250000,,, +30.1406250000,482,814.4531250000,,, +30.1425781250,482,814.4531250000,,, +30.1445312500,482,814.4531250000,,, +30.1464843750,482,814.4531250000,,, +30.1484375000,482,814.4531250000,,, +30.1503906250,482,814.4531250000,,, +30.1523437500,482,814.4531250000,,, +30.1542968750,482,814.4531250000,,, +30.1562500000,482,814.4531250000,,, +30.1582031250,482,814.4531250000,,, +30.1601562500,482,814.4531250000,,, +30.1621093750,482,814.4531250000,,, +30.1640625000,482,814.4531250000,,, +30.1660156250,482,814.4531250000,,, +30.1679687500,482,814.4531250000,,, +30.1699218750,482,814.4531250000,,, +30.1718750000,482,814.4531250000,,, +30.1738281250,482,814.4531250000,,, +30.1757812500,482,814.4531250000,,, +30.1777343750,482,814.4531250000,,, +30.1796875000,482,814.4531250000,,, +30.1816406250,482,814.4531250000,,, +30.1835937500,482,814.4531250000,,, +30.1855468750,482,814.4531250000,,, +30.1875000000,483,814.4531250000,,, +30.1894531250,483,814.4531250000,,, +30.1914062500,483,814.4531250000,,, +30.1933593750,483,814.4531250000,,, +30.1953125000,483,814.4531250000,,, +30.1972656250,483,814.4531250000,,, +30.1992187500,483,814.4531250000,,, +30.2011718750,483,814.4531250000,,, +30.2031250000,483,814.4531250000,,, +30.2050781250,483,814.4531250000,,, +30.2070312500,483,814.4531250000,,, +30.2089843750,483,814.4531250000,,, +30.2109375000,483,814.4531250000,,, +30.2128906250,483,814.4531250000,,, +30.2148437500,483,814.4531250000,,, +30.2167968750,483,814.4531250000,,, +30.2187500000,483,814.4531250000,,, +30.2207031250,483,814.4531250000,,, +30.2226562500,483,814.4531250000,,, +30.2246093750,483,814.4531250000,,, +30.2265625000,483,814.4531250000,,, +30.2285156250,483,814.4531250000,,, +30.2304687500,483,814.4531250000,,, +30.2324218750,483,814.4531250000,,, +30.2343750000,483,814.4531250000,,, +30.2363281250,483,814.4531250000,,, +30.2382812500,483,814.4531250000,,, +30.2402343750,483,814.4531250000,,, +30.2421875000,483,814.4531250000,,, +30.2441406250,483,814.4531250000,,, +30.2460937500,483,814.4531250000,,, +30.2480468750,483,814.4531250000,,, +30.2500000000,484,814.4531250000,,, +30.2519531250,484,814.4531250000,,, +30.2539062500,484,814.4531250000,,, +30.2558593750,484,814.4531250000,,, +30.2578125000,484,814.4531250000,,, +30.2597656250,484,814.4531250000,,, +30.2617187500,484,814.4531250000,,, +30.2636718750,484,814.4531250000,,, +30.2656250000,484,814.4531250000,,, +30.2675781250,484,814.4531250000,,, +30.2695312500,484,814.4531250000,,, +30.2714843750,484,814.4531250000,,, +30.2734375000,484,814.4531250000,,, +30.2753906250,484,814.4531250000,,, +30.2773437500,484,814.4531250000,,, +30.2792968750,484,814.4531250000,,, +30.2812500000,484,814.4531250000,,, +30.2832031250,484,814.4531250000,,, +30.2851562500,484,814.4531250000,,, +30.2871093750,484,814.4531250000,,, +30.2890625000,484,814.4531250000,,, +30.2910156250,484,814.4531250000,,, +30.2929687500,484,814.4531250000,,, +30.2949218750,484,814.4531250000,,, +30.2968750000,484,814.4531250000,,, +30.2988281250,484,814.4531250000,,, +30.3007812500,484,814.4531250000,,, +30.3027343750,484,814.4531250000,,, +30.3046875000,484,814.4531250000,,, +30.3066406250,484,814.4531250000,,, +30.3085937500,484,814.4531250000,,, +30.3105468750,484,814.4531250000,,, +30.3125000000,485,814.4531250000,,, +30.3144531250,485,814.4531250000,,, +30.3164062500,485,814.4531250000,,, +30.3183593750,485,814.4531250000,,, +30.3203125000,485,814.4531250000,,, +30.3222656250,485,814.4531250000,,, +30.3242187500,485,814.4531250000,,, +30.3261718750,485,814.4531250000,,, +30.3281250000,485,814.4531250000,,, +30.3300781250,485,814.4531250000,,, +30.3320312500,485,814.4531250000,,, +30.3339843750,485,814.4531250000,,, +30.3359375000,485,814.4531250000,,, +30.3378906250,485,814.4531250000,,, +30.3398437500,485,814.4531250000,,, +30.3417968750,485,814.4531250000,,, +30.3437500000,485,814.4531250000,,, +30.3457031250,485,814.4531250000,,, +30.3476562500,485,814.4531250000,,, +30.3496093750,485,814.4531250000,,, +30.3515625000,485,814.4531250000,,, +30.3535156250,485,814.4531250000,,, +30.3554687500,485,814.4531250000,,, +30.3574218750,485,814.4531250000,,, +30.3593750000,485,814.4531250000,,, +30.3613281250,485,814.4531250000,,, +30.3632812500,485,814.4531250000,,, +30.3652343750,485,814.4531250000,,, +30.3671875000,485,814.4531250000,,, +30.3691406250,485,814.4531250000,,, +30.3710937500,485,814.4531250000,,, +30.3730468750,485,814.4531250000,,, +30.3750000000,486,814.4531250000,,, +30.3769531250,486,814.4531250000,,, +30.3789062500,486,814.4531250000,,, +30.3808593750,486,814.4531250000,,, +30.3828125000,486,814.4531250000,,, +30.3847656250,486,814.4531250000,,, +30.3867187500,486,814.4531250000,,, +30.3886718750,486,814.4531250000,,, +30.3906250000,486,814.4531250000,,, +30.3925781250,486,814.4531250000,,, +30.3945312500,486,814.4531250000,,, +30.3964843750,486,814.4531250000,,, +30.3984375000,486,814.4531250000,,, +30.4003906250,486,814.4531250000,,, +30.4023437500,486,814.4531250000,,, +30.4042968750,486,814.4531250000,,, +30.4062500000,486,814.4531250000,,, +30.4082031250,486,814.4531250000,,, +30.4101562500,486,814.4531250000,,, +30.4121093750,486,814.4531250000,,, +30.4140625000,486,814.4531250000,,, +30.4160156250,486,814.4531250000,,, +30.4179687500,486,814.4531250000,,, +30.4199218750,486,814.4531250000,,, +30.4218750000,486,814.4531250000,,, +30.4238281250,486,814.4531250000,,, +30.4257812500,486,814.4531250000,,, +30.4277343750,486,814.4531250000,,, +30.4296875000,486,814.4531250000,,, +30.4316406250,486,814.4531250000,,, +30.4335937500,486,814.4531250000,,, +30.4355468750,486,814.4531250000,,, +30.4375000000,487,814.4531250000,,, +30.4394531250,487,814.4531250000,,, +30.4414062500,487,814.4531250000,,, +30.4433593750,487,814.4531250000,,, +30.4453125000,487,814.4531250000,,, +30.4472656250,487,814.4531250000,,, +30.4492187500,487,814.4531250000,,, +30.4511718750,487,814.4531250000,,, +30.4531250000,487,814.4531250000,,, +30.4550781250,487,814.4531250000,,, +30.4570312500,487,814.4531250000,,, +30.4589843750,487,814.4531250000,,, +30.4609375000,487,814.4531250000,,, +30.4628906250,487,814.4531250000,,, +30.4648437500,487,814.4531250000,,, +30.4667968750,487,814.4531250000,,, +30.4687500000,487,814.4531250000,,, +30.4707031250,487,814.4531250000,,, +30.4726562500,487,814.4531250000,,, +30.4746093750,487,814.4531250000,,, +30.4765625000,487,814.4531250000,,, +30.4785156250,487,814.4531250000,,, +30.4804687500,487,814.4531250000,,, +30.4824218750,487,814.4531250000,,, +30.4843750000,487,814.4531250000,,, +30.4863281250,487,814.4531250000,,, +30.4882812500,487,814.4531250000,,, +30.4902343750,487,814.4531250000,,, +30.4921875000,487,814.4531250000,,, +30.4941406250,487,814.4531250000,,, +30.4960937500,487,814.4531250000,,, +30.4980468750,487,814.4531250000,,, +30.5000000000,488,814.4531250000,,, +30.5019531250,488,814.4531250000,,, +30.5039062500,488,814.4531250000,,, +30.5058593750,488,814.4531250000,,, +30.5078125000,488,814.4531250000,,, +30.5097656250,488,814.4531250000,,, +30.5117187500,488,814.4531250000,,, +30.5136718750,488,814.4531250000,,, +30.5156250000,488,814.4531250000,,, +30.5175781250,488,814.4531250000,,, +30.5195312500,488,814.4531250000,,, +30.5214843750,488,814.4531250000,,, +30.5234375000,488,814.4531250000,,, +30.5253906250,488,814.4531250000,,, +30.5273437500,488,814.4531250000,,, +30.5292968750,488,814.4531250000,,, +30.5312500000,488,814.4531250000,,, +30.5332031250,488,814.4531250000,,, +30.5351562500,488,814.4531250000,,, +30.5371093750,488,814.4531250000,,, +30.5390625000,488,814.4531250000,,, +30.5410156250,488,814.4531250000,,, +30.5429687500,488,814.4531250000,,, +30.5449218750,488,814.4531250000,,, +30.5468750000,488,814.4531250000,,, +30.5488281250,488,814.4531250000,,, +30.5507812500,488,814.4531250000,,, +30.5527343750,488,814.4531250000,,, +30.5546875000,488,814.4531250000,,, +30.5566406250,488,814.4531250000,,, +30.5585937500,488,814.4531250000,,, +30.5605468750,488,814.4531250000,,, +30.5625000000,489,814.4531250000,,, +30.5644531250,489,814.4531250000,,, +30.5664062500,489,814.4531250000,,, +30.5683593750,489,814.4531250000,,, +30.5703125000,489,814.4531250000,,, +30.5722656250,489,814.4531250000,,, +30.5742187500,489,814.4531250000,,, +30.5761718750,489,814.4531250000,,, +30.5781250000,489,814.4531250000,,, +30.5800781250,489,814.4531250000,,, +30.5820312500,489,814.4531250000,,, +30.5839843750,489,814.4531250000,,, +30.5859375000,489,814.4531250000,,, +30.5878906250,489,814.4531250000,,, +30.5898437500,489,814.4531250000,,, +30.5917968750,489,814.4531250000,,, +30.5937500000,489,814.4531250000,,, +30.5957031250,489,814.4531250000,,, +30.5976562500,489,814.4531250000,,, +30.5996093750,489,814.4531250000,,, +30.6015625000,489,814.4531250000,,, +30.6035156250,489,814.4531250000,,, +30.6054687500,489,814.4531250000,,, +30.6074218750,489,814.4531250000,,, +30.6093750000,489,814.4531250000,,, +30.6113281250,489,814.4531250000,,, +30.6132812500,489,814.4531250000,,, +30.6152343750,489,814.4531250000,,, +30.6171875000,489,814.4531250000,,, +30.6191406250,489,814.4531250000,,, +30.6210937500,489,814.4531250000,,, +30.6230468750,489,814.4531250000,,, +30.6250000000,490,814.4531250000,,, +30.6269531250,490,814.4531250000,,, +30.6289062500,490,814.4531250000,,, +30.6308593750,490,814.4531250000,,, +30.6328125000,490,814.4531250000,,, +30.6347656250,490,814.4531250000,,, +30.6367187500,490,814.4531250000,,, +30.6386718750,490,814.4531250000,,, +30.6406250000,490,814.4531250000,,, +30.6425781250,490,814.4531250000,,, +30.6445312500,490,814.4531250000,,, +30.6464843750,490,814.4531250000,,, +30.6484375000,490,814.4531250000,,, +30.6503906250,490,814.4531250000,,, +30.6523437500,490,814.4531250000,,, +30.6542968750,490,814.4531250000,,, +30.6562500000,490,814.4531250000,,, +30.6582031250,490,814.4531250000,,, +30.6601562500,490,814.4531250000,,, +30.6621093750,490,814.4531250000,,, +30.6640625000,490,814.4531250000,,, +30.6660156250,490,814.4531250000,,, +30.6679687500,490,814.4531250000,,, +30.6699218750,490,814.4531250000,,, +30.6718750000,490,814.4531250000,,, +30.6738281250,490,814.4531250000,,, +30.6757812500,490,814.4531250000,,, +30.6777343750,490,814.4531250000,,, +30.6796875000,490,814.4531250000,,, +30.6816406250,490,814.4531250000,,, +30.6835937500,490,814.4531250000,,, +30.6855468750,490,814.4531250000,,, +30.6875000000,491,814.4531250000,,, +30.6894531250,491,814.4531250000,,, +30.6914062500,491,814.4531250000,,, +30.6933593750,491,814.4531250000,,, +30.6953125000,491,814.4531250000,,, +30.6972656250,491,814.4531250000,,, +30.6992187500,491,814.4531250000,,, +30.7011718750,491,814.4531250000,,, +30.7031250000,491,814.4531250000,,, +30.7050781250,491,814.4531250000,,, +30.7070312500,491,814.4531250000,,, +30.7089843750,491,814.4531250000,,, +30.7109375000,491,814.4531250000,,, +30.7128906250,491,814.4531250000,,, +30.7148437500,491,814.4531250000,,, +30.7167968750,491,814.4531250000,,, +30.7187500000,491,814.4531250000,,, +30.7207031250,491,814.4531250000,,, +30.7226562500,491,814.4531250000,,, +30.7246093750,491,814.4531250000,,, +30.7265625000,491,814.4531250000,,, +30.7285156250,491,814.4531250000,,, +30.7304687500,491,814.4531250000,,, +30.7324218750,491,814.4531250000,,, +30.7343750000,491,814.4531250000,,, +30.7363281250,491,814.4531250000,,, +30.7382812500,491,814.4531250000,,, +30.7402343750,491,814.4531250000,,, +30.7421875000,491,814.4531250000,,, +30.7441406250,491,814.4531250000,,, +30.7460937500,491,814.4531250000,,, +30.7480468750,491,814.4531250000,,, +30.7500000000,492,814.4531250000,,, +30.7519531250,492,814.4531250000,,, +30.7539062500,492,814.4531250000,,, +30.7558593750,492,814.4531250000,,, +30.7578125000,492,814.4531250000,,, +30.7597656250,492,814.4531250000,,, +30.7617187500,492,814.4531250000,,, +30.7636718750,492,814.4531250000,,, +30.7656250000,492,814.4531250000,,, +30.7675781250,492,814.4531250000,,, +30.7695312500,492,814.4531250000,,, +30.7714843750,492,814.4531250000,,, +30.7734375000,492,814.4531250000,,, +30.7753906250,492,814.4531250000,,, +30.7773437500,492,814.4531250000,,, +30.7792968750,492,814.4531250000,,, +30.7812500000,492,814.4531250000,,, +30.7832031250,492,814.4531250000,,, +30.7851562500,492,814.4531250000,,, +30.7871093750,492,814.4531250000,,, +30.7890625000,492,814.4531250000,,, +30.7910156250,492,814.4531250000,,, +30.7929687500,492,814.4531250000,,, +30.7949218750,492,814.4531250000,,, +30.7968750000,492,814.4531250000,,, +30.7988281250,492,814.4531250000,,, +30.8007812500,492,814.4531250000,,, +30.8027343750,492,814.4531250000,,, +30.8046875000,492,814.4531250000,,, +30.8066406250,492,814.4531250000,,, +30.8085937500,492,814.4531250000,,, +30.8105468750,492,814.4531250000,,, +30.8125000000,493,814.4531250000,,, +30.8144531250,493,814.4531250000,,, +30.8164062500,493,814.4531250000,,, +30.8183593750,493,814.4531250000,,, +30.8203125000,493,814.4531250000,,, +30.8222656250,493,814.4531250000,,, +30.8242187500,493,814.4531250000,,, +30.8261718750,493,814.4531250000,,, +30.8281250000,493,814.4531250000,,, +30.8300781250,493,814.4531250000,,, +30.8320312500,493,814.4531250000,,, +30.8339843750,493,814.4531250000,,, +30.8359375000,493,814.4531250000,,, +30.8378906250,493,814.4531250000,,, +30.8398437500,493,814.4531250000,,, +30.8417968750,493,814.4531250000,,, +30.8437500000,493,814.4531250000,,, +30.8457031250,493,814.4531250000,,, +30.8476562500,493,814.4531250000,,, +30.8496093750,493,814.4531250000,,, +30.8515625000,493,814.4531250000,,, +30.8535156250,493,814.4531250000,,, +30.8554687500,493,814.4531250000,,, +30.8574218750,493,814.4531250000,,, +30.8593750000,493,814.4531250000,,, +30.8613281250,493,814.4531250000,,, +30.8632812500,493,814.4531250000,,, +30.8652343750,493,814.4531250000,,, +30.8671875000,493,814.4531250000,,, +30.8691406250,493,814.4531250000,,, +30.8710937500,493,814.4531250000,,, +30.8730468750,493,814.4531250000,,, +30.8750000000,494,814.4531250000,,, +30.8769531250,494,814.4531250000,,, +30.8789062500,494,814.4531250000,,, +30.8808593750,494,814.4531250000,,, +30.8828125000,494,814.4531250000,,, +30.8847656250,494,814.4531250000,,, +30.8867187500,494,814.4531250000,,, +30.8886718750,494,814.4531250000,,, +30.8906250000,494,814.4531250000,,, +30.8925781250,494,814.4531250000,,, +30.8945312500,494,814.4531250000,,, +30.8964843750,494,814.4531250000,,, +30.8984375000,494,814.4531250000,,, +30.9003906250,494,814.4531250000,,, +30.9023437500,494,814.4531250000,,, +30.9042968750,494,814.4531250000,,, +30.9062500000,494,814.4531250000,,, +30.9082031250,494,814.4531250000,,, +30.9101562500,494,814.4531250000,,, +30.9121093750,494,814.4531250000,,, +30.9140625000,494,814.4531250000,,, +30.9160156250,494,814.4531250000,,, +30.9179687500,494,814.4531250000,,, +30.9199218750,494,814.4531250000,,, +30.9218750000,494,814.4531250000,,, +30.9238281250,494,814.4531250000,,, +30.9257812500,494,814.4531250000,,, +30.9277343750,494,814.4531250000,,, +30.9296875000,494,814.4531250000,,, +30.9316406250,494,814.4531250000,,, +30.9335937500,494,814.4531250000,,, +30.9355468750,494,814.4531250000,,, +30.9375000000,495,888.6718750000,,, +30.9394531250,495,888.6718750000,,, +30.9414062500,495,888.6718750000,,, +30.9433593750,495,888.6718750000,,, +30.9453125000,495,888.6718750000,,, +30.9472656250,495,888.6718750000,,, +30.9492187500,495,888.6718750000,,, +30.9511718750,495,888.6718750000,,, +30.9531250000,495,888.6718750000,,, +30.9550781250,495,888.6718750000,,, +30.9570312500,495,888.6718750000,,, +30.9589843750,495,888.6718750000,,, +30.9609375000,495,888.6718750000,,, +30.9628906250,495,888.6718750000,,, +30.9648437500,495,888.6718750000,,, +30.9667968750,495,888.6718750000,,, +30.9687500000,495,888.6718750000,,, +30.9707031250,495,888.6718750000,,, +30.9726562500,495,888.6718750000,,, +30.9746093750,495,888.6718750000,,, +30.9765625000,495,888.6718750000,,, +30.9785156250,495,888.6718750000,,, +30.9804687500,495,888.6718750000,,, +30.9824218750,495,888.6718750000,,, +30.9843750000,495,888.6718750000,,, +30.9863281250,495,888.6718750000,,, +30.9882812500,495,888.6718750000,,, +30.9902343750,495,888.6718750000,,, +30.9921875000,495,888.6718750000,,, +30.9941406250,495,888.6718750000,,, +30.9960937500,495,888.6718750000,,, +30.9980468750,495,888.6718750000,,, +31.0000000000,496,888.6718750000,,, +31.0019531250,496,888.6718750000,,, +31.0039062500,496,888.6718750000,,, +31.0058593750,496,888.6718750000,,, +31.0078125000,496,888.6718750000,,, +31.0097656250,496,888.6718750000,,, +31.0117187500,496,888.6718750000,,, +31.0136718750,496,888.6718750000,,, +31.0156250000,496,888.6718750000,,, +31.0175781250,496,888.6718750000,,, +31.0195312500,496,888.6718750000,,, +31.0214843750,496,888.6718750000,,, +31.0234375000,496,888.6718750000,,, +31.0253906250,496,888.6718750000,,, +31.0273437500,496,888.6718750000,,, +31.0292968750,496,888.6718750000,,, +31.0312500000,496,888.6718750000,,, +31.0332031250,496,888.6718750000,,, +31.0351562500,496,888.6718750000,,, +31.0371093750,496,888.6718750000,,, +31.0390625000,496,888.6718750000,,, +31.0410156250,496,888.6718750000,,, +31.0429687500,496,888.6718750000,,, +31.0449218750,496,888.6718750000,,, +31.0468750000,496,888.6718750000,,, +31.0488281250,496,888.6718750000,,, +31.0507812500,496,888.6718750000,,, +31.0527343750,496,888.6718750000,,, +31.0546875000,496,888.6718750000,,, +31.0566406250,496,888.6718750000,,, +31.0585937500,496,888.6718750000,,, +31.0605468750,496,888.6718750000,,, +31.0625000000,497,888.6718750000,,, +31.0644531250,497,888.6718750000,,, +31.0664062500,497,888.6718750000,,, +31.0683593750,497,888.6718750000,,, +31.0703125000,497,888.6718750000,,, +31.0722656250,497,888.6718750000,,, +31.0742187500,497,888.6718750000,,, +31.0761718750,497,888.6718750000,,, +31.0781250000,497,888.6718750000,,, +31.0800781250,497,888.6718750000,,, +31.0820312500,497,888.6718750000,,, +31.0839843750,497,888.6718750000,,, +31.0859375000,497,888.6718750000,,, +31.0878906250,497,888.6718750000,,, +31.0898437500,497,888.6718750000,,, +31.0917968750,497,888.6718750000,,, +31.0937500000,497,888.6718750000,,, +31.0957031250,497,888.6718750000,,, +31.0976562500,497,888.6718750000,,, +31.0996093750,497,888.6718750000,,, +31.1015625000,497,888.6718750000,,, +31.1035156250,497,888.6718750000,,, +31.1054687500,497,888.6718750000,,, +31.1074218750,497,888.6718750000,,, +31.1093750000,497,888.6718750000,,, +31.1113281250,497,888.6718750000,,, +31.1132812500,497,888.6718750000,,, +31.1152343750,497,888.6718750000,,, +31.1171875000,497,888.6718750000,,, +31.1191406250,497,888.6718750000,,, +31.1210937500,497,888.6718750000,,, +31.1230468750,497,888.6718750000,,, +31.1250000000,498,888.6718750000,,, +31.1269531250,498,888.6718750000,,, +31.1289062500,498,888.6718750000,,, +31.1308593750,498,888.6718750000,,, +31.1328125000,498,888.6718750000,,, +31.1347656250,498,888.6718750000,,, +31.1367187500,498,888.6718750000,,, +31.1386718750,498,888.6718750000,,, +31.1406250000,498,888.6718750000,,, +31.1425781250,498,888.6718750000,,, +31.1445312500,498,888.6718750000,,, +31.1464843750,498,888.6718750000,,, +31.1484375000,498,888.6718750000,,, +31.1503906250,498,888.6718750000,,, +31.1523437500,498,888.6718750000,,, +31.1542968750,498,888.6718750000,,, +31.1562500000,498,888.6718750000,,, +31.1582031250,498,888.6718750000,,, +31.1601562500,498,888.6718750000,,, +31.1621093750,498,888.6718750000,,, +31.1640625000,498,888.6718750000,,, +31.1660156250,498,888.6718750000,,, +31.1679687500,498,888.6718750000,,, +31.1699218750,498,888.6718750000,,, +31.1718750000,498,888.6718750000,,, +31.1738281250,498,888.6718750000,,, +31.1757812500,498,888.6718750000,,, +31.1777343750,498,888.6718750000,,, +31.1796875000,498,888.6718750000,,, +31.1816406250,498,888.6718750000,,, +31.1835937500,498,888.6718750000,,, +31.1855468750,498,888.6718750000,,, +31.1875000000,499,888.6718750000,,, +31.1894531250,499,888.6718750000,,, +31.1914062500,499,888.6718750000,,, +31.1933593750,499,888.6718750000,,, +31.1953125000,499,888.6718750000,,, +31.1972656250,499,888.6718750000,,, +31.1992187500,499,888.6718750000,,, +31.2011718750,499,888.6718750000,,, +31.2031250000,499,888.6718750000,,, +31.2050781250,499,888.6718750000,,, +31.2070312500,499,888.6718750000,,, +31.2089843750,499,888.6718750000,,, +31.2109375000,499,888.6718750000,,, +31.2128906250,499,888.6718750000,,, +31.2148437500,499,888.6718750000,,, +31.2167968750,499,888.6718750000,,, +31.2187500000,499,888.6718750000,,, +31.2207031250,499,888.6718750000,,, +31.2226562500,499,888.6718750000,,, +31.2246093750,499,888.6718750000,,, +31.2265625000,499,888.6718750000,,, +31.2285156250,499,888.6718750000,,, +31.2304687500,499,888.6718750000,,, +31.2324218750,499,888.6718750000,,, +31.2343750000,499,888.6718750000,,, +31.2363281250,499,888.6718750000,,, +31.2382812500,499,888.6718750000,,, +31.2402343750,499,888.6718750000,,, +31.2421875000,499,888.6718750000,,, +31.2441406250,499,888.6718750000,,, +31.2460937500,499,888.6718750000,,, +31.2480468750,499,888.6718750000,,, +31.2500000000,500,888.6718750000,,, +31.2519531250,500,888.6718750000,,, +31.2539062500,500,888.6718750000,,, +31.2558593750,500,888.6718750000,,, +31.2578125000,500,888.6718750000,,, +31.2597656250,500,888.6718750000,,, +31.2617187500,500,888.6718750000,,, +31.2636718750,500,888.6718750000,,, +31.2656250000,500,888.6718750000,,, +31.2675781250,500,888.6718750000,,, +31.2695312500,500,888.6718750000,,, +31.2714843750,500,888.6718750000,,, +31.2734375000,500,888.6718750000,,, +31.2753906250,500,888.6718750000,,, +31.2773437500,500,888.6718750000,,, +31.2792968750,500,888.6718750000,,, +31.2812500000,500,888.6718750000,,, +31.2832031250,500,888.6718750000,,, +31.2851562500,500,888.6718750000,,, +31.2871093750,500,888.6718750000,,, +31.2890625000,500,888.6718750000,,, +31.2910156250,500,888.6718750000,,, +31.2929687500,500,888.6718750000,,, +31.2949218750,500,888.6718750000,,, +31.2968750000,500,888.6718750000,,, +31.2988281250,500,888.6718750000,,, +31.3007812500,500,888.6718750000,,, +31.3027343750,500,888.6718750000,,, +31.3046875000,500,888.6718750000,,, +31.3066406250,500,888.6718750000,,, +31.3085937500,500,888.6718750000,,, +31.3105468750,500,888.6718750000,,, +31.3125000000,501,888.6718750000,,, +31.3144531250,501,888.6718750000,,, +31.3164062500,501,888.6718750000,,, +31.3183593750,501,888.6718750000,,, +31.3203125000,501,888.6718750000,,, +31.3222656250,501,888.6718750000,,, +31.3242187500,501,888.6718750000,,, +31.3261718750,501,888.6718750000,,, +31.3281250000,501,888.6718750000,,, +31.3300781250,501,888.6718750000,,, +31.3320312500,501,888.6718750000,,, +31.3339843750,501,888.6718750000,,, +31.3359375000,501,888.6718750000,,, +31.3378906250,501,888.6718750000,,, +31.3398437500,501,888.6718750000,,, +31.3417968750,501,888.6718750000,,, +31.3437500000,501,888.6718750000,,, +31.3457031250,501,888.6718750000,,, +31.3476562500,501,888.6718750000,,, +31.3496093750,501,888.6718750000,,, +31.3515625000,501,888.6718750000,,, +31.3535156250,501,888.6718750000,,, +31.3554687500,501,888.6718750000,,, +31.3574218750,501,888.6718750000,,, +31.3593750000,501,888.6718750000,,, +31.3613281250,501,888.6718750000,,, +31.3632812500,501,888.6718750000,,, +31.3652343750,501,888.6718750000,,, +31.3671875000,501,888.6718750000,,, +31.3691406250,501,888.6718750000,,, +31.3710937500,501,888.6718750000,,, +31.3730468750,501,888.6718750000,,, +31.3750000000,502,888.6718750000,,, +31.3769531250,502,888.6718750000,,, +31.3789062500,502,888.6718750000,,, +31.3808593750,502,888.6718750000,,, +31.3828125000,502,888.6718750000,,, +31.3847656250,502,888.6718750000,,, +31.3867187500,502,888.6718750000,,, +31.3886718750,502,888.6718750000,,, +31.3906250000,502,888.6718750000,,, +31.3925781250,502,888.6718750000,,, +31.3945312500,502,888.6718750000,,, +31.3964843750,502,888.6718750000,,, +31.3984375000,502,888.6718750000,,, +31.4003906250,502,888.6718750000,,, +31.4023437500,502,888.6718750000,,, +31.4042968750,502,888.6718750000,,, +31.4062500000,502,888.6718750000,,, +31.4082031250,502,888.6718750000,,, +31.4101562500,502,888.6718750000,,, +31.4121093750,502,888.6718750000,,, +31.4140625000,502,888.6718750000,,, +31.4160156250,502,888.6718750000,,, +31.4179687500,502,888.6718750000,,, +31.4199218750,502,888.6718750000,,, +31.4218750000,502,888.6718750000,,, +31.4238281250,502,888.6718750000,,, +31.4257812500,502,888.6718750000,,, +31.4277343750,502,888.6718750000,,, +31.4296875000,502,888.6718750000,,, +31.4316406250,502,888.6718750000,,, +31.4335937500,502,888.6718750000,,, +31.4355468750,502,888.6718750000,,, +31.4375000000,503,888.6718750000,,, +31.4394531250,503,888.6718750000,,, +31.4414062500,503,888.6718750000,,, +31.4433593750,503,888.6718750000,,, +31.4453125000,503,888.6718750000,,, +31.4472656250,503,888.6718750000,,, +31.4492187500,503,888.6718750000,,, +31.4511718750,503,888.6718750000,,, +31.4531250000,503,888.6718750000,,, +31.4550781250,503,888.6718750000,,, +31.4570312500,503,888.6718750000,,, +31.4589843750,503,888.6718750000,,, +31.4609375000,503,888.6718750000,,, +31.4628906250,503,888.6718750000,,, +31.4648437500,503,888.6718750000,,, +31.4667968750,503,888.6718750000,,, +31.4687500000,503,888.6718750000,,, +31.4707031250,503,888.6718750000,,, +31.4726562500,503,888.6718750000,,, +31.4746093750,503,888.6718750000,,, +31.4765625000,503,888.6718750000,,, +31.4785156250,503,888.6718750000,,, +31.4804687500,503,888.6718750000,,, +31.4824218750,503,888.6718750000,,, +31.4843750000,503,888.6718750000,,, +31.4863281250,503,888.6718750000,,, +31.4882812500,503,888.6718750000,,, +31.4902343750,503,888.6718750000,,, +31.4921875000,503,888.6718750000,,, +31.4941406250,503,888.6718750000,,, +31.4960937500,503,888.6718750000,,, +31.4980468750,503,888.6718750000,,, +31.5000000000,504,888.6718750000,,, +31.5019531250,504,888.6718750000,,, +31.5039062500,504,888.6718750000,,, +31.5058593750,504,888.6718750000,,, +31.5078125000,504,888.6718750000,,, +31.5097656250,504,888.6718750000,,, +31.5117187500,504,888.6718750000,,, +31.5136718750,504,888.6718750000,,, +31.5156250000,504,888.6718750000,,, +31.5175781250,504,888.6718750000,,, +31.5195312500,504,888.6718750000,,, +31.5214843750,504,888.6718750000,,, +31.5234375000,504,888.6718750000,,, +31.5253906250,504,888.6718750000,,, +31.5273437500,504,888.6718750000,,, +31.5292968750,504,888.6718750000,,, +31.5312500000,504,888.6718750000,,, +31.5332031250,504,888.6718750000,,, +31.5351562500,504,888.6718750000,,, +31.5371093750,504,888.6718750000,,, +31.5390625000,504,888.6718750000,,, +31.5410156250,504,888.6718750000,,, +31.5429687500,504,888.6718750000,,, +31.5449218750,504,888.6718750000,,, +31.5468750000,504,888.6718750000,,, +31.5488281250,504,888.6718750000,,, +31.5507812500,504,888.6718750000,,, +31.5527343750,504,888.6718750000,,, +31.5546875000,504,888.6718750000,,, +31.5566406250,504,888.6718750000,,, +31.5585937500,504,888.6718750000,,, +31.5605468750,504,888.6718750000,,, +31.5625000000,505,888.6718750000,,, +31.5644531250,505,888.6718750000,,, +31.5664062500,505,888.6718750000,,, +31.5683593750,505,888.6718750000,,, +31.5703125000,505,888.6718750000,,, +31.5722656250,505,888.6718750000,,, +31.5742187500,505,888.6718750000,,, +31.5761718750,505,888.6718750000,,, +31.5781250000,505,888.6718750000,,, +31.5800781250,505,888.6718750000,,, +31.5820312500,505,888.6718750000,,, +31.5839843750,505,888.6718750000,,, +31.5859375000,505,888.6718750000,,, +31.5878906250,505,888.6718750000,,, +31.5898437500,505,888.6718750000,,, +31.5917968750,505,888.6718750000,,, +31.5937500000,505,888.6718750000,,, +31.5957031250,505,888.6718750000,,, +31.5976562500,505,888.6718750000,,, +31.5996093750,505,888.6718750000,,, +31.6015625000,505,888.6718750000,,, +31.6035156250,505,888.6718750000,,, +31.6054687500,505,888.6718750000,,, +31.6074218750,505,888.6718750000,,, +31.6093750000,505,888.6718750000,,, +31.6113281250,505,888.6718750000,,, +31.6132812500,505,888.6718750000,,, +31.6152343750,505,888.6718750000,,, +31.6171875000,505,888.6718750000,,, +31.6191406250,505,888.6718750000,,, +31.6210937500,505,888.6718750000,,, +31.6230468750,505,888.6718750000,,, +31.6250000000,506,888.6718750000,,, +31.6269531250,506,888.6718750000,,, +31.6289062500,506,888.6718750000,,, +31.6308593750,506,888.6718750000,,, +31.6328125000,506,888.6718750000,,, +31.6347656250,506,888.6718750000,,, +31.6367187500,506,888.6718750000,,, +31.6386718750,506,888.6718750000,,, +31.6406250000,506,888.6718750000,,, +31.6425781250,506,888.6718750000,,, +31.6445312500,506,888.6718750000,,, +31.6464843750,506,888.6718750000,,, +31.6484375000,506,888.6718750000,,, +31.6503906250,506,888.6718750000,,, +31.6523437500,506,888.6718750000,,, +31.6542968750,506,888.6718750000,,, +31.6562500000,506,888.6718750000,,, +31.6582031250,506,888.6718750000,,, +31.6601562500,506,888.6718750000,,, +31.6621093750,506,888.6718750000,,, +31.6640625000,506,888.6718750000,,, +31.6660156250,506,888.6718750000,,, +31.6679687500,506,888.6718750000,,, +31.6699218750,506,888.6718750000,,, +31.6718750000,506,888.6718750000,,, +31.6738281250,506,888.6718750000,,, +31.6757812500,506,888.6718750000,,, +31.6777343750,506,888.6718750000,,, +31.6796875000,506,888.6718750000,,, +31.6816406250,506,888.6718750000,,, +31.6835937500,506,888.6718750000,,, +31.6855468750,506,888.6718750000,,, +31.6875000000,507,888.6718750000,,, +31.6894531250,507,888.6718750000,,, +31.6914062500,507,888.6718750000,,, +31.6933593750,507,888.6718750000,,, +31.6953125000,507,888.6718750000,,, +31.6972656250,507,888.6718750000,,, +31.6992187500,507,888.6718750000,,, +31.7011718750,507,888.6718750000,,, +31.7031250000,507,888.6718750000,,, +31.7050781250,507,888.6718750000,,, +31.7070312500,507,888.6718750000,,, +31.7089843750,507,888.6718750000,,, +31.7109375000,507,888.6718750000,,, +31.7128906250,507,888.6718750000,,, +31.7148437500,507,888.6718750000,,, +31.7167968750,507,888.6718750000,,, +31.7187500000,507,888.6718750000,,, +31.7207031250,507,888.6718750000,,, +31.7226562500,507,888.6718750000,,, +31.7246093750,507,888.6718750000,,, +31.7265625000,507,888.6718750000,,, +31.7285156250,507,888.6718750000,,, +31.7304687500,507,888.6718750000,,, +31.7324218750,507,888.6718750000,,, +31.7343750000,507,888.6718750000,,, +31.7363281250,507,888.6718750000,,, +31.7382812500,507,888.6718750000,,, +31.7402343750,507,888.6718750000,,, +31.7421875000,507,888.6718750000,,, +31.7441406250,507,888.6718750000,,, +31.7460937500,507,888.6718750000,,, +31.7480468750,507,888.6718750000,,, +31.7500000000,508,888.6718750000,,, +31.7519531250,508,888.6718750000,,, +31.7539062500,508,888.6718750000,,, +31.7558593750,508,888.6718750000,,, +31.7578125000,508,888.6718750000,,, +31.7597656250,508,888.6718750000,,, +31.7617187500,508,888.6718750000,,, +31.7636718750,508,888.6718750000,,, +31.7656250000,508,888.6718750000,,, +31.7675781250,508,888.6718750000,,, +31.7695312500,508,888.6718750000,,, +31.7714843750,508,888.6718750000,,, +31.7734375000,508,888.6718750000,,, +31.7753906250,508,888.6718750000,,, +31.7773437500,508,888.6718750000,,, +31.7792968750,508,888.6718750000,,, +31.7812500000,508,888.6718750000,,, +31.7832031250,508,888.6718750000,,, +31.7851562500,508,888.6718750000,,, +31.7871093750,508,888.6718750000,,, +31.7890625000,508,888.6718750000,,, +31.7910156250,508,888.6718750000,,, +31.7929687500,508,888.6718750000,,, +31.7949218750,508,888.6718750000,,, +31.7968750000,508,888.6718750000,,, +31.7988281250,508,888.6718750000,,, +31.8007812500,508,888.6718750000,,, +31.8027343750,508,888.6718750000,,, +31.8046875000,508,888.6718750000,,, +31.8066406250,508,888.6718750000,,, +31.8085937500,508,888.6718750000,,, +31.8105468750,508,888.6718750000,,, +31.8125000000,509,888.6718750000,,, +31.8144531250,509,888.6718750000,,, +31.8164062500,509,888.6718750000,,, +31.8183593750,509,888.6718750000,,, +31.8203125000,509,888.6718750000,,, +31.8222656250,509,888.6718750000,,, +31.8242187500,509,888.6718750000,,, +31.8261718750,509,888.6718750000,,, +31.8281250000,509,888.6718750000,,, +31.8300781250,509,888.6718750000,,, +31.8320312500,509,888.6718750000,,, +31.8339843750,509,888.6718750000,,, +31.8359375000,509,888.6718750000,,, +31.8378906250,509,888.6718750000,,, +31.8398437500,509,888.6718750000,,, +31.8417968750,509,888.6718750000,,, +31.8437500000,509,888.6718750000,,, +31.8457031250,509,888.6718750000,,, +31.8476562500,509,888.6718750000,,, +31.8496093750,509,888.6718750000,,, +31.8515625000,509,888.6718750000,,, +31.8535156250,509,888.6718750000,,, +31.8554687500,509,888.6718750000,,, +31.8574218750,509,888.6718750000,,, +31.8593750000,509,888.6718750000,,, +31.8613281250,509,888.6718750000,,, +31.8632812500,509,888.6718750000,,, +31.8652343750,509,888.6718750000,,, +31.8671875000,509,888.6718750000,,, +31.8691406250,509,888.6718750000,,, +31.8710937500,509,888.6718750000,,, +31.8730468750,509,888.6718750000,,, +31.8750000000,510,888.6718750000,,, +31.8769531250,510,888.6718750000,,, +31.8789062500,510,888.6718750000,,, +31.8808593750,510,888.6718750000,,, +31.8828125000,510,888.6718750000,,, +31.8847656250,510,888.6718750000,,, +31.8867187500,510,888.6718750000,,, +31.8886718750,510,888.6718750000,,, +31.8906250000,510,888.6718750000,,, +31.8925781250,510,888.6718750000,,, +31.8945312500,510,888.6718750000,,, +31.8964843750,510,888.6718750000,,, +31.8984375000,510,888.6718750000,,, +31.9003906250,510,888.6718750000,,, +31.9023437500,510,888.6718750000,,, +31.9042968750,510,888.6718750000,,, +31.9062500000,510,888.6718750000,,, +31.9082031250,510,888.6718750000,,, +31.9101562500,510,888.6718750000,,, +31.9121093750,510,888.6718750000,,, +31.9140625000,510,888.6718750000,,, +31.9160156250,510,888.6718750000,,, +31.9179687500,510,888.6718750000,,, +31.9199218750,510,888.6718750000,,, +31.9218750000,510,888.6718750000,,, +31.9238281250,510,888.6718750000,,, +31.9257812500,510,888.6718750000,,, +31.9277343750,510,888.6718750000,,, +31.9296875000,510,888.6718750000,,, +31.9316406250,510,888.6718750000,,, +31.9335937500,510,888.6718750000,,, +31.9355468750,510,888.6718750000,,, +31.9375000000,511,933.5937500000,,, +31.9394531250,511,933.5937500000,,, +31.9414062500,511,933.5937500000,,, +31.9433593750,511,933.5937500000,,, +31.9453125000,511,933.5937500000,,, +31.9472656250,511,933.5937500000,,, +31.9492187500,511,933.5937500000,,, +31.9511718750,511,933.5937500000,,, +31.9531250000,511,933.5937500000,,, +31.9550781250,511,933.5937500000,,, +31.9570312500,511,933.5937500000,,, +31.9589843750,511,933.5937500000,,, +31.9609375000,511,933.5937500000,,, +31.9628906250,511,933.5937500000,,, +31.9648437500,511,933.5937500000,,, +31.9667968750,511,933.5937500000,,, +31.9687500000,511,933.5937500000,,, +31.9707031250,511,933.5937500000,,, +31.9726562500,511,933.5937500000,,, +31.9746093750,511,933.5937500000,,, +31.9765625000,511,933.5937500000,,, +31.9785156250,511,933.5937500000,,, +31.9804687500,511,933.5937500000,,, +31.9824218750,511,933.5937500000,,, +31.9843750000,511,933.5937500000,,, +31.9863281250,511,933.5937500000,,, +31.9882812500,511,933.5937500000,,, +31.9902343750,511,933.5937500000,,, +31.9921875000,511,933.5937500000,,, +31.9941406250,511,933.5937500000,,, +31.9960937500,511,933.5937500000,,, +31.9980468750,511,933.5937500000,,, +32.0000000000,512,933.5937500000,,, +32.0019531250,512,933.5937500000,,, +32.0039062500,512,933.5937500000,,, +32.0058593750,512,933.5937500000,,, +32.0078125000,512,933.5937500000,,, +32.0097656250,512,933.5937500000,,, +32.0117187500,512,933.5937500000,,, +32.0136718750,512,933.5937500000,,, +32.0156250000,512,933.5937500000,,, +32.0175781250,512,933.5937500000,,, +32.0195312500,512,933.5937500000,,, +32.0214843750,512,933.5937500000,,, +32.0234375000,512,933.5937500000,,, +32.0253906250,512,933.5937500000,,, +32.0273437500,512,933.5937500000,,, +32.0292968750,512,933.5937500000,,, +32.0312500000,512,933.5937500000,,, +32.0332031250,512,933.5937500000,,, +32.0351562500,512,933.5937500000,,, +32.0371093750,512,933.5937500000,,, +32.0390625000,512,933.5937500000,,, +32.0410156250,512,933.5937500000,,, +32.0429687500,512,933.5937500000,,, +32.0449218750,512,933.5937500000,,, +32.0468750000,512,933.5937500000,,, +32.0488281250,512,933.5937500000,,, +32.0507812500,512,933.5937500000,,, +32.0527343750,512,933.5937500000,,, +32.0546875000,512,933.5937500000,,, +32.0566406250,512,933.5937500000,,, +32.0585937500,512,933.5937500000,,, +32.0605468750,512,933.5937500000,,, +32.0625000000,513,933.5937500000,,, +32.0644531250,513,933.5937500000,,, +32.0664062500,513,933.5937500000,,, +32.0683593750,513,933.5937500000,,, +32.0703125000,513,933.5937500000,,, +32.0722656250,513,933.5937500000,,, +32.0742187500,513,933.5937500000,,, +32.0761718750,513,933.5937500000,,, +32.0781250000,513,933.5937500000,,, +32.0800781250,513,933.5937500000,,, +32.0820312500,513,933.5937500000,,, +32.0839843750,513,933.5937500000,,, +32.0859375000,513,933.5937500000,,, +32.0878906250,513,933.5937500000,,, +32.0898437500,513,933.5937500000,,, +32.0917968750,513,933.5937500000,,, +32.0937500000,513,933.5937500000,,, +32.0957031250,513,933.5937500000,,, +32.0976562500,513,933.5937500000,,, +32.0996093750,513,933.5937500000,,, +32.1015625000,513,933.5937500000,,, +32.1035156250,513,933.5937500000,,, +32.1054687500,513,933.5937500000,,, +32.1074218750,513,933.5937500000,,, +32.1093750000,513,933.5937500000,,, +32.1113281250,513,933.5937500000,,, +32.1132812500,513,933.5937500000,,, +32.1152343750,513,933.5937500000,,, +32.1171875000,513,933.5937500000,,, +32.1191406250,513,933.5937500000,,, +32.1210937500,513,933.5937500000,,, +32.1230468750,513,933.5937500000,,, +32.1250000000,514,933.5937500000,,, +32.1269531250,514,933.5937500000,,, +32.1289062500,514,933.5937500000,,, +32.1308593750,514,933.5937500000,,, +32.1328125000,514,933.5937500000,,, +32.1347656250,514,933.5937500000,,, +32.1367187500,514,933.5937500000,,, +32.1386718750,514,933.5937500000,,, +32.1406250000,514,933.5937500000,,, +32.1425781250,514,933.5937500000,,, +32.1445312500,514,933.5937500000,,, +32.1464843750,514,933.5937500000,,, +32.1484375000,514,933.5937500000,,, +32.1503906250,514,933.5937500000,,, +32.1523437500,514,933.5937500000,,, +32.1542968750,514,933.5937500000,,, +32.1562500000,514,933.5937500000,,, +32.1582031250,514,933.5937500000,,, +32.1601562500,514,933.5937500000,,, +32.1621093750,514,933.5937500000,,, +32.1640625000,514,933.5937500000,,, +32.1660156250,514,933.5937500000,,, +32.1679687500,514,933.5937500000,,, +32.1699218750,514,933.5937500000,,, +32.1718750000,514,933.5937500000,,, +32.1738281250,514,933.5937500000,,, +32.1757812500,514,933.5937500000,,, +32.1777343750,514,933.5937500000,,, +32.1796875000,514,933.5937500000,,, +32.1816406250,514,933.5937500000,,, +32.1835937500,514,933.5937500000,,, +32.1855468750,514,933.5937500000,,, +32.1875000000,515,933.5937500000,,, +32.1894531250,515,933.5937500000,,, +32.1914062500,515,933.5937500000,,, +32.1933593750,515,933.5937500000,,, +32.1953125000,515,933.5937500000,,, +32.1972656250,515,933.5937500000,,, +32.1992187500,515,933.5937500000,,, +32.2011718750,515,933.5937500000,,, +32.2031250000,515,933.5937500000,,, +32.2050781250,515,933.5937500000,,, +32.2070312500,515,933.5937500000,,, +32.2089843750,515,933.5937500000,,, +32.2109375000,515,933.5937500000,,, +32.2128906250,515,933.5937500000,,, +32.2148437500,515,933.5937500000,,, +32.2167968750,515,933.5937500000,,, +32.2187500000,515,933.5937500000,,, +32.2207031250,515,933.5937500000,,, +32.2226562500,515,933.5937500000,,, +32.2246093750,515,933.5937500000,,, +32.2265625000,515,933.5937500000,,, +32.2285156250,515,933.5937500000,,, +32.2304687500,515,933.5937500000,,, +32.2324218750,515,933.5937500000,,, +32.2343750000,515,933.5937500000,,, +32.2363281250,515,933.5937500000,,, +32.2382812500,515,933.5937500000,,, +32.2402343750,515,933.5937500000,,, +32.2421875000,515,933.5937500000,,, +32.2441406250,515,933.5937500000,,, +32.2460937500,515,933.5937500000,,, +32.2480468750,515,933.5937500000,,, +32.2500000000,516,933.5937500000,,, +32.2519531250,516,933.5937500000,,, +32.2539062500,516,933.5937500000,,, +32.2558593750,516,933.5937500000,,, +32.2578125000,516,933.5937500000,,, +32.2597656250,516,933.5937500000,,, +32.2617187500,516,933.5937500000,,, +32.2636718750,516,933.5937500000,,, +32.2656250000,516,933.5937500000,,, +32.2675781250,516,933.5937500000,,, +32.2695312500,516,933.5937500000,,, +32.2714843750,516,933.5937500000,,, +32.2734375000,516,933.5937500000,,, +32.2753906250,516,933.5937500000,,, +32.2773437500,516,933.5937500000,,, +32.2792968750,516,933.5937500000,,, +32.2812500000,516,933.5937500000,,, +32.2832031250,516,933.5937500000,,, +32.2851562500,516,933.5937500000,,, +32.2871093750,516,933.5937500000,,, +32.2890625000,516,933.5937500000,,, +32.2910156250,516,933.5937500000,,, +32.2929687500,516,933.5937500000,,, +32.2949218750,516,933.5937500000,,, +32.2968750000,516,933.5937500000,,, +32.2988281250,516,933.5937500000,,, +32.3007812500,516,933.5937500000,,, +32.3027343750,516,933.5937500000,,, +32.3046875000,516,933.5937500000,,, +32.3066406250,516,933.5937500000,,, +32.3085937500,516,933.5937500000,,, +32.3105468750,516,933.5937500000,,, +32.3125000000,517,933.5937500000,,, +32.3144531250,517,933.5937500000,,, +32.3164062500,517,933.5937500000,,, +32.3183593750,517,933.5937500000,,, +32.3203125000,517,933.5937500000,,, +32.3222656250,517,933.5937500000,,, +32.3242187500,517,933.5937500000,,, +32.3261718750,517,933.5937500000,,, +32.3281250000,517,933.5937500000,,, +32.3300781250,517,933.5937500000,,, +32.3320312500,517,933.5937500000,,, +32.3339843750,517,933.5937500000,,, +32.3359375000,517,933.5937500000,,, +32.3378906250,517,933.5937500000,,, +32.3398437500,517,933.5937500000,,, +32.3417968750,517,933.5937500000,,, +32.3437500000,517,933.5937500000,,, +32.3457031250,517,933.5937500000,,, +32.3476562500,517,933.5937500000,,, +32.3496093750,517,933.5937500000,,, +32.3515625000,517,933.5937500000,,, +32.3535156250,517,933.5937500000,,, +32.3554687500,517,933.5937500000,,, +32.3574218750,517,933.5937500000,,, +32.3593750000,517,933.5937500000,,, +32.3613281250,517,933.5937500000,,, +32.3632812500,517,933.5937500000,,, +32.3652343750,517,933.5937500000,,, +32.3671875000,517,933.5937500000,,, +32.3691406250,517,933.5937500000,,, +32.3710937500,517,933.5937500000,,, +32.3730468750,517,933.5937500000,,, +32.3750000000,518,933.5937500000,,, +32.3769531250,518,933.5937500000,,, +32.3789062500,518,933.5937500000,,, +32.3808593750,518,933.5937500000,,, +32.3828125000,518,933.5937500000,,, +32.3847656250,518,933.5937500000,,, +32.3867187500,518,933.5937500000,,, +32.3886718750,518,933.5937500000,,, +32.3906250000,518,933.5937500000,,, +32.3925781250,518,933.5937500000,,, +32.3945312500,518,933.5937500000,,, +32.3964843750,518,933.5937500000,,, +32.3984375000,518,933.5937500000,,, +32.4003906250,518,933.5937500000,,, +32.4023437500,518,933.5937500000,,, +32.4042968750,518,933.5937500000,,, +32.4062500000,518,933.5937500000,,, +32.4082031250,518,933.5937500000,,, +32.4101562500,518,933.5937500000,,, +32.4121093750,518,933.5937500000,,, +32.4140625000,518,933.5937500000,,, +32.4160156250,518,933.5937500000,,, +32.4179687500,518,933.5937500000,,, +32.4199218750,518,933.5937500000,,, +32.4218750000,518,933.5937500000,,, +32.4238281250,518,933.5937500000,,, +32.4257812500,518,933.5937500000,,, +32.4277343750,518,933.5937500000,,, +32.4296875000,518,933.5937500000,,, +32.4316406250,518,933.5937500000,,, +32.4335937500,518,933.5937500000,,, +32.4355468750,518,933.5937500000,,, +32.4375000000,519,933.5937500000,,, +32.4394531250,519,933.5937500000,,, +32.4414062500,519,933.5937500000,,, +32.4433593750,519,933.5937500000,,, +32.4453125000,519,933.5937500000,,, +32.4472656250,519,933.5937500000,,, +32.4492187500,519,933.5937500000,,, +32.4511718750,519,933.5937500000,,, +32.4531250000,519,933.5937500000,,, +32.4550781250,519,933.5937500000,,, +32.4570312500,519,933.5937500000,,, +32.4589843750,519,933.5937500000,,, +32.4609375000,519,933.5937500000,,, +32.4628906250,519,933.5937500000,,, +32.4648437500,519,933.5937500000,,, +32.4667968750,519,933.5937500000,,, +32.4687500000,519,933.5937500000,,, +32.4707031250,519,933.5937500000,,, +32.4726562500,519,933.5937500000,,, +32.4746093750,519,933.5937500000,,, +32.4765625000,519,933.5937500000,,, +32.4785156250,519,933.5937500000,,, +32.4804687500,519,933.5937500000,,, +32.4824218750,519,933.5937500000,,, +32.4843750000,519,933.5937500000,,, +32.4863281250,519,933.5937500000,,, +32.4882812500,519,933.5937500000,,, +32.4902343750,519,933.5937500000,,, +32.4921875000,519,933.5937500000,,, +32.4941406250,519,933.5937500000,,, +32.4960937500,519,933.5937500000,,, +32.4980468750,519,933.5937500000,,, +32.5000000000,520,933.5937500000,,, +32.5019531250,520,933.5937500000,,, +32.5039062500,520,933.5937500000,,, +32.5058593750,520,933.5937500000,,, +32.5078125000,520,933.5937500000,,, +32.5097656250,520,933.5937500000,,, +32.5117187500,520,933.5937500000,,, +32.5136718750,520,933.5937500000,,, +32.5156250000,520,933.5937500000,,, +32.5175781250,520,933.5937500000,,, +32.5195312500,520,933.5937500000,,, +32.5214843750,520,933.5937500000,,, +32.5234375000,520,933.5937500000,,, +32.5253906250,520,933.5937500000,,, +32.5273437500,520,933.5937500000,,, +32.5292968750,520,933.5937500000,,, +32.5312500000,520,933.5937500000,,, +32.5332031250,520,933.5937500000,,, +32.5351562500,520,933.5937500000,,, +32.5371093750,520,933.5937500000,,, +32.5390625000,520,933.5937500000,,, +32.5410156250,520,933.5937500000,,, +32.5429687500,520,933.5937500000,,, +32.5449218750,520,933.5937500000,,, +32.5468750000,520,933.5937500000,,, +32.5488281250,520,933.5937500000,,, +32.5507812500,520,933.5937500000,,, +32.5527343750,520,933.5937500000,,, +32.5546875000,520,933.5937500000,,, +32.5566406250,520,933.5937500000,,, +32.5585937500,520,933.5937500000,,, +32.5605468750,520,933.5937500000,,, +32.5625000000,521,933.5937500000,,, +32.5644531250,521,933.5937500000,,, +32.5664062500,521,933.5937500000,,, +32.5683593750,521,933.5937500000,,, +32.5703125000,521,933.5937500000,,, +32.5722656250,521,933.5937500000,,, +32.5742187500,521,933.5937500000,,, +32.5761718750,521,933.5937500000,,, +32.5781250000,521,933.5937500000,,, +32.5800781250,521,933.5937500000,,, +32.5820312500,521,933.5937500000,,, +32.5839843750,521,933.5937500000,,, +32.5859375000,521,933.5937500000,,, +32.5878906250,521,933.5937500000,,, +32.5898437500,521,933.5937500000,,, +32.5917968750,521,933.5937500000,,, +32.5937500000,521,933.5937500000,,, +32.5957031250,521,933.5937500000,,, +32.5976562500,521,933.5937500000,,, +32.5996093750,521,933.5937500000,,, +32.6015625000,521,933.5937500000,,, +32.6035156250,521,933.5937500000,,, +32.6054687500,521,933.5937500000,,, +32.6074218750,521,933.5937500000,,, +32.6093750000,521,933.5937500000,,, +32.6113281250,521,933.5937500000,,, +32.6132812500,521,933.5937500000,,, +32.6152343750,521,933.5937500000,,, +32.6171875000,521,933.5937500000,,, +32.6191406250,521,933.5937500000,,, +32.6210937500,521,933.5937500000,,, +32.6230468750,521,933.5937500000,,, +32.6250000000,522,933.5937500000,,, +32.6269531250,522,933.5937500000,,, +32.6289062500,522,933.5937500000,,, +32.6308593750,522,933.5937500000,,, +32.6328125000,522,933.5937500000,,, +32.6347656250,522,933.5937500000,,, +32.6367187500,522,933.5937500000,,, +32.6386718750,522,933.5937500000,,, +32.6406250000,522,933.5937500000,,, +32.6425781250,522,933.5937500000,,, +32.6445312500,522,933.5937500000,,, +32.6464843750,522,933.5937500000,,, +32.6484375000,522,933.5937500000,,, +32.6503906250,522,933.5937500000,,, +32.6523437500,522,933.5937500000,,, +32.6542968750,522,933.5937500000,,, +32.6562500000,522,933.5937500000,,, +32.6582031250,522,933.5937500000,,, +32.6601562500,522,933.5937500000,,, +32.6621093750,522,933.5937500000,,, +32.6640625000,522,933.5937500000,,, +32.6660156250,522,933.5937500000,,, +32.6679687500,522,933.5937500000,,, +32.6699218750,522,933.5937500000,,, +32.6718750000,522,933.5937500000,,, +32.6738281250,522,933.5937500000,,, +32.6757812500,522,933.5937500000,,, +32.6777343750,522,933.5937500000,,, +32.6796875000,522,933.5937500000,,, +32.6816406250,522,933.5937500000,,, +32.6835937500,522,933.5937500000,,, +32.6855468750,522,933.5937500000,,, +32.6875000000,523,933.5937500000,,, +32.6894531250,523,933.5937500000,,, +32.6914062500,523,933.5937500000,,, +32.6933593750,523,933.5937500000,,, +32.6953125000,523,933.5937500000,,, +32.6972656250,523,933.5937500000,,, +32.6992187500,523,933.5937500000,,, +32.7011718750,523,933.5937500000,,, +32.7031250000,523,933.5937500000,,, +32.7050781250,523,933.5937500000,,, +32.7070312500,523,933.5937500000,,, +32.7089843750,523,933.5937500000,,, +32.7109375000,523,933.5937500000,,, +32.7128906250,523,933.5937500000,,, +32.7148437500,523,933.5937500000,,, +32.7167968750,523,933.5937500000,,, +32.7187500000,523,933.5937500000,,, +32.7207031250,523,933.5937500000,,, +32.7226562500,523,933.5937500000,,, +32.7246093750,523,933.5937500000,,, +32.7265625000,523,933.5937500000,,, +32.7285156250,523,933.5937500000,,, +32.7304687500,523,933.5937500000,,, +32.7324218750,523,933.5937500000,,, +32.7343750000,523,933.5937500000,,, +32.7363281250,523,933.5937500000,,, +32.7382812500,523,933.5937500000,,, +32.7402343750,523,933.5937500000,,, +32.7421875000,523,933.5937500000,,, +32.7441406250,523,933.5937500000,,, +32.7460937500,523,933.5937500000,,, +32.7480468750,523,933.5937500000,,, +32.7500000000,524,933.5937500000,,, +32.7519531250,524,933.5937500000,,, +32.7539062500,524,933.5937500000,,, +32.7558593750,524,933.5937500000,,, +32.7578125000,524,933.5937500000,,, +32.7597656250,524,933.5937500000,,, +32.7617187500,524,933.5937500000,,, +32.7636718750,524,933.5937500000,,, +32.7656250000,524,933.5937500000,,, +32.7675781250,524,933.5937500000,,, +32.7695312500,524,933.5937500000,,, +32.7714843750,524,933.5937500000,,, +32.7734375000,524,933.5937500000,,, +32.7753906250,524,933.5937500000,,, +32.7773437500,524,933.5937500000,,, +32.7792968750,524,933.5937500000,,, +32.7812500000,524,933.5937500000,,, +32.7832031250,524,933.5937500000,,, +32.7851562500,524,933.5937500000,,, +32.7871093750,524,933.5937500000,,, +32.7890625000,524,933.5937500000,,, +32.7910156250,524,933.5937500000,,, +32.7929687500,524,933.5937500000,,, +32.7949218750,524,933.5937500000,,, +32.7968750000,524,933.5937500000,,, +32.7988281250,524,933.5937500000,,, +32.8007812500,524,933.5937500000,,, +32.8027343750,524,933.5937500000,,, +32.8046875000,524,933.5937500000,,, +32.8066406250,524,933.5937500000,,, +32.8085937500,524,933.5937500000,,, +32.8105468750,524,933.5937500000,,, +32.8125000000,525,933.5937500000,,, +32.8144531250,525,933.5937500000,,, +32.8164062500,525,933.5937500000,,, +32.8183593750,525,933.5937500000,,, +32.8203125000,525,933.5937500000,,, +32.8222656250,525,933.5937500000,,, +32.8242187500,525,933.5937500000,,, +32.8261718750,525,933.5937500000,,, +32.8281250000,525,933.5937500000,,, +32.8300781250,525,933.5937500000,,, +32.8320312500,525,933.5937500000,,, +32.8339843750,525,933.5937500000,,, +32.8359375000,525,933.5937500000,,, +32.8378906250,525,933.5937500000,,, +32.8398437500,525,933.5937500000,,, +32.8417968750,525,933.5937500000,,, +32.8437500000,525,933.5937500000,,, +32.8457031250,525,933.5937500000,,, +32.8476562500,525,933.5937500000,,, +32.8496093750,525,933.5937500000,,, +32.8515625000,525,933.5937500000,,, +32.8535156250,525,933.5937500000,,, +32.8554687500,525,933.5937500000,,, +32.8574218750,525,933.5937500000,,, +32.8593750000,525,933.5937500000,,, +32.8613281250,525,933.5937500000,,, +32.8632812500,525,933.5937500000,,, +32.8652343750,525,933.5937500000,,, +32.8671875000,525,933.5937500000,,, +32.8691406250,525,933.5937500000,,, +32.8710937500,525,933.5937500000,,, +32.8730468750,525,933.5937500000,,, +32.8750000000,526,1003.9062500000,,, +32.8769531250,526,1003.9062500000,,, +32.8789062500,526,1003.9062500000,,, +32.8808593750,526,1003.9062500000,,, +32.8828125000,526,1003.9062500000,,, +32.8847656250,526,1003.9062500000,,, +32.8867187500,526,1003.9062500000,,, +32.8886718750,526,1003.9062500000,,, +32.8906250000,526,1003.9062500000,,, +32.8925781250,526,1003.9062500000,,, +32.8945312500,526,1003.9062500000,,, +32.8964843750,526,1003.9062500000,,, +32.8984375000,526,1003.9062500000,,, +32.9003906250,526,1003.9062500000,,, +32.9023437500,526,1003.9062500000,,, +32.9042968750,526,1003.9062500000,,, +32.9062500000,526,1003.9062500000,,, +32.9082031250,526,1003.9062500000,,, +32.9101562500,526,1003.9062500000,,, +32.9121093750,526,1003.9062500000,,, +32.9140625000,526,1003.9062500000,,, +32.9160156250,526,1003.9062500000,,, +32.9179687500,526,1003.9062500000,,, +32.9199218750,526,1003.9062500000,,, +32.9218750000,526,1003.9062500000,,, +32.9238281250,526,1003.9062500000,,, +32.9257812500,526,1003.9062500000,,, +32.9277343750,526,1003.9062500000,,, +32.9296875000,526,1003.9062500000,,, +32.9316406250,526,1003.9062500000,,, +32.9335937500,526,1003.9062500000,,, +32.9355468750,526,1003.9062500000,,, +32.9375000000,527,1003.9062500000,,, +32.9394531250,527,1003.9062500000,,, +32.9414062500,527,1003.9062500000,,, +32.9433593750,527,1003.9062500000,,, +32.9453125000,527,1003.9062500000,,, +32.9472656250,527,1003.9062500000,,, +32.9492187500,527,1003.9062500000,,, +32.9511718750,527,1003.9062500000,,, +32.9531250000,527,1003.9062500000,,, +32.9550781250,527,1003.9062500000,,, +32.9570312500,527,1003.9062500000,,, +32.9589843750,527,1003.9062500000,,, +32.9609375000,527,1003.9062500000,,, +32.9628906250,527,1003.9062500000,,, +32.9648437500,527,1003.9062500000,,, +32.9667968750,527,1003.9062500000,,, +32.9687500000,527,1003.9062500000,,, +32.9707031250,527,1003.9062500000,,, +32.9726562500,527,1003.9062500000,,, +32.9746093750,527,1003.9062500000,,, +32.9765625000,527,1003.9062500000,,, +32.9785156250,527,1003.9062500000,,, +32.9804687500,527,1003.9062500000,,, +32.9824218750,527,1003.9062500000,,, +32.9843750000,527,1003.9062500000,,, +32.9863281250,527,1003.9062500000,,, +32.9882812500,527,1003.9062500000,,, +32.9902343750,527,1003.9062500000,,, +32.9921875000,527,1003.9062500000,,, +32.9941406250,527,1003.9062500000,,, +32.9960937500,527,1003.9062500000,,, +32.9980468750,527,1003.9062500000,,, +33.0000000000,528,1003.9062500000,,, +33.0019531250,528,1003.9062500000,,, +33.0039062500,528,1003.9062500000,,, +33.0058593750,528,1003.9062500000,,, +33.0078125000,528,1003.9062500000,,, +33.0097656250,528,1003.9062500000,,, +33.0117187500,528,1003.9062500000,,, +33.0136718750,528,1003.9062500000,,, +33.0156250000,528,1003.9062500000,,, +33.0175781250,528,1003.9062500000,,, +33.0195312500,528,1003.9062500000,,, +33.0214843750,528,1003.9062500000,,, +33.0234375000,528,1003.9062500000,,, +33.0253906250,528,1003.9062500000,,, +33.0273437500,528,1003.9062500000,,, +33.0292968750,528,1003.9062500000,,, +33.0312500000,528,1003.9062500000,,, +33.0332031250,528,1003.9062500000,,, +33.0351562500,528,1003.9062500000,,, +33.0371093750,528,1003.9062500000,,, +33.0390625000,528,1003.9062500000,,, +33.0410156250,528,1003.9062500000,,, +33.0429687500,528,1003.9062500000,,, +33.0449218750,528,1003.9062500000,,, +33.0468750000,528,1003.9062500000,,, +33.0488281250,528,1003.9062500000,,, +33.0507812500,528,1003.9062500000,,, +33.0527343750,528,1003.9062500000,,, +33.0546875000,528,1003.9062500000,,, +33.0566406250,528,1003.9062500000,,, +33.0585937500,528,1003.9062500000,,, +33.0605468750,528,1003.9062500000,,, +33.0625000000,529,1003.9062500000,,, +33.0644531250,529,1003.9062500000,,, +33.0664062500,529,1003.9062500000,,, +33.0683593750,529,1003.9062500000,,, +33.0703125000,529,1003.9062500000,,, +33.0722656250,529,1003.9062500000,,, +33.0742187500,529,1003.9062500000,,, +33.0761718750,529,1003.9062500000,,, +33.0781250000,529,1003.9062500000,,, +33.0800781250,529,1003.9062500000,,, +33.0820312500,529,1003.9062500000,,, +33.0839843750,529,1003.9062500000,,, +33.0859375000,529,1003.9062500000,,, +33.0878906250,529,1003.9062500000,,, +33.0898437500,529,1003.9062500000,,, +33.0917968750,529,1003.9062500000,,, +33.0937500000,529,1003.9062500000,,, +33.0957031250,529,1003.9062500000,,, +33.0976562500,529,1003.9062500000,,, +33.0996093750,529,1003.9062500000,,, +33.1015625000,529,1003.9062500000,,, +33.1035156250,529,1003.9062500000,,, +33.1054687500,529,1003.9062500000,,, +33.1074218750,529,1003.9062500000,,, +33.1093750000,529,1003.9062500000,,, +33.1113281250,529,1003.9062500000,,, +33.1132812500,529,1003.9062500000,,, +33.1152343750,529,1003.9062500000,,, +33.1171875000,529,1003.9062500000,,, +33.1191406250,529,1003.9062500000,,, +33.1210937500,529,1003.9062500000,,, +33.1230468750,529,1003.9062500000,,, +33.1250000000,530,1003.9062500000,,, +33.1269531250,530,1003.9062500000,,, +33.1289062500,530,1003.9062500000,,, +33.1308593750,530,1003.9062500000,,, +33.1328125000,530,1003.9062500000,,, +33.1347656250,530,1003.9062500000,,, +33.1367187500,530,1003.9062500000,,, +33.1386718750,530,1003.9062500000,,, +33.1406250000,530,1003.9062500000,,, +33.1425781250,530,1003.9062500000,,, +33.1445312500,530,1003.9062500000,,, +33.1464843750,530,1003.9062500000,,, +33.1484375000,530,1003.9062500000,,, +33.1503906250,530,1003.9062500000,,, +33.1523437500,530,1003.9062500000,,, +33.1542968750,530,1003.9062500000,,, +33.1562500000,530,1003.9062500000,,, +33.1582031250,530,1003.9062500000,,, +33.1601562500,530,1003.9062500000,,, +33.1621093750,530,1003.9062500000,,, +33.1640625000,530,1003.9062500000,,, +33.1660156250,530,1003.9062500000,,, +33.1679687500,530,1003.9062500000,,, +33.1699218750,530,1003.9062500000,,, +33.1718750000,530,1003.9062500000,,, +33.1738281250,530,1003.9062500000,,, +33.1757812500,530,1003.9062500000,,, +33.1777343750,530,1003.9062500000,,, +33.1796875000,530,1003.9062500000,,, +33.1816406250,530,1003.9062500000,,, +33.1835937500,530,1003.9062500000,,, +33.1855468750,530,1003.9062500000,,, +33.1875000000,531,1003.9062500000,,, +33.1894531250,531,1003.9062500000,,, +33.1914062500,531,1003.9062500000,,, +33.1933593750,531,1003.9062500000,,, +33.1953125000,531,1003.9062500000,,, +33.1972656250,531,1003.9062500000,,, +33.1992187500,531,1003.9062500000,,, +33.2011718750,531,1003.9062500000,,, +33.2031250000,531,1003.9062500000,,, +33.2050781250,531,1003.9062500000,,, +33.2070312500,531,1003.9062500000,,, +33.2089843750,531,1003.9062500000,,, +33.2109375000,531,1003.9062500000,,, +33.2128906250,531,1003.9062500000,,, +33.2148437500,531,1003.9062500000,,, +33.2167968750,531,1003.9062500000,,, +33.2187500000,531,1003.9062500000,,, +33.2207031250,531,1003.9062500000,,, +33.2226562500,531,1003.9062500000,,, +33.2246093750,531,1003.9062500000,,, +33.2265625000,531,1003.9062500000,,, +33.2285156250,531,1003.9062500000,,, +33.2304687500,531,1003.9062500000,,, +33.2324218750,531,1003.9062500000,,, +33.2343750000,531,1003.9062500000,,, +33.2363281250,531,1003.9062500000,,, +33.2382812500,531,1003.9062500000,,, +33.2402343750,531,1003.9062500000,,, +33.2421875000,531,1003.9062500000,,, +33.2441406250,531,1003.9062500000,,, +33.2460937500,531,1003.9062500000,,, +33.2480468750,531,1003.9062500000,,, +33.2500000000,532,1003.9062500000,,, +33.2519531250,532,1003.9062500000,,, +33.2539062500,532,1003.9062500000,,, +33.2558593750,532,1003.9062500000,,, +33.2578125000,532,1003.9062500000,,, +33.2597656250,532,1003.9062500000,,, +33.2617187500,532,1003.9062500000,,, +33.2636718750,532,1003.9062500000,,, +33.2656250000,532,1003.9062500000,,, +33.2675781250,532,1003.9062500000,,, +33.2695312500,532,1003.9062500000,,, +33.2714843750,532,1003.9062500000,,, +33.2734375000,532,1003.9062500000,,, +33.2753906250,532,1003.9062500000,,, +33.2773437500,532,1003.9062500000,,, +33.2792968750,532,1003.9062500000,,, +33.2812500000,532,1003.9062500000,,, +33.2832031250,532,1003.9062500000,,, +33.2851562500,532,1003.9062500000,,, +33.2871093750,532,1003.9062500000,,, +33.2890625000,532,1003.9062500000,,, +33.2910156250,532,1003.9062500000,,, +33.2929687500,532,1003.9062500000,,, +33.2949218750,532,1003.9062500000,,, +33.2968750000,532,1003.9062500000,,, +33.2988281250,532,1003.9062500000,,, +33.3007812500,532,1003.9062500000,,, +33.3027343750,532,1003.9062500000,,, +33.3046875000,532,1003.9062500000,,, +33.3066406250,532,1003.9062500000,,, +33.3085937500,532,1003.9062500000,,, +33.3105468750,532,1003.9062500000,,, +33.3125000000,533,1003.9062500000,,, +33.3144531250,533,1003.9062500000,,, +33.3164062500,533,1003.9062500000,,, +33.3183593750,533,1003.9062500000,,, +33.3203125000,533,1003.9062500000,,, +33.3222656250,533,1003.9062500000,,, +33.3242187500,533,1003.9062500000,,, +33.3261718750,533,1003.9062500000,,, +33.3281250000,533,1003.9062500000,,, +33.3300781250,533,1003.9062500000,,, +33.3320312500,533,1003.9062500000,,, +33.3339843750,533,1003.9062500000,,, +33.3359375000,533,1003.9062500000,,, +33.3378906250,533,1003.9062500000,,, +33.3398437500,533,1003.9062500000,,, +33.3417968750,533,1003.9062500000,,, +33.3437500000,533,1003.9062500000,,, +33.3457031250,533,1003.9062500000,,, +33.3476562500,533,1003.9062500000,,, +33.3496093750,533,1003.9062500000,,, +33.3515625000,533,1003.9062500000,,, +33.3535156250,533,1003.9062500000,,, +33.3554687500,533,1003.9062500000,,, +33.3574218750,533,1003.9062500000,,, +33.3593750000,533,1003.9062500000,,, +33.3613281250,533,1003.9062500000,,, +33.3632812500,533,1003.9062500000,,, +33.3652343750,533,1003.9062500000,,, +33.3671875000,533,1003.9062500000,,, +33.3691406250,533,1003.9062500000,,, +33.3710937500,533,1003.9062500000,,, +33.3730468750,533,1003.9062500000,,, +33.3750000000,534,1003.9062500000,,, +33.3769531250,534,1003.9062500000,,, +33.3789062500,534,1003.9062500000,,, +33.3808593750,534,1003.9062500000,,, +33.3828125000,534,1003.9062500000,,, +33.3847656250,534,1003.9062500000,,, +33.3867187500,534,1003.9062500000,,, +33.3886718750,534,1003.9062500000,,, +33.3906250000,534,1003.9062500000,,, +33.3925781250,534,1003.9062500000,,, +33.3945312500,534,1003.9062500000,,, +33.3964843750,534,1003.9062500000,,, +33.3984375000,534,1003.9062500000,,, +33.4003906250,534,1003.9062500000,,, +33.4023437500,534,1003.9062500000,,, +33.4042968750,534,1003.9062500000,,, +33.4062500000,534,1003.9062500000,,, +33.4082031250,534,1003.9062500000,,, +33.4101562500,534,1003.9062500000,,, +33.4121093750,534,1003.9062500000,,, +33.4140625000,534,1003.9062500000,,, +33.4160156250,534,1003.9062500000,,, +33.4179687500,534,1003.9062500000,,, +33.4199218750,534,1003.9062500000,,, +33.4218750000,534,1003.9062500000,,, +33.4238281250,534,1003.9062500000,,, +33.4257812500,534,1003.9062500000,,, +33.4277343750,534,1003.9062500000,,, +33.4296875000,534,1003.9062500000,,, +33.4316406250,534,1003.9062500000,,, +33.4335937500,534,1003.9062500000,,, +33.4355468750,534,1003.9062500000,,, +33.4375000000,535,1003.9062500000,,, +33.4394531250,535,1003.9062500000,,, +33.4414062500,535,1003.9062500000,,, +33.4433593750,535,1003.9062500000,,, +33.4453125000,535,1003.9062500000,,, +33.4472656250,535,1003.9062500000,,, +33.4492187500,535,1003.9062500000,,, +33.4511718750,535,1003.9062500000,,, +33.4531250000,535,1003.9062500000,,, +33.4550781250,535,1003.9062500000,,, +33.4570312500,535,1003.9062500000,,, +33.4589843750,535,1003.9062500000,,, +33.4609375000,535,1003.9062500000,,, +33.4628906250,535,1003.9062500000,,, +33.4648437500,535,1003.9062500000,,, +33.4667968750,535,1003.9062500000,,, +33.4687500000,535,1003.9062500000,,, +33.4707031250,535,1003.9062500000,,, +33.4726562500,535,1003.9062500000,,, +33.4746093750,535,1003.9062500000,,, +33.4765625000,535,1003.9062500000,,, +33.4785156250,535,1003.9062500000,,, +33.4804687500,535,1003.9062500000,,, +33.4824218750,535,1003.9062500000,,, +33.4843750000,535,1003.9062500000,,, +33.4863281250,535,1003.9062500000,,, +33.4882812500,535,1003.9062500000,,, +33.4902343750,535,1003.9062500000,,, +33.4921875000,535,1003.9062500000,,, +33.4941406250,535,1003.9062500000,,, +33.4960937500,535,1003.9062500000,,, +33.4980468750,535,1003.9062500000,,, +33.5000000000,536,1003.9062500000,,, +33.5019531250,536,1003.9062500000,,, +33.5039062500,536,1003.9062500000,,, +33.5058593750,536,1003.9062500000,,, +33.5078125000,536,1003.9062500000,,, +33.5097656250,536,1003.9062500000,,, +33.5117187500,536,1003.9062500000,,, +33.5136718750,536,1003.9062500000,,, +33.5156250000,536,1003.9062500000,,, +33.5175781250,536,1003.9062500000,,, +33.5195312500,536,1003.9062500000,,, +33.5214843750,536,1003.9062500000,,, +33.5234375000,536,1003.9062500000,,, +33.5253906250,536,1003.9062500000,,, +33.5273437500,536,1003.9062500000,,, +33.5292968750,536,1003.9062500000,,, +33.5312500000,536,1003.9062500000,,, +33.5332031250,536,1003.9062500000,,, +33.5351562500,536,1003.9062500000,,, +33.5371093750,536,1003.9062500000,,, +33.5390625000,536,1003.9062500000,,, +33.5410156250,536,1003.9062500000,,, +33.5429687500,536,1003.9062500000,,, +33.5449218750,536,1003.9062500000,,, +33.5468750000,536,1003.9062500000,,, +33.5488281250,536,1003.9062500000,,, +33.5507812500,536,1003.9062500000,,, +33.5527343750,536,1003.9062500000,,, +33.5546875000,536,1003.9062500000,,, +33.5566406250,536,1003.9062500000,,, +33.5585937500,536,1003.9062500000,,, +33.5605468750,536,1003.9062500000,,, +33.5625000000,537,1003.9062500000,,, +33.5644531250,537,1003.9062500000,,, +33.5664062500,537,1003.9062500000,,, +33.5683593750,537,1003.9062500000,,, +33.5703125000,537,1003.9062500000,,, +33.5722656250,537,1003.9062500000,,, +33.5742187500,537,1003.9062500000,,, +33.5761718750,537,1003.9062500000,,, +33.5781250000,537,1003.9062500000,,, +33.5800781250,537,1003.9062500000,,, +33.5820312500,537,1003.9062500000,,, +33.5839843750,537,1003.9062500000,,, +33.5859375000,537,1003.9062500000,,, +33.5878906250,537,1003.9062500000,,, +33.5898437500,537,1003.9062500000,,, +33.5917968750,537,1003.9062500000,,, +33.5937500000,537,1003.9062500000,,, +33.5957031250,537,1003.9062500000,,, +33.5976562500,537,1003.9062500000,,, +33.5996093750,537,1003.9062500000,,, +33.6015625000,537,1003.9062500000,,, +33.6035156250,537,1003.9062500000,,, +33.6054687500,537,1003.9062500000,,, +33.6074218750,537,1003.9062500000,,, +33.6093750000,537,1003.9062500000,,, +33.6113281250,537,1003.9062500000,,, +33.6132812500,537,1003.9062500000,,, +33.6152343750,537,1003.9062500000,,, +33.6171875000,537,1003.9062500000,,, +33.6191406250,537,1003.9062500000,,, +33.6210937500,537,1003.9062500000,,, +33.6230468750,537,1003.9062500000,,, +33.6250000000,538,1003.9062500000,,, +33.6269531250,538,1003.9062500000,,, +33.6289062500,538,1003.9062500000,,, +33.6308593750,538,1003.9062500000,,, +33.6328125000,538,1003.9062500000,,, +33.6347656250,538,1003.9062500000,,, +33.6367187500,538,1003.9062500000,,, +33.6386718750,538,1003.9062500000,,, +33.6406250000,538,1003.9062500000,,, +33.6425781250,538,1003.9062500000,,, +33.6445312500,538,1003.9062500000,,, +33.6464843750,538,1003.9062500000,,, +33.6484375000,538,1003.9062500000,,, +33.6503906250,538,1003.9062500000,,, +33.6523437500,538,1003.9062500000,,, +33.6542968750,538,1003.9062500000,,, +33.6562500000,538,1003.9062500000,,, +33.6582031250,538,1003.9062500000,,, +33.6601562500,538,1003.9062500000,,, +33.6621093750,538,1003.9062500000,,, +33.6640625000,538,1003.9062500000,,, +33.6660156250,538,1003.9062500000,,, +33.6679687500,538,1003.9062500000,,, +33.6699218750,538,1003.9062500000,,, +33.6718750000,538,1003.9062500000,,, +33.6738281250,538,1003.9062500000,,, +33.6757812500,538,1003.9062500000,,, +33.6777343750,538,1003.9062500000,,, +33.6796875000,538,1003.9062500000,,, +33.6816406250,538,1003.9062500000,,, +33.6835937500,538,1003.9062500000,,, +33.6855468750,538,1003.9062500000,,, +33.6875000000,539,1003.9062500000,,, +33.6894531250,539,1003.9062500000,,, +33.6914062500,539,1003.9062500000,,, +33.6933593750,539,1003.9062500000,,, +33.6953125000,539,1003.9062500000,,, +33.6972656250,539,1003.9062500000,,, +33.6992187500,539,1003.9062500000,,, +33.7011718750,539,1003.9062500000,,, +33.7031250000,539,1003.9062500000,,, +33.7050781250,539,1003.9062500000,,, +33.7070312500,539,1003.9062500000,,, +33.7089843750,539,1003.9062500000,,, +33.7109375000,539,1003.9062500000,,, +33.7128906250,539,1003.9062500000,,, +33.7148437500,539,1003.9062500000,,, +33.7167968750,539,1003.9062500000,,, +33.7187500000,539,1003.9062500000,,, +33.7207031250,539,1003.9062500000,,, +33.7226562500,539,1003.9062500000,,, +33.7246093750,539,1003.9062500000,,, +33.7265625000,539,1003.9062500000,,, +33.7285156250,539,1003.9062500000,,, +33.7304687500,539,1003.9062500000,,, +33.7324218750,539,1003.9062500000,,, +33.7343750000,539,1003.9062500000,,, +33.7363281250,539,1003.9062500000,,, +33.7382812500,539,1003.9062500000,,, +33.7402343750,539,1003.9062500000,,, +33.7421875000,539,1003.9062500000,,, +33.7441406250,539,1003.9062500000,,, +33.7460937500,539,1003.9062500000,,, +33.7480468750,539,1003.9062500000,,, +33.7500000000,540,1003.9062500000,,, +33.7519531250,540,1003.9062500000,,, +33.7539062500,540,1003.9062500000,,, +33.7558593750,540,1003.9062500000,,, +33.7578125000,540,1003.9062500000,,, +33.7597656250,540,1003.9062500000,,, +33.7617187500,540,1003.9062500000,,, +33.7636718750,540,1003.9062500000,,, +33.7656250000,540,1003.9062500000,,, +33.7675781250,540,1003.9062500000,,, +33.7695312500,540,1003.9062500000,,, +33.7714843750,540,1003.9062500000,,, +33.7734375000,540,1003.9062500000,,, +33.7753906250,540,1003.9062500000,,, +33.7773437500,540,1003.9062500000,,, +33.7792968750,540,1003.9062500000,,, +33.7812500000,540,1003.9062500000,,, +33.7832031250,540,1003.9062500000,,, +33.7851562500,540,1003.9062500000,,, +33.7871093750,540,1003.9062500000,,, +33.7890625000,540,1003.9062500000,,, +33.7910156250,540,1003.9062500000,,, +33.7929687500,540,1003.9062500000,,, +33.7949218750,540,1003.9062500000,,, +33.7968750000,540,1003.9062500000,,, +33.7988281250,540,1003.9062500000,,, +33.8007812500,540,1003.9062500000,,, +33.8027343750,540,1003.9062500000,,, +33.8046875000,540,1003.9062500000,,, +33.8066406250,540,1003.9062500000,,, +33.8085937500,540,1003.9062500000,,, +33.8105468750,540,1003.9062500000,,, +33.8125000000,541,1003.9062500000,,, +33.8144531250,541,1003.9062500000,,, +33.8164062500,541,1003.9062500000,,, +33.8183593750,541,1003.9062500000,,, +33.8203125000,541,1003.9062500000,,, +33.8222656250,541,1003.9062500000,,, +33.8242187500,541,1003.9062500000,,, +33.8261718750,541,1003.9062500000,,, +33.8281250000,541,1003.9062500000,,, +33.8300781250,541,1003.9062500000,,, +33.8320312500,541,1003.9062500000,,, +33.8339843750,541,1003.9062500000,,, +33.8359375000,541,1003.9062500000,,, +33.8378906250,541,1003.9062500000,,, +33.8398437500,541,1003.9062500000,,, +33.8417968750,541,1003.9062500000,,, +33.8437500000,541,1003.9062500000,,, +33.8457031250,541,1003.9062500000,,, +33.8476562500,541,1003.9062500000,,, +33.8496093750,541,1003.9062500000,,, +33.8515625000,541,1003.9062500000,,, +33.8535156250,541,1003.9062500000,,, +33.8554687500,541,1003.9062500000,,, +33.8574218750,541,1003.9062500000,,, +33.8593750000,541,1003.9062500000,,, +33.8613281250,541,1003.9062500000,,, +33.8632812500,541,1003.9062500000,,, +33.8652343750,541,1003.9062500000,,, +33.8671875000,541,1003.9062500000,,, +33.8691406250,541,1003.9062500000,,, +33.8710937500,541,1003.9062500000,,, +33.8730468750,541,1003.9062500000,,, +33.8750000000,542,960.9375000000,,, +33.8769531250,542,960.9375000000,,, +33.8789062500,542,960.9375000000,,, +33.8808593750,542,960.9375000000,,, +33.8828125000,542,960.9375000000,,, +33.8847656250,542,960.9375000000,,, +33.8867187500,542,960.9375000000,,, +33.8886718750,542,960.9375000000,,, +33.8906250000,542,960.9375000000,,, +33.8925781250,542,960.9375000000,,, +33.8945312500,542,960.9375000000,,, +33.8964843750,542,960.9375000000,,, +33.8984375000,542,960.9375000000,,, +33.9003906250,542,960.9375000000,,, +33.9023437500,542,960.9375000000,,, +33.9042968750,542,960.9375000000,,, +33.9062500000,542,960.9375000000,,, +33.9082031250,542,960.9375000000,,, +33.9101562500,542,960.9375000000,,, +33.9121093750,542,960.9375000000,,, +33.9140625000,542,960.9375000000,,, +33.9160156250,542,960.9375000000,,, +33.9179687500,542,960.9375000000,,, +33.9199218750,542,960.9375000000,,, +33.9218750000,542,960.9375000000,,, +33.9238281250,542,960.9375000000,,, +33.9257812500,542,960.9375000000,,, +33.9277343750,542,960.9375000000,,, +33.9296875000,542,960.9375000000,,, +33.9316406250,542,960.9375000000,,, +33.9335937500,542,960.9375000000,,, +33.9355468750,542,960.9375000000,,, +33.9375000000,543,960.9375000000,,, +33.9394531250,543,960.9375000000,,, +33.9414062500,543,960.9375000000,,, +33.9433593750,543,960.9375000000,,, +33.9453125000,543,960.9375000000,,, +33.9472656250,543,960.9375000000,,, +33.9492187500,543,960.9375000000,,, +33.9511718750,543,960.9375000000,,, +33.9531250000,543,960.9375000000,,, +33.9550781250,543,960.9375000000,,, +33.9570312500,543,960.9375000000,,, +33.9589843750,543,960.9375000000,,, +33.9609375000,543,960.9375000000,,, +33.9628906250,543,960.9375000000,,, +33.9648437500,543,960.9375000000,,, +33.9667968750,543,960.9375000000,,, +33.9687500000,543,960.9375000000,,, +33.9707031250,543,960.9375000000,,, +33.9726562500,543,960.9375000000,,, +33.9746093750,543,960.9375000000,,, +33.9765625000,543,960.9375000000,,, +33.9785156250,543,960.9375000000,,, +33.9804687500,543,960.9375000000,,, +33.9824218750,543,960.9375000000,,, +33.9843750000,543,960.9375000000,,, +33.9863281250,543,960.9375000000,,, +33.9882812500,543,960.9375000000,,, +33.9902343750,543,960.9375000000,,, +33.9921875000,543,960.9375000000,,, +33.9941406250,543,960.9375000000,,, +33.9960937500,543,960.9375000000,,, +33.9980468750,543,960.9375000000,,, +34.0000000000,544,960.9375000000,,, +34.0019531250,544,960.9375000000,,, +34.0039062500,544,960.9375000000,,, +34.0058593750,544,960.9375000000,,, +34.0078125000,544,960.9375000000,,, +34.0097656250,544,960.9375000000,,, +34.0117187500,544,960.9375000000,,, +34.0136718750,544,960.9375000000,,, +34.0156250000,544,960.9375000000,,, +34.0175781250,544,960.9375000000,,, +34.0195312500,544,960.9375000000,,, +34.0214843750,544,960.9375000000,,, +34.0234375000,544,960.9375000000,,, +34.0253906250,544,960.9375000000,,, +34.0273437500,544,960.9375000000,,, +34.0292968750,544,960.9375000000,,, +34.0312500000,544,960.9375000000,,, +34.0332031250,544,960.9375000000,,, +34.0351562500,544,960.9375000000,,, +34.0371093750,544,960.9375000000,,, +34.0390625000,544,960.9375000000,,, +34.0410156250,544,960.9375000000,,, +34.0429687500,544,960.9375000000,,, +34.0449218750,544,960.9375000000,,, +34.0468750000,544,960.9375000000,,, +34.0488281250,544,960.9375000000,,, +34.0507812500,544,960.9375000000,,, +34.0527343750,544,960.9375000000,,, +34.0546875000,544,960.9375000000,,, +34.0566406250,544,960.9375000000,,, +34.0585937500,544,960.9375000000,,, +34.0605468750,544,960.9375000000,,, +34.0625000000,545,960.9375000000,,, +34.0644531250,545,960.9375000000,,, +34.0664062500,545,960.9375000000,,, +34.0683593750,545,960.9375000000,,, +34.0703125000,545,960.9375000000,,, +34.0722656250,545,960.9375000000,,, +34.0742187500,545,960.9375000000,,, +34.0761718750,545,960.9375000000,,, +34.0781250000,545,960.9375000000,,, +34.0800781250,545,960.9375000000,,, +34.0820312500,545,960.9375000000,,, +34.0839843750,545,960.9375000000,,, +34.0859375000,545,960.9375000000,,, +34.0878906250,545,960.9375000000,,, +34.0898437500,545,960.9375000000,,, +34.0917968750,545,960.9375000000,,, +34.0937500000,545,960.9375000000,,, +34.0957031250,545,960.9375000000,,, +34.0976562500,545,960.9375000000,,, +34.0996093750,545,960.9375000000,,, +34.1015625000,545,960.9375000000,,, +34.1035156250,545,960.9375000000,,, +34.1054687500,545,960.9375000000,,, +34.1074218750,545,960.9375000000,,, +34.1093750000,545,960.9375000000,,, +34.1113281250,545,960.9375000000,,, +34.1132812500,545,960.9375000000,,, +34.1152343750,545,960.9375000000,,, +34.1171875000,545,960.9375000000,,, +34.1191406250,545,960.9375000000,,, +34.1210937500,545,960.9375000000,,, +34.1230468750,545,960.9375000000,,, +34.1250000000,546,960.9375000000,,, +34.1269531250,546,960.9375000000,,, +34.1289062500,546,960.9375000000,,, +34.1308593750,546,960.9375000000,,, +34.1328125000,546,960.9375000000,,, +34.1347656250,546,960.9375000000,,, +34.1367187500,546,960.9375000000,,, +34.1386718750,546,960.9375000000,,, +34.1406250000,546,960.9375000000,,, +34.1425781250,546,960.9375000000,,, +34.1445312500,546,960.9375000000,,, +34.1464843750,546,960.9375000000,,, +34.1484375000,546,960.9375000000,,, +34.1503906250,546,960.9375000000,,, +34.1523437500,546,960.9375000000,,, +34.1542968750,546,960.9375000000,,, +34.1562500000,546,960.9375000000,,, +34.1582031250,546,960.9375000000,,, +34.1601562500,546,960.9375000000,,, +34.1621093750,546,960.9375000000,,, +34.1640625000,546,960.9375000000,,, +34.1660156250,546,960.9375000000,,, +34.1679687500,546,960.9375000000,,, +34.1699218750,546,960.9375000000,,, +34.1718750000,546,960.9375000000,,, +34.1738281250,546,960.9375000000,,, +34.1757812500,546,960.9375000000,,, +34.1777343750,546,960.9375000000,,, +34.1796875000,546,960.9375000000,,, +34.1816406250,546,960.9375000000,,, +34.1835937500,546,960.9375000000,,, +34.1855468750,546,960.9375000000,,, +34.1875000000,547,960.9375000000,,, +34.1894531250,547,960.9375000000,,, +34.1914062500,547,960.9375000000,,, +34.1933593750,547,960.9375000000,,, +34.1953125000,547,960.9375000000,,, +34.1972656250,547,960.9375000000,,, +34.1992187500,547,960.9375000000,,, +34.2011718750,547,960.9375000000,,, +34.2031250000,547,960.9375000000,,, +34.2050781250,547,960.9375000000,,, +34.2070312500,547,960.9375000000,,, +34.2089843750,547,960.9375000000,,, +34.2109375000,547,960.9375000000,,, +34.2128906250,547,960.9375000000,,, +34.2148437500,547,960.9375000000,,, +34.2167968750,547,960.9375000000,,, +34.2187500000,547,960.9375000000,,, +34.2207031250,547,960.9375000000,,, +34.2226562500,547,960.9375000000,,, +34.2246093750,547,960.9375000000,,, +34.2265625000,547,960.9375000000,,, +34.2285156250,547,960.9375000000,,, +34.2304687500,547,960.9375000000,,, +34.2324218750,547,960.9375000000,,, +34.2343750000,547,960.9375000000,,, +34.2363281250,547,960.9375000000,,, +34.2382812500,547,960.9375000000,,, +34.2402343750,547,960.9375000000,,, +34.2421875000,547,960.9375000000,,, +34.2441406250,547,960.9375000000,,, +34.2460937500,547,960.9375000000,,, +34.2480468750,547,960.9375000000,,, +34.2500000000,548,960.9375000000,,, +34.2519531250,548,960.9375000000,,, +34.2539062500,548,960.9375000000,,, +34.2558593750,548,960.9375000000,,, +34.2578125000,548,960.9375000000,,, +34.2597656250,548,960.9375000000,,, +34.2617187500,548,960.9375000000,,, +34.2636718750,548,960.9375000000,,, +34.2656250000,548,960.9375000000,,, +34.2675781250,548,960.9375000000,,, +34.2695312500,548,960.9375000000,,, +34.2714843750,548,960.9375000000,,, +34.2734375000,548,960.9375000000,,, +34.2753906250,548,960.9375000000,,, +34.2773437500,548,960.9375000000,,, +34.2792968750,548,960.9375000000,,, +34.2812500000,548,960.9375000000,,, +34.2832031250,548,960.9375000000,,, +34.2851562500,548,960.9375000000,,, +34.2871093750,548,960.9375000000,,, +34.2890625000,548,960.9375000000,,, +34.2910156250,548,960.9375000000,,, +34.2929687500,548,960.9375000000,,, +34.2949218750,548,960.9375000000,,, +34.2968750000,548,960.9375000000,,, +34.2988281250,548,960.9375000000,,, +34.3007812500,548,960.9375000000,,, +34.3027343750,548,960.9375000000,,, +34.3046875000,548,960.9375000000,,, +34.3066406250,548,960.9375000000,,, +34.3085937500,548,960.9375000000,,, +34.3105468750,548,960.9375000000,,, +34.3125000000,549,960.9375000000,,, +34.3144531250,549,960.9375000000,,, +34.3164062500,549,960.9375000000,,, +34.3183593750,549,960.9375000000,,, +34.3203125000,549,960.9375000000,,, +34.3222656250,549,960.9375000000,,, +34.3242187500,549,960.9375000000,,, +34.3261718750,549,960.9375000000,,, +34.3281250000,549,960.9375000000,,, +34.3300781250,549,960.9375000000,,, +34.3320312500,549,960.9375000000,,, +34.3339843750,549,960.9375000000,,, +34.3359375000,549,960.9375000000,,, +34.3378906250,549,960.9375000000,,, +34.3398437500,549,960.9375000000,,, +34.3417968750,549,960.9375000000,,, +34.3437500000,549,960.9375000000,,, +34.3457031250,549,960.9375000000,,, +34.3476562500,549,960.9375000000,,, +34.3496093750,549,960.9375000000,,, +34.3515625000,549,960.9375000000,,, +34.3535156250,549,960.9375000000,,, +34.3554687500,549,960.9375000000,,, +34.3574218750,549,960.9375000000,,, +34.3593750000,549,960.9375000000,,, +34.3613281250,549,960.9375000000,,, +34.3632812500,549,960.9375000000,,, +34.3652343750,549,960.9375000000,,, +34.3671875000,549,960.9375000000,,, +34.3691406250,549,960.9375000000,,, +34.3710937500,549,960.9375000000,,, +34.3730468750,549,960.9375000000,,, +34.3750000000,550,960.9375000000,,, +34.3769531250,550,960.9375000000,,, +34.3789062500,550,960.9375000000,,, +34.3808593750,550,960.9375000000,,, +34.3828125000,550,960.9375000000,,, +34.3847656250,550,960.9375000000,,, +34.3867187500,550,960.9375000000,,, +34.3886718750,550,960.9375000000,,, +34.3906250000,550,960.9375000000,,, +34.3925781250,550,960.9375000000,,, +34.3945312500,550,960.9375000000,,, +34.3964843750,550,960.9375000000,,, +34.3984375000,550,960.9375000000,,, +34.4003906250,550,960.9375000000,,, +34.4023437500,550,960.9375000000,,, +34.4042968750,550,960.9375000000,,, +34.4062500000,550,960.9375000000,,, +34.4082031250,550,960.9375000000,,, +34.4101562500,550,960.9375000000,,, +34.4121093750,550,960.9375000000,,, +34.4140625000,550,960.9375000000,,, +34.4160156250,550,960.9375000000,,, +34.4179687500,550,960.9375000000,,, +34.4199218750,550,960.9375000000,,, +34.4218750000,550,960.9375000000,,, +34.4238281250,550,960.9375000000,,, +34.4257812500,550,960.9375000000,,, +34.4277343750,550,960.9375000000,,, +34.4296875000,550,960.9375000000,,, +34.4316406250,550,960.9375000000,,, +34.4335937500,550,960.9375000000,,, +34.4355468750,550,960.9375000000,,, +34.4375000000,551,960.9375000000,,, +34.4394531250,551,960.9375000000,,, +34.4414062500,551,960.9375000000,,, +34.4433593750,551,960.9375000000,,, +34.4453125000,551,960.9375000000,,, +34.4472656250,551,960.9375000000,,, +34.4492187500,551,960.9375000000,,, +34.4511718750,551,960.9375000000,,, +34.4531250000,551,960.9375000000,,, +34.4550781250,551,960.9375000000,,, +34.4570312500,551,960.9375000000,,, +34.4589843750,551,960.9375000000,,, +34.4609375000,551,960.9375000000,,, +34.4628906250,551,960.9375000000,,, +34.4648437500,551,960.9375000000,,, +34.4667968750,551,960.9375000000,,, +34.4687500000,551,960.9375000000,,, +34.4707031250,551,960.9375000000,,, +34.4726562500,551,960.9375000000,,, +34.4746093750,551,960.9375000000,,, +34.4765625000,551,960.9375000000,,, +34.4785156250,551,960.9375000000,,, +34.4804687500,551,960.9375000000,,, +34.4824218750,551,960.9375000000,,, +34.4843750000,551,960.9375000000,,, +34.4863281250,551,960.9375000000,,, +34.4882812500,551,960.9375000000,,, +34.4902343750,551,960.9375000000,,, +34.4921875000,551,960.9375000000,,, +34.4941406250,551,960.9375000000,,, +34.4960937500,551,960.9375000000,,, +34.4980468750,551,960.9375000000,,, +34.5000000000,552,960.9375000000,,, +34.5019531250,552,960.9375000000,,, +34.5039062500,552,960.9375000000,,, +34.5058593750,552,960.9375000000,,, +34.5078125000,552,960.9375000000,,, +34.5097656250,552,960.9375000000,,, +34.5117187500,552,960.9375000000,,, +34.5136718750,552,960.9375000000,,, +34.5156250000,552,960.9375000000,,, +34.5175781250,552,960.9375000000,,, +34.5195312500,552,960.9375000000,,, +34.5214843750,552,960.9375000000,,, +34.5234375000,552,960.9375000000,,, +34.5253906250,552,960.9375000000,,, +34.5273437500,552,960.9375000000,,, +34.5292968750,552,960.9375000000,,, +34.5312500000,552,960.9375000000,,, +34.5332031250,552,960.9375000000,,, +34.5351562500,552,960.9375000000,,, +34.5371093750,552,960.9375000000,,, +34.5390625000,552,960.9375000000,,, +34.5410156250,552,960.9375000000,,, +34.5429687500,552,960.9375000000,,, +34.5449218750,552,960.9375000000,,, +34.5468750000,552,960.9375000000,,, +34.5488281250,552,960.9375000000,,, +34.5507812500,552,960.9375000000,,, +34.5527343750,552,960.9375000000,,, +34.5546875000,552,960.9375000000,,, +34.5566406250,552,960.9375000000,,, +34.5585937500,552,960.9375000000,,, +34.5605468750,552,960.9375000000,,, +34.5625000000,553,960.9375000000,,, +34.5644531250,553,960.9375000000,,, +34.5664062500,553,960.9375000000,,, +34.5683593750,553,960.9375000000,,, +34.5703125000,553,960.9375000000,,, +34.5722656250,553,960.9375000000,,, +34.5742187500,553,960.9375000000,,, +34.5761718750,553,960.9375000000,,, +34.5781250000,553,960.9375000000,,, +34.5800781250,553,960.9375000000,,, +34.5820312500,553,960.9375000000,,, +34.5839843750,553,960.9375000000,,, +34.5859375000,553,960.9375000000,,, +34.5878906250,553,960.9375000000,,, +34.5898437500,553,960.9375000000,,, +34.5917968750,553,960.9375000000,,, +34.5937500000,553,960.9375000000,,, +34.5957031250,553,960.9375000000,,, +34.5976562500,553,960.9375000000,,, +34.5996093750,553,960.9375000000,,, +34.6015625000,553,960.9375000000,,, +34.6035156250,553,960.9375000000,,, +34.6054687500,553,960.9375000000,,, +34.6074218750,553,960.9375000000,,, +34.6093750000,553,960.9375000000,,, +34.6113281250,553,960.9375000000,,, +34.6132812500,553,960.9375000000,,, +34.6152343750,553,960.9375000000,,, +34.6171875000,553,960.9375000000,,, +34.6191406250,553,960.9375000000,,, +34.6210937500,553,960.9375000000,,, +34.6230468750,553,960.9375000000,,, +34.6250000000,554,960.9375000000,,, +34.6269531250,554,960.9375000000,,, +34.6289062500,554,960.9375000000,,, +34.6308593750,554,960.9375000000,,, +34.6328125000,554,960.9375000000,,, +34.6347656250,554,960.9375000000,,, +34.6367187500,554,960.9375000000,,, +34.6386718750,554,960.9375000000,,, +34.6406250000,554,960.9375000000,,, +34.6425781250,554,960.9375000000,,, +34.6445312500,554,960.9375000000,,, +34.6464843750,554,960.9375000000,,, +34.6484375000,554,960.9375000000,,, +34.6503906250,554,960.9375000000,,, +34.6523437500,554,960.9375000000,,, +34.6542968750,554,960.9375000000,,, +34.6562500000,554,960.9375000000,,, +34.6582031250,554,960.9375000000,,, +34.6601562500,554,960.9375000000,,, +34.6621093750,554,960.9375000000,,, +34.6640625000,554,960.9375000000,,, +34.6660156250,554,960.9375000000,,, +34.6679687500,554,960.9375000000,,, +34.6699218750,554,960.9375000000,,, +34.6718750000,554,960.9375000000,,, +34.6738281250,554,960.9375000000,,, +34.6757812500,554,960.9375000000,,, +34.6777343750,554,960.9375000000,,, +34.6796875000,554,960.9375000000,,, +34.6816406250,554,960.9375000000,,, +34.6835937500,554,960.9375000000,,, +34.6855468750,554,960.9375000000,,, +34.6875000000,555,960.9375000000,,, +34.6894531250,555,960.9375000000,,, +34.6914062500,555,960.9375000000,,, +34.6933593750,555,960.9375000000,,, +34.6953125000,555,960.9375000000,,, +34.6972656250,555,960.9375000000,,, +34.6992187500,555,960.9375000000,,, +34.7011718750,555,960.9375000000,,, +34.7031250000,555,960.9375000000,,, +34.7050781250,555,960.9375000000,,, +34.7070312500,555,960.9375000000,,, +34.7089843750,555,960.9375000000,,, +34.7109375000,555,960.9375000000,,, +34.7128906250,555,960.9375000000,,, +34.7148437500,555,960.9375000000,,, +34.7167968750,555,960.9375000000,,, +34.7187500000,555,960.9375000000,,, +34.7207031250,555,960.9375000000,,, +34.7226562500,555,960.9375000000,,, +34.7246093750,555,960.9375000000,,, +34.7265625000,555,960.9375000000,,, +34.7285156250,555,960.9375000000,,, +34.7304687500,555,960.9375000000,,, +34.7324218750,555,960.9375000000,,, +34.7343750000,555,960.9375000000,,, +34.7363281250,555,960.9375000000,,, +34.7382812500,555,960.9375000000,,, +34.7402343750,555,960.9375000000,,, +34.7421875000,555,960.9375000000,,, +34.7441406250,555,960.9375000000,,, +34.7460937500,555,960.9375000000,,, +34.7480468750,555,960.9375000000,,, +34.7500000000,556,960.9375000000,,, +34.7519531250,556,960.9375000000,,, +34.7539062500,556,960.9375000000,,, +34.7558593750,556,960.9375000000,,, +34.7578125000,556,960.9375000000,,, +34.7597656250,556,960.9375000000,,, +34.7617187500,556,960.9375000000,,, +34.7636718750,556,960.9375000000,,, +34.7656250000,556,960.9375000000,,, +34.7675781250,556,960.9375000000,,, +34.7695312500,556,960.9375000000,,, +34.7714843750,556,960.9375000000,,, +34.7734375000,556,960.9375000000,,, +34.7753906250,556,960.9375000000,,, +34.7773437500,556,960.9375000000,,, +34.7792968750,556,960.9375000000,,, +34.7812500000,556,960.9375000000,,, +34.7832031250,556,960.9375000000,,, +34.7851562500,556,960.9375000000,,, +34.7871093750,556,960.9375000000,,, +34.7890625000,556,960.9375000000,,, +34.7910156250,556,960.9375000000,,, +34.7929687500,556,960.9375000000,,, +34.7949218750,556,960.9375000000,,, +34.7968750000,556,960.9375000000,,, +34.7988281250,556,960.9375000000,,, +34.8007812500,556,960.9375000000,,, +34.8027343750,556,960.9375000000,,, +34.8046875000,556,960.9375000000,,, +34.8066406250,556,960.9375000000,,, +34.8085937500,556,960.9375000000,,, +34.8105468750,556,960.9375000000,,, +34.8125000000,557,960.9375000000,,, +34.8144531250,557,960.9375000000,,, +34.8164062500,557,960.9375000000,,, +34.8183593750,557,960.9375000000,,, +34.8203125000,557,960.9375000000,,, +34.8222656250,557,960.9375000000,,, +34.8242187500,557,960.9375000000,,, +34.8261718750,557,960.9375000000,,, +34.8281250000,557,960.9375000000,,, +34.8300781250,557,960.9375000000,,, +34.8320312500,557,960.9375000000,,, +34.8339843750,557,960.9375000000,,, +34.8359375000,557,960.9375000000,,, +34.8378906250,557,960.9375000000,,, +34.8398437500,557,960.9375000000,,, +34.8417968750,557,960.9375000000,,, +34.8437500000,557,960.9375000000,,, +34.8457031250,557,960.9375000000,,, +34.8476562500,557,960.9375000000,,, +34.8496093750,557,960.9375000000,,, +34.8515625000,557,960.9375000000,,, +34.8535156250,557,960.9375000000,,, +34.8554687500,557,960.9375000000,,, +34.8574218750,557,960.9375000000,,, +34.8593750000,557,960.9375000000,,, +34.8613281250,557,960.9375000000,,, +34.8632812500,557,960.9375000000,,, +34.8652343750,557,960.9375000000,,, +34.8671875000,557,960.9375000000,,, +34.8691406250,557,960.9375000000,,, +34.8710937500,557,960.9375000000,,, +34.8730468750,557,960.9375000000,,, +34.8750000000,558,960.9375000000,,, +34.8769531250,558,960.9375000000,,, +34.8789062500,558,960.9375000000,,, +34.8808593750,558,960.9375000000,,, +34.8828125000,558,960.9375000000,,, +34.8847656250,558,960.9375000000,,, +34.8867187500,558,960.9375000000,,, +34.8886718750,558,960.9375000000,,, +34.8906250000,558,960.9375000000,,, +34.8925781250,558,960.9375000000,,, +34.8945312500,558,960.9375000000,,, +34.8964843750,558,960.9375000000,,, +34.8984375000,558,960.9375000000,,, +34.9003906250,558,960.9375000000,,, +34.9023437500,558,960.9375000000,,, +34.9042968750,558,960.9375000000,,, +34.9062500000,558,960.9375000000,,, +34.9082031250,558,960.9375000000,,, +34.9101562500,558,960.9375000000,,, +34.9121093750,558,960.9375000000,,, +34.9140625000,558,960.9375000000,,, +34.9160156250,558,960.9375000000,,, +34.9179687500,558,960.9375000000,,, +34.9199218750,558,960.9375000000,,, +34.9218750000,558,960.9375000000,,, +34.9238281250,558,960.9375000000,,, +34.9257812500,558,960.9375000000,,, +34.9277343750,558,960.9375000000,,, +34.9296875000,558,960.9375000000,,, +34.9316406250,558,960.9375000000,,, +34.9335937500,558,960.9375000000,,, +34.9355468750,558,960.9375000000,,, +34.9375000000,559,990.2343750000,,, +34.9394531250,559,990.2343750000,,, +34.9414062500,559,990.2343750000,,, +34.9433593750,559,990.2343750000,,, +34.9453125000,559,990.2343750000,,, +34.9472656250,559,990.2343750000,,, +34.9492187500,559,990.2343750000,,, +34.9511718750,559,990.2343750000,,, +34.9531250000,559,990.2343750000,,, +34.9550781250,559,990.2343750000,,, +34.9570312500,559,990.2343750000,,, +34.9589843750,559,990.2343750000,,, +34.9609375000,559,990.2343750000,,, +34.9628906250,559,990.2343750000,,, +34.9648437500,559,990.2343750000,,, +34.9667968750,559,990.2343750000,,, +34.9687500000,559,990.2343750000,,, +34.9707031250,559,990.2343750000,,, +34.9726562500,559,990.2343750000,,, +34.9746093750,559,990.2343750000,,, +34.9765625000,559,990.2343750000,,, +34.9785156250,559,990.2343750000,,, +34.9804687500,559,990.2343750000,,, +34.9824218750,559,990.2343750000,,, +34.9843750000,559,990.2343750000,,, +34.9863281250,559,990.2343750000,,, +34.9882812500,559,990.2343750000,,, +34.9902343750,559,990.2343750000,,, +34.9921875000,559,990.2343750000,,, +34.9941406250,559,990.2343750000,,, +34.9960937500,559,990.2343750000,,, +34.9980468750,559,990.2343750000,,, +35.0000000000,560,990.2343750000,,, +35.0019531250,560,990.2343750000,,, +35.0039062500,560,990.2343750000,,, +35.0058593750,560,990.2343750000,,, +35.0078125000,560,990.2343750000,,, +35.0097656250,560,990.2343750000,,, +35.0117187500,560,990.2343750000,,, +35.0136718750,560,990.2343750000,,, +35.0156250000,560,990.2343750000,,, +35.0175781250,560,990.2343750000,,, +35.0195312500,560,990.2343750000,,, +35.0214843750,560,990.2343750000,,, +35.0234375000,560,990.2343750000,,, +35.0253906250,560,990.2343750000,,, +35.0273437500,560,990.2343750000,,, +35.0292968750,560,990.2343750000,,, +35.0312500000,560,990.2343750000,,, +35.0332031250,560,990.2343750000,,, +35.0351562500,560,990.2343750000,,, +35.0371093750,560,990.2343750000,,, +35.0390625000,560,990.2343750000,,, +35.0410156250,560,990.2343750000,,, +35.0429687500,560,990.2343750000,,, +35.0449218750,560,990.2343750000,,, +35.0468750000,560,990.2343750000,,, +35.0488281250,560,990.2343750000,,, +35.0507812500,560,990.2343750000,,, +35.0527343750,560,990.2343750000,,, +35.0546875000,560,990.2343750000,,, +35.0566406250,560,990.2343750000,,, +35.0585937500,560,990.2343750000,,, +35.0605468750,560,990.2343750000,,, +35.0625000000,561,990.2343750000,,, +35.0644531250,561,990.2343750000,,, +35.0664062500,561,990.2343750000,,, +35.0683593750,561,990.2343750000,,, +35.0703125000,561,990.2343750000,,, +35.0722656250,561,990.2343750000,,, +35.0742187500,561,990.2343750000,,, +35.0761718750,561,990.2343750000,,, +35.0781250000,561,990.2343750000,,, +35.0800781250,561,990.2343750000,,, +35.0820312500,561,990.2343750000,,, +35.0839843750,561,990.2343750000,,, +35.0859375000,561,990.2343750000,,, +35.0878906250,561,990.2343750000,,, +35.0898437500,561,990.2343750000,,, +35.0917968750,561,990.2343750000,,, +35.0937500000,561,990.2343750000,,, +35.0957031250,561,990.2343750000,,, +35.0976562500,561,990.2343750000,,, +35.0996093750,561,990.2343750000,,, +35.1015625000,561,990.2343750000,,, +35.1035156250,561,990.2343750000,,, +35.1054687500,561,990.2343750000,,, +35.1074218750,561,990.2343750000,,, +35.1093750000,561,990.2343750000,,, +35.1113281250,561,990.2343750000,,, +35.1132812500,561,990.2343750000,,, +35.1152343750,561,990.2343750000,,, +35.1171875000,561,990.2343750000,,, +35.1191406250,561,990.2343750000,,, +35.1210937500,561,990.2343750000,,, +35.1230468750,561,990.2343750000,,, +35.1250000000,562,990.2343750000,,, +35.1269531250,562,990.2343750000,,, +35.1289062500,562,990.2343750000,,, +35.1308593750,562,990.2343750000,,, +35.1328125000,562,990.2343750000,,, +35.1347656250,562,990.2343750000,,, +35.1367187500,562,990.2343750000,,, +35.1386718750,562,990.2343750000,,, +35.1406250000,562,990.2343750000,,, +35.1425781250,562,990.2343750000,,, +35.1445312500,562,990.2343750000,,, +35.1464843750,562,990.2343750000,,, +35.1484375000,562,990.2343750000,,, +35.1503906250,562,990.2343750000,,, +35.1523437500,562,990.2343750000,,, +35.1542968750,562,990.2343750000,,, +35.1562500000,562,990.2343750000,,, +35.1582031250,562,990.2343750000,,, +35.1601562500,562,990.2343750000,,, +35.1621093750,562,990.2343750000,,, +35.1640625000,562,990.2343750000,,, +35.1660156250,562,990.2343750000,,, +35.1679687500,562,990.2343750000,,, +35.1699218750,562,990.2343750000,,, +35.1718750000,562,990.2343750000,,, +35.1738281250,562,990.2343750000,,, +35.1757812500,562,990.2343750000,,, +35.1777343750,562,990.2343750000,,, +35.1796875000,562,990.2343750000,,, +35.1816406250,562,990.2343750000,,, +35.1835937500,562,990.2343750000,,, +35.1855468750,562,990.2343750000,,, +35.1875000000,563,990.2343750000,,, +35.1894531250,563,990.2343750000,,, +35.1914062500,563,990.2343750000,,, +35.1933593750,563,990.2343750000,,, +35.1953125000,563,990.2343750000,,, +35.1972656250,563,990.2343750000,,, +35.1992187500,563,990.2343750000,,, +35.2011718750,563,990.2343750000,,, +35.2031250000,563,990.2343750000,,, +35.2050781250,563,990.2343750000,,, +35.2070312500,563,990.2343750000,,, +35.2089843750,563,990.2343750000,,, +35.2109375000,563,990.2343750000,,, +35.2128906250,563,990.2343750000,,, +35.2148437500,563,990.2343750000,,, +35.2167968750,563,990.2343750000,,, +35.2187500000,563,990.2343750000,,, +35.2207031250,563,990.2343750000,,, +35.2226562500,563,990.2343750000,,, +35.2246093750,563,990.2343750000,,, +35.2265625000,563,990.2343750000,,, +35.2285156250,563,990.2343750000,,, +35.2304687500,563,990.2343750000,,, +35.2324218750,563,990.2343750000,,, +35.2343750000,563,990.2343750000,,, +35.2363281250,563,990.2343750000,,, +35.2382812500,563,990.2343750000,,, +35.2402343750,563,990.2343750000,,, +35.2421875000,563,990.2343750000,,, +35.2441406250,563,990.2343750000,,, +35.2460937500,563,990.2343750000,,, +35.2480468750,563,990.2343750000,,, +35.2500000000,564,990.2343750000,,, +35.2519531250,564,990.2343750000,,, +35.2539062500,564,990.2343750000,,, +35.2558593750,564,990.2343750000,,, +35.2578125000,564,990.2343750000,,, +35.2597656250,564,990.2343750000,,, +35.2617187500,564,990.2343750000,,, +35.2636718750,564,990.2343750000,,, +35.2656250000,564,990.2343750000,,, +35.2675781250,564,990.2343750000,,, +35.2695312500,564,990.2343750000,,, +35.2714843750,564,990.2343750000,,, +35.2734375000,564,990.2343750000,,, +35.2753906250,564,990.2343750000,,, +35.2773437500,564,990.2343750000,,, +35.2792968750,564,990.2343750000,,, +35.2812500000,564,990.2343750000,,, +35.2832031250,564,990.2343750000,,, +35.2851562500,564,990.2343750000,,, +35.2871093750,564,990.2343750000,,, +35.2890625000,564,990.2343750000,,, +35.2910156250,564,990.2343750000,,, +35.2929687500,564,990.2343750000,,, +35.2949218750,564,990.2343750000,,, +35.2968750000,564,990.2343750000,,, +35.2988281250,564,990.2343750000,,, +35.3007812500,564,990.2343750000,,, +35.3027343750,564,990.2343750000,,, +35.3046875000,564,990.2343750000,,, +35.3066406250,564,990.2343750000,,, +35.3085937500,564,990.2343750000,,, +35.3105468750,564,990.2343750000,,, +35.3125000000,565,990.2343750000,,, +35.3144531250,565,990.2343750000,,, +35.3164062500,565,990.2343750000,,, +35.3183593750,565,990.2343750000,,, +35.3203125000,565,990.2343750000,,, +35.3222656250,565,990.2343750000,,, +35.3242187500,565,990.2343750000,,, +35.3261718750,565,990.2343750000,,, +35.3281250000,565,990.2343750000,,, +35.3300781250,565,990.2343750000,,, +35.3320312500,565,990.2343750000,,, +35.3339843750,565,990.2343750000,,, +35.3359375000,565,990.2343750000,,, +35.3378906250,565,990.2343750000,,, +35.3398437500,565,990.2343750000,,, +35.3417968750,565,990.2343750000,,, +35.3437500000,565,990.2343750000,,, +35.3457031250,565,990.2343750000,,, +35.3476562500,565,990.2343750000,,, +35.3496093750,565,990.2343750000,,, +35.3515625000,565,990.2343750000,,, +35.3535156250,565,990.2343750000,,, +35.3554687500,565,990.2343750000,,, +35.3574218750,565,990.2343750000,,, +35.3593750000,565,990.2343750000,,, +35.3613281250,565,990.2343750000,,, +35.3632812500,565,990.2343750000,,, +35.3652343750,565,990.2343750000,,, +35.3671875000,565,990.2343750000,,, +35.3691406250,565,990.2343750000,,, +35.3710937500,565,990.2343750000,,, +35.3730468750,565,990.2343750000,,, +35.3750000000,566,990.2343750000,,, +35.3769531250,566,990.2343750000,,, +35.3789062500,566,990.2343750000,,, +35.3808593750,566,990.2343750000,,, +35.3828125000,566,990.2343750000,,, +35.3847656250,566,990.2343750000,,, +35.3867187500,566,990.2343750000,,, +35.3886718750,566,990.2343750000,,, +35.3906250000,566,990.2343750000,,, +35.3925781250,566,990.2343750000,,, +35.3945312500,566,990.2343750000,,, +35.3964843750,566,990.2343750000,,, +35.3984375000,566,990.2343750000,,, +35.4003906250,566,990.2343750000,,, +35.4023437500,566,990.2343750000,,, +35.4042968750,566,990.2343750000,,, +35.4062500000,566,990.2343750000,,, +35.4082031250,566,990.2343750000,,, +35.4101562500,566,990.2343750000,,, +35.4121093750,566,990.2343750000,,, +35.4140625000,566,990.2343750000,,, +35.4160156250,566,990.2343750000,,, +35.4179687500,566,990.2343750000,,, +35.4199218750,566,990.2343750000,,, +35.4218750000,566,990.2343750000,,, +35.4238281250,566,990.2343750000,,, +35.4257812500,566,990.2343750000,,, +35.4277343750,566,990.2343750000,,, +35.4296875000,566,990.2343750000,,, +35.4316406250,566,990.2343750000,,, +35.4335937500,566,990.2343750000,,, +35.4355468750,566,990.2343750000,,, +35.4375000000,567,990.2343750000,,, +35.4394531250,567,990.2343750000,,, +35.4414062500,567,990.2343750000,,, +35.4433593750,567,990.2343750000,,, +35.4453125000,567,990.2343750000,,, +35.4472656250,567,990.2343750000,,, +35.4492187500,567,990.2343750000,,, +35.4511718750,567,990.2343750000,,, +35.4531250000,567,990.2343750000,,, +35.4550781250,567,990.2343750000,,, +35.4570312500,567,990.2343750000,,, +35.4589843750,567,990.2343750000,,, +35.4609375000,567,990.2343750000,,, +35.4628906250,567,990.2343750000,,, +35.4648437500,567,990.2343750000,,, +35.4667968750,567,990.2343750000,,, +35.4687500000,567,990.2343750000,,, +35.4707031250,567,990.2343750000,,, +35.4726562500,567,990.2343750000,,, +35.4746093750,567,990.2343750000,,, +35.4765625000,567,990.2343750000,,, +35.4785156250,567,990.2343750000,,, +35.4804687500,567,990.2343750000,,, +35.4824218750,567,990.2343750000,,, +35.4843750000,567,990.2343750000,,, +35.4863281250,567,990.2343750000,,, +35.4882812500,567,990.2343750000,,, +35.4902343750,567,990.2343750000,,, +35.4921875000,567,990.2343750000,,, +35.4941406250,567,990.2343750000,,, +35.4960937500,567,990.2343750000,,, +35.4980468750,567,990.2343750000,,, +35.5000000000,568,990.2343750000,,, +35.5019531250,568,990.2343750000,,, +35.5039062500,568,990.2343750000,,, +35.5058593750,568,990.2343750000,,, +35.5078125000,568,990.2343750000,,, +35.5097656250,568,990.2343750000,,, +35.5117187500,568,990.2343750000,,, +35.5136718750,568,990.2343750000,,, +35.5156250000,568,990.2343750000,,, +35.5175781250,568,990.2343750000,,, +35.5195312500,568,990.2343750000,,, +35.5214843750,568,990.2343750000,,, +35.5234375000,568,990.2343750000,,, +35.5253906250,568,990.2343750000,,, +35.5273437500,568,990.2343750000,,, +35.5292968750,568,990.2343750000,,, +35.5312500000,568,990.2343750000,,, +35.5332031250,568,990.2343750000,,, +35.5351562500,568,990.2343750000,,, +35.5371093750,568,990.2343750000,,, +35.5390625000,568,990.2343750000,,, +35.5410156250,568,990.2343750000,,, +35.5429687500,568,990.2343750000,,, +35.5449218750,568,990.2343750000,,, +35.5468750000,568,990.2343750000,,, +35.5488281250,568,990.2343750000,,, +35.5507812500,568,990.2343750000,,, +35.5527343750,568,990.2343750000,,, +35.5546875000,568,990.2343750000,,, +35.5566406250,568,990.2343750000,,, +35.5585937500,568,990.2343750000,,, +35.5605468750,568,990.2343750000,,, +35.5625000000,569,990.2343750000,,, +35.5644531250,569,990.2343750000,,, +35.5664062500,569,990.2343750000,,, +35.5683593750,569,990.2343750000,,, +35.5703125000,569,990.2343750000,,, +35.5722656250,569,990.2343750000,,, +35.5742187500,569,990.2343750000,,, +35.5761718750,569,990.2343750000,,, +35.5781250000,569,990.2343750000,,, +35.5800781250,569,990.2343750000,,, +35.5820312500,569,990.2343750000,,, +35.5839843750,569,990.2343750000,,, +35.5859375000,569,990.2343750000,,, +35.5878906250,569,990.2343750000,,, +35.5898437500,569,990.2343750000,,, +35.5917968750,569,990.2343750000,,, +35.5937500000,569,990.2343750000,,, +35.5957031250,569,990.2343750000,,, +35.5976562500,569,990.2343750000,,, +35.5996093750,569,990.2343750000,,, +35.6015625000,569,990.2343750000,,, +35.6035156250,569,990.2343750000,,, +35.6054687500,569,990.2343750000,,, +35.6074218750,569,990.2343750000,,, +35.6093750000,569,990.2343750000,,, +35.6113281250,569,990.2343750000,,, +35.6132812500,569,990.2343750000,,, +35.6152343750,569,990.2343750000,,, +35.6171875000,569,990.2343750000,,, +35.6191406250,569,990.2343750000,,, +35.6210937500,569,990.2343750000,,, +35.6230468750,569,990.2343750000,,, +35.6250000000,570,990.2343750000,,, +35.6269531250,570,990.2343750000,,, +35.6289062500,570,990.2343750000,,, +35.6308593750,570,990.2343750000,,, +35.6328125000,570,990.2343750000,,, +35.6347656250,570,990.2343750000,,, +35.6367187500,570,990.2343750000,,, +35.6386718750,570,990.2343750000,,, +35.6406250000,570,990.2343750000,,, +35.6425781250,570,990.2343750000,,, +35.6445312500,570,990.2343750000,,, +35.6464843750,570,990.2343750000,,, +35.6484375000,570,990.2343750000,,, +35.6503906250,570,990.2343750000,,, +35.6523437500,570,990.2343750000,,, +35.6542968750,570,990.2343750000,,, +35.6562500000,570,990.2343750000,,, +35.6582031250,570,990.2343750000,,, +35.6601562500,570,990.2343750000,,, +35.6621093750,570,990.2343750000,,, +35.6640625000,570,990.2343750000,,, +35.6660156250,570,990.2343750000,,, +35.6679687500,570,990.2343750000,,, +35.6699218750,570,990.2343750000,,, +35.6718750000,570,990.2343750000,,, +35.6738281250,570,990.2343750000,,, +35.6757812500,570,990.2343750000,,, +35.6777343750,570,990.2343750000,,, +35.6796875000,570,990.2343750000,,, +35.6816406250,570,990.2343750000,,, +35.6835937500,570,990.2343750000,,, +35.6855468750,570,990.2343750000,,, +35.6875000000,571,990.2343750000,,, +35.6894531250,571,990.2343750000,,, +35.6914062500,571,990.2343750000,,, +35.6933593750,571,990.2343750000,,, +35.6953125000,571,990.2343750000,,, +35.6972656250,571,990.2343750000,,, +35.6992187500,571,990.2343750000,,, +35.7011718750,571,990.2343750000,,, +35.7031250000,571,990.2343750000,,, +35.7050781250,571,990.2343750000,,, +35.7070312500,571,990.2343750000,,, +35.7089843750,571,990.2343750000,,, +35.7109375000,571,990.2343750000,,, +35.7128906250,571,990.2343750000,,, +35.7148437500,571,990.2343750000,,, +35.7167968750,571,990.2343750000,,, +35.7187500000,571,990.2343750000,,, +35.7207031250,571,990.2343750000,,, +35.7226562500,571,990.2343750000,,, +35.7246093750,571,990.2343750000,,, +35.7265625000,571,990.2343750000,,, +35.7285156250,571,990.2343750000,,, +35.7304687500,571,990.2343750000,,, +35.7324218750,571,990.2343750000,,, +35.7343750000,571,990.2343750000,,, +35.7363281250,571,990.2343750000,,, +35.7382812500,571,990.2343750000,,, +35.7402343750,571,990.2343750000,,, +35.7421875000,571,990.2343750000,,, +35.7441406250,571,990.2343750000,,, +35.7460937500,571,990.2343750000,,, +35.7480468750,571,990.2343750000,,, +35.7500000000,572,990.2343750000,,, +35.7519531250,572,990.2343750000,,, +35.7539062500,572,990.2343750000,,, +35.7558593750,572,990.2343750000,,, +35.7578125000,572,990.2343750000,,, +35.7597656250,572,990.2343750000,,, +35.7617187500,572,990.2343750000,,, +35.7636718750,572,990.2343750000,,, +35.7656250000,572,990.2343750000,,, +35.7675781250,572,990.2343750000,,, +35.7695312500,572,990.2343750000,,, +35.7714843750,572,990.2343750000,,, +35.7734375000,572,990.2343750000,,, +35.7753906250,572,990.2343750000,,, +35.7773437500,572,990.2343750000,,, +35.7792968750,572,990.2343750000,,, +35.7812500000,572,990.2343750000,,, +35.7832031250,572,990.2343750000,,, +35.7851562500,572,990.2343750000,,, +35.7871093750,572,990.2343750000,,, +35.7890625000,572,990.2343750000,,, +35.7910156250,572,990.2343750000,,, +35.7929687500,572,990.2343750000,,, +35.7949218750,572,990.2343750000,,, +35.7968750000,572,990.2343750000,,, +35.7988281250,572,990.2343750000,,, +35.8007812500,572,990.2343750000,,, +35.8027343750,572,990.2343750000,,, +35.8046875000,572,990.2343750000,,, +35.8066406250,572,990.2343750000,,, +35.8085937500,572,990.2343750000,,, +35.8105468750,572,990.2343750000,,, +35.8125000000,573,990.2343750000,,, +35.8144531250,573,990.2343750000,,, +35.8164062500,573,990.2343750000,,, +35.8183593750,573,990.2343750000,,, +35.8203125000,573,990.2343750000,,, +35.8222656250,573,990.2343750000,,, +35.8242187500,573,990.2343750000,,, +35.8261718750,573,990.2343750000,,, +35.8281250000,573,990.2343750000,,, +35.8300781250,573,990.2343750000,,, +35.8320312500,573,990.2343750000,,, +35.8339843750,573,990.2343750000,,, +35.8359375000,573,990.2343750000,,, +35.8378906250,573,990.2343750000,,, +35.8398437500,573,990.2343750000,,, +35.8417968750,573,990.2343750000,,, +35.8437500000,573,990.2343750000,,, +35.8457031250,573,990.2343750000,,, +35.8476562500,573,990.2343750000,,, +35.8496093750,573,990.2343750000,,, +35.8515625000,573,990.2343750000,,, +35.8535156250,573,990.2343750000,,, +35.8554687500,573,990.2343750000,,, +35.8574218750,573,990.2343750000,,, +35.8593750000,573,990.2343750000,,, +35.8613281250,573,990.2343750000,,, +35.8632812500,573,990.2343750000,,, +35.8652343750,573,990.2343750000,,, +35.8671875000,573,990.2343750000,,, +35.8691406250,573,990.2343750000,,, +35.8710937500,573,990.2343750000,,, +35.8730468750,573,990.2343750000,,, +35.8750000000,574,1011.7187500000,,, +35.8769531250,574,1011.7187500000,,, +35.8789062500,574,1011.7187500000,,, +35.8808593750,574,1011.7187500000,,, +35.8828125000,574,1011.7187500000,,, +35.8847656250,574,1011.7187500000,,, +35.8867187500,574,1011.7187500000,,, +35.8886718750,574,1011.7187500000,,, +35.8906250000,574,1011.7187500000,,, +35.8925781250,574,1011.7187500000,,, +35.8945312500,574,1011.7187500000,,, +35.8964843750,574,1011.7187500000,,, +35.8984375000,574,1011.7187500000,,, +35.9003906250,574,1011.7187500000,,, +35.9023437500,574,1011.7187500000,,, +35.9042968750,574,1011.7187500000,,, +35.9062500000,574,1011.7187500000,,, +35.9082031250,574,1011.7187500000,,, +35.9101562500,574,1011.7187500000,,, +35.9121093750,574,1011.7187500000,,, +35.9140625000,574,1011.7187500000,,, +35.9160156250,574,1011.7187500000,,, +35.9179687500,574,1011.7187500000,,, +35.9199218750,574,1011.7187500000,,, +35.9218750000,574,1011.7187500000,,, +35.9238281250,574,1011.7187500000,,, +35.9257812500,574,1011.7187500000,,, +35.9277343750,574,1011.7187500000,,, +35.9296875000,574,1011.7187500000,,, +35.9316406250,574,1011.7187500000,,, +35.9335937500,574,1011.7187500000,,, +35.9355468750,574,1011.7187500000,,, +35.9375000000,575,1011.7187500000,,, +35.9394531250,575,1011.7187500000,,, +35.9414062500,575,1011.7187500000,,, +35.9433593750,575,1011.7187500000,,, +35.9453125000,575,1011.7187500000,,, +35.9472656250,575,1011.7187500000,,, +35.9492187500,575,1011.7187500000,,, +35.9511718750,575,1011.7187500000,,, +35.9531250000,575,1011.7187500000,,, +35.9550781250,575,1011.7187500000,,, +35.9570312500,575,1011.7187500000,,, +35.9589843750,575,1011.7187500000,,, +35.9609375000,575,1011.7187500000,,, +35.9628906250,575,1011.7187500000,,, +35.9648437500,575,1011.7187500000,,, +35.9667968750,575,1011.7187500000,,, +35.9687500000,575,1011.7187500000,,, +35.9707031250,575,1011.7187500000,,, +35.9726562500,575,1011.7187500000,,, +35.9746093750,575,1011.7187500000,,, +35.9765625000,575,1011.7187500000,,, +35.9785156250,575,1011.7187500000,,, +35.9804687500,575,1011.7187500000,,, +35.9824218750,575,1011.7187500000,,, +35.9843750000,575,1011.7187500000,,, +35.9863281250,575,1011.7187500000,,, +35.9882812500,575,1011.7187500000,,, +35.9902343750,575,1011.7187500000,,, +35.9921875000,575,1011.7187500000,,, +35.9941406250,575,1011.7187500000,,, +35.9960937500,575,1011.7187500000,,, +35.9980468750,575,1011.7187500000,,, +36.0000000000,576,1011.7187500000,,, +36.0019531250,576,1011.7187500000,,, +36.0039062500,576,1011.7187500000,,, +36.0058593750,576,1011.7187500000,,, +36.0078125000,576,1011.7187500000,,, +36.0097656250,576,1011.7187500000,,, +36.0117187500,576,1011.7187500000,,, +36.0136718750,576,1011.7187500000,,, +36.0156250000,576,1011.7187500000,,, +36.0175781250,576,1011.7187500000,,, +36.0195312500,576,1011.7187500000,,, +36.0214843750,576,1011.7187500000,,, +36.0234375000,576,1011.7187500000,,, +36.0253906250,576,1011.7187500000,,, +36.0273437500,576,1011.7187500000,,, +36.0292968750,576,1011.7187500000,,, +36.0312500000,576,1011.7187500000,,, +36.0332031250,576,1011.7187500000,,, +36.0351562500,576,1011.7187500000,,, +36.0371093750,576,1011.7187500000,,, +36.0390625000,576,1011.7187500000,,, +36.0410156250,576,1011.7187500000,,, +36.0429687500,576,1011.7187500000,,, +36.0449218750,576,1011.7187500000,,, +36.0468750000,576,1011.7187500000,,, +36.0488281250,576,1011.7187500000,,, +36.0507812500,576,1011.7187500000,,, +36.0527343750,576,1011.7187500000,,, +36.0546875000,576,1011.7187500000,,, +36.0566406250,576,1011.7187500000,,, +36.0585937500,576,1011.7187500000,,, +36.0605468750,576,1011.7187500000,,, +36.0625000000,577,1011.7187500000,,, +36.0644531250,577,1011.7187500000,,, +36.0664062500,577,1011.7187500000,,, +36.0683593750,577,1011.7187500000,,, +36.0703125000,577,1011.7187500000,,, +36.0722656250,577,1011.7187500000,,, +36.0742187500,577,1011.7187500000,,, +36.0761718750,577,1011.7187500000,,, +36.0781250000,577,1011.7187500000,,, +36.0800781250,577,1011.7187500000,,, +36.0820312500,577,1011.7187500000,,, +36.0839843750,577,1011.7187500000,,, +36.0859375000,577,1011.7187500000,,, +36.0878906250,577,1011.7187500000,,, +36.0898437500,577,1011.7187500000,,, +36.0917968750,577,1011.7187500000,,, +36.0937500000,577,1011.7187500000,,, +36.0957031250,577,1011.7187500000,,, +36.0976562500,577,1011.7187500000,,, +36.0996093750,577,1011.7187500000,,, +36.1015625000,577,1011.7187500000,,, +36.1035156250,577,1011.7187500000,,, +36.1054687500,577,1011.7187500000,,, +36.1074218750,577,1011.7187500000,,, +36.1093750000,577,1011.7187500000,,, +36.1113281250,577,1011.7187500000,,, +36.1132812500,577,1011.7187500000,,, +36.1152343750,577,1011.7187500000,,, +36.1171875000,577,1011.7187500000,,, +36.1191406250,577,1011.7187500000,,, +36.1210937500,577,1011.7187500000,,, +36.1230468750,577,1011.7187500000,,, +36.1250000000,578,1011.7187500000,,, +36.1269531250,578,1011.7187500000,,, +36.1289062500,578,1011.7187500000,,, +36.1308593750,578,1011.7187500000,,, +36.1328125000,578,1011.7187500000,,, +36.1347656250,578,1011.7187500000,,, +36.1367187500,578,1011.7187500000,,, +36.1386718750,578,1011.7187500000,,, +36.1406250000,578,1011.7187500000,,, +36.1425781250,578,1011.7187500000,,, +36.1445312500,578,1011.7187500000,,, +36.1464843750,578,1011.7187500000,,, +36.1484375000,578,1011.7187500000,,, +36.1503906250,578,1011.7187500000,,, +36.1523437500,578,1011.7187500000,,, +36.1542968750,578,1011.7187500000,,, +36.1562500000,578,1011.7187500000,,, +36.1582031250,578,1011.7187500000,,, +36.1601562500,578,1011.7187500000,,, +36.1621093750,578,1011.7187500000,,, +36.1640625000,578,1011.7187500000,,, +36.1660156250,578,1011.7187500000,,, +36.1679687500,578,1011.7187500000,,, +36.1699218750,578,1011.7187500000,,, +36.1718750000,578,1011.7187500000,,, +36.1738281250,578,1011.7187500000,,, +36.1757812500,578,1011.7187500000,,, +36.1777343750,578,1011.7187500000,,, +36.1796875000,578,1011.7187500000,,, +36.1816406250,578,1011.7187500000,,, +36.1835937500,578,1011.7187500000,,, +36.1855468750,578,1011.7187500000,,, +36.1875000000,579,1011.7187500000,,, +36.1894531250,579,1011.7187500000,,, +36.1914062500,579,1011.7187500000,,, +36.1933593750,579,1011.7187500000,,, +36.1953125000,579,1011.7187500000,,, +36.1972656250,579,1011.7187500000,,, +36.1992187500,579,1011.7187500000,,, +36.2011718750,579,1011.7187500000,,, +36.2031250000,579,1011.7187500000,,, +36.2050781250,579,1011.7187500000,,, +36.2070312500,579,1011.7187500000,,, +36.2089843750,579,1011.7187500000,,, +36.2109375000,579,1011.7187500000,,, +36.2128906250,579,1011.7187500000,,, +36.2148437500,579,1011.7187500000,,, +36.2167968750,579,1011.7187500000,,, +36.2187500000,579,1011.7187500000,,, +36.2207031250,579,1011.7187500000,,, +36.2226562500,579,1011.7187500000,,, +36.2246093750,579,1011.7187500000,,, +36.2265625000,579,1011.7187500000,,, +36.2285156250,579,1011.7187500000,,, +36.2304687500,579,1011.7187500000,,, +36.2324218750,579,1011.7187500000,,, +36.2343750000,579,1011.7187500000,,, +36.2363281250,579,1011.7187500000,,, +36.2382812500,579,1011.7187500000,,, +36.2402343750,579,1011.7187500000,,, +36.2421875000,579,1011.7187500000,,, +36.2441406250,579,1011.7187500000,,, +36.2460937500,579,1011.7187500000,,, +36.2480468750,579,1011.7187500000,,, +36.2500000000,580,1011.7187500000,,, +36.2519531250,580,1011.7187500000,,, +36.2539062500,580,1011.7187500000,,, +36.2558593750,580,1011.7187500000,,, +36.2578125000,580,1011.7187500000,,, +36.2597656250,580,1011.7187500000,,, +36.2617187500,580,1011.7187500000,,, +36.2636718750,580,1011.7187500000,,, +36.2656250000,580,1011.7187500000,,, +36.2675781250,580,1011.7187500000,,, +36.2695312500,580,1011.7187500000,,, +36.2714843750,580,1011.7187500000,,, +36.2734375000,580,1011.7187500000,,, +36.2753906250,580,1011.7187500000,,, +36.2773437500,580,1011.7187500000,,, +36.2792968750,580,1011.7187500000,,, +36.2812500000,580,1011.7187500000,,, +36.2832031250,580,1011.7187500000,,, +36.2851562500,580,1011.7187500000,,, +36.2871093750,580,1011.7187500000,,, +36.2890625000,580,1011.7187500000,,, +36.2910156250,580,1011.7187500000,,, +36.2929687500,580,1011.7187500000,,, +36.2949218750,580,1011.7187500000,,, +36.2968750000,580,1011.7187500000,,, +36.2988281250,580,1011.7187500000,,, +36.3007812500,580,1011.7187500000,,, +36.3027343750,580,1011.7187500000,,, +36.3046875000,580,1011.7187500000,,, +36.3066406250,580,1011.7187500000,,, +36.3085937500,580,1011.7187500000,,, +36.3105468750,580,1011.7187500000,,, +36.3125000000,581,1011.7187500000,,, +36.3144531250,581,1011.7187500000,,, +36.3164062500,581,1011.7187500000,,, +36.3183593750,581,1011.7187500000,,, +36.3203125000,581,1011.7187500000,,, +36.3222656250,581,1011.7187500000,,, +36.3242187500,581,1011.7187500000,,, +36.3261718750,581,1011.7187500000,,, +36.3281250000,581,1011.7187500000,,, +36.3300781250,581,1011.7187500000,,, +36.3320312500,581,1011.7187500000,,, +36.3339843750,581,1011.7187500000,,, +36.3359375000,581,1011.7187500000,,, +36.3378906250,581,1011.7187500000,,, +36.3398437500,581,1011.7187500000,,, +36.3417968750,581,1011.7187500000,,, +36.3437500000,581,1011.7187500000,,, +36.3457031250,581,1011.7187500000,,, +36.3476562500,581,1011.7187500000,,, +36.3496093750,581,1011.7187500000,,, +36.3515625000,581,1011.7187500000,,, +36.3535156250,581,1011.7187500000,,, +36.3554687500,581,1011.7187500000,,, +36.3574218750,581,1011.7187500000,,, +36.3593750000,581,1011.7187500000,,, +36.3613281250,581,1011.7187500000,,, +36.3632812500,581,1011.7187500000,,, +36.3652343750,581,1011.7187500000,,, +36.3671875000,581,1011.7187500000,,, +36.3691406250,581,1011.7187500000,,, +36.3710937500,581,1011.7187500000,,, +36.3730468750,581,1011.7187500000,,, +36.3750000000,582,1011.7187500000,,, +36.3769531250,582,1011.7187500000,,, +36.3789062500,582,1011.7187500000,,, +36.3808593750,582,1011.7187500000,,, +36.3828125000,582,1011.7187500000,,, +36.3847656250,582,1011.7187500000,,, +36.3867187500,582,1011.7187500000,,, +36.3886718750,582,1011.7187500000,,, +36.3906250000,582,1011.7187500000,,, +36.3925781250,582,1011.7187500000,,, +36.3945312500,582,1011.7187500000,,, +36.3964843750,582,1011.7187500000,,, +36.3984375000,582,1011.7187500000,,, +36.4003906250,582,1011.7187500000,,, +36.4023437500,582,1011.7187500000,,, +36.4042968750,582,1011.7187500000,,, +36.4062500000,582,1011.7187500000,,, +36.4082031250,582,1011.7187500000,,, +36.4101562500,582,1011.7187500000,,, +36.4121093750,582,1011.7187500000,,, +36.4140625000,582,1011.7187500000,,, +36.4160156250,582,1011.7187500000,,, +36.4179687500,582,1011.7187500000,,, +36.4199218750,582,1011.7187500000,,, +36.4218750000,582,1011.7187500000,,, +36.4238281250,582,1011.7187500000,,, +36.4257812500,582,1011.7187500000,,, +36.4277343750,582,1011.7187500000,,, +36.4296875000,582,1011.7187500000,,, +36.4316406250,582,1011.7187500000,,, +36.4335937500,582,1011.7187500000,,, +36.4355468750,582,1011.7187500000,,, +36.4375000000,583,1011.7187500000,,, +36.4394531250,583,1011.7187500000,,, +36.4414062500,583,1011.7187500000,,, +36.4433593750,583,1011.7187500000,,, +36.4453125000,583,1011.7187500000,,, +36.4472656250,583,1011.7187500000,,, +36.4492187500,583,1011.7187500000,,, +36.4511718750,583,1011.7187500000,,, +36.4531250000,583,1011.7187500000,,, +36.4550781250,583,1011.7187500000,,, +36.4570312500,583,1011.7187500000,,, +36.4589843750,583,1011.7187500000,,, +36.4609375000,583,1011.7187500000,,, +36.4628906250,583,1011.7187500000,,, +36.4648437500,583,1011.7187500000,,, +36.4667968750,583,1011.7187500000,,, +36.4687500000,583,1011.7187500000,,, +36.4707031250,583,1011.7187500000,,, +36.4726562500,583,1011.7187500000,,, +36.4746093750,583,1011.7187500000,,, +36.4765625000,583,1011.7187500000,,, +36.4785156250,583,1011.7187500000,,, +36.4804687500,583,1011.7187500000,,, +36.4824218750,583,1011.7187500000,,, +36.4843750000,583,1011.7187500000,,, +36.4863281250,583,1011.7187500000,,, +36.4882812500,583,1011.7187500000,,, +36.4902343750,583,1011.7187500000,,, +36.4921875000,583,1011.7187500000,,, +36.4941406250,583,1011.7187500000,,, +36.4960937500,583,1011.7187500000,,, +36.4980468750,583,1011.7187500000,,, +36.5000000000,584,1011.7187500000,,, +36.5019531250,584,1011.7187500000,,, +36.5039062500,584,1011.7187500000,,, +36.5058593750,584,1011.7187500000,,, +36.5078125000,584,1011.7187500000,,, +36.5097656250,584,1011.7187500000,,, +36.5117187500,584,1011.7187500000,,, +36.5136718750,584,1011.7187500000,,, +36.5156250000,584,1011.7187500000,,, +36.5175781250,584,1011.7187500000,,, +36.5195312500,584,1011.7187500000,,, +36.5214843750,584,1011.7187500000,,, +36.5234375000,584,1011.7187500000,,, +36.5253906250,584,1011.7187500000,,, +36.5273437500,584,1011.7187500000,,, +36.5292968750,584,1011.7187500000,,, +36.5312500000,584,1011.7187500000,,, +36.5332031250,584,1011.7187500000,,, +36.5351562500,584,1011.7187500000,,, +36.5371093750,584,1011.7187500000,,, +36.5390625000,584,1011.7187500000,,, +36.5410156250,584,1011.7187500000,,, +36.5429687500,584,1011.7187500000,,, +36.5449218750,584,1011.7187500000,,, +36.5468750000,584,1011.7187500000,,, +36.5488281250,584,1011.7187500000,,, +36.5507812500,584,1011.7187500000,,, +36.5527343750,584,1011.7187500000,,, +36.5546875000,584,1011.7187500000,,, +36.5566406250,584,1011.7187500000,,, +36.5585937500,584,1011.7187500000,,, +36.5605468750,584,1011.7187500000,,, +36.5625000000,585,1011.7187500000,,, +36.5644531250,585,1011.7187500000,,, +36.5664062500,585,1011.7187500000,,, +36.5683593750,585,1011.7187500000,,, +36.5703125000,585,1011.7187500000,,, +36.5722656250,585,1011.7187500000,,, +36.5742187500,585,1011.7187500000,,, +36.5761718750,585,1011.7187500000,,, +36.5781250000,585,1011.7187500000,,, +36.5800781250,585,1011.7187500000,,, +36.5820312500,585,1011.7187500000,,, +36.5839843750,585,1011.7187500000,,, +36.5859375000,585,1011.7187500000,,, +36.5878906250,585,1011.7187500000,,, +36.5898437500,585,1011.7187500000,,, +36.5917968750,585,1011.7187500000,,, +36.5937500000,585,1011.7187500000,,, +36.5957031250,585,1011.7187500000,,, +36.5976562500,585,1011.7187500000,,, +36.5996093750,585,1011.7187500000,,, +36.6015625000,585,1011.7187500000,,, +36.6035156250,585,1011.7187500000,,, +36.6054687500,585,1011.7187500000,,, +36.6074218750,585,1011.7187500000,,, +36.6093750000,585,1011.7187500000,,, +36.6113281250,585,1011.7187500000,,, +36.6132812500,585,1011.7187500000,,, +36.6152343750,585,1011.7187500000,,, +36.6171875000,585,1011.7187500000,,, +36.6191406250,585,1011.7187500000,,, +36.6210937500,585,1011.7187500000,,, +36.6230468750,585,1011.7187500000,,, +36.6250000000,586,1011.7187500000,,, +36.6269531250,586,1011.7187500000,,, +36.6289062500,586,1011.7187500000,,, +36.6308593750,586,1011.7187500000,,, +36.6328125000,586,1011.7187500000,,, +36.6347656250,586,1011.7187500000,,, +36.6367187500,586,1011.7187500000,,, +36.6386718750,586,1011.7187500000,,, +36.6406250000,586,1011.7187500000,,, +36.6425781250,586,1011.7187500000,,, +36.6445312500,586,1011.7187500000,,, +36.6464843750,586,1011.7187500000,,, +36.6484375000,586,1011.7187500000,,, +36.6503906250,586,1011.7187500000,,, +36.6523437500,586,1011.7187500000,,, +36.6542968750,586,1011.7187500000,,, +36.6562500000,586,1011.7187500000,,, +36.6582031250,586,1011.7187500000,,, +36.6601562500,586,1011.7187500000,,, +36.6621093750,586,1011.7187500000,,, +36.6640625000,586,1011.7187500000,,, +36.6660156250,586,1011.7187500000,,, +36.6679687500,586,1011.7187500000,,, +36.6699218750,586,1011.7187500000,,, +36.6718750000,586,1011.7187500000,,, +36.6738281250,586,1011.7187500000,,, +36.6757812500,586,1011.7187500000,,, +36.6777343750,586,1011.7187500000,,, +36.6796875000,586,1011.7187500000,,, +36.6816406250,586,1011.7187500000,,, +36.6835937500,586,1011.7187500000,,, +36.6855468750,586,1011.7187500000,,, +36.6875000000,587,1011.7187500000,,, +36.6894531250,587,1011.7187500000,,, +36.6914062500,587,1011.7187500000,,, +36.6933593750,587,1011.7187500000,,, +36.6953125000,587,1011.7187500000,,, +36.6972656250,587,1011.7187500000,,, +36.6992187500,587,1011.7187500000,,, +36.7011718750,587,1011.7187500000,,, +36.7031250000,587,1011.7187500000,,, +36.7050781250,587,1011.7187500000,,, +36.7070312500,587,1011.7187500000,,, +36.7089843750,587,1011.7187500000,,, +36.7109375000,587,1011.7187500000,,, +36.7128906250,587,1011.7187500000,,, +36.7148437500,587,1011.7187500000,,, +36.7167968750,587,1011.7187500000,,, +36.7187500000,587,1011.7187500000,,, +36.7207031250,587,1011.7187500000,,, +36.7226562500,587,1011.7187500000,,, +36.7246093750,587,1011.7187500000,,, +36.7265625000,587,1011.7187500000,,, +36.7285156250,587,1011.7187500000,,, +36.7304687500,587,1011.7187500000,,, +36.7324218750,587,1011.7187500000,,, +36.7343750000,587,1011.7187500000,,, +36.7363281250,587,1011.7187500000,,, +36.7382812500,587,1011.7187500000,,, +36.7402343750,587,1011.7187500000,,, +36.7421875000,587,1011.7187500000,,, +36.7441406250,587,1011.7187500000,,, +36.7460937500,587,1011.7187500000,,, +36.7480468750,587,1011.7187500000,,, +36.7500000000,588,1011.7187500000,,, +36.7519531250,588,1011.7187500000,,, +36.7539062500,588,1011.7187500000,,, +36.7558593750,588,1011.7187500000,,, +36.7578125000,588,1011.7187500000,,, +36.7597656250,588,1011.7187500000,,, +36.7617187500,588,1011.7187500000,,, +36.7636718750,588,1011.7187500000,,, +36.7656250000,588,1011.7187500000,,, +36.7675781250,588,1011.7187500000,,, +36.7695312500,588,1011.7187500000,,, +36.7714843750,588,1011.7187500000,,, +36.7734375000,588,1011.7187500000,,, +36.7753906250,588,1011.7187500000,,, +36.7773437500,588,1011.7187500000,,, +36.7792968750,588,1011.7187500000,,, +36.7812500000,588,1011.7187500000,,, +36.7832031250,588,1011.7187500000,,, +36.7851562500,588,1011.7187500000,,, +36.7871093750,588,1011.7187500000,,, +36.7890625000,588,1011.7187500000,,, +36.7910156250,588,1011.7187500000,,, +36.7929687500,588,1011.7187500000,,, +36.7949218750,588,1011.7187500000,,, +36.7968750000,588,1011.7187500000,,, +36.7988281250,588,1011.7187500000,,, +36.8007812500,588,1011.7187500000,,, +36.8027343750,588,1011.7187500000,,, +36.8046875000,588,1011.7187500000,,, +36.8066406250,588,1011.7187500000,,, +36.8085937500,588,1011.7187500000,,, +36.8105468750,588,1011.7187500000,,, +36.8125000000,589,1011.7187500000,,, +36.8144531250,589,1011.7187500000,,, +36.8164062500,589,1011.7187500000,,, +36.8183593750,589,1011.7187500000,,, +36.8203125000,589,1011.7187500000,,, +36.8222656250,589,1011.7187500000,,, +36.8242187500,589,1011.7187500000,,, +36.8261718750,589,1011.7187500000,,, +36.8281250000,589,1011.7187500000,,, +36.8300781250,589,1011.7187500000,,, +36.8320312500,589,1011.7187500000,,, +36.8339843750,589,1011.7187500000,,, +36.8359375000,589,1011.7187500000,,, +36.8378906250,589,1011.7187500000,,, +36.8398437500,589,1011.7187500000,,, +36.8417968750,589,1011.7187500000,,, +36.8437500000,589,1011.7187500000,,, +36.8457031250,589,1011.7187500000,,, +36.8476562500,589,1011.7187500000,,, +36.8496093750,589,1011.7187500000,,, +36.8515625000,589,1011.7187500000,,, +36.8535156250,589,1011.7187500000,,, +36.8554687500,589,1011.7187500000,,, +36.8574218750,589,1011.7187500000,,, +36.8593750000,589,1011.7187500000,,, +36.8613281250,589,1011.7187500000,,, +36.8632812500,589,1011.7187500000,,, +36.8652343750,589,1011.7187500000,,, +36.8671875000,589,1011.7187500000,,, +36.8691406250,589,1011.7187500000,,, +36.8710937500,589,1011.7187500000,,, +36.8730468750,589,1011.7187500000,,, +36.8750000000,590,986.3281250000,,, +36.8769531250,590,986.3281250000,,, +36.8789062500,590,986.3281250000,,, +36.8808593750,590,986.3281250000,,, +36.8828125000,590,986.3281250000,,, +36.8847656250,590,986.3281250000,,, +36.8867187500,590,986.3281250000,,, +36.8886718750,590,986.3281250000,,, +36.8906250000,590,986.3281250000,,, +36.8925781250,590,986.3281250000,,, +36.8945312500,590,986.3281250000,,, +36.8964843750,590,986.3281250000,,, +36.8984375000,590,986.3281250000,,, +36.9003906250,590,986.3281250000,,, +36.9023437500,590,986.3281250000,,, +36.9042968750,590,986.3281250000,,, +36.9062500000,590,986.3281250000,,, +36.9082031250,590,986.3281250000,,, +36.9101562500,590,986.3281250000,,, +36.9121093750,590,986.3281250000,,, +36.9140625000,590,986.3281250000,,, +36.9160156250,590,986.3281250000,,, +36.9179687500,590,986.3281250000,,, +36.9199218750,590,986.3281250000,,, +36.9218750000,590,986.3281250000,,, +36.9238281250,590,986.3281250000,,, +36.9257812500,590,986.3281250000,,, +36.9277343750,590,986.3281250000,,, +36.9296875000,590,986.3281250000,,, +36.9316406250,590,986.3281250000,,, +36.9335937500,590,986.3281250000,,, +36.9355468750,590,986.3281250000,,, +36.9375000000,591,986.3281250000,,, +36.9394531250,591,986.3281250000,,, +36.9414062500,591,986.3281250000,,, +36.9433593750,591,986.3281250000,,, +36.9453125000,591,986.3281250000,,, +36.9472656250,591,986.3281250000,,, +36.9492187500,591,986.3281250000,,, +36.9511718750,591,986.3281250000,,, +36.9531250000,591,986.3281250000,,, +36.9550781250,591,986.3281250000,,, +36.9570312500,591,986.3281250000,,, +36.9589843750,591,986.3281250000,,, +36.9609375000,591,986.3281250000,,, +36.9628906250,591,986.3281250000,,, +36.9648437500,591,986.3281250000,,, +36.9667968750,591,986.3281250000,,, +36.9687500000,591,986.3281250000,,, +36.9707031250,591,986.3281250000,,, +36.9726562500,591,986.3281250000,,, +36.9746093750,591,986.3281250000,,, +36.9765625000,591,986.3281250000,,, +36.9785156250,591,986.3281250000,,, +36.9804687500,591,986.3281250000,,, +36.9824218750,591,986.3281250000,,, +36.9843750000,591,986.3281250000,,, +36.9863281250,591,986.3281250000,,, +36.9882812500,591,986.3281250000,,, +36.9902343750,591,986.3281250000,,, +36.9921875000,591,986.3281250000,,, +36.9941406250,591,986.3281250000,,, +36.9960937500,591,986.3281250000,,, +36.9980468750,591,986.3281250000,,, +37.0000000000,592,986.3281250000,,, +37.0019531250,592,986.3281250000,,, +37.0039062500,592,986.3281250000,,, +37.0058593750,592,986.3281250000,,, +37.0078125000,592,986.3281250000,,, +37.0097656250,592,986.3281250000,,, +37.0117187500,592,986.3281250000,,, +37.0136718750,592,986.3281250000,,, +37.0156250000,592,986.3281250000,,, +37.0175781250,592,986.3281250000,,, +37.0195312500,592,986.3281250000,,, +37.0214843750,592,986.3281250000,,, +37.0234375000,592,986.3281250000,,, +37.0253906250,592,986.3281250000,,, +37.0273437500,592,986.3281250000,,, +37.0292968750,592,986.3281250000,,, +37.0312500000,592,986.3281250000,,, +37.0332031250,592,986.3281250000,,, +37.0351562500,592,986.3281250000,,, +37.0371093750,592,986.3281250000,,, +37.0390625000,592,986.3281250000,,, +37.0410156250,592,986.3281250000,,, +37.0429687500,592,986.3281250000,,, +37.0449218750,592,986.3281250000,,, +37.0468750000,592,986.3281250000,,, +37.0488281250,592,986.3281250000,,, +37.0507812500,592,986.3281250000,,, +37.0527343750,592,986.3281250000,,, +37.0546875000,592,986.3281250000,,, +37.0566406250,592,986.3281250000,,, +37.0585937500,592,986.3281250000,,, +37.0605468750,592,986.3281250000,,, +37.0625000000,593,986.3281250000,,, +37.0644531250,593,986.3281250000,,, +37.0664062500,593,986.3281250000,,, +37.0683593750,593,986.3281250000,,, +37.0703125000,593,986.3281250000,,, +37.0722656250,593,986.3281250000,,, +37.0742187500,593,986.3281250000,,, +37.0761718750,593,986.3281250000,,, +37.0781250000,593,986.3281250000,,, +37.0800781250,593,986.3281250000,,, +37.0820312500,593,986.3281250000,,, +37.0839843750,593,986.3281250000,,, +37.0859375000,593,986.3281250000,,, +37.0878906250,593,986.3281250000,,, +37.0898437500,593,986.3281250000,,, +37.0917968750,593,986.3281250000,,, +37.0937500000,593,986.3281250000,,, +37.0957031250,593,986.3281250000,,, +37.0976562500,593,986.3281250000,,, +37.0996093750,593,986.3281250000,,, +37.1015625000,593,986.3281250000,,, +37.1035156250,593,986.3281250000,,, +37.1054687500,593,986.3281250000,,, +37.1074218750,593,986.3281250000,,, +37.1093750000,593,986.3281250000,,, +37.1113281250,593,986.3281250000,,, +37.1132812500,593,986.3281250000,,, +37.1152343750,593,986.3281250000,,, +37.1171875000,593,986.3281250000,,, +37.1191406250,593,986.3281250000,,, +37.1210937500,593,986.3281250000,,, +37.1230468750,593,986.3281250000,,, +37.1250000000,594,986.3281250000,,, +37.1269531250,594,986.3281250000,,, +37.1289062500,594,986.3281250000,,, +37.1308593750,594,986.3281250000,,, +37.1328125000,594,986.3281250000,,, +37.1347656250,594,986.3281250000,,, +37.1367187500,594,986.3281250000,,, +37.1386718750,594,986.3281250000,,, +37.1406250000,594,986.3281250000,,, +37.1425781250,594,986.3281250000,,, +37.1445312500,594,986.3281250000,,, +37.1464843750,594,986.3281250000,,, +37.1484375000,594,986.3281250000,,, +37.1503906250,594,986.3281250000,,, +37.1523437500,594,986.3281250000,,, +37.1542968750,594,986.3281250000,,, +37.1562500000,594,986.3281250000,,, +37.1582031250,594,986.3281250000,,, +37.1601562500,594,986.3281250000,,, +37.1621093750,594,986.3281250000,,, +37.1640625000,594,986.3281250000,,, +37.1660156250,594,986.3281250000,,, +37.1679687500,594,986.3281250000,,, +37.1699218750,594,986.3281250000,,, +37.1718750000,594,986.3281250000,,, +37.1738281250,594,986.3281250000,,, +37.1757812500,594,986.3281250000,,, +37.1777343750,594,986.3281250000,,, +37.1796875000,594,986.3281250000,,, +37.1816406250,594,986.3281250000,,, +37.1835937500,594,986.3281250000,,, +37.1855468750,594,986.3281250000,,, +37.1875000000,595,986.3281250000,,, +37.1894531250,595,986.3281250000,,, +37.1914062500,595,986.3281250000,,, +37.1933593750,595,986.3281250000,,, +37.1953125000,595,986.3281250000,,, +37.1972656250,595,986.3281250000,,, +37.1992187500,595,986.3281250000,,, +37.2011718750,595,986.3281250000,,, +37.2031250000,595,986.3281250000,,, +37.2050781250,595,986.3281250000,,, +37.2070312500,595,986.3281250000,,, +37.2089843750,595,986.3281250000,,, +37.2109375000,595,986.3281250000,,, +37.2128906250,595,986.3281250000,,, +37.2148437500,595,986.3281250000,,, +37.2167968750,595,986.3281250000,,, +37.2187500000,595,986.3281250000,,, +37.2207031250,595,986.3281250000,,, +37.2226562500,595,986.3281250000,,, +37.2246093750,595,986.3281250000,,, +37.2265625000,595,986.3281250000,,, +37.2285156250,595,986.3281250000,,, +37.2304687500,595,986.3281250000,,, +37.2324218750,595,986.3281250000,,, +37.2343750000,595,986.3281250000,,, +37.2363281250,595,986.3281250000,,, +37.2382812500,595,986.3281250000,,, +37.2402343750,595,986.3281250000,,, +37.2421875000,595,986.3281250000,,, +37.2441406250,595,986.3281250000,,, +37.2460937500,595,986.3281250000,,, +37.2480468750,595,986.3281250000,,, +37.2500000000,596,986.3281250000,,, +37.2519531250,596,986.3281250000,,, +37.2539062500,596,986.3281250000,,, +37.2558593750,596,986.3281250000,,, +37.2578125000,596,986.3281250000,,, +37.2597656250,596,986.3281250000,,, +37.2617187500,596,986.3281250000,,, +37.2636718750,596,986.3281250000,,, +37.2656250000,596,986.3281250000,,, +37.2675781250,596,986.3281250000,,, +37.2695312500,596,986.3281250000,,, +37.2714843750,596,986.3281250000,,, +37.2734375000,596,986.3281250000,,, +37.2753906250,596,986.3281250000,,, +37.2773437500,596,986.3281250000,,, +37.2792968750,596,986.3281250000,,, +37.2812500000,596,986.3281250000,,, +37.2832031250,596,986.3281250000,,, +37.2851562500,596,986.3281250000,,, +37.2871093750,596,986.3281250000,,, +37.2890625000,596,986.3281250000,,, +37.2910156250,596,986.3281250000,,, +37.2929687500,596,986.3281250000,,, +37.2949218750,596,986.3281250000,,, +37.2968750000,596,986.3281250000,,, +37.2988281250,596,986.3281250000,,, +37.3007812500,596,986.3281250000,,, +37.3027343750,596,986.3281250000,,, +37.3046875000,596,986.3281250000,,, +37.3066406250,596,986.3281250000,,, +37.3085937500,596,986.3281250000,,, +37.3105468750,596,986.3281250000,,, +37.3125000000,597,986.3281250000,,, +37.3144531250,597,986.3281250000,,, +37.3164062500,597,986.3281250000,,, +37.3183593750,597,986.3281250000,,, +37.3203125000,597,986.3281250000,,, +37.3222656250,597,986.3281250000,,, +37.3242187500,597,986.3281250000,,, +37.3261718750,597,986.3281250000,,, +37.3281250000,597,986.3281250000,,, +37.3300781250,597,986.3281250000,,, +37.3320312500,597,986.3281250000,,, +37.3339843750,597,986.3281250000,,, +37.3359375000,597,986.3281250000,,, +37.3378906250,597,986.3281250000,,, +37.3398437500,597,986.3281250000,,, +37.3417968750,597,986.3281250000,,, +37.3437500000,597,986.3281250000,,, +37.3457031250,597,986.3281250000,,, +37.3476562500,597,986.3281250000,,, +37.3496093750,597,986.3281250000,,, +37.3515625000,597,986.3281250000,,, +37.3535156250,597,986.3281250000,,, +37.3554687500,597,986.3281250000,,, +37.3574218750,597,986.3281250000,,, +37.3593750000,597,986.3281250000,,, +37.3613281250,597,986.3281250000,,, +37.3632812500,597,986.3281250000,,, +37.3652343750,597,986.3281250000,,, +37.3671875000,597,986.3281250000,,, +37.3691406250,597,986.3281250000,,, +37.3710937500,597,986.3281250000,,, +37.3730468750,597,986.3281250000,,, +37.3750000000,598,986.3281250000,,, +37.3769531250,598,986.3281250000,,, +37.3789062500,598,986.3281250000,,, +37.3808593750,598,986.3281250000,,, +37.3828125000,598,986.3281250000,,, +37.3847656250,598,986.3281250000,,, +37.3867187500,598,986.3281250000,,, +37.3886718750,598,986.3281250000,,, +37.3906250000,598,986.3281250000,,, +37.3925781250,598,986.3281250000,,, +37.3945312500,598,986.3281250000,,, +37.3964843750,598,986.3281250000,,, +37.3984375000,598,986.3281250000,,, +37.4003906250,598,986.3281250000,,, +37.4023437500,598,986.3281250000,,, +37.4042968750,598,986.3281250000,,, +37.4062500000,598,986.3281250000,,, +37.4082031250,598,986.3281250000,,, +37.4101562500,598,986.3281250000,,, +37.4121093750,598,986.3281250000,,, +37.4140625000,598,986.3281250000,,, +37.4160156250,598,986.3281250000,,, +37.4179687500,598,986.3281250000,,, +37.4199218750,598,986.3281250000,,, +37.4218750000,598,986.3281250000,,, +37.4238281250,598,986.3281250000,,, +37.4257812500,598,986.3281250000,,, +37.4277343750,598,986.3281250000,,, +37.4296875000,598,986.3281250000,,, +37.4316406250,598,986.3281250000,,, +37.4335937500,598,986.3281250000,,, +37.4355468750,598,986.3281250000,,, +37.4375000000,599,986.3281250000,,, +37.4394531250,599,986.3281250000,,, +37.4414062500,599,986.3281250000,,, +37.4433593750,599,986.3281250000,,, +37.4453125000,599,986.3281250000,,, +37.4472656250,599,986.3281250000,,, +37.4492187500,599,986.3281250000,,, +37.4511718750,599,986.3281250000,,, +37.4531250000,599,986.3281250000,,, +37.4550781250,599,986.3281250000,,, +37.4570312500,599,986.3281250000,,, +37.4589843750,599,986.3281250000,,, +37.4609375000,599,986.3281250000,,, +37.4628906250,599,986.3281250000,,, +37.4648437500,599,986.3281250000,,, +37.4667968750,599,986.3281250000,,, +37.4687500000,599,986.3281250000,,, +37.4707031250,599,986.3281250000,,, +37.4726562500,599,986.3281250000,,, +37.4746093750,599,986.3281250000,,, +37.4765625000,599,986.3281250000,,, +37.4785156250,599,986.3281250000,,, +37.4804687500,599,986.3281250000,,, +37.4824218750,599,986.3281250000,,, +37.4843750000,599,986.3281250000,,, +37.4863281250,599,986.3281250000,,, +37.4882812500,599,986.3281250000,,, +37.4902343750,599,986.3281250000,,, +37.4921875000,599,986.3281250000,,, +37.4941406250,599,986.3281250000,,, +37.4960937500,599,986.3281250000,,, +37.4980468750,599,986.3281250000,,, +37.5000000000,600,986.3281250000,,, +37.5019531250,600,986.3281250000,,, +37.5039062500,600,986.3281250000,,, +37.5058593750,600,986.3281250000,,, +37.5078125000,600,986.3281250000,,, +37.5097656250,600,986.3281250000,,, +37.5117187500,600,986.3281250000,,, +37.5136718750,600,986.3281250000,,, +37.5156250000,600,986.3281250000,,, +37.5175781250,600,986.3281250000,,, +37.5195312500,600,986.3281250000,,, +37.5214843750,600,986.3281250000,,, +37.5234375000,600,986.3281250000,,, +37.5253906250,600,986.3281250000,,, +37.5273437500,600,986.3281250000,,, +37.5292968750,600,986.3281250000,,, +37.5312500000,600,986.3281250000,,, +37.5332031250,600,986.3281250000,,, +37.5351562500,600,986.3281250000,,, +37.5371093750,600,986.3281250000,,, +37.5390625000,600,986.3281250000,,, +37.5410156250,600,986.3281250000,,, +37.5429687500,600,986.3281250000,,, +37.5449218750,600,986.3281250000,,, +37.5468750000,600,986.3281250000,,, +37.5488281250,600,986.3281250000,,, +37.5507812500,600,986.3281250000,,, +37.5527343750,600,986.3281250000,,, +37.5546875000,600,986.3281250000,,, +37.5566406250,600,986.3281250000,,, +37.5585937500,600,986.3281250000,,, +37.5605468750,600,986.3281250000,,, +37.5625000000,601,986.3281250000,,, +37.5644531250,601,986.3281250000,,, +37.5664062500,601,986.3281250000,,, +37.5683593750,601,986.3281250000,,, +37.5703125000,601,986.3281250000,,, +37.5722656250,601,986.3281250000,,, +37.5742187500,601,986.3281250000,,, +37.5761718750,601,986.3281250000,,, +37.5781250000,601,986.3281250000,,, +37.5800781250,601,986.3281250000,,, +37.5820312500,601,986.3281250000,,, +37.5839843750,601,986.3281250000,,, +37.5859375000,601,986.3281250000,,, +37.5878906250,601,986.3281250000,,, +37.5898437500,601,986.3281250000,,, +37.5917968750,601,986.3281250000,,, +37.5937500000,601,986.3281250000,,, +37.5957031250,601,986.3281250000,,, +37.5976562500,601,986.3281250000,,, +37.5996093750,601,986.3281250000,,, +37.6015625000,601,986.3281250000,,, +37.6035156250,601,986.3281250000,,, +37.6054687500,601,986.3281250000,,, +37.6074218750,601,986.3281250000,,, +37.6093750000,601,986.3281250000,,, +37.6113281250,601,986.3281250000,,, +37.6132812500,601,986.3281250000,,, +37.6152343750,601,986.3281250000,,, +37.6171875000,601,986.3281250000,,, +37.6191406250,601,986.3281250000,,, +37.6210937500,601,986.3281250000,,, +37.6230468750,601,986.3281250000,,, +37.6250000000,602,986.3281250000,,, +37.6269531250,602,986.3281250000,,, +37.6289062500,602,986.3281250000,,, +37.6308593750,602,986.3281250000,,, +37.6328125000,602,986.3281250000,,, +37.6347656250,602,986.3281250000,,, +37.6367187500,602,986.3281250000,,, +37.6386718750,602,986.3281250000,,, +37.6406250000,602,986.3281250000,,, +37.6425781250,602,986.3281250000,,, +37.6445312500,602,986.3281250000,,, +37.6464843750,602,986.3281250000,,, +37.6484375000,602,986.3281250000,,, +37.6503906250,602,986.3281250000,,, +37.6523437500,602,986.3281250000,,, +37.6542968750,602,986.3281250000,,, +37.6562500000,602,986.3281250000,,, +37.6582031250,602,986.3281250000,,, +37.6601562500,602,986.3281250000,,, +37.6621093750,602,986.3281250000,,, +37.6640625000,602,986.3281250000,,, +37.6660156250,602,986.3281250000,,, +37.6679687500,602,986.3281250000,,, +37.6699218750,602,986.3281250000,,, +37.6718750000,602,986.3281250000,,, +37.6738281250,602,986.3281250000,,, +37.6757812500,602,986.3281250000,,, +37.6777343750,602,986.3281250000,,, +37.6796875000,602,986.3281250000,,, +37.6816406250,602,986.3281250000,,, +37.6835937500,602,986.3281250000,,, +37.6855468750,602,986.3281250000,,, +37.6875000000,603,986.3281250000,,, +37.6894531250,603,986.3281250000,,, +37.6914062500,603,986.3281250000,,, +37.6933593750,603,986.3281250000,,, +37.6953125000,603,986.3281250000,,, +37.6972656250,603,986.3281250000,,, +37.6992187500,603,986.3281250000,,, +37.7011718750,603,986.3281250000,,, +37.7031250000,603,986.3281250000,,, +37.7050781250,603,986.3281250000,,, +37.7070312500,603,986.3281250000,,, +37.7089843750,603,986.3281250000,,, +37.7109375000,603,986.3281250000,,, +37.7128906250,603,986.3281250000,,, +37.7148437500,603,986.3281250000,,, +37.7167968750,603,986.3281250000,,, +37.7187500000,603,986.3281250000,,, +37.7207031250,603,986.3281250000,,, +37.7226562500,603,986.3281250000,,, +37.7246093750,603,986.3281250000,,, +37.7265625000,603,986.3281250000,,, +37.7285156250,603,986.3281250000,,, +37.7304687500,603,986.3281250000,,, +37.7324218750,603,986.3281250000,,, +37.7343750000,603,986.3281250000,,, +37.7363281250,603,986.3281250000,,, +37.7382812500,603,986.3281250000,,, +37.7402343750,603,986.3281250000,,, +37.7421875000,603,986.3281250000,,, +37.7441406250,603,986.3281250000,,, +37.7460937500,603,986.3281250000,,, +37.7480468750,603,986.3281250000,,, +37.7500000000,604,986.3281250000,,, +37.7519531250,604,986.3281250000,,, +37.7539062500,604,986.3281250000,,, +37.7558593750,604,986.3281250000,,, +37.7578125000,604,986.3281250000,,, +37.7597656250,604,986.3281250000,,, +37.7617187500,604,986.3281250000,,, +37.7636718750,604,986.3281250000,,, +37.7656250000,604,986.3281250000,,, +37.7675781250,604,986.3281250000,,, +37.7695312500,604,986.3281250000,,, +37.7714843750,604,986.3281250000,,, +37.7734375000,604,986.3281250000,,, +37.7753906250,604,986.3281250000,,, +37.7773437500,604,986.3281250000,,, +37.7792968750,604,986.3281250000,,, +37.7812500000,604,986.3281250000,,, +37.7832031250,604,986.3281250000,,, +37.7851562500,604,986.3281250000,,, +37.7871093750,604,986.3281250000,,, +37.7890625000,604,986.3281250000,,, +37.7910156250,604,986.3281250000,,, +37.7929687500,604,986.3281250000,,, +37.7949218750,604,986.3281250000,,, +37.7968750000,604,986.3281250000,,, +37.7988281250,604,986.3281250000,,, +37.8007812500,604,986.3281250000,,, +37.8027343750,604,986.3281250000,,, +37.8046875000,604,986.3281250000,,, +37.8066406250,604,986.3281250000,,, +37.8085937500,604,986.3281250000,,, +37.8105468750,604,986.3281250000,,, +37.8125000000,605,986.3281250000,,, +37.8144531250,605,986.3281250000,,, +37.8164062500,605,986.3281250000,,, +37.8183593750,605,986.3281250000,,, +37.8203125000,605,986.3281250000,,, +37.8222656250,605,986.3281250000,,, +37.8242187500,605,986.3281250000,,, +37.8261718750,605,986.3281250000,,, +37.8281250000,605,986.3281250000,,, +37.8300781250,605,986.3281250000,,, +37.8320312500,605,986.3281250000,,, +37.8339843750,605,986.3281250000,,, +37.8359375000,605,986.3281250000,,, +37.8378906250,605,986.3281250000,,, +37.8398437500,605,986.3281250000,,, +37.8417968750,605,986.3281250000,,, +37.8437500000,605,986.3281250000,,, +37.8457031250,605,986.3281250000,,, +37.8476562500,605,986.3281250000,,, +37.8496093750,605,986.3281250000,,, +37.8515625000,605,986.3281250000,,, +37.8535156250,605,986.3281250000,,, +37.8554687500,605,986.3281250000,,, +37.8574218750,605,986.3281250000,,, +37.8593750000,605,986.3281250000,,, +37.8613281250,605,986.3281250000,,, +37.8632812500,605,986.3281250000,,, +37.8652343750,605,986.3281250000,,, +37.8671875000,605,986.3281250000,,, +37.8691406250,605,986.3281250000,,, +37.8710937500,605,986.3281250000,,, +37.8730468750,605,986.3281250000,,, +37.8750000000,606,984.3750000000,,, +37.8769531250,606,984.3750000000,,, +37.8789062500,606,984.3750000000,,, +37.8808593750,606,984.3750000000,,, +37.8828125000,606,984.3750000000,,, +37.8847656250,606,984.3750000000,,, +37.8867187500,606,984.3750000000,,, +37.8886718750,606,984.3750000000,,, +37.8906250000,606,984.3750000000,,, +37.8925781250,606,984.3750000000,,, +37.8945312500,606,984.3750000000,,, +37.8964843750,606,984.3750000000,,, +37.8984375000,606,984.3750000000,,, +37.9003906250,606,984.3750000000,,, +37.9023437500,606,984.3750000000,,, +37.9042968750,606,984.3750000000,,, +37.9062500000,606,984.3750000000,,, +37.9082031250,606,984.3750000000,,, +37.9101562500,606,984.3750000000,,, +37.9121093750,606,984.3750000000,,, +37.9140625000,606,984.3750000000,,, +37.9160156250,606,984.3750000000,,, +37.9179687500,606,984.3750000000,,, +37.9199218750,606,984.3750000000,,, +37.9218750000,606,984.3750000000,,, +37.9238281250,606,984.3750000000,,, +37.9257812500,606,984.3750000000,,, +37.9277343750,606,984.3750000000,,, +37.9296875000,606,984.3750000000,,, +37.9316406250,606,984.3750000000,,, +37.9335937500,606,984.3750000000,,, +37.9355468750,606,984.3750000000,,, +37.9375000000,607,984.3750000000,,, +37.9394531250,607,984.3750000000,,, +37.9414062500,607,984.3750000000,,, +37.9433593750,607,984.3750000000,,, +37.9453125000,607,984.3750000000,,, +37.9472656250,607,984.3750000000,,, +37.9492187500,607,984.3750000000,,, +37.9511718750,607,984.3750000000,,, +37.9531250000,607,984.3750000000,,, +37.9550781250,607,984.3750000000,,, +37.9570312500,607,984.3750000000,,, +37.9589843750,607,984.3750000000,,, +37.9609375000,607,984.3750000000,,, +37.9628906250,607,984.3750000000,,, +37.9648437500,607,984.3750000000,,, +37.9667968750,607,984.3750000000,,, +37.9687500000,607,984.3750000000,,, +37.9707031250,607,984.3750000000,,, +37.9726562500,607,984.3750000000,,, +37.9746093750,607,984.3750000000,,, +37.9765625000,607,984.3750000000,,, +37.9785156250,607,984.3750000000,,, +37.9804687500,607,984.3750000000,,, +37.9824218750,607,984.3750000000,,, +37.9843750000,607,984.3750000000,,, +37.9863281250,607,984.3750000000,,, +37.9882812500,607,984.3750000000,,, +37.9902343750,607,984.3750000000,,, +37.9921875000,607,984.3750000000,,, +37.9941406250,607,984.3750000000,,, +37.9960937500,607,984.3750000000,,, +37.9980468750,607,984.3750000000,,, +38.0000000000,608,984.3750000000,,, +38.0019531250,608,984.3750000000,,, +38.0039062500,608,984.3750000000,,, +38.0058593750,608,984.3750000000,,, +38.0078125000,608,984.3750000000,,, +38.0097656250,608,984.3750000000,,, +38.0117187500,608,984.3750000000,,, +38.0136718750,608,984.3750000000,,, +38.0156250000,608,984.3750000000,,, +38.0175781250,608,984.3750000000,,, +38.0195312500,608,984.3750000000,,, +38.0214843750,608,984.3750000000,,, +38.0234375000,608,984.3750000000,,, +38.0253906250,608,984.3750000000,,, +38.0273437500,608,984.3750000000,,, +38.0292968750,608,984.3750000000,,, +38.0312500000,608,984.3750000000,,, +38.0332031250,608,984.3750000000,,, +38.0351562500,608,984.3750000000,,, +38.0371093750,608,984.3750000000,,, +38.0390625000,608,984.3750000000,,, +38.0410156250,608,984.3750000000,,, +38.0429687500,608,984.3750000000,,, +38.0449218750,608,984.3750000000,,, +38.0468750000,608,984.3750000000,,, +38.0488281250,608,984.3750000000,,, +38.0507812500,608,984.3750000000,,, +38.0527343750,608,984.3750000000,,, +38.0546875000,608,984.3750000000,,, +38.0566406250,608,984.3750000000,,, +38.0585937500,608,984.3750000000,,, +38.0605468750,608,984.3750000000,,, +38.0625000000,609,984.3750000000,,, +38.0644531250,609,984.3750000000,,, +38.0664062500,609,984.3750000000,,, +38.0683593750,609,984.3750000000,,, +38.0703125000,609,984.3750000000,,, +38.0722656250,609,984.3750000000,,, +38.0742187500,609,984.3750000000,,, +38.0761718750,609,984.3750000000,,, +38.0781250000,609,984.3750000000,,, +38.0800781250,609,984.3750000000,,, +38.0820312500,609,984.3750000000,,, +38.0839843750,609,984.3750000000,,, +38.0859375000,609,984.3750000000,,, +38.0878906250,609,984.3750000000,,, +38.0898437500,609,984.3750000000,,, +38.0917968750,609,984.3750000000,,, +38.0937500000,609,984.3750000000,,, +38.0957031250,609,984.3750000000,,, +38.0976562500,609,984.3750000000,,, +38.0996093750,609,984.3750000000,,, +38.1015625000,609,984.3750000000,,, +38.1035156250,609,984.3750000000,,, +38.1054687500,609,984.3750000000,,, +38.1074218750,609,984.3750000000,,, +38.1093750000,609,984.3750000000,,, +38.1113281250,609,984.3750000000,,, +38.1132812500,609,984.3750000000,,, +38.1152343750,609,984.3750000000,,, +38.1171875000,609,984.3750000000,,, +38.1191406250,609,984.3750000000,,, +38.1210937500,609,984.3750000000,,, +38.1230468750,609,984.3750000000,,, +38.1250000000,610,984.3750000000,,, +38.1269531250,610,984.3750000000,,, +38.1289062500,610,984.3750000000,,, +38.1308593750,610,984.3750000000,,, +38.1328125000,610,984.3750000000,,, +38.1347656250,610,984.3750000000,,, +38.1367187500,610,984.3750000000,,, +38.1386718750,610,984.3750000000,,, +38.1406250000,610,984.3750000000,,, +38.1425781250,610,984.3750000000,,, +38.1445312500,610,984.3750000000,,, +38.1464843750,610,984.3750000000,,, +38.1484375000,610,984.3750000000,,, +38.1503906250,610,984.3750000000,,, +38.1523437500,610,984.3750000000,,, +38.1542968750,610,984.3750000000,,, +38.1562500000,610,984.3750000000,,, +38.1582031250,610,984.3750000000,,, +38.1601562500,610,984.3750000000,,, +38.1621093750,610,984.3750000000,,, +38.1640625000,610,984.3750000000,,, +38.1660156250,610,984.3750000000,,, +38.1679687500,610,984.3750000000,,, +38.1699218750,610,984.3750000000,,, +38.1718750000,610,984.3750000000,,, +38.1738281250,610,984.3750000000,,, +38.1757812500,610,984.3750000000,,, +38.1777343750,610,984.3750000000,,, +38.1796875000,610,984.3750000000,,, +38.1816406250,610,984.3750000000,,, +38.1835937500,610,984.3750000000,,, +38.1855468750,610,984.3750000000,,, +38.1875000000,611,984.3750000000,,, +38.1894531250,611,984.3750000000,,, +38.1914062500,611,984.3750000000,,, +38.1933593750,611,984.3750000000,,, +38.1953125000,611,984.3750000000,,, +38.1972656250,611,984.3750000000,,, +38.1992187500,611,984.3750000000,,, +38.2011718750,611,984.3750000000,,, +38.2031250000,611,984.3750000000,,, +38.2050781250,611,984.3750000000,,, +38.2070312500,611,984.3750000000,,, +38.2089843750,611,984.3750000000,,, +38.2109375000,611,984.3750000000,,, +38.2128906250,611,984.3750000000,,, +38.2148437500,611,984.3750000000,,, +38.2167968750,611,984.3750000000,,, +38.2187500000,611,984.3750000000,,, +38.2207031250,611,984.3750000000,,, +38.2226562500,611,984.3750000000,,, +38.2246093750,611,984.3750000000,,, +38.2265625000,611,984.3750000000,,, +38.2285156250,611,984.3750000000,,, +38.2304687500,611,984.3750000000,,, +38.2324218750,611,984.3750000000,,, +38.2343750000,611,984.3750000000,,, +38.2363281250,611,984.3750000000,,, +38.2382812500,611,984.3750000000,,, +38.2402343750,611,984.3750000000,,, +38.2421875000,611,984.3750000000,,, +38.2441406250,611,984.3750000000,,, +38.2460937500,611,984.3750000000,,, +38.2480468750,611,984.3750000000,,, +38.2500000000,612,984.3750000000,,, +38.2519531250,612,984.3750000000,,, +38.2539062500,612,984.3750000000,,, +38.2558593750,612,984.3750000000,,, +38.2578125000,612,984.3750000000,,, +38.2597656250,612,984.3750000000,,, +38.2617187500,612,984.3750000000,,, +38.2636718750,612,984.3750000000,,, +38.2656250000,612,984.3750000000,,, +38.2675781250,612,984.3750000000,,, +38.2695312500,612,984.3750000000,,, +38.2714843750,612,984.3750000000,,, +38.2734375000,612,984.3750000000,,, +38.2753906250,612,984.3750000000,,, +38.2773437500,612,984.3750000000,,, +38.2792968750,612,984.3750000000,,, +38.2812500000,612,984.3750000000,,, +38.2832031250,612,984.3750000000,,, +38.2851562500,612,984.3750000000,,, +38.2871093750,612,984.3750000000,,, +38.2890625000,612,984.3750000000,,, +38.2910156250,612,984.3750000000,,, +38.2929687500,612,984.3750000000,,, +38.2949218750,612,984.3750000000,,, +38.2968750000,612,984.3750000000,,, +38.2988281250,612,984.3750000000,,, +38.3007812500,612,984.3750000000,,, +38.3027343750,612,984.3750000000,,, +38.3046875000,612,984.3750000000,,, +38.3066406250,612,984.3750000000,,, +38.3085937500,612,984.3750000000,,, +38.3105468750,612,984.3750000000,,, +38.3125000000,613,984.3750000000,,, +38.3144531250,613,984.3750000000,,, +38.3164062500,613,984.3750000000,,, +38.3183593750,613,984.3750000000,,, +38.3203125000,613,984.3750000000,,, +38.3222656250,613,984.3750000000,,, +38.3242187500,613,984.3750000000,,, +38.3261718750,613,984.3750000000,,, +38.3281250000,613,984.3750000000,,, +38.3300781250,613,984.3750000000,,, +38.3320312500,613,984.3750000000,,, +38.3339843750,613,984.3750000000,,, +38.3359375000,613,984.3750000000,,, +38.3378906250,613,984.3750000000,,, +38.3398437500,613,984.3750000000,,, +38.3417968750,613,984.3750000000,,, +38.3437500000,613,984.3750000000,,, +38.3457031250,613,984.3750000000,,, +38.3476562500,613,984.3750000000,,, +38.3496093750,613,984.3750000000,,, +38.3515625000,613,984.3750000000,,, +38.3535156250,613,984.3750000000,,, +38.3554687500,613,984.3750000000,,, +38.3574218750,613,984.3750000000,,, +38.3593750000,613,984.3750000000,,, +38.3613281250,613,984.3750000000,,, +38.3632812500,613,984.3750000000,,, +38.3652343750,613,984.3750000000,,, +38.3671875000,613,984.3750000000,,, +38.3691406250,613,984.3750000000,,, +38.3710937500,613,984.3750000000,,, +38.3730468750,613,984.3750000000,,, +38.3750000000,614,984.3750000000,,, +38.3769531250,614,984.3750000000,,, +38.3789062500,614,984.3750000000,,, +38.3808593750,614,984.3750000000,,, +38.3828125000,614,984.3750000000,,, +38.3847656250,614,984.3750000000,,, +38.3867187500,614,984.3750000000,,, +38.3886718750,614,984.3750000000,,, +38.3906250000,614,984.3750000000,,, +38.3925781250,614,984.3750000000,,, +38.3945312500,614,984.3750000000,,, +38.3964843750,614,984.3750000000,,, +38.3984375000,614,984.3750000000,,, +38.4003906250,614,984.3750000000,,, +38.4023437500,614,984.3750000000,,, +38.4042968750,614,984.3750000000,,, +38.4062500000,614,984.3750000000,,, +38.4082031250,614,984.3750000000,,, +38.4101562500,614,984.3750000000,,, +38.4121093750,614,984.3750000000,,, +38.4140625000,614,984.3750000000,,, +38.4160156250,614,984.3750000000,,, +38.4179687500,614,984.3750000000,,, +38.4199218750,614,984.3750000000,,, +38.4218750000,614,984.3750000000,,, +38.4238281250,614,984.3750000000,,, +38.4257812500,614,984.3750000000,,, +38.4277343750,614,984.3750000000,,, +38.4296875000,614,984.3750000000,,, +38.4316406250,614,984.3750000000,,, +38.4335937500,614,984.3750000000,,, +38.4355468750,614,984.3750000000,,, +38.4375000000,615,984.3750000000,,, +38.4394531250,615,984.3750000000,,, +38.4414062500,615,984.3750000000,,, +38.4433593750,615,984.3750000000,,, +38.4453125000,615,984.3750000000,,, +38.4472656250,615,984.3750000000,,, +38.4492187500,615,984.3750000000,,, +38.4511718750,615,984.3750000000,,, +38.4531250000,615,984.3750000000,,, +38.4550781250,615,984.3750000000,,, +38.4570312500,615,984.3750000000,,, +38.4589843750,615,984.3750000000,,, +38.4609375000,615,984.3750000000,,, +38.4628906250,615,984.3750000000,,, +38.4648437500,615,984.3750000000,,, +38.4667968750,615,984.3750000000,,, +38.4687500000,615,984.3750000000,,, +38.4707031250,615,984.3750000000,,, +38.4726562500,615,984.3750000000,,, +38.4746093750,615,984.3750000000,,, +38.4765625000,615,984.3750000000,,, +38.4785156250,615,984.3750000000,,, +38.4804687500,615,984.3750000000,,, +38.4824218750,615,984.3750000000,,, +38.4843750000,615,984.3750000000,,, +38.4863281250,615,984.3750000000,,, +38.4882812500,615,984.3750000000,,, +38.4902343750,615,984.3750000000,,, +38.4921875000,615,984.3750000000,,, +38.4941406250,615,984.3750000000,,, +38.4960937500,615,984.3750000000,,, +38.4980468750,615,984.3750000000,,, +38.5000000000,616,984.3750000000,,, +38.5019531250,616,984.3750000000,,, +38.5039062500,616,984.3750000000,,, +38.5058593750,616,984.3750000000,,, +38.5078125000,616,984.3750000000,,, +38.5097656250,616,984.3750000000,,, +38.5117187500,616,984.3750000000,,, +38.5136718750,616,984.3750000000,,, +38.5156250000,616,984.3750000000,,, +38.5175781250,616,984.3750000000,,, +38.5195312500,616,984.3750000000,,, +38.5214843750,616,984.3750000000,,, +38.5234375000,616,984.3750000000,,, +38.5253906250,616,984.3750000000,,, +38.5273437500,616,984.3750000000,,, +38.5292968750,616,984.3750000000,,, +38.5312500000,616,984.3750000000,,, +38.5332031250,616,984.3750000000,,, +38.5351562500,616,984.3750000000,,, +38.5371093750,616,984.3750000000,,, +38.5390625000,616,984.3750000000,,, +38.5410156250,616,984.3750000000,,, +38.5429687500,616,984.3750000000,,, +38.5449218750,616,984.3750000000,,, +38.5468750000,616,984.3750000000,,, +38.5488281250,616,984.3750000000,,, +38.5507812500,616,984.3750000000,,, +38.5527343750,616,984.3750000000,,, +38.5546875000,616,984.3750000000,,, +38.5566406250,616,984.3750000000,,, +38.5585937500,616,984.3750000000,,, +38.5605468750,616,984.3750000000,,, +38.5625000000,617,984.3750000000,,, +38.5644531250,617,984.3750000000,,, +38.5664062500,617,984.3750000000,,, +38.5683593750,617,984.3750000000,,, +38.5703125000,617,984.3750000000,,, +38.5722656250,617,984.3750000000,,, +38.5742187500,617,984.3750000000,,, +38.5761718750,617,984.3750000000,,, +38.5781250000,617,984.3750000000,,, +38.5800781250,617,984.3750000000,,, +38.5820312500,617,984.3750000000,,, +38.5839843750,617,984.3750000000,,, +38.5859375000,617,984.3750000000,,, +38.5878906250,617,984.3750000000,,, +38.5898437500,617,984.3750000000,,, +38.5917968750,617,984.3750000000,,, +38.5937500000,617,984.3750000000,,, +38.5957031250,617,984.3750000000,,, +38.5976562500,617,984.3750000000,,, +38.5996093750,617,984.3750000000,,, +38.6015625000,617,984.3750000000,,, +38.6035156250,617,984.3750000000,,, +38.6054687500,617,984.3750000000,,, +38.6074218750,617,984.3750000000,,, +38.6093750000,617,984.3750000000,,, +38.6113281250,617,984.3750000000,,, +38.6132812500,617,984.3750000000,,, +38.6152343750,617,984.3750000000,,, +38.6171875000,617,984.3750000000,,, +38.6191406250,617,984.3750000000,,, +38.6210937500,617,984.3750000000,,, +38.6230468750,617,984.3750000000,,, +38.6250000000,618,984.3750000000,,, +38.6269531250,618,984.3750000000,,, +38.6289062500,618,984.3750000000,,, +38.6308593750,618,984.3750000000,,, +38.6328125000,618,984.3750000000,,, +38.6347656250,618,984.3750000000,,, +38.6367187500,618,984.3750000000,,, +38.6386718750,618,984.3750000000,,, +38.6406250000,618,984.3750000000,,, +38.6425781250,618,984.3750000000,,, +38.6445312500,618,984.3750000000,,, +38.6464843750,618,984.3750000000,,, +38.6484375000,618,984.3750000000,,, +38.6503906250,618,984.3750000000,,, +38.6523437500,618,984.3750000000,,, +38.6542968750,618,984.3750000000,,, +38.6562500000,618,984.3750000000,,, +38.6582031250,618,984.3750000000,,, +38.6601562500,618,984.3750000000,,, +38.6621093750,618,984.3750000000,,, +38.6640625000,618,984.3750000000,,, +38.6660156250,618,984.3750000000,,, +38.6679687500,618,984.3750000000,,, +38.6699218750,618,984.3750000000,,, +38.6718750000,618,984.3750000000,,, +38.6738281250,618,984.3750000000,,, +38.6757812500,618,984.3750000000,,, +38.6777343750,618,984.3750000000,,, +38.6796875000,618,984.3750000000,,, +38.6816406250,618,984.3750000000,,, +38.6835937500,618,984.3750000000,,, +38.6855468750,618,984.3750000000,,, +38.6875000000,619,984.3750000000,,, +38.6894531250,619,984.3750000000,,, +38.6914062500,619,984.3750000000,,, +38.6933593750,619,984.3750000000,,, +38.6953125000,619,984.3750000000,,, +38.6972656250,619,984.3750000000,,, +38.6992187500,619,984.3750000000,,, +38.7011718750,619,984.3750000000,,, +38.7031250000,619,984.3750000000,,, +38.7050781250,619,984.3750000000,,, +38.7070312500,619,984.3750000000,,, +38.7089843750,619,984.3750000000,,, +38.7109375000,619,984.3750000000,,, +38.7128906250,619,984.3750000000,,, +38.7148437500,619,984.3750000000,,, +38.7167968750,619,984.3750000000,,, +38.7187500000,619,984.3750000000,,, +38.7207031250,619,984.3750000000,,, +38.7226562500,619,984.3750000000,,, +38.7246093750,619,984.3750000000,,, +38.7265625000,619,984.3750000000,,, +38.7285156250,619,984.3750000000,,, +38.7304687500,619,984.3750000000,,, +38.7324218750,619,984.3750000000,,, +38.7343750000,619,984.3750000000,,, +38.7363281250,619,984.3750000000,,, +38.7382812500,619,984.3750000000,,, +38.7402343750,619,984.3750000000,,, +38.7421875000,619,984.3750000000,,, +38.7441406250,619,984.3750000000,,, +38.7460937500,619,984.3750000000,,, +38.7480468750,619,984.3750000000,,, +38.7500000000,620,984.3750000000,,, +38.7519531250,620,984.3750000000,,, +38.7539062500,620,984.3750000000,,, +38.7558593750,620,984.3750000000,,, +38.7578125000,620,984.3750000000,,, +38.7597656250,620,984.3750000000,,, +38.7617187500,620,984.3750000000,,, +38.7636718750,620,984.3750000000,,, +38.7656250000,620,984.3750000000,,, +38.7675781250,620,984.3750000000,,, +38.7695312500,620,984.3750000000,,, +38.7714843750,620,984.3750000000,,, +38.7734375000,620,984.3750000000,,, +38.7753906250,620,984.3750000000,,, +38.7773437500,620,984.3750000000,,, +38.7792968750,620,984.3750000000,,, +38.7812500000,620,984.3750000000,,, +38.7832031250,620,984.3750000000,,, +38.7851562500,620,984.3750000000,,, +38.7871093750,620,984.3750000000,,, +38.7890625000,620,984.3750000000,,, +38.7910156250,620,984.3750000000,,, +38.7929687500,620,984.3750000000,,, +38.7949218750,620,984.3750000000,,, +38.7968750000,620,984.3750000000,,, +38.7988281250,620,984.3750000000,,, +38.8007812500,620,984.3750000000,,, +38.8027343750,620,984.3750000000,,, +38.8046875000,620,984.3750000000,,, +38.8066406250,620,984.3750000000,,, +38.8085937500,620,984.3750000000,,, +38.8105468750,620,984.3750000000,,, +38.8125000000,621,984.3750000000,,, +38.8144531250,621,984.3750000000,,, +38.8164062500,621,984.3750000000,,, +38.8183593750,621,984.3750000000,,, +38.8203125000,621,984.3750000000,,, +38.8222656250,621,984.3750000000,,, +38.8242187500,621,984.3750000000,,, +38.8261718750,621,984.3750000000,,, +38.8281250000,621,984.3750000000,,, +38.8300781250,621,984.3750000000,,, +38.8320312500,621,984.3750000000,,, +38.8339843750,621,984.3750000000,,, +38.8359375000,621,984.3750000000,,, +38.8378906250,621,984.3750000000,,, +38.8398437500,621,984.3750000000,,, +38.8417968750,621,984.3750000000,,, +38.8437500000,621,984.3750000000,,, +38.8457031250,621,984.3750000000,,, +38.8476562500,621,984.3750000000,,, +38.8496093750,621,984.3750000000,,, +38.8515625000,621,984.3750000000,,, +38.8535156250,621,984.3750000000,,, +38.8554687500,621,984.3750000000,,, +38.8574218750,621,984.3750000000,,, +38.8593750000,621,984.3750000000,,, +38.8613281250,621,984.3750000000,,, +38.8632812500,621,984.3750000000,,, +38.8652343750,621,984.3750000000,,, +38.8671875000,621,984.3750000000,,, +38.8691406250,621,984.3750000000,,, +38.8710937500,621,984.3750000000,,, +38.8730468750,621,984.3750000000,,, +38.8750000000,622,1013.6718750000,,, +38.8769531250,622,1013.6718750000,,, +38.8789062500,622,1013.6718750000,,, +38.8808593750,622,1013.6718750000,,, +38.8828125000,622,1013.6718750000,,, +38.8847656250,622,1013.6718750000,,, +38.8867187500,622,1013.6718750000,,, +38.8886718750,622,1013.6718750000,,, +38.8906250000,622,1013.6718750000,,, +38.8925781250,622,1013.6718750000,,, +38.8945312500,622,1013.6718750000,,, +38.8964843750,622,1013.6718750000,,, +38.8984375000,622,1013.6718750000,,, +38.9003906250,622,1013.6718750000,,, +38.9023437500,622,1013.6718750000,,, +38.9042968750,622,1013.6718750000,,, +38.9062500000,622,1013.6718750000,,, +38.9082031250,622,1013.6718750000,,, +38.9101562500,622,1013.6718750000,,, +38.9121093750,622,1013.6718750000,,, +38.9140625000,622,1013.6718750000,,, +38.9160156250,622,1013.6718750000,,, +38.9179687500,622,1013.6718750000,,, +38.9199218750,622,1013.6718750000,,, +38.9218750000,622,1013.6718750000,,, +38.9238281250,622,1013.6718750000,,, +38.9257812500,622,1013.6718750000,,, +38.9277343750,622,1013.6718750000,,, +38.9296875000,622,1013.6718750000,,, +38.9316406250,622,1013.6718750000,,, +38.9335937500,622,1013.6718750000,,, +38.9355468750,622,1013.6718750000,,, +38.9375000000,623,1013.6718750000,,, +38.9394531250,623,1013.6718750000,,, +38.9414062500,623,1013.6718750000,,, +38.9433593750,623,1013.6718750000,,, +38.9453125000,623,1013.6718750000,,, +38.9472656250,623,1013.6718750000,,, +38.9492187500,623,1013.6718750000,,, +38.9511718750,623,1013.6718750000,,, +38.9531250000,623,1013.6718750000,,, +38.9550781250,623,1013.6718750000,,, +38.9570312500,623,1013.6718750000,,, +38.9589843750,623,1013.6718750000,,, +38.9609375000,623,1013.6718750000,,, +38.9628906250,623,1013.6718750000,,, +38.9648437500,623,1013.6718750000,,, +38.9667968750,623,1013.6718750000,,, +38.9687500000,623,1013.6718750000,,, +38.9707031250,623,1013.6718750000,,, +38.9726562500,623,1013.6718750000,,, +38.9746093750,623,1013.6718750000,,, +38.9765625000,623,1013.6718750000,,, +38.9785156250,623,1013.6718750000,,, +38.9804687500,623,1013.6718750000,,, +38.9824218750,623,1013.6718750000,,, +38.9843750000,623,1013.6718750000,,, +38.9863281250,623,1013.6718750000,,, +38.9882812500,623,1013.6718750000,,, +38.9902343750,623,1013.6718750000,,, +38.9921875000,623,1013.6718750000,,, +38.9941406250,623,1013.6718750000,,, +38.9960937500,623,1013.6718750000,,, +38.9980468750,623,1013.6718750000,,, +39.0000000000,624,1013.6718750000,,, +39.0019531250,624,1013.6718750000,,, +39.0039062500,624,1013.6718750000,,, +39.0058593750,624,1013.6718750000,,, +39.0078125000,624,1013.6718750000,,, +39.0097656250,624,1013.6718750000,,, +39.0117187500,624,1013.6718750000,,, +39.0136718750,624,1013.6718750000,,, +39.0156250000,624,1013.6718750000,,, +39.0175781250,624,1013.6718750000,,, +39.0195312500,624,1013.6718750000,,, +39.0214843750,624,1013.6718750000,,, +39.0234375000,624,1013.6718750000,,, +39.0253906250,624,1013.6718750000,,, +39.0273437500,624,1013.6718750000,,, +39.0292968750,624,1013.6718750000,,, +39.0312500000,624,1013.6718750000,,, +39.0332031250,624,1013.6718750000,,, +39.0351562500,624,1013.6718750000,,, +39.0371093750,624,1013.6718750000,,, +39.0390625000,624,1013.6718750000,,, +39.0410156250,624,1013.6718750000,,, +39.0429687500,624,1013.6718750000,,, +39.0449218750,624,1013.6718750000,,, +39.0468750000,624,1013.6718750000,,, +39.0488281250,624,1013.6718750000,,, +39.0507812500,624,1013.6718750000,,, +39.0527343750,624,1013.6718750000,,, +39.0546875000,624,1013.6718750000,,, +39.0566406250,624,1013.6718750000,,, +39.0585937500,624,1013.6718750000,,, +39.0605468750,624,1013.6718750000,,, +39.0625000000,625,1013.6718750000,,, +39.0644531250,625,1013.6718750000,,, +39.0664062500,625,1013.6718750000,,, +39.0683593750,625,1013.6718750000,,, +39.0703125000,625,1013.6718750000,,, +39.0722656250,625,1013.6718750000,,, +39.0742187500,625,1013.6718750000,,, +39.0761718750,625,1013.6718750000,,, +39.0781250000,625,1013.6718750000,,, +39.0800781250,625,1013.6718750000,,, +39.0820312500,625,1013.6718750000,,, +39.0839843750,625,1013.6718750000,,, +39.0859375000,625,1013.6718750000,,, +39.0878906250,625,1013.6718750000,,, +39.0898437500,625,1013.6718750000,,, +39.0917968750,625,1013.6718750000,,, +39.0937500000,625,1013.6718750000,,, +39.0957031250,625,1013.6718750000,,, +39.0976562500,625,1013.6718750000,,, +39.0996093750,625,1013.6718750000,,, +39.1015625000,625,1013.6718750000,,, +39.1035156250,625,1013.6718750000,,, +39.1054687500,625,1013.6718750000,,, +39.1074218750,625,1013.6718750000,,, +39.1093750000,625,1013.6718750000,,, +39.1113281250,625,1013.6718750000,,, +39.1132812500,625,1013.6718750000,,, +39.1152343750,625,1013.6718750000,,, +39.1171875000,625,1013.6718750000,,, +39.1191406250,625,1013.6718750000,,, +39.1210937500,625,1013.6718750000,,, +39.1230468750,625,1013.6718750000,,, +39.1250000000,626,1013.6718750000,,, +39.1269531250,626,1013.6718750000,,, +39.1289062500,626,1013.6718750000,,, +39.1308593750,626,1013.6718750000,,, +39.1328125000,626,1013.6718750000,,, +39.1347656250,626,1013.6718750000,,, +39.1367187500,626,1013.6718750000,,, +39.1386718750,626,1013.6718750000,,, +39.1406250000,626,1013.6718750000,,, +39.1425781250,626,1013.6718750000,,, +39.1445312500,626,1013.6718750000,,, +39.1464843750,626,1013.6718750000,,, +39.1484375000,626,1013.6718750000,,, +39.1503906250,626,1013.6718750000,,, +39.1523437500,626,1013.6718750000,,, +39.1542968750,626,1013.6718750000,,, +39.1562500000,626,1013.6718750000,,, +39.1582031250,626,1013.6718750000,,, +39.1601562500,626,1013.6718750000,,, +39.1621093750,626,1013.6718750000,,, +39.1640625000,626,1013.6718750000,,, +39.1660156250,626,1013.6718750000,,, +39.1679687500,626,1013.6718750000,,, +39.1699218750,626,1013.6718750000,,, +39.1718750000,626,1013.6718750000,,, +39.1738281250,626,1013.6718750000,,, +39.1757812500,626,1013.6718750000,,, +39.1777343750,626,1013.6718750000,,, +39.1796875000,626,1013.6718750000,,, +39.1816406250,626,1013.6718750000,,, +39.1835937500,626,1013.6718750000,,, +39.1855468750,626,1013.6718750000,,, +39.1875000000,627,1013.6718750000,,, +39.1894531250,627,1013.6718750000,,, +39.1914062500,627,1013.6718750000,,, +39.1933593750,627,1013.6718750000,,, +39.1953125000,627,1013.6718750000,,, +39.1972656250,627,1013.6718750000,,, +39.1992187500,627,1013.6718750000,,, +39.2011718750,627,1013.6718750000,,, +39.2031250000,627,1013.6718750000,,, +39.2050781250,627,1013.6718750000,,, +39.2070312500,627,1013.6718750000,,, +39.2089843750,627,1013.6718750000,,, +39.2109375000,627,1013.6718750000,,, +39.2128906250,627,1013.6718750000,,, +39.2148437500,627,1013.6718750000,,, +39.2167968750,627,1013.6718750000,,, +39.2187500000,627,1013.6718750000,,, +39.2207031250,627,1013.6718750000,,, +39.2226562500,627,1013.6718750000,,, +39.2246093750,627,1013.6718750000,,, +39.2265625000,627,1013.6718750000,,, +39.2285156250,627,1013.6718750000,,, +39.2304687500,627,1013.6718750000,,, +39.2324218750,627,1013.6718750000,,, +39.2343750000,627,1013.6718750000,,, +39.2363281250,627,1013.6718750000,,, +39.2382812500,627,1013.6718750000,,, +39.2402343750,627,1013.6718750000,,, +39.2421875000,627,1013.6718750000,,, +39.2441406250,627,1013.6718750000,,, +39.2460937500,627,1013.6718750000,,, +39.2480468750,627,1013.6718750000,,, +39.2500000000,628,1013.6718750000,,, +39.2519531250,628,1013.6718750000,,, +39.2539062500,628,1013.6718750000,,, +39.2558593750,628,1013.6718750000,,, +39.2578125000,628,1013.6718750000,,, +39.2597656250,628,1013.6718750000,,, +39.2617187500,628,1013.6718750000,,, +39.2636718750,628,1013.6718750000,,, +39.2656250000,628,1013.6718750000,,, +39.2675781250,628,1013.6718750000,,, +39.2695312500,628,1013.6718750000,,, +39.2714843750,628,1013.6718750000,,, +39.2734375000,628,1013.6718750000,,, +39.2753906250,628,1013.6718750000,,, +39.2773437500,628,1013.6718750000,,, +39.2792968750,628,1013.6718750000,,, +39.2812500000,628,1013.6718750000,,, +39.2832031250,628,1013.6718750000,,, +39.2851562500,628,1013.6718750000,,, +39.2871093750,628,1013.6718750000,,, +39.2890625000,628,1013.6718750000,,, +39.2910156250,628,1013.6718750000,,, +39.2929687500,628,1013.6718750000,,, +39.2949218750,628,1013.6718750000,,, +39.2968750000,628,1013.6718750000,,, +39.2988281250,628,1013.6718750000,,, +39.3007812500,628,1013.6718750000,,, +39.3027343750,628,1013.6718750000,,, +39.3046875000,628,1013.6718750000,,, +39.3066406250,628,1013.6718750000,,, +39.3085937500,628,1013.6718750000,,, +39.3105468750,628,1013.6718750000,,, +39.3125000000,629,1013.6718750000,,, +39.3144531250,629,1013.6718750000,,, +39.3164062500,629,1013.6718750000,,, +39.3183593750,629,1013.6718750000,,, +39.3203125000,629,1013.6718750000,,, +39.3222656250,629,1013.6718750000,,, +39.3242187500,629,1013.6718750000,,, +39.3261718750,629,1013.6718750000,,, +39.3281250000,629,1013.6718750000,,, +39.3300781250,629,1013.6718750000,,, +39.3320312500,629,1013.6718750000,,, +39.3339843750,629,1013.6718750000,,, +39.3359375000,629,1013.6718750000,,, +39.3378906250,629,1013.6718750000,,, +39.3398437500,629,1013.6718750000,,, +39.3417968750,629,1013.6718750000,,, +39.3437500000,629,1013.6718750000,,, +39.3457031250,629,1013.6718750000,,, +39.3476562500,629,1013.6718750000,,, +39.3496093750,629,1013.6718750000,,, +39.3515625000,629,1013.6718750000,,, +39.3535156250,629,1013.6718750000,,, +39.3554687500,629,1013.6718750000,,, +39.3574218750,629,1013.6718750000,,, +39.3593750000,629,1013.6718750000,,, +39.3613281250,629,1013.6718750000,,, +39.3632812500,629,1013.6718750000,,, +39.3652343750,629,1013.6718750000,,, +39.3671875000,629,1013.6718750000,,, +39.3691406250,629,1013.6718750000,,, +39.3710937500,629,1013.6718750000,,, +39.3730468750,629,1013.6718750000,,, +39.3750000000,630,1013.6718750000,,, +39.3769531250,630,1013.6718750000,,, +39.3789062500,630,1013.6718750000,,, +39.3808593750,630,1013.6718750000,,, +39.3828125000,630,1013.6718750000,,, +39.3847656250,630,1013.6718750000,,, +39.3867187500,630,1013.6718750000,,, +39.3886718750,630,1013.6718750000,,, +39.3906250000,630,1013.6718750000,,, +39.3925781250,630,1013.6718750000,,, +39.3945312500,630,1013.6718750000,,, +39.3964843750,630,1013.6718750000,,, +39.3984375000,630,1013.6718750000,,, +39.4003906250,630,1013.6718750000,,, +39.4023437500,630,1013.6718750000,,, +39.4042968750,630,1013.6718750000,,, +39.4062500000,630,1013.6718750000,,, +39.4082031250,630,1013.6718750000,,, +39.4101562500,630,1013.6718750000,,, +39.4121093750,630,1013.6718750000,,, +39.4140625000,630,1013.6718750000,,, +39.4160156250,630,1013.6718750000,,, +39.4179687500,630,1013.6718750000,,, +39.4199218750,630,1013.6718750000,,, +39.4218750000,630,1013.6718750000,,, +39.4238281250,630,1013.6718750000,,, +39.4257812500,630,1013.6718750000,,, +39.4277343750,630,1013.6718750000,,, +39.4296875000,630,1013.6718750000,,, +39.4316406250,630,1013.6718750000,,, +39.4335937500,630,1013.6718750000,,, +39.4355468750,630,1013.6718750000,,, +39.4375000000,631,1013.6718750000,,, +39.4394531250,631,1013.6718750000,,, +39.4414062500,631,1013.6718750000,,, +39.4433593750,631,1013.6718750000,,, +39.4453125000,631,1013.6718750000,,, +39.4472656250,631,1013.6718750000,,, +39.4492187500,631,1013.6718750000,,, +39.4511718750,631,1013.6718750000,,, +39.4531250000,631,1013.6718750000,,, +39.4550781250,631,1013.6718750000,,, +39.4570312500,631,1013.6718750000,,, +39.4589843750,631,1013.6718750000,,, +39.4609375000,631,1013.6718750000,,, +39.4628906250,631,1013.6718750000,,, +39.4648437500,631,1013.6718750000,,, +39.4667968750,631,1013.6718750000,,, +39.4687500000,631,1013.6718750000,,, +39.4707031250,631,1013.6718750000,,, +39.4726562500,631,1013.6718750000,,, +39.4746093750,631,1013.6718750000,,, +39.4765625000,631,1013.6718750000,,, +39.4785156250,631,1013.6718750000,,, +39.4804687500,631,1013.6718750000,,, +39.4824218750,631,1013.6718750000,,, +39.4843750000,631,1013.6718750000,,, +39.4863281250,631,1013.6718750000,,, +39.4882812500,631,1013.6718750000,,, +39.4902343750,631,1013.6718750000,,, +39.4921875000,631,1013.6718750000,,, +39.4941406250,631,1013.6718750000,,, +39.4960937500,631,1013.6718750000,,, +39.4980468750,631,1013.6718750000,,, +39.5000000000,632,1013.6718750000,,, +39.5019531250,632,1013.6718750000,,, +39.5039062500,632,1013.6718750000,,, +39.5058593750,632,1013.6718750000,,, +39.5078125000,632,1013.6718750000,,, +39.5097656250,632,1013.6718750000,,, +39.5117187500,632,1013.6718750000,,, +39.5136718750,632,1013.6718750000,,, +39.5156250000,632,1013.6718750000,,, +39.5175781250,632,1013.6718750000,,, +39.5195312500,632,1013.6718750000,,, +39.5214843750,632,1013.6718750000,,, +39.5234375000,632,1013.6718750000,,, +39.5253906250,632,1013.6718750000,,, +39.5273437500,632,1013.6718750000,,, +39.5292968750,632,1013.6718750000,,, +39.5312500000,632,1013.6718750000,,, +39.5332031250,632,1013.6718750000,,, +39.5351562500,632,1013.6718750000,,, +39.5371093750,632,1013.6718750000,,, +39.5390625000,632,1013.6718750000,,, +39.5410156250,632,1013.6718750000,,, +39.5429687500,632,1013.6718750000,,, +39.5449218750,632,1013.6718750000,,, +39.5468750000,632,1013.6718750000,,, +39.5488281250,632,1013.6718750000,,, +39.5507812500,632,1013.6718750000,,, +39.5527343750,632,1013.6718750000,,, +39.5546875000,632,1013.6718750000,,, +39.5566406250,632,1013.6718750000,,, +39.5585937500,632,1013.6718750000,,, +39.5605468750,632,1013.6718750000,,, +39.5625000000,633,1013.6718750000,,, +39.5644531250,633,1013.6718750000,,, +39.5664062500,633,1013.6718750000,,, +39.5683593750,633,1013.6718750000,,, +39.5703125000,633,1013.6718750000,,, +39.5722656250,633,1013.6718750000,,, +39.5742187500,633,1013.6718750000,,, +39.5761718750,633,1013.6718750000,,, +39.5781250000,633,1013.6718750000,,, +39.5800781250,633,1013.6718750000,,, +39.5820312500,633,1013.6718750000,,, +39.5839843750,633,1013.6718750000,,, +39.5859375000,633,1013.6718750000,,, +39.5878906250,633,1013.6718750000,,, +39.5898437500,633,1013.6718750000,,, +39.5917968750,633,1013.6718750000,,, +39.5937500000,633,1013.6718750000,,, +39.5957031250,633,1013.6718750000,,, +39.5976562500,633,1013.6718750000,,, +39.5996093750,633,1013.6718750000,,, +39.6015625000,633,1013.6718750000,,, +39.6035156250,633,1013.6718750000,,, +39.6054687500,633,1013.6718750000,,, +39.6074218750,633,1013.6718750000,,, +39.6093750000,633,1013.6718750000,,, +39.6113281250,633,1013.6718750000,,, +39.6132812500,633,1013.6718750000,,, +39.6152343750,633,1013.6718750000,,, +39.6171875000,633,1013.6718750000,,, +39.6191406250,633,1013.6718750000,,, +39.6210937500,633,1013.6718750000,,, +39.6230468750,633,1013.6718750000,,, +39.6250000000,634,1013.6718750000,,, +39.6269531250,634,1013.6718750000,,, +39.6289062500,634,1013.6718750000,,, +39.6308593750,634,1013.6718750000,,, +39.6328125000,634,1013.6718750000,,, +39.6347656250,634,1013.6718750000,,, +39.6367187500,634,1013.6718750000,,, +39.6386718750,634,1013.6718750000,,, +39.6406250000,634,1013.6718750000,,, +39.6425781250,634,1013.6718750000,,, +39.6445312500,634,1013.6718750000,,, +39.6464843750,634,1013.6718750000,,, +39.6484375000,634,1013.6718750000,,, +39.6503906250,634,1013.6718750000,,, +39.6523437500,634,1013.6718750000,,, +39.6542968750,634,1013.6718750000,,, +39.6562500000,634,1013.6718750000,,, +39.6582031250,634,1013.6718750000,,, +39.6601562500,634,1013.6718750000,,, +39.6621093750,634,1013.6718750000,,, +39.6640625000,634,1013.6718750000,,, +39.6660156250,634,1013.6718750000,,, +39.6679687500,634,1013.6718750000,,, +39.6699218750,634,1013.6718750000,,, +39.6718750000,634,1013.6718750000,,, +39.6738281250,634,1013.6718750000,,, +39.6757812500,634,1013.6718750000,,, +39.6777343750,634,1013.6718750000,,, +39.6796875000,634,1013.6718750000,,, +39.6816406250,634,1013.6718750000,,, +39.6835937500,634,1013.6718750000,,, +39.6855468750,634,1013.6718750000,,, +39.6875000000,635,1013.6718750000,,, +39.6894531250,635,1013.6718750000,,, +39.6914062500,635,1013.6718750000,,, +39.6933593750,635,1013.6718750000,,, +39.6953125000,635,1013.6718750000,,, +39.6972656250,635,1013.6718750000,,, +39.6992187500,635,1013.6718750000,,, +39.7011718750,635,1013.6718750000,,, +39.7031250000,635,1013.6718750000,,, +39.7050781250,635,1013.6718750000,,, +39.7070312500,635,1013.6718750000,,, +39.7089843750,635,1013.6718750000,,, +39.7109375000,635,1013.6718750000,,, +39.7128906250,635,1013.6718750000,,, +39.7148437500,635,1013.6718750000,,, +39.7167968750,635,1013.6718750000,,, +39.7187500000,635,1013.6718750000,,, +39.7207031250,635,1013.6718750000,,, +39.7226562500,635,1013.6718750000,,, +39.7246093750,635,1013.6718750000,,, +39.7265625000,635,1013.6718750000,,, +39.7285156250,635,1013.6718750000,,, +39.7304687500,635,1013.6718750000,,, +39.7324218750,635,1013.6718750000,,, +39.7343750000,635,1013.6718750000,,, +39.7363281250,635,1013.6718750000,,, +39.7382812500,635,1013.6718750000,,, +39.7402343750,635,1013.6718750000,,, +39.7421875000,635,1013.6718750000,,, +39.7441406250,635,1013.6718750000,,, +39.7460937500,635,1013.6718750000,,, +39.7480468750,635,1013.6718750000,,, +39.7500000000,636,1013.6718750000,,, +39.7519531250,636,1013.6718750000,,, +39.7539062500,636,1013.6718750000,,, +39.7558593750,636,1013.6718750000,,, +39.7578125000,636,1013.6718750000,,, +39.7597656250,636,1013.6718750000,,, +39.7617187500,636,1013.6718750000,,, +39.7636718750,636,1013.6718750000,,, +39.7656250000,636,1013.6718750000,,, +39.7675781250,636,1013.6718750000,,, +39.7695312500,636,1013.6718750000,,, +39.7714843750,636,1013.6718750000,,, +39.7734375000,636,1013.6718750000,,, +39.7753906250,636,1013.6718750000,,, +39.7773437500,636,1013.6718750000,,, +39.7792968750,636,1013.6718750000,,, +39.7812500000,636,1013.6718750000,,, +39.7832031250,636,1013.6718750000,,, +39.7851562500,636,1013.6718750000,,, +39.7871093750,636,1013.6718750000,,, +39.7890625000,636,1013.6718750000,,, +39.7910156250,636,1013.6718750000,,, +39.7929687500,636,1013.6718750000,,, +39.7949218750,636,1013.6718750000,,, +39.7968750000,636,1013.6718750000,,, +39.7988281250,636,1013.6718750000,,, +39.8007812500,636,1013.6718750000,,, +39.8027343750,636,1013.6718750000,,, +39.8046875000,636,1013.6718750000,,, +39.8066406250,636,1013.6718750000,,, +39.8085937500,636,1013.6718750000,,, +39.8105468750,636,1013.6718750000,,, +39.8125000000,637,1013.6718750000,,, +39.8144531250,637,1013.6718750000,,, +39.8164062500,637,1013.6718750000,,, +39.8183593750,637,1013.6718750000,,, +39.8203125000,637,1013.6718750000,,, +39.8222656250,637,1013.6718750000,,, +39.8242187500,637,1013.6718750000,,, +39.8261718750,637,1013.6718750000,,, +39.8281250000,637,1013.6718750000,,, +39.8300781250,637,1013.6718750000,,, +39.8320312500,637,1013.6718750000,,, +39.8339843750,637,1013.6718750000,,, +39.8359375000,637,1013.6718750000,,, +39.8378906250,637,1013.6718750000,,, +39.8398437500,637,1013.6718750000,,, +39.8417968750,637,1013.6718750000,,, +39.8437500000,637,1013.6718750000,,, +39.8457031250,637,1013.6718750000,,, +39.8476562500,637,1013.6718750000,,, +39.8496093750,637,1013.6718750000,,, +39.8515625000,637,1013.6718750000,,, +39.8535156250,637,1013.6718750000,,, +39.8554687500,637,1013.6718750000,,, +39.8574218750,637,1013.6718750000,,, +39.8593750000,637,1013.6718750000,,, +39.8613281250,637,1013.6718750000,,, +39.8632812500,637,1013.6718750000,,, +39.8652343750,637,1013.6718750000,,, +39.8671875000,637,1013.6718750000,,, +39.8691406250,637,1013.6718750000,,, +39.8710937500,637,1013.6718750000,,, +39.8730468750,637,1013.6718750000,,, +39.8750000000,638,1000.0000000000,,, +39.8769531250,638,1000.0000000000,,, +39.8789062500,638,1000.0000000000,,, +39.8808593750,638,1000.0000000000,,, +39.8828125000,638,1000.0000000000,,, +39.8847656250,638,1000.0000000000,,, +39.8867187500,638,1000.0000000000,,, +39.8886718750,638,1000.0000000000,,, +39.8906250000,638,1000.0000000000,,, +39.8925781250,638,1000.0000000000,,, +39.8945312500,638,1000.0000000000,,, +39.8964843750,638,1000.0000000000,,, +39.8984375000,638,1000.0000000000,,, +39.9003906250,638,1000.0000000000,,, +39.9023437500,638,1000.0000000000,,, +39.9042968750,638,1000.0000000000,,, +39.9062500000,638,1000.0000000000,,, +39.9082031250,638,1000.0000000000,,, +39.9101562500,638,1000.0000000000,,, +39.9121093750,638,1000.0000000000,,, +39.9140625000,638,1000.0000000000,,, +39.9160156250,638,1000.0000000000,,, +39.9179687500,638,1000.0000000000,,, +39.9199218750,638,1000.0000000000,,, +39.9218750000,638,1000.0000000000,,, +39.9238281250,638,1000.0000000000,,, +39.9257812500,638,1000.0000000000,,, +39.9277343750,638,1000.0000000000,,, +39.9296875000,638,1000.0000000000,,, +39.9316406250,638,1000.0000000000,,, +39.9335937500,638,1000.0000000000,,, +39.9355468750,638,1000.0000000000,,, +39.9375000000,639,1000.0000000000,,, +39.9394531250,639,1000.0000000000,,, +39.9414062500,639,1000.0000000000,,, +39.9433593750,639,1000.0000000000,,, +39.9453125000,639,1000.0000000000,,, +39.9472656250,639,1000.0000000000,,, +39.9492187500,639,1000.0000000000,,, +39.9511718750,639,1000.0000000000,,, +39.9531250000,639,1000.0000000000,,, +39.9550781250,639,1000.0000000000,,, +39.9570312500,639,1000.0000000000,,, +39.9589843750,639,1000.0000000000,,, +39.9609375000,639,1000.0000000000,,, +39.9628906250,639,1000.0000000000,,, +39.9648437500,639,1000.0000000000,,, +39.9667968750,639,1000.0000000000,,, +39.9687500000,639,1000.0000000000,,, +39.9707031250,639,1000.0000000000,,, +39.9726562500,639,1000.0000000000,,, +39.9746093750,639,1000.0000000000,,, +39.9765625000,639,1000.0000000000,,, +39.9785156250,639,1000.0000000000,,, +39.9804687500,639,1000.0000000000,,, +39.9824218750,639,1000.0000000000,,, +39.9843750000,639,1000.0000000000,,, +39.9863281250,639,1000.0000000000,,, +39.9882812500,639,1000.0000000000,,, +39.9902343750,639,1000.0000000000,,, +39.9921875000,639,1000.0000000000,,, +39.9941406250,639,1000.0000000000,,, +39.9960937500,639,1000.0000000000,,, +39.9980468750,639,1000.0000000000,,, +40.0000000000,640,1000.0000000000,,, +40.0019531250,640,1000.0000000000,,, +40.0039062500,640,1000.0000000000,,, +40.0058593750,640,1000.0000000000,,, +40.0078125000,640,1000.0000000000,,, +40.0097656250,640,1000.0000000000,,, +40.0117187500,640,1000.0000000000,,, +40.0136718750,640,1000.0000000000,,, +40.0156250000,640,1000.0000000000,,, +40.0175781250,640,1000.0000000000,,, +40.0195312500,640,1000.0000000000,,, +40.0214843750,640,1000.0000000000,,, +40.0234375000,640,1000.0000000000,,, +40.0253906250,640,1000.0000000000,,, +40.0273437500,640,1000.0000000000,,, +40.0292968750,640,1000.0000000000,,, +40.0312500000,640,1000.0000000000,,, +40.0332031250,640,1000.0000000000,,, +40.0351562500,640,1000.0000000000,,, +40.0371093750,640,1000.0000000000,,, +40.0390625000,640,1000.0000000000,,, +40.0410156250,640,1000.0000000000,,, +40.0429687500,640,1000.0000000000,,, +40.0449218750,640,1000.0000000000,,, +40.0468750000,640,1000.0000000000,,, +40.0488281250,640,1000.0000000000,,, +40.0507812500,640,1000.0000000000,,, +40.0527343750,640,1000.0000000000,,, +40.0546875000,640,1000.0000000000,,, +40.0566406250,640,1000.0000000000,,, +40.0585937500,640,1000.0000000000,,, +40.0605468750,640,1000.0000000000,,, +40.0625000000,641,1000.0000000000,,, +40.0644531250,641,1000.0000000000,,, +40.0664062500,641,1000.0000000000,,, +40.0683593750,641,1000.0000000000,,, +40.0703125000,641,1000.0000000000,,, +40.0722656250,641,1000.0000000000,,, +40.0742187500,641,1000.0000000000,,, +40.0761718750,641,1000.0000000000,,, +40.0781250000,641,1000.0000000000,,, +40.0800781250,641,1000.0000000000,,, +40.0820312500,641,1000.0000000000,,, +40.0839843750,641,1000.0000000000,,, +40.0859375000,641,1000.0000000000,,, +40.0878906250,641,1000.0000000000,,, +40.0898437500,641,1000.0000000000,,, +40.0917968750,641,1000.0000000000,,, +40.0937500000,641,1000.0000000000,,, +40.0957031250,641,1000.0000000000,,, +40.0976562500,641,1000.0000000000,,, +40.0996093750,641,1000.0000000000,,, +40.1015625000,641,1000.0000000000,,, +40.1035156250,641,1000.0000000000,,, +40.1054687500,641,1000.0000000000,,, +40.1074218750,641,1000.0000000000,,, +40.1093750000,641,1000.0000000000,,, +40.1113281250,641,1000.0000000000,,, +40.1132812500,641,1000.0000000000,,, +40.1152343750,641,1000.0000000000,,, +40.1171875000,641,1000.0000000000,,, +40.1191406250,641,1000.0000000000,,, +40.1210937500,641,1000.0000000000,,, +40.1230468750,641,1000.0000000000,,, +40.1250000000,642,1000.0000000000,,, +40.1269531250,642,1000.0000000000,,, +40.1289062500,642,1000.0000000000,,, +40.1308593750,642,1000.0000000000,,, +40.1328125000,642,1000.0000000000,,, +40.1347656250,642,1000.0000000000,,, +40.1367187500,642,1000.0000000000,,, +40.1386718750,642,1000.0000000000,,, +40.1406250000,642,1000.0000000000,,, +40.1425781250,642,1000.0000000000,,, +40.1445312500,642,1000.0000000000,,, +40.1464843750,642,1000.0000000000,,, +40.1484375000,642,1000.0000000000,,, +40.1503906250,642,1000.0000000000,,, +40.1523437500,642,1000.0000000000,,, +40.1542968750,642,1000.0000000000,,, +40.1562500000,642,1000.0000000000,,, +40.1582031250,642,1000.0000000000,,, +40.1601562500,642,1000.0000000000,,, +40.1621093750,642,1000.0000000000,,, +40.1640625000,642,1000.0000000000,,, +40.1660156250,642,1000.0000000000,,, +40.1679687500,642,1000.0000000000,,, +40.1699218750,642,1000.0000000000,,, +40.1718750000,642,1000.0000000000,,, +40.1738281250,642,1000.0000000000,,, +40.1757812500,642,1000.0000000000,,, +40.1777343750,642,1000.0000000000,,, +40.1796875000,642,1000.0000000000,,, +40.1816406250,642,1000.0000000000,,, +40.1835937500,642,1000.0000000000,,, +40.1855468750,642,1000.0000000000,,, +40.1875000000,643,1000.0000000000,,, +40.1894531250,643,1000.0000000000,,, +40.1914062500,643,1000.0000000000,,, +40.1933593750,643,1000.0000000000,,, +40.1953125000,643,1000.0000000000,,, +40.1972656250,643,1000.0000000000,,, +40.1992187500,643,1000.0000000000,,, +40.2011718750,643,1000.0000000000,,, +40.2031250000,643,1000.0000000000,,, +40.2050781250,643,1000.0000000000,,, +40.2070312500,643,1000.0000000000,,, +40.2089843750,643,1000.0000000000,,, +40.2109375000,643,1000.0000000000,,, +40.2128906250,643,1000.0000000000,,, +40.2148437500,643,1000.0000000000,,, +40.2167968750,643,1000.0000000000,,, +40.2187500000,643,1000.0000000000,,, +40.2207031250,643,1000.0000000000,,, +40.2226562500,643,1000.0000000000,,, +40.2246093750,643,1000.0000000000,,, +40.2265625000,643,1000.0000000000,,, +40.2285156250,643,1000.0000000000,,, +40.2304687500,643,1000.0000000000,,, +40.2324218750,643,1000.0000000000,,, +40.2343750000,643,1000.0000000000,,, +40.2363281250,643,1000.0000000000,,, +40.2382812500,643,1000.0000000000,,, +40.2402343750,643,1000.0000000000,,, +40.2421875000,643,1000.0000000000,,, +40.2441406250,643,1000.0000000000,,, +40.2460937500,643,1000.0000000000,,, +40.2480468750,643,1000.0000000000,,, +40.2500000000,644,1000.0000000000,,, +40.2519531250,644,1000.0000000000,,, +40.2539062500,644,1000.0000000000,,, +40.2558593750,644,1000.0000000000,,, +40.2578125000,644,1000.0000000000,,, +40.2597656250,644,1000.0000000000,,, +40.2617187500,644,1000.0000000000,,, +40.2636718750,644,1000.0000000000,,, +40.2656250000,644,1000.0000000000,,, +40.2675781250,644,1000.0000000000,,, +40.2695312500,644,1000.0000000000,,, +40.2714843750,644,1000.0000000000,,, +40.2734375000,644,1000.0000000000,,, +40.2753906250,644,1000.0000000000,,, +40.2773437500,644,1000.0000000000,,, +40.2792968750,644,1000.0000000000,,, +40.2812500000,644,1000.0000000000,,, +40.2832031250,644,1000.0000000000,,, +40.2851562500,644,1000.0000000000,,, +40.2871093750,644,1000.0000000000,,, +40.2890625000,644,1000.0000000000,,, +40.2910156250,644,1000.0000000000,,, +40.2929687500,644,1000.0000000000,,, +40.2949218750,644,1000.0000000000,,, +40.2968750000,644,1000.0000000000,,, +40.2988281250,644,1000.0000000000,,, +40.3007812500,644,1000.0000000000,,, +40.3027343750,644,1000.0000000000,,, +40.3046875000,644,1000.0000000000,,, +40.3066406250,644,1000.0000000000,,, +40.3085937500,644,1000.0000000000,,, +40.3105468750,644,1000.0000000000,,, +40.3125000000,645,1000.0000000000,,, +40.3144531250,645,1000.0000000000,,, +40.3164062500,645,1000.0000000000,,, +40.3183593750,645,1000.0000000000,,, +40.3203125000,645,1000.0000000000,,, +40.3222656250,645,1000.0000000000,,, +40.3242187500,645,1000.0000000000,,, +40.3261718750,645,1000.0000000000,,, +40.3281250000,645,1000.0000000000,,, +40.3300781250,645,1000.0000000000,,, +40.3320312500,645,1000.0000000000,,, +40.3339843750,645,1000.0000000000,,, +40.3359375000,645,1000.0000000000,,, +40.3378906250,645,1000.0000000000,,, +40.3398437500,645,1000.0000000000,,, +40.3417968750,645,1000.0000000000,,, +40.3437500000,645,1000.0000000000,,, +40.3457031250,645,1000.0000000000,,, +40.3476562500,645,1000.0000000000,,, +40.3496093750,645,1000.0000000000,,, +40.3515625000,645,1000.0000000000,,, +40.3535156250,645,1000.0000000000,,, +40.3554687500,645,1000.0000000000,,, +40.3574218750,645,1000.0000000000,,, +40.3593750000,645,1000.0000000000,,, +40.3613281250,645,1000.0000000000,,, +40.3632812500,645,1000.0000000000,,, +40.3652343750,645,1000.0000000000,,, +40.3671875000,645,1000.0000000000,,, +40.3691406250,645,1000.0000000000,,, +40.3710937500,645,1000.0000000000,,, +40.3730468750,645,1000.0000000000,,, +40.3750000000,646,1000.0000000000,,, +40.3769531250,646,1000.0000000000,,, +40.3789062500,646,1000.0000000000,,, +40.3808593750,646,1000.0000000000,,, +40.3828125000,646,1000.0000000000,,, +40.3847656250,646,1000.0000000000,,, +40.3867187500,646,1000.0000000000,,, +40.3886718750,646,1000.0000000000,,, +40.3906250000,646,1000.0000000000,,, +40.3925781250,646,1000.0000000000,,, +40.3945312500,646,1000.0000000000,,, +40.3964843750,646,1000.0000000000,,, +40.3984375000,646,1000.0000000000,,, +40.4003906250,646,1000.0000000000,,, +40.4023437500,646,1000.0000000000,,, +40.4042968750,646,1000.0000000000,,, +40.4062500000,646,1000.0000000000,,, +40.4082031250,646,1000.0000000000,,, +40.4101562500,646,1000.0000000000,,, +40.4121093750,646,1000.0000000000,,, +40.4140625000,646,1000.0000000000,,, +40.4160156250,646,1000.0000000000,,, +40.4179687500,646,1000.0000000000,,, +40.4199218750,646,1000.0000000000,,, +40.4218750000,646,1000.0000000000,,, +40.4238281250,646,1000.0000000000,,, +40.4257812500,646,1000.0000000000,,, +40.4277343750,646,1000.0000000000,,, +40.4296875000,646,1000.0000000000,,, +40.4316406250,646,1000.0000000000,,, +40.4335937500,646,1000.0000000000,,, +40.4355468750,646,1000.0000000000,,, +40.4375000000,647,1000.0000000000,,, +40.4394531250,647,1000.0000000000,,, +40.4414062500,647,1000.0000000000,,, +40.4433593750,647,1000.0000000000,,, +40.4453125000,647,1000.0000000000,,, +40.4472656250,647,1000.0000000000,,, +40.4492187500,647,1000.0000000000,,, +40.4511718750,647,1000.0000000000,,, +40.4531250000,647,1000.0000000000,,, +40.4550781250,647,1000.0000000000,,, +40.4570312500,647,1000.0000000000,,, +40.4589843750,647,1000.0000000000,,, +40.4609375000,647,1000.0000000000,,, +40.4628906250,647,1000.0000000000,,, +40.4648437500,647,1000.0000000000,,, +40.4667968750,647,1000.0000000000,,, +40.4687500000,647,1000.0000000000,,, +40.4707031250,647,1000.0000000000,,, +40.4726562500,647,1000.0000000000,,, +40.4746093750,647,1000.0000000000,,, +40.4765625000,647,1000.0000000000,,, +40.4785156250,647,1000.0000000000,,, +40.4804687500,647,1000.0000000000,,, +40.4824218750,647,1000.0000000000,,, +40.4843750000,647,1000.0000000000,,, +40.4863281250,647,1000.0000000000,,, +40.4882812500,647,1000.0000000000,,, +40.4902343750,647,1000.0000000000,,, +40.4921875000,647,1000.0000000000,,, +40.4941406250,647,1000.0000000000,,, +40.4960937500,647,1000.0000000000,,, +40.4980468750,647,1000.0000000000,,, +40.5000000000,648,1000.0000000000,,, +40.5019531250,648,1000.0000000000,,, +40.5039062500,648,1000.0000000000,,, +40.5058593750,648,1000.0000000000,,, +40.5078125000,648,1000.0000000000,,, +40.5097656250,648,1000.0000000000,,, +40.5117187500,648,1000.0000000000,,, +40.5136718750,648,1000.0000000000,,, +40.5156250000,648,1000.0000000000,,, +40.5175781250,648,1000.0000000000,,, +40.5195312500,648,1000.0000000000,,, +40.5214843750,648,1000.0000000000,,, +40.5234375000,648,1000.0000000000,,, +40.5253906250,648,1000.0000000000,,, +40.5273437500,648,1000.0000000000,,, +40.5292968750,648,1000.0000000000,,, +40.5312500000,648,1000.0000000000,,, +40.5332031250,648,1000.0000000000,,, +40.5351562500,648,1000.0000000000,,, +40.5371093750,648,1000.0000000000,,, +40.5390625000,648,1000.0000000000,,, +40.5410156250,648,1000.0000000000,,, +40.5429687500,648,1000.0000000000,,, +40.5449218750,648,1000.0000000000,,, +40.5468750000,648,1000.0000000000,,, +40.5488281250,648,1000.0000000000,,, +40.5507812500,648,1000.0000000000,,, +40.5527343750,648,1000.0000000000,,, +40.5546875000,648,1000.0000000000,,, +40.5566406250,648,1000.0000000000,,, +40.5585937500,648,1000.0000000000,,, +40.5605468750,648,1000.0000000000,,, +40.5625000000,649,1000.0000000000,,, +40.5644531250,649,1000.0000000000,,, +40.5664062500,649,1000.0000000000,,, +40.5683593750,649,1000.0000000000,,, +40.5703125000,649,1000.0000000000,,, +40.5722656250,649,1000.0000000000,,, +40.5742187500,649,1000.0000000000,,, +40.5761718750,649,1000.0000000000,,, +40.5781250000,649,1000.0000000000,,, +40.5800781250,649,1000.0000000000,,, +40.5820312500,649,1000.0000000000,,, +40.5839843750,649,1000.0000000000,,, +40.5859375000,649,1000.0000000000,,, +40.5878906250,649,1000.0000000000,,, +40.5898437500,649,1000.0000000000,,, +40.5917968750,649,1000.0000000000,,, +40.5937500000,649,1000.0000000000,,, +40.5957031250,649,1000.0000000000,,, +40.5976562500,649,1000.0000000000,,, +40.5996093750,649,1000.0000000000,,, +40.6015625000,649,1000.0000000000,,, +40.6035156250,649,1000.0000000000,,, +40.6054687500,649,1000.0000000000,,, +40.6074218750,649,1000.0000000000,,, +40.6093750000,649,1000.0000000000,,, +40.6113281250,649,1000.0000000000,,, +40.6132812500,649,1000.0000000000,,, +40.6152343750,649,1000.0000000000,,, +40.6171875000,649,1000.0000000000,,, +40.6191406250,649,1000.0000000000,,, +40.6210937500,649,1000.0000000000,,, +40.6230468750,649,1000.0000000000,,, +40.6250000000,650,1000.0000000000,,, +40.6269531250,650,1000.0000000000,,, +40.6289062500,650,1000.0000000000,,, +40.6308593750,650,1000.0000000000,,, +40.6328125000,650,1000.0000000000,,, +40.6347656250,650,1000.0000000000,,, +40.6367187500,650,1000.0000000000,,, +40.6386718750,650,1000.0000000000,,, +40.6406250000,650,1000.0000000000,,, +40.6425781250,650,1000.0000000000,,, +40.6445312500,650,1000.0000000000,,, +40.6464843750,650,1000.0000000000,,, +40.6484375000,650,1000.0000000000,,, +40.6503906250,650,1000.0000000000,,, +40.6523437500,650,1000.0000000000,,, +40.6542968750,650,1000.0000000000,,, +40.6562500000,650,1000.0000000000,,, +40.6582031250,650,1000.0000000000,,, +40.6601562500,650,1000.0000000000,,, +40.6621093750,650,1000.0000000000,,, +40.6640625000,650,1000.0000000000,,, +40.6660156250,650,1000.0000000000,,, +40.6679687500,650,1000.0000000000,,, +40.6699218750,650,1000.0000000000,,, +40.6718750000,650,1000.0000000000,,, +40.6738281250,650,1000.0000000000,,, +40.6757812500,650,1000.0000000000,,, +40.6777343750,650,1000.0000000000,,, +40.6796875000,650,1000.0000000000,,, +40.6816406250,650,1000.0000000000,,, +40.6835937500,650,1000.0000000000,,, +40.6855468750,650,1000.0000000000,,, +40.6875000000,651,1000.0000000000,,, +40.6894531250,651,1000.0000000000,,, +40.6914062500,651,1000.0000000000,,, +40.6933593750,651,1000.0000000000,,, +40.6953125000,651,1000.0000000000,,, +40.6972656250,651,1000.0000000000,,, +40.6992187500,651,1000.0000000000,,, +40.7011718750,651,1000.0000000000,,, +40.7031250000,651,1000.0000000000,,, +40.7050781250,651,1000.0000000000,,, +40.7070312500,651,1000.0000000000,,, +40.7089843750,651,1000.0000000000,,, +40.7109375000,651,1000.0000000000,,, +40.7128906250,651,1000.0000000000,,, +40.7148437500,651,1000.0000000000,,, +40.7167968750,651,1000.0000000000,,, +40.7187500000,651,1000.0000000000,,, +40.7207031250,651,1000.0000000000,,, +40.7226562500,651,1000.0000000000,,, +40.7246093750,651,1000.0000000000,,, +40.7265625000,651,1000.0000000000,,, +40.7285156250,651,1000.0000000000,,, +40.7304687500,651,1000.0000000000,,, +40.7324218750,651,1000.0000000000,,, +40.7343750000,651,1000.0000000000,,, +40.7363281250,651,1000.0000000000,,, +40.7382812500,651,1000.0000000000,,, +40.7402343750,651,1000.0000000000,,, +40.7421875000,651,1000.0000000000,,, +40.7441406250,651,1000.0000000000,,, +40.7460937500,651,1000.0000000000,,, +40.7480468750,651,1000.0000000000,,, +40.7500000000,652,1000.0000000000,,, +40.7519531250,652,1000.0000000000,,, +40.7539062500,652,1000.0000000000,,, +40.7558593750,652,1000.0000000000,,, +40.7578125000,652,1000.0000000000,,, +40.7597656250,652,1000.0000000000,,, +40.7617187500,652,1000.0000000000,,, +40.7636718750,652,1000.0000000000,,, +40.7656250000,652,1000.0000000000,,, +40.7675781250,652,1000.0000000000,,, +40.7695312500,652,1000.0000000000,,, +40.7714843750,652,1000.0000000000,,, +40.7734375000,652,1000.0000000000,,, +40.7753906250,652,1000.0000000000,,, +40.7773437500,652,1000.0000000000,,, +40.7792968750,652,1000.0000000000,,, +40.7812500000,652,1000.0000000000,,, +40.7832031250,652,1000.0000000000,,, +40.7851562500,652,1000.0000000000,,, +40.7871093750,652,1000.0000000000,,, +40.7890625000,652,1000.0000000000,,, +40.7910156250,652,1000.0000000000,,, +40.7929687500,652,1000.0000000000,,, +40.7949218750,652,1000.0000000000,,, +40.7968750000,652,1000.0000000000,,, +40.7988281250,652,1000.0000000000,,, +40.8007812500,652,1000.0000000000,,, +40.8027343750,652,1000.0000000000,,, +40.8046875000,652,1000.0000000000,,, +40.8066406250,652,1000.0000000000,,, +40.8085937500,652,1000.0000000000,,, +40.8105468750,652,1000.0000000000,,, +40.8125000000,653,996.0937500000,,, +40.8144531250,653,996.0937500000,,, +40.8164062500,653,996.0937500000,,, +40.8183593750,653,996.0937500000,,, +40.8203125000,653,996.0937500000,,, +40.8222656250,653,996.0937500000,,, +40.8242187500,653,996.0937500000,,, +40.8261718750,653,996.0937500000,,, +40.8281250000,653,996.0937500000,,, +40.8300781250,653,996.0937500000,,, +40.8320312500,653,996.0937500000,,, +40.8339843750,653,996.0937500000,,, +40.8359375000,653,996.0937500000,,, +40.8378906250,653,996.0937500000,,, +40.8398437500,653,996.0937500000,,, +40.8417968750,653,996.0937500000,,, +40.8437500000,653,996.0937500000,,, +40.8457031250,653,996.0937500000,,, +40.8476562500,653,996.0937500000,,, +40.8496093750,653,996.0937500000,,, +40.8515625000,653,996.0937500000,,, +40.8535156250,653,996.0937500000,,, +40.8554687500,653,996.0937500000,,, +40.8574218750,653,996.0937500000,,, +40.8593750000,653,996.0937500000,,, +40.8613281250,653,996.0937500000,,, +40.8632812500,653,996.0937500000,,, +40.8652343750,653,996.0937500000,,, +40.8671875000,653,996.0937500000,,, +40.8691406250,653,996.0937500000,,, +40.8710937500,653,996.0937500000,,, +40.8730468750,653,996.0937500000,,, +40.8750000000,654,996.0937500000,,, +40.8769531250,654,996.0937500000,,, +40.8789062500,654,996.0937500000,,, +40.8808593750,654,996.0937500000,,, +40.8828125000,654,996.0937500000,,, +40.8847656250,654,996.0937500000,,, +40.8867187500,654,996.0937500000,,, +40.8886718750,654,996.0937500000,,, +40.8906250000,654,996.0937500000,,, +40.8925781250,654,996.0937500000,,, +40.8945312500,654,996.0937500000,,, +40.8964843750,654,996.0937500000,,, +40.8984375000,654,996.0937500000,,, +40.9003906250,654,996.0937500000,,, +40.9023437500,654,996.0937500000,,, +40.9042968750,654,996.0937500000,,, +40.9062500000,654,996.0937500000,,, +40.9082031250,654,996.0937500000,,, +40.9101562500,654,996.0937500000,,, +40.9121093750,654,996.0937500000,,, +40.9140625000,654,996.0937500000,,, +40.9160156250,654,996.0937500000,,, +40.9179687500,654,996.0937500000,,, +40.9199218750,654,996.0937500000,,, +40.9218750000,654,996.0937500000,,, +40.9238281250,654,996.0937500000,,, +40.9257812500,654,996.0937500000,,, +40.9277343750,654,996.0937500000,,, +40.9296875000,654,996.0937500000,,, +40.9316406250,654,996.0937500000,,, +40.9335937500,654,996.0937500000,,, +40.9355468750,654,996.0937500000,,, +40.9375000000,655,996.0937500000,,, +40.9394531250,655,996.0937500000,,, +40.9414062500,655,996.0937500000,,, +40.9433593750,655,996.0937500000,,, +40.9453125000,655,996.0937500000,,, +40.9472656250,655,996.0937500000,,, +40.9492187500,655,996.0937500000,,, +40.9511718750,655,996.0937500000,,, +40.9531250000,655,996.0937500000,,, +40.9550781250,655,996.0937500000,,, +40.9570312500,655,996.0937500000,,, +40.9589843750,655,996.0937500000,,, +40.9609375000,655,996.0937500000,,, +40.9628906250,655,996.0937500000,,, +40.9648437500,655,996.0937500000,,, +40.9667968750,655,996.0937500000,,, +40.9687500000,655,996.0937500000,,, +40.9707031250,655,996.0937500000,,, +40.9726562500,655,996.0937500000,,, +40.9746093750,655,996.0937500000,,, +40.9765625000,655,996.0937500000,,, +40.9785156250,655,996.0937500000,,, +40.9804687500,655,996.0937500000,,, +40.9824218750,655,996.0937500000,,, +40.9843750000,655,996.0937500000,,, +40.9863281250,655,996.0937500000,,, +40.9882812500,655,996.0937500000,,, +40.9902343750,655,996.0937500000,,, +40.9921875000,655,996.0937500000,,, +40.9941406250,655,996.0937500000,,, +40.9960937500,655,996.0937500000,,, +40.9980468750,655,996.0937500000,,, +41.0000000000,656,996.0937500000,,, +41.0019531250,656,996.0937500000,,, +41.0039062500,656,996.0937500000,,, +41.0058593750,656,996.0937500000,,, +41.0078125000,656,996.0937500000,,, +41.0097656250,656,996.0937500000,,, +41.0117187500,656,996.0937500000,,, +41.0136718750,656,996.0937500000,,, +41.0156250000,656,996.0937500000,,, +41.0175781250,656,996.0937500000,,, +41.0195312500,656,996.0937500000,,, +41.0214843750,656,996.0937500000,,, +41.0234375000,656,996.0937500000,,, +41.0253906250,656,996.0937500000,,, +41.0273437500,656,996.0937500000,,, +41.0292968750,656,996.0937500000,,, +41.0312500000,656,996.0937500000,,, +41.0332031250,656,996.0937500000,,, +41.0351562500,656,996.0937500000,,, +41.0371093750,656,996.0937500000,,, +41.0390625000,656,996.0937500000,,, +41.0410156250,656,996.0937500000,,, +41.0429687500,656,996.0937500000,,, +41.0449218750,656,996.0937500000,,, +41.0468750000,656,996.0937500000,,, +41.0488281250,656,996.0937500000,,, +41.0507812500,656,996.0937500000,,, +41.0527343750,656,996.0937500000,,, +41.0546875000,656,996.0937500000,,, +41.0566406250,656,996.0937500000,,, +41.0585937500,656,996.0937500000,,, +41.0605468750,656,996.0937500000,,, +41.0625000000,657,996.0937500000,,, +41.0644531250,657,996.0937500000,,, +41.0664062500,657,996.0937500000,,, +41.0683593750,657,996.0937500000,,, +41.0703125000,657,996.0937500000,,, +41.0722656250,657,996.0937500000,,, +41.0742187500,657,996.0937500000,,, +41.0761718750,657,996.0937500000,,, +41.0781250000,657,996.0937500000,,, +41.0800781250,657,996.0937500000,,, +41.0820312500,657,996.0937500000,,, +41.0839843750,657,996.0937500000,,, +41.0859375000,657,996.0937500000,,, +41.0878906250,657,996.0937500000,,, +41.0898437500,657,996.0937500000,,, +41.0917968750,657,996.0937500000,,, +41.0937500000,657,996.0937500000,,, +41.0957031250,657,996.0937500000,,, +41.0976562500,657,996.0937500000,,, +41.0996093750,657,996.0937500000,,, +41.1015625000,657,996.0937500000,,, +41.1035156250,657,996.0937500000,,, +41.1054687500,657,996.0937500000,,, +41.1074218750,657,996.0937500000,,, +41.1093750000,657,996.0937500000,,, +41.1113281250,657,996.0937500000,,, +41.1132812500,657,996.0937500000,,, +41.1152343750,657,996.0937500000,,, +41.1171875000,657,996.0937500000,,, +41.1191406250,657,996.0937500000,,, +41.1210937500,657,996.0937500000,,, +41.1230468750,657,996.0937500000,,, +41.1250000000,658,996.0937500000,,, +41.1269531250,658,996.0937500000,,, +41.1289062500,658,996.0937500000,,, +41.1308593750,658,996.0937500000,,, +41.1328125000,658,996.0937500000,,, +41.1347656250,658,996.0937500000,,, +41.1367187500,658,996.0937500000,,, +41.1386718750,658,996.0937500000,,, +41.1406250000,658,996.0937500000,,, +41.1425781250,658,996.0937500000,,, +41.1445312500,658,996.0937500000,,, +41.1464843750,658,996.0937500000,,, +41.1484375000,658,996.0937500000,,, +41.1503906250,658,996.0937500000,,, +41.1523437500,658,996.0937500000,,, +41.1542968750,658,996.0937500000,,, +41.1562500000,658,996.0937500000,,, +41.1582031250,658,996.0937500000,,, +41.1601562500,658,996.0937500000,,, +41.1621093750,658,996.0937500000,,, +41.1640625000,658,996.0937500000,,, +41.1660156250,658,996.0937500000,,, +41.1679687500,658,996.0937500000,,, +41.1699218750,658,996.0937500000,,, +41.1718750000,658,996.0937500000,,, +41.1738281250,658,996.0937500000,,, +41.1757812500,658,996.0937500000,,, +41.1777343750,658,996.0937500000,,, +41.1796875000,658,996.0937500000,,, +41.1816406250,658,996.0937500000,,, +41.1835937500,658,996.0937500000,,, +41.1855468750,658,996.0937500000,,, +41.1875000000,659,996.0937500000,,, +41.1894531250,659,996.0937500000,,, +41.1914062500,659,996.0937500000,,, +41.1933593750,659,996.0937500000,,, +41.1953125000,659,996.0937500000,,, +41.1972656250,659,996.0937500000,,, +41.1992187500,659,996.0937500000,,, +41.2011718750,659,996.0937500000,,, +41.2031250000,659,996.0937500000,,, +41.2050781250,659,996.0937500000,,, +41.2070312500,659,996.0937500000,,, +41.2089843750,659,996.0937500000,,, +41.2109375000,659,996.0937500000,,, +41.2128906250,659,996.0937500000,,, +41.2148437500,659,996.0937500000,,, +41.2167968750,659,996.0937500000,,, +41.2187500000,659,996.0937500000,,, +41.2207031250,659,996.0937500000,,, +41.2226562500,659,996.0937500000,,, +41.2246093750,659,996.0937500000,,, +41.2265625000,659,996.0937500000,,, +41.2285156250,659,996.0937500000,,, +41.2304687500,659,996.0937500000,,, +41.2324218750,659,996.0937500000,,, +41.2343750000,659,996.0937500000,,, +41.2363281250,659,996.0937500000,,, +41.2382812500,659,996.0937500000,,, +41.2402343750,659,996.0937500000,,, +41.2421875000,659,996.0937500000,,, +41.2441406250,659,996.0937500000,,, +41.2460937500,659,996.0937500000,,, +41.2480468750,659,996.0937500000,,, +41.2500000000,660,996.0937500000,,, +41.2519531250,660,996.0937500000,,, +41.2539062500,660,996.0937500000,,, +41.2558593750,660,996.0937500000,,, +41.2578125000,660,996.0937500000,,, +41.2597656250,660,996.0937500000,,, +41.2617187500,660,996.0937500000,,, +41.2636718750,660,996.0937500000,,, +41.2656250000,660,996.0937500000,,, +41.2675781250,660,996.0937500000,,, +41.2695312500,660,996.0937500000,,, +41.2714843750,660,996.0937500000,,, +41.2734375000,660,996.0937500000,,, +41.2753906250,660,996.0937500000,,, +41.2773437500,660,996.0937500000,,, +41.2792968750,660,996.0937500000,,, +41.2812500000,660,996.0937500000,,, +41.2832031250,660,996.0937500000,,, +41.2851562500,660,996.0937500000,,, +41.2871093750,660,996.0937500000,,, +41.2890625000,660,996.0937500000,,, +41.2910156250,660,996.0937500000,,, +41.2929687500,660,996.0937500000,,, +41.2949218750,660,996.0937500000,,, +41.2968750000,660,996.0937500000,,, +41.2988281250,660,996.0937500000,,, +41.3007812500,660,996.0937500000,,, +41.3027343750,660,996.0937500000,,, +41.3046875000,660,996.0937500000,,, +41.3066406250,660,996.0937500000,,, +41.3085937500,660,996.0937500000,,, +41.3105468750,660,996.0937500000,,, +41.3125000000,661,996.0937500000,,, +41.3144531250,661,996.0937500000,,, +41.3164062500,661,996.0937500000,,, +41.3183593750,661,996.0937500000,,, +41.3203125000,661,996.0937500000,,, +41.3222656250,661,996.0937500000,,, +41.3242187500,661,996.0937500000,,, +41.3261718750,661,996.0937500000,,, +41.3281250000,661,996.0937500000,,, +41.3300781250,661,996.0937500000,,, +41.3320312500,661,996.0937500000,,, +41.3339843750,661,996.0937500000,,, +41.3359375000,661,996.0937500000,,, +41.3378906250,661,996.0937500000,,, +41.3398437500,661,996.0937500000,,, +41.3417968750,661,996.0937500000,,, +41.3437500000,661,996.0937500000,,, +41.3457031250,661,996.0937500000,,, +41.3476562500,661,996.0937500000,,, +41.3496093750,661,996.0937500000,,, +41.3515625000,661,996.0937500000,,, +41.3535156250,661,996.0937500000,,, +41.3554687500,661,996.0937500000,,, +41.3574218750,661,996.0937500000,,, +41.3593750000,661,996.0937500000,,, +41.3613281250,661,996.0937500000,,, +41.3632812500,661,996.0937500000,,, +41.3652343750,661,996.0937500000,,, +41.3671875000,661,996.0937500000,,, +41.3691406250,661,996.0937500000,,, +41.3710937500,661,996.0937500000,,, +41.3730468750,661,996.0937500000,,, +41.3750000000,662,996.0937500000,,, +41.3769531250,662,996.0937500000,,, +41.3789062500,662,996.0937500000,,, +41.3808593750,662,996.0937500000,,, +41.3828125000,662,996.0937500000,,, +41.3847656250,662,996.0937500000,,, +41.3867187500,662,996.0937500000,,, +41.3886718750,662,996.0937500000,,, +41.3906250000,662,996.0937500000,,, +41.3925781250,662,996.0937500000,,, +41.3945312500,662,996.0937500000,,, +41.3964843750,662,996.0937500000,,, +41.3984375000,662,996.0937500000,,, +41.4003906250,662,996.0937500000,,, +41.4023437500,662,996.0937500000,,, +41.4042968750,662,996.0937500000,,, +41.4062500000,662,996.0937500000,,, +41.4082031250,662,996.0937500000,,, +41.4101562500,662,996.0937500000,,, +41.4121093750,662,996.0937500000,,, +41.4140625000,662,996.0937500000,,, +41.4160156250,662,996.0937500000,,, +41.4179687500,662,996.0937500000,,, +41.4199218750,662,996.0937500000,,, +41.4218750000,662,996.0937500000,,, +41.4238281250,662,996.0937500000,,, +41.4257812500,662,996.0937500000,,, +41.4277343750,662,996.0937500000,,, +41.4296875000,662,996.0937500000,,, +41.4316406250,662,996.0937500000,,, +41.4335937500,662,996.0937500000,,, +41.4355468750,662,996.0937500000,,, +41.4375000000,663,996.0937500000,,, +41.4394531250,663,996.0937500000,,, +41.4414062500,663,996.0937500000,,, +41.4433593750,663,996.0937500000,,, +41.4453125000,663,996.0937500000,,, +41.4472656250,663,996.0937500000,,, +41.4492187500,663,996.0937500000,,, +41.4511718750,663,996.0937500000,,, +41.4531250000,663,996.0937500000,,, +41.4550781250,663,996.0937500000,,, +41.4570312500,663,996.0937500000,,, +41.4589843750,663,996.0937500000,,, +41.4609375000,663,996.0937500000,,, +41.4628906250,663,996.0937500000,,, +41.4648437500,663,996.0937500000,,, +41.4667968750,663,996.0937500000,,, +41.4687500000,663,996.0937500000,,, +41.4707031250,663,996.0937500000,,, +41.4726562500,663,996.0937500000,,, +41.4746093750,663,996.0937500000,,, +41.4765625000,663,996.0937500000,,, +41.4785156250,663,996.0937500000,,, +41.4804687500,663,996.0937500000,,, +41.4824218750,663,996.0937500000,,, +41.4843750000,663,996.0937500000,,, +41.4863281250,663,996.0937500000,,, +41.4882812500,663,996.0937500000,,, +41.4902343750,663,996.0937500000,,, +41.4921875000,663,996.0937500000,,, +41.4941406250,663,996.0937500000,,, +41.4960937500,663,996.0937500000,,, +41.4980468750,663,996.0937500000,,, +41.5000000000,664,996.0937500000,,, +41.5019531250,664,996.0937500000,,, +41.5039062500,664,996.0937500000,,, +41.5058593750,664,996.0937500000,,, +41.5078125000,664,996.0937500000,,, +41.5097656250,664,996.0937500000,,, +41.5117187500,664,996.0937500000,,, +41.5136718750,664,996.0937500000,,, +41.5156250000,664,996.0937500000,,, +41.5175781250,664,996.0937500000,,, +41.5195312500,664,996.0937500000,,, +41.5214843750,664,996.0937500000,,, +41.5234375000,664,996.0937500000,,, +41.5253906250,664,996.0937500000,,, +41.5273437500,664,996.0937500000,,, +41.5292968750,664,996.0937500000,,, +41.5312500000,664,996.0937500000,,, +41.5332031250,664,996.0937500000,,, +41.5351562500,664,996.0937500000,,, +41.5371093750,664,996.0937500000,,, +41.5390625000,664,996.0937500000,,, +41.5410156250,664,996.0937500000,,, +41.5429687500,664,996.0937500000,,, +41.5449218750,664,996.0937500000,,, +41.5468750000,664,996.0937500000,,, +41.5488281250,664,996.0937500000,,, +41.5507812500,664,996.0937500000,,, +41.5527343750,664,996.0937500000,,, +41.5546875000,664,996.0937500000,,, +41.5566406250,664,996.0937500000,,, +41.5585937500,664,996.0937500000,,, +41.5605468750,664,996.0937500000,,, +41.5625000000,665,996.0937500000,,, +41.5644531250,665,996.0937500000,,, +41.5664062500,665,996.0937500000,,, +41.5683593750,665,996.0937500000,,, +41.5703125000,665,996.0937500000,,, +41.5722656250,665,996.0937500000,,, +41.5742187500,665,996.0937500000,,, +41.5761718750,665,996.0937500000,,, +41.5781250000,665,996.0937500000,,, +41.5800781250,665,996.0937500000,,, +41.5820312500,665,996.0937500000,,, +41.5839843750,665,996.0937500000,,, +41.5859375000,665,996.0937500000,,, +41.5878906250,665,996.0937500000,,, +41.5898437500,665,996.0937500000,,, +41.5917968750,665,996.0937500000,,, +41.5937500000,665,996.0937500000,,, +41.5957031250,665,996.0937500000,,, +41.5976562500,665,996.0937500000,,, +41.5996093750,665,996.0937500000,,, +41.6015625000,665,996.0937500000,,, +41.6035156250,665,996.0937500000,,, +41.6054687500,665,996.0937500000,,, +41.6074218750,665,996.0937500000,,, +41.6093750000,665,996.0937500000,,, +41.6113281250,665,996.0937500000,,, +41.6132812500,665,996.0937500000,,, +41.6152343750,665,996.0937500000,,, +41.6171875000,665,996.0937500000,,, +41.6191406250,665,996.0937500000,,, +41.6210937500,665,996.0937500000,,, +41.6230468750,665,996.0937500000,,, +41.6250000000,666,996.0937500000,,, +41.6269531250,666,996.0937500000,,, +41.6289062500,666,996.0937500000,,, +41.6308593750,666,996.0937500000,,, +41.6328125000,666,996.0937500000,,, +41.6347656250,666,996.0937500000,,, +41.6367187500,666,996.0937500000,,, +41.6386718750,666,996.0937500000,,, +41.6406250000,666,996.0937500000,,, +41.6425781250,666,996.0937500000,,, +41.6445312500,666,996.0937500000,,, +41.6464843750,666,996.0937500000,,, +41.6484375000,666,996.0937500000,,, +41.6503906250,666,996.0937500000,,, +41.6523437500,666,996.0937500000,,, +41.6542968750,666,996.0937500000,,, +41.6562500000,666,996.0937500000,,, +41.6582031250,666,996.0937500000,,, +41.6601562500,666,996.0937500000,,, +41.6621093750,666,996.0937500000,,, +41.6640625000,666,996.0937500000,,, +41.6660156250,666,996.0937500000,,, +41.6679687500,666,996.0937500000,,, +41.6699218750,666,996.0937500000,,, +41.6718750000,666,996.0937500000,,, +41.6738281250,666,996.0937500000,,, +41.6757812500,666,996.0937500000,,, +41.6777343750,666,996.0937500000,,, +41.6796875000,666,996.0937500000,,, +41.6816406250,666,996.0937500000,,, +41.6835937500,666,996.0937500000,,, +41.6855468750,666,996.0937500000,,, +41.6875000000,667,996.0937500000,,, +41.6894531250,667,996.0937500000,,, +41.6914062500,667,996.0937500000,,, +41.6933593750,667,996.0937500000,,, +41.6953125000,667,996.0937500000,,, +41.6972656250,667,996.0937500000,,, +41.6992187500,667,996.0937500000,,, +41.7011718750,667,996.0937500000,,, +41.7031250000,667,996.0937500000,,, +41.7050781250,667,996.0937500000,,, +41.7070312500,667,996.0937500000,,, +41.7089843750,667,996.0937500000,,, +41.7109375000,667,996.0937500000,,, +41.7128906250,667,996.0937500000,,, +41.7148437500,667,996.0937500000,,, +41.7167968750,667,996.0937500000,,, +41.7187500000,667,996.0937500000,,, +41.7207031250,667,996.0937500000,,, +41.7226562500,667,996.0937500000,,, +41.7246093750,667,996.0937500000,,, +41.7265625000,667,996.0937500000,,, +41.7285156250,667,996.0937500000,,, +41.7304687500,667,996.0937500000,,, +41.7324218750,667,996.0937500000,,, +41.7343750000,667,996.0937500000,,, +41.7363281250,667,996.0937500000,,, +41.7382812500,667,996.0937500000,,, +41.7402343750,667,996.0937500000,,, +41.7421875000,667,996.0937500000,,, +41.7441406250,667,996.0937500000,,, +41.7460937500,667,996.0937500000,,, +41.7480468750,667,996.0937500000,,, +41.7500000000,668,925.7812500000,,, +41.7519531250,668,925.7812500000,,, +41.7539062500,668,925.7812500000,,, +41.7558593750,668,925.7812500000,,, +41.7578125000,668,925.7812500000,,, +41.7597656250,668,925.7812500000,,, +41.7617187500,668,925.7812500000,,, +41.7636718750,668,925.7812500000,,, +41.7656250000,668,925.7812500000,,, +41.7675781250,668,925.7812500000,,, +41.7695312500,668,925.7812500000,,, +41.7714843750,668,925.7812500000,,, +41.7734375000,668,925.7812500000,,, +41.7753906250,668,925.7812500000,,, +41.7773437500,668,925.7812500000,,, +41.7792968750,668,925.7812500000,,, +41.7812500000,668,925.7812500000,,, +41.7832031250,668,925.7812500000,,, +41.7851562500,668,925.7812500000,,, +41.7871093750,668,925.7812500000,,, +41.7890625000,668,925.7812500000,,, +41.7910156250,668,925.7812500000,,, +41.7929687500,668,925.7812500000,,, +41.7949218750,668,925.7812500000,,, +41.7968750000,668,925.7812500000,,, +41.7988281250,668,925.7812500000,,, +41.8007812500,668,925.7812500000,,, +41.8027343750,668,925.7812500000,,, +41.8046875000,668,925.7812500000,,, +41.8066406250,668,925.7812500000,,, +41.8085937500,668,925.7812500000,,, +41.8105468750,668,925.7812500000,,, +41.8125000000,669,925.7812500000,,, +41.8144531250,669,925.7812500000,,, +41.8164062500,669,925.7812500000,,, +41.8183593750,669,925.7812500000,,, +41.8203125000,669,925.7812500000,,, +41.8222656250,669,925.7812500000,,, +41.8242187500,669,925.7812500000,,, +41.8261718750,669,925.7812500000,,, +41.8281250000,669,925.7812500000,,, +41.8300781250,669,925.7812500000,,, +41.8320312500,669,925.7812500000,,, +41.8339843750,669,925.7812500000,,, +41.8359375000,669,925.7812500000,,, +41.8378906250,669,925.7812500000,,, +41.8398437500,669,925.7812500000,,, +41.8417968750,669,925.7812500000,,, +41.8437500000,669,925.7812500000,,, +41.8457031250,669,925.7812500000,,, +41.8476562500,669,925.7812500000,,, +41.8496093750,669,925.7812500000,,, +41.8515625000,669,925.7812500000,,, +41.8535156250,669,925.7812500000,,, +41.8554687500,669,925.7812500000,,, +41.8574218750,669,925.7812500000,,, +41.8593750000,669,925.7812500000,,, +41.8613281250,669,925.7812500000,,, +41.8632812500,669,925.7812500000,,, +41.8652343750,669,925.7812500000,,, +41.8671875000,669,925.7812500000,,, +41.8691406250,669,925.7812500000,,, +41.8710937500,669,925.7812500000,,, +41.8730468750,669,925.7812500000,,, +41.8750000000,670,925.7812500000,,, +41.8769531250,670,925.7812500000,,, +41.8789062500,670,925.7812500000,,, +41.8808593750,670,925.7812500000,,, +41.8828125000,670,925.7812500000,,, +41.8847656250,670,925.7812500000,,, +41.8867187500,670,925.7812500000,,, +41.8886718750,670,925.7812500000,,, +41.8906250000,670,925.7812500000,,, +41.8925781250,670,925.7812500000,,, +41.8945312500,670,925.7812500000,,, +41.8964843750,670,925.7812500000,,, +41.8984375000,670,925.7812500000,,, +41.9003906250,670,925.7812500000,,, +41.9023437500,670,925.7812500000,,, +41.9042968750,670,925.7812500000,,, +41.9062500000,670,925.7812500000,,, +41.9082031250,670,925.7812500000,,, +41.9101562500,670,925.7812500000,,, +41.9121093750,670,925.7812500000,,, +41.9140625000,670,925.7812500000,,, +41.9160156250,670,925.7812500000,,, +41.9179687500,670,925.7812500000,,, +41.9199218750,670,925.7812500000,,, +41.9218750000,670,925.7812500000,,, +41.9238281250,670,925.7812500000,,, +41.9257812500,670,925.7812500000,,, +41.9277343750,670,925.7812500000,,, +41.9296875000,670,925.7812500000,,, +41.9316406250,670,925.7812500000,,, +41.9335937500,670,925.7812500000,,, +41.9355468750,670,925.7812500000,,, +41.9375000000,671,925.7812500000,,, +41.9394531250,671,925.7812500000,,, +41.9414062500,671,925.7812500000,,, +41.9433593750,671,925.7812500000,,, +41.9453125000,671,925.7812500000,,, +41.9472656250,671,925.7812500000,,, +41.9492187500,671,925.7812500000,,, +41.9511718750,671,925.7812500000,,, +41.9531250000,671,925.7812500000,,, +41.9550781250,671,925.7812500000,,, +41.9570312500,671,925.7812500000,,, +41.9589843750,671,925.7812500000,,, +41.9609375000,671,925.7812500000,,, +41.9628906250,671,925.7812500000,,, +41.9648437500,671,925.7812500000,,, +41.9667968750,671,925.7812500000,,, +41.9687500000,671,925.7812500000,,, +41.9707031250,671,925.7812500000,,, +41.9726562500,671,925.7812500000,,, +41.9746093750,671,925.7812500000,,, +41.9765625000,671,925.7812500000,,, +41.9785156250,671,925.7812500000,,, +41.9804687500,671,925.7812500000,,, +41.9824218750,671,925.7812500000,,, +41.9843750000,671,925.7812500000,,, +41.9863281250,671,925.7812500000,,, +41.9882812500,671,925.7812500000,,, +41.9902343750,671,925.7812500000,,, +41.9921875000,671,925.7812500000,,, +41.9941406250,671,925.7812500000,,, +41.9960937500,671,925.7812500000,,, +41.9980468750,671,925.7812500000,,, +42.0000000000,672,925.7812500000,,, +42.0019531250,672,925.7812500000,,, +42.0039062500,672,925.7812500000,,, +42.0058593750,672,925.7812500000,,, +42.0078125000,672,925.7812500000,,, +42.0097656250,672,925.7812500000,,, +42.0117187500,672,925.7812500000,,, +42.0136718750,672,925.7812500000,,, +42.0156250000,672,925.7812500000,,, +42.0175781250,672,925.7812500000,,, +42.0195312500,672,925.7812500000,,, +42.0214843750,672,925.7812500000,,, +42.0234375000,672,925.7812500000,,, +42.0253906250,672,925.7812500000,,, +42.0273437500,672,925.7812500000,,, +42.0292968750,672,925.7812500000,,, +42.0312500000,672,925.7812500000,,, +42.0332031250,672,925.7812500000,,, +42.0351562500,672,925.7812500000,,, +42.0371093750,672,925.7812500000,,, +42.0390625000,672,925.7812500000,,, +42.0410156250,672,925.7812500000,,, +42.0429687500,672,925.7812500000,,, +42.0449218750,672,925.7812500000,,, +42.0468750000,672,925.7812500000,,, +42.0488281250,672,925.7812500000,,, +42.0507812500,672,925.7812500000,,, +42.0527343750,672,925.7812500000,,, +42.0546875000,672,925.7812500000,,, +42.0566406250,672,925.7812500000,,, +42.0585937500,672,925.7812500000,,, +42.0605468750,672,925.7812500000,,, +42.0625000000,673,925.7812500000,,, +42.0644531250,673,925.7812500000,,, +42.0664062500,673,925.7812500000,,, +42.0683593750,673,925.7812500000,,, +42.0703125000,673,925.7812500000,,, +42.0722656250,673,925.7812500000,,, +42.0742187500,673,925.7812500000,,, +42.0761718750,673,925.7812500000,,, +42.0781250000,673,925.7812500000,,, +42.0800781250,673,925.7812500000,,, +42.0820312500,673,925.7812500000,,, +42.0839843750,673,925.7812500000,,, +42.0859375000,673,925.7812500000,,, +42.0878906250,673,925.7812500000,,, +42.0898437500,673,925.7812500000,,, +42.0917968750,673,925.7812500000,,, +42.0937500000,673,925.7812500000,,, +42.0957031250,673,925.7812500000,,, +42.0976562500,673,925.7812500000,,, +42.0996093750,673,925.7812500000,,, +42.1015625000,673,925.7812500000,,, +42.1035156250,673,925.7812500000,,, +42.1054687500,673,925.7812500000,,, +42.1074218750,673,925.7812500000,,, +42.1093750000,673,925.7812500000,,, +42.1113281250,673,925.7812500000,,, +42.1132812500,673,925.7812500000,,, +42.1152343750,673,925.7812500000,,, +42.1171875000,673,925.7812500000,,, +42.1191406250,673,925.7812500000,,, +42.1210937500,673,925.7812500000,,, +42.1230468750,673,925.7812500000,,, +42.1250000000,674,925.7812500000,,, +42.1269531250,674,925.7812500000,,, +42.1289062500,674,925.7812500000,,, +42.1308593750,674,925.7812500000,,, +42.1328125000,674,925.7812500000,,, +42.1347656250,674,925.7812500000,,, +42.1367187500,674,925.7812500000,,, +42.1386718750,674,925.7812500000,,, +42.1406250000,674,925.7812500000,,, +42.1425781250,674,925.7812500000,,, +42.1445312500,674,925.7812500000,,, +42.1464843750,674,925.7812500000,,, +42.1484375000,674,925.7812500000,,, +42.1503906250,674,925.7812500000,,, +42.1523437500,674,925.7812500000,,, +42.1542968750,674,925.7812500000,,, +42.1562500000,674,925.7812500000,,, +42.1582031250,674,925.7812500000,,, +42.1601562500,674,925.7812500000,,, +42.1621093750,674,925.7812500000,,, +42.1640625000,674,925.7812500000,,, +42.1660156250,674,925.7812500000,,, +42.1679687500,674,925.7812500000,,, +42.1699218750,674,925.7812500000,,, +42.1718750000,674,925.7812500000,,, +42.1738281250,674,925.7812500000,,, +42.1757812500,674,925.7812500000,,, +42.1777343750,674,925.7812500000,,, +42.1796875000,674,925.7812500000,,, +42.1816406250,674,925.7812500000,,, +42.1835937500,674,925.7812500000,,, +42.1855468750,674,925.7812500000,,, +42.1875000000,675,925.7812500000,,, +42.1894531250,675,925.7812500000,,, +42.1914062500,675,925.7812500000,,, +42.1933593750,675,925.7812500000,,, +42.1953125000,675,925.7812500000,,, +42.1972656250,675,925.7812500000,,, +42.1992187500,675,925.7812500000,,, +42.2011718750,675,925.7812500000,,, +42.2031250000,675,925.7812500000,,, +42.2050781250,675,925.7812500000,,, +42.2070312500,675,925.7812500000,,, +42.2089843750,675,925.7812500000,,, +42.2109375000,675,925.7812500000,,, +42.2128906250,675,925.7812500000,,, +42.2148437500,675,925.7812500000,,, +42.2167968750,675,925.7812500000,,, +42.2187500000,675,925.7812500000,,, +42.2207031250,675,925.7812500000,,, +42.2226562500,675,925.7812500000,,, +42.2246093750,675,925.7812500000,,, +42.2265625000,675,925.7812500000,,, +42.2285156250,675,925.7812500000,,, +42.2304687500,675,925.7812500000,,, +42.2324218750,675,925.7812500000,,, +42.2343750000,675,925.7812500000,,, +42.2363281250,675,925.7812500000,,, +42.2382812500,675,925.7812500000,,, +42.2402343750,675,925.7812500000,,, +42.2421875000,675,925.7812500000,,, +42.2441406250,675,925.7812500000,,, +42.2460937500,675,925.7812500000,,, +42.2480468750,675,925.7812500000,,, +42.2500000000,676,925.7812500000,,, +42.2519531250,676,925.7812500000,,, +42.2539062500,676,925.7812500000,,, +42.2558593750,676,925.7812500000,,, +42.2578125000,676,925.7812500000,,, +42.2597656250,676,925.7812500000,,, +42.2617187500,676,925.7812500000,,, +42.2636718750,676,925.7812500000,,, +42.2656250000,676,925.7812500000,,, +42.2675781250,676,925.7812500000,,, +42.2695312500,676,925.7812500000,,, +42.2714843750,676,925.7812500000,,, +42.2734375000,676,925.7812500000,,, +42.2753906250,676,925.7812500000,,, +42.2773437500,676,925.7812500000,,, +42.2792968750,676,925.7812500000,,, +42.2812500000,676,925.7812500000,,, +42.2832031250,676,925.7812500000,,, +42.2851562500,676,925.7812500000,,, +42.2871093750,676,925.7812500000,,, +42.2890625000,676,925.7812500000,,, +42.2910156250,676,925.7812500000,,, +42.2929687500,676,925.7812500000,,, +42.2949218750,676,925.7812500000,,, +42.2968750000,676,925.7812500000,,, +42.2988281250,676,925.7812500000,,, +42.3007812500,676,925.7812500000,,, +42.3027343750,676,925.7812500000,,, +42.3046875000,676,925.7812500000,,, +42.3066406250,676,925.7812500000,,, +42.3085937500,676,925.7812500000,,, +42.3105468750,676,925.7812500000,,, +42.3125000000,677,925.7812500000,,, +42.3144531250,677,925.7812500000,,, +42.3164062500,677,925.7812500000,,, +42.3183593750,677,925.7812500000,,, +42.3203125000,677,925.7812500000,,, +42.3222656250,677,925.7812500000,,, +42.3242187500,677,925.7812500000,,, +42.3261718750,677,925.7812500000,,, +42.3281250000,677,925.7812500000,,, +42.3300781250,677,925.7812500000,,, +42.3320312500,677,925.7812500000,,, +42.3339843750,677,925.7812500000,,, +42.3359375000,677,925.7812500000,,, +42.3378906250,677,925.7812500000,,, +42.3398437500,677,925.7812500000,,, +42.3417968750,677,925.7812500000,,, +42.3437500000,677,925.7812500000,,, +42.3457031250,677,925.7812500000,,, +42.3476562500,677,925.7812500000,,, +42.3496093750,677,925.7812500000,,, +42.3515625000,677,925.7812500000,,, +42.3535156250,677,925.7812500000,,, +42.3554687500,677,925.7812500000,,, +42.3574218750,677,925.7812500000,,, +42.3593750000,677,925.7812500000,,, +42.3613281250,677,925.7812500000,,, +42.3632812500,677,925.7812500000,,, +42.3652343750,677,925.7812500000,,, +42.3671875000,677,925.7812500000,,, +42.3691406250,677,925.7812500000,,, +42.3710937500,677,925.7812500000,,, +42.3730468750,677,925.7812500000,,, +42.3750000000,678,925.7812500000,,, +42.3769531250,678,925.7812500000,,, +42.3789062500,678,925.7812500000,,, +42.3808593750,678,925.7812500000,,, +42.3828125000,678,925.7812500000,,, +42.3847656250,678,925.7812500000,,, +42.3867187500,678,925.7812500000,,, +42.3886718750,678,925.7812500000,,, +42.3906250000,678,925.7812500000,,, +42.3925781250,678,925.7812500000,,, +42.3945312500,678,925.7812500000,,, +42.3964843750,678,925.7812500000,,, +42.3984375000,678,925.7812500000,,, +42.4003906250,678,925.7812500000,,, +42.4023437500,678,925.7812500000,,, +42.4042968750,678,925.7812500000,,, +42.4062500000,678,925.7812500000,,, +42.4082031250,678,925.7812500000,,, +42.4101562500,678,925.7812500000,,, +42.4121093750,678,925.7812500000,,, +42.4140625000,678,925.7812500000,,, +42.4160156250,678,925.7812500000,,, +42.4179687500,678,925.7812500000,,, +42.4199218750,678,925.7812500000,,, +42.4218750000,678,925.7812500000,,, +42.4238281250,678,925.7812500000,,, +42.4257812500,678,925.7812500000,,, +42.4277343750,678,925.7812500000,,, +42.4296875000,678,925.7812500000,,, +42.4316406250,678,925.7812500000,,, +42.4335937500,678,925.7812500000,,, +42.4355468750,678,925.7812500000,,, +42.4375000000,679,925.7812500000,,, +42.4394531250,679,925.7812500000,,, +42.4414062500,679,925.7812500000,,, +42.4433593750,679,925.7812500000,,, +42.4453125000,679,925.7812500000,,, +42.4472656250,679,925.7812500000,,, +42.4492187500,679,925.7812500000,,, +42.4511718750,679,925.7812500000,,, +42.4531250000,679,925.7812500000,,, +42.4550781250,679,925.7812500000,,, +42.4570312500,679,925.7812500000,,, +42.4589843750,679,925.7812500000,,, +42.4609375000,679,925.7812500000,,, +42.4628906250,679,925.7812500000,,, +42.4648437500,679,925.7812500000,,, +42.4667968750,679,925.7812500000,,, +42.4687500000,679,925.7812500000,,, +42.4707031250,679,925.7812500000,,, +42.4726562500,679,925.7812500000,,, +42.4746093750,679,925.7812500000,,, +42.4765625000,679,925.7812500000,,, +42.4785156250,679,925.7812500000,,, +42.4804687500,679,925.7812500000,,, +42.4824218750,679,925.7812500000,,, +42.4843750000,679,925.7812500000,,, +42.4863281250,679,925.7812500000,,, +42.4882812500,679,925.7812500000,,, +42.4902343750,679,925.7812500000,,, +42.4921875000,679,925.7812500000,,, +42.4941406250,679,925.7812500000,,, +42.4960937500,679,925.7812500000,,, +42.4980468750,679,925.7812500000,,, +42.5000000000,680,925.7812500000,,, +42.5019531250,680,925.7812500000,,, +42.5039062500,680,925.7812500000,,, +42.5058593750,680,925.7812500000,,, +42.5078125000,680,925.7812500000,,, +42.5097656250,680,925.7812500000,,, +42.5117187500,680,925.7812500000,,, +42.5136718750,680,925.7812500000,,, +42.5156250000,680,925.7812500000,,, +42.5175781250,680,925.7812500000,,, +42.5195312500,680,925.7812500000,,, +42.5214843750,680,925.7812500000,,, +42.5234375000,680,925.7812500000,,, +42.5253906250,680,925.7812500000,,, +42.5273437500,680,925.7812500000,,, +42.5292968750,680,925.7812500000,,, +42.5312500000,680,925.7812500000,,, +42.5332031250,680,925.7812500000,,, +42.5351562500,680,925.7812500000,,, +42.5371093750,680,925.7812500000,,, +42.5390625000,680,925.7812500000,,, +42.5410156250,680,925.7812500000,,, +42.5429687500,680,925.7812500000,,, +42.5449218750,680,925.7812500000,,, +42.5468750000,680,925.7812500000,,, +42.5488281250,680,925.7812500000,,, +42.5507812500,680,925.7812500000,,, +42.5527343750,680,925.7812500000,,, +42.5546875000,680,925.7812500000,,, +42.5566406250,680,925.7812500000,,, +42.5585937500,680,925.7812500000,,, +42.5605468750,680,925.7812500000,,, +42.5625000000,681,925.7812500000,,, +42.5644531250,681,925.7812500000,,, +42.5664062500,681,925.7812500000,,, +42.5683593750,681,925.7812500000,,, +42.5703125000,681,925.7812500000,,, +42.5722656250,681,925.7812500000,,, +42.5742187500,681,925.7812500000,,, +42.5761718750,681,925.7812500000,,, +42.5781250000,681,925.7812500000,,, +42.5800781250,681,925.7812500000,,, +42.5820312500,681,925.7812500000,,, +42.5839843750,681,925.7812500000,,, +42.5859375000,681,925.7812500000,,, +42.5878906250,681,925.7812500000,,, +42.5898437500,681,925.7812500000,,, +42.5917968750,681,925.7812500000,,, +42.5937500000,681,925.7812500000,,, +42.5957031250,681,925.7812500000,,, +42.5976562500,681,925.7812500000,,, +42.5996093750,681,925.7812500000,,, +42.6015625000,681,925.7812500000,,, +42.6035156250,681,925.7812500000,,, +42.6054687500,681,925.7812500000,,, +42.6074218750,681,925.7812500000,,, +42.6093750000,681,925.7812500000,,, +42.6113281250,681,925.7812500000,,, +42.6132812500,681,925.7812500000,,, +42.6152343750,681,925.7812500000,,, +42.6171875000,681,925.7812500000,,, +42.6191406250,681,925.7812500000,,, +42.6210937500,681,925.7812500000,,, +42.6230468750,681,925.7812500000,,, +42.6250000000,682,925.7812500000,,, +42.6269531250,682,925.7812500000,,, +42.6289062500,682,925.7812500000,,, +42.6308593750,682,925.7812500000,,, +42.6328125000,682,925.7812500000,,, +42.6347656250,682,925.7812500000,,, +42.6367187500,682,925.7812500000,,, +42.6386718750,682,925.7812500000,,, +42.6406250000,682,925.7812500000,,, +42.6425781250,682,925.7812500000,,, +42.6445312500,682,925.7812500000,,, +42.6464843750,682,925.7812500000,,, +42.6484375000,682,925.7812500000,,, +42.6503906250,682,925.7812500000,,, +42.6523437500,682,925.7812500000,,, +42.6542968750,682,925.7812500000,,, +42.6562500000,682,925.7812500000,,, +42.6582031250,682,925.7812500000,,, +42.6601562500,682,925.7812500000,,, +42.6621093750,682,925.7812500000,,, +42.6640625000,682,925.7812500000,,, +42.6660156250,682,925.7812500000,,, +42.6679687500,682,925.7812500000,,, +42.6699218750,682,925.7812500000,,, +42.6718750000,682,925.7812500000,,, +42.6738281250,682,925.7812500000,,, +42.6757812500,682,925.7812500000,,, +42.6777343750,682,925.7812500000,,, +42.6796875000,682,925.7812500000,,, +42.6816406250,682,925.7812500000,,, +42.6835937500,682,925.7812500000,,, +42.6855468750,682,925.7812500000,,, +42.6875000000,683,941.4062500000,,, +42.6894531250,683,941.4062500000,,, +42.6914062500,683,941.4062500000,,, +42.6933593750,683,941.4062500000,,, +42.6953125000,683,941.4062500000,,, +42.6972656250,683,941.4062500000,,, +42.6992187500,683,941.4062500000,,, +42.7011718750,683,941.4062500000,,, +42.7031250000,683,941.4062500000,,, +42.7050781250,683,941.4062500000,,, +42.7070312500,683,941.4062500000,,, +42.7089843750,683,941.4062500000,,, +42.7109375000,683,941.4062500000,,, +42.7128906250,683,941.4062500000,,, +42.7148437500,683,941.4062500000,,, +42.7167968750,683,941.4062500000,,, +42.7187500000,683,941.4062500000,,, +42.7207031250,683,941.4062500000,,, +42.7226562500,683,941.4062500000,,, +42.7246093750,683,941.4062500000,,, +42.7265625000,683,941.4062500000,,, +42.7285156250,683,941.4062500000,,, +42.7304687500,683,941.4062500000,,, +42.7324218750,683,941.4062500000,,, +42.7343750000,683,941.4062500000,,, +42.7363281250,683,941.4062500000,,, +42.7382812500,683,941.4062500000,,, +42.7402343750,683,941.4062500000,,, +42.7421875000,683,941.4062500000,,, +42.7441406250,683,941.4062500000,,, +42.7460937500,683,941.4062500000,,, +42.7480468750,683,941.4062500000,,, +42.7500000000,684,941.4062500000,,, +42.7519531250,684,941.4062500000,,, +42.7539062500,684,941.4062500000,,, +42.7558593750,684,941.4062500000,,, +42.7578125000,684,941.4062500000,,, +42.7597656250,684,941.4062500000,,, +42.7617187500,684,941.4062500000,,, +42.7636718750,684,941.4062500000,,, +42.7656250000,684,941.4062500000,,, +42.7675781250,684,941.4062500000,,, +42.7695312500,684,941.4062500000,,, +42.7714843750,684,941.4062500000,,, +42.7734375000,684,941.4062500000,,, +42.7753906250,684,941.4062500000,,, +42.7773437500,684,941.4062500000,,, +42.7792968750,684,941.4062500000,,, +42.7812500000,684,941.4062500000,,, +42.7832031250,684,941.4062500000,,, +42.7851562500,684,941.4062500000,,, +42.7871093750,684,941.4062500000,,, +42.7890625000,684,941.4062500000,,, +42.7910156250,684,941.4062500000,,, +42.7929687500,684,941.4062500000,,, +42.7949218750,684,941.4062500000,,, +42.7968750000,684,941.4062500000,,, +42.7988281250,684,941.4062500000,,, +42.8007812500,684,941.4062500000,,, +42.8027343750,684,941.4062500000,,, +42.8046875000,684,941.4062500000,,, +42.8066406250,684,941.4062500000,,, +42.8085937500,684,941.4062500000,,, +42.8105468750,684,941.4062500000,,, +42.8125000000,685,941.4062500000,,, +42.8144531250,685,941.4062500000,,, +42.8164062500,685,941.4062500000,,, +42.8183593750,685,941.4062500000,,, +42.8203125000,685,941.4062500000,,, +42.8222656250,685,941.4062500000,,, +42.8242187500,685,941.4062500000,,, +42.8261718750,685,941.4062500000,,, +42.8281250000,685,941.4062500000,,, +42.8300781250,685,941.4062500000,,, +42.8320312500,685,941.4062500000,,, +42.8339843750,685,941.4062500000,,, +42.8359375000,685,941.4062500000,,, +42.8378906250,685,941.4062500000,,, +42.8398437500,685,941.4062500000,,, +42.8417968750,685,941.4062500000,,, +42.8437500000,685,941.4062500000,,, +42.8457031250,685,941.4062500000,,, +42.8476562500,685,941.4062500000,,, +42.8496093750,685,941.4062500000,,, +42.8515625000,685,941.4062500000,,, +42.8535156250,685,941.4062500000,,, +42.8554687500,685,941.4062500000,,, +42.8574218750,685,941.4062500000,,, +42.8593750000,685,941.4062500000,,, +42.8613281250,685,941.4062500000,,, +42.8632812500,685,941.4062500000,,, +42.8652343750,685,941.4062500000,,, +42.8671875000,685,941.4062500000,,, +42.8691406250,685,941.4062500000,,, +42.8710937500,685,941.4062500000,,, +42.8730468750,685,941.4062500000,,, +42.8750000000,686,941.4062500000,,, +42.8769531250,686,941.4062500000,,, +42.8789062500,686,941.4062500000,,, +42.8808593750,686,941.4062500000,,, +42.8828125000,686,941.4062500000,,, +42.8847656250,686,941.4062500000,,, +42.8867187500,686,941.4062500000,,, +42.8886718750,686,941.4062500000,,, +42.8906250000,686,941.4062500000,,, +42.8925781250,686,941.4062500000,,, +42.8945312500,686,941.4062500000,,, +42.8964843750,686,941.4062500000,,, +42.8984375000,686,941.4062500000,,, +42.9003906250,686,941.4062500000,,, +42.9023437500,686,941.4062500000,,, +42.9042968750,686,941.4062500000,,, +42.9062500000,686,941.4062500000,,, +42.9082031250,686,941.4062500000,,, +42.9101562500,686,941.4062500000,,, +42.9121093750,686,941.4062500000,,, +42.9140625000,686,941.4062500000,,, +42.9160156250,686,941.4062500000,,, +42.9179687500,686,941.4062500000,,, +42.9199218750,686,941.4062500000,,, +42.9218750000,686,941.4062500000,,, +42.9238281250,686,941.4062500000,,, +42.9257812500,686,941.4062500000,,, +42.9277343750,686,941.4062500000,,, +42.9296875000,686,941.4062500000,,, +42.9316406250,686,941.4062500000,,, +42.9335937500,686,941.4062500000,,, +42.9355468750,686,941.4062500000,,, +42.9375000000,687,941.4062500000,,, +42.9394531250,687,941.4062500000,,, +42.9414062500,687,941.4062500000,,, +42.9433593750,687,941.4062500000,,, +42.9453125000,687,941.4062500000,,, +42.9472656250,687,941.4062500000,,, +42.9492187500,687,941.4062500000,,, +42.9511718750,687,941.4062500000,,, +42.9531250000,687,941.4062500000,,, +42.9550781250,687,941.4062500000,,, +42.9570312500,687,941.4062500000,,, +42.9589843750,687,941.4062500000,,, +42.9609375000,687,941.4062500000,,, +42.9628906250,687,941.4062500000,,, +42.9648437500,687,941.4062500000,,, +42.9667968750,687,941.4062500000,,, +42.9687500000,687,941.4062500000,,, +42.9707031250,687,941.4062500000,,, +42.9726562500,687,941.4062500000,,, +42.9746093750,687,941.4062500000,,, +42.9765625000,687,941.4062500000,,, +42.9785156250,687,941.4062500000,,, +42.9804687500,687,941.4062500000,,, +42.9824218750,687,941.4062500000,,, +42.9843750000,687,941.4062500000,,, +42.9863281250,687,941.4062500000,,, +42.9882812500,687,941.4062500000,,, +42.9902343750,687,941.4062500000,,, +42.9921875000,687,941.4062500000,,, +42.9941406250,687,941.4062500000,,, +42.9960937500,687,941.4062500000,,, +42.9980468750,687,941.4062500000,,, +43.0000000000,688,941.4062500000,,, +43.0019531250,688,941.4062500000,,, +43.0039062500,688,941.4062500000,,, +43.0058593750,688,941.4062500000,,, +43.0078125000,688,941.4062500000,,, +43.0097656250,688,941.4062500000,,, +43.0117187500,688,941.4062500000,,, +43.0136718750,688,941.4062500000,,, +43.0156250000,688,941.4062500000,,, +43.0175781250,688,941.4062500000,,, +43.0195312500,688,941.4062500000,,, +43.0214843750,688,941.4062500000,,, +43.0234375000,688,941.4062500000,,, +43.0253906250,688,941.4062500000,,, +43.0273437500,688,941.4062500000,,, +43.0292968750,688,941.4062500000,,, +43.0312500000,688,941.4062500000,,, +43.0332031250,688,941.4062500000,,, +43.0351562500,688,941.4062500000,,, +43.0371093750,688,941.4062500000,,, +43.0390625000,688,941.4062500000,,, +43.0410156250,688,941.4062500000,,, +43.0429687500,688,941.4062500000,,, +43.0449218750,688,941.4062500000,,, +43.0468750000,688,941.4062500000,,, +43.0488281250,688,941.4062500000,,, +43.0507812500,688,941.4062500000,,, +43.0527343750,688,941.4062500000,,, +43.0546875000,688,941.4062500000,,, +43.0566406250,688,941.4062500000,,, +43.0585937500,688,941.4062500000,,, +43.0605468750,688,941.4062500000,,, +43.0625000000,689,941.4062500000,,, +43.0644531250,689,941.4062500000,,, +43.0664062500,689,941.4062500000,,, +43.0683593750,689,941.4062500000,,, +43.0703125000,689,941.4062500000,,, +43.0722656250,689,941.4062500000,,, +43.0742187500,689,941.4062500000,,, +43.0761718750,689,941.4062500000,,, +43.0781250000,689,941.4062500000,,, +43.0800781250,689,941.4062500000,,, +43.0820312500,689,941.4062500000,,, +43.0839843750,689,941.4062500000,,, +43.0859375000,689,941.4062500000,,, +43.0878906250,689,941.4062500000,,, +43.0898437500,689,941.4062500000,,, +43.0917968750,689,941.4062500000,,, +43.0937500000,689,941.4062500000,,, +43.0957031250,689,941.4062500000,,, +43.0976562500,689,941.4062500000,,, +43.0996093750,689,941.4062500000,,, +43.1015625000,689,941.4062500000,,, +43.1035156250,689,941.4062500000,,, +43.1054687500,689,941.4062500000,,, +43.1074218750,689,941.4062500000,,, +43.1093750000,689,941.4062500000,,, +43.1113281250,689,941.4062500000,,, +43.1132812500,689,941.4062500000,,, +43.1152343750,689,941.4062500000,,, +43.1171875000,689,941.4062500000,,, +43.1191406250,689,941.4062500000,,, +43.1210937500,689,941.4062500000,,, +43.1230468750,689,941.4062500000,,, +43.1250000000,690,941.4062500000,,, +43.1269531250,690,941.4062500000,,, +43.1289062500,690,941.4062500000,,, +43.1308593750,690,941.4062500000,,, +43.1328125000,690,941.4062500000,,, +43.1347656250,690,941.4062500000,,, +43.1367187500,690,941.4062500000,,, +43.1386718750,690,941.4062500000,,, +43.1406250000,690,941.4062500000,,, +43.1425781250,690,941.4062500000,,, +43.1445312500,690,941.4062500000,,, +43.1464843750,690,941.4062500000,,, +43.1484375000,690,941.4062500000,,, +43.1503906250,690,941.4062500000,,, +43.1523437500,690,941.4062500000,,, +43.1542968750,690,941.4062500000,,, +43.1562500000,690,941.4062500000,,, +43.1582031250,690,941.4062500000,,, +43.1601562500,690,941.4062500000,,, +43.1621093750,690,941.4062500000,,, +43.1640625000,690,941.4062500000,,, +43.1660156250,690,941.4062500000,,, +43.1679687500,690,941.4062500000,,, +43.1699218750,690,941.4062500000,,, +43.1718750000,690,941.4062500000,,, +43.1738281250,690,941.4062500000,,, +43.1757812500,690,941.4062500000,,, +43.1777343750,690,941.4062500000,,, +43.1796875000,690,941.4062500000,,, +43.1816406250,690,941.4062500000,,, +43.1835937500,690,941.4062500000,,, +43.1855468750,690,941.4062500000,,, +43.1875000000,691,941.4062500000,,, +43.1894531250,691,941.4062500000,,, +43.1914062500,691,941.4062500000,,, +43.1933593750,691,941.4062500000,,, +43.1953125000,691,941.4062500000,,, +43.1972656250,691,941.4062500000,,, +43.1992187500,691,941.4062500000,,, +43.2011718750,691,941.4062500000,,, +43.2031250000,691,941.4062500000,,, +43.2050781250,691,941.4062500000,,, +43.2070312500,691,941.4062500000,,, +43.2089843750,691,941.4062500000,,, +43.2109375000,691,941.4062500000,,, +43.2128906250,691,941.4062500000,,, +43.2148437500,691,941.4062500000,,, +43.2167968750,691,941.4062500000,,, +43.2187500000,691,941.4062500000,,, +43.2207031250,691,941.4062500000,,, +43.2226562500,691,941.4062500000,,, +43.2246093750,691,941.4062500000,,, +43.2265625000,691,941.4062500000,,, +43.2285156250,691,941.4062500000,,, +43.2304687500,691,941.4062500000,,, +43.2324218750,691,941.4062500000,,, +43.2343750000,691,941.4062500000,,, +43.2363281250,691,941.4062500000,,, +43.2382812500,691,941.4062500000,,, +43.2402343750,691,941.4062500000,,, +43.2421875000,691,941.4062500000,,, +43.2441406250,691,941.4062500000,,, +43.2460937500,691,941.4062500000,,, +43.2480468750,691,941.4062500000,,, +43.2500000000,692,941.4062500000,,, +43.2519531250,692,941.4062500000,,, +43.2539062500,692,941.4062500000,,, +43.2558593750,692,941.4062500000,,, +43.2578125000,692,941.4062500000,,, +43.2597656250,692,941.4062500000,,, +43.2617187500,692,941.4062500000,,, +43.2636718750,692,941.4062500000,,, +43.2656250000,692,941.4062500000,,, +43.2675781250,692,941.4062500000,,, +43.2695312500,692,941.4062500000,,, +43.2714843750,692,941.4062500000,,, +43.2734375000,692,941.4062500000,,, +43.2753906250,692,941.4062500000,,, +43.2773437500,692,941.4062500000,,, +43.2792968750,692,941.4062500000,,, +43.2812500000,692,941.4062500000,,, +43.2832031250,692,941.4062500000,,, +43.2851562500,692,941.4062500000,,, +43.2871093750,692,941.4062500000,,, +43.2890625000,692,941.4062500000,,, +43.2910156250,692,941.4062500000,,, +43.2929687500,692,941.4062500000,,, +43.2949218750,692,941.4062500000,,, +43.2968750000,692,941.4062500000,,, +43.2988281250,692,941.4062500000,,, +43.3007812500,692,941.4062500000,,, +43.3027343750,692,941.4062500000,,, +43.3046875000,692,941.4062500000,,, +43.3066406250,692,941.4062500000,,, +43.3085937500,692,941.4062500000,,, +43.3105468750,692,941.4062500000,,, +43.3125000000,693,941.4062500000,,, +43.3144531250,693,941.4062500000,,, +43.3164062500,693,941.4062500000,,, +43.3183593750,693,941.4062500000,,, +43.3203125000,693,941.4062500000,,, +43.3222656250,693,941.4062500000,,, +43.3242187500,693,941.4062500000,,, +43.3261718750,693,941.4062500000,,, +43.3281250000,693,941.4062500000,,, +43.3300781250,693,941.4062500000,,, +43.3320312500,693,941.4062500000,,, +43.3339843750,693,941.4062500000,,, +43.3359375000,693,941.4062500000,,, +43.3378906250,693,941.4062500000,,, +43.3398437500,693,941.4062500000,,, +43.3417968750,693,941.4062500000,,, +43.3437500000,693,941.4062500000,,, +43.3457031250,693,941.4062500000,,, +43.3476562500,693,941.4062500000,,, +43.3496093750,693,941.4062500000,,, +43.3515625000,693,941.4062500000,,, +43.3535156250,693,941.4062500000,,, +43.3554687500,693,941.4062500000,,, +43.3574218750,693,941.4062500000,,, +43.3593750000,693,941.4062500000,,, +43.3613281250,693,941.4062500000,,, +43.3632812500,693,941.4062500000,,, +43.3652343750,693,941.4062500000,,, +43.3671875000,693,941.4062500000,,, +43.3691406250,693,941.4062500000,,, +43.3710937500,693,941.4062500000,,, +43.3730468750,693,941.4062500000,,, +43.3750000000,694,941.4062500000,,, +43.3769531250,694,941.4062500000,,, +43.3789062500,694,941.4062500000,,, +43.3808593750,694,941.4062500000,,, +43.3828125000,694,941.4062500000,,, +43.3847656250,694,941.4062500000,,, +43.3867187500,694,941.4062500000,,, +43.3886718750,694,941.4062500000,,, +43.3906250000,694,941.4062500000,,, +43.3925781250,694,941.4062500000,,, +43.3945312500,694,941.4062500000,,, +43.3964843750,694,941.4062500000,,, +43.3984375000,694,941.4062500000,,, +43.4003906250,694,941.4062500000,,, +43.4023437500,694,941.4062500000,,, +43.4042968750,694,941.4062500000,,, +43.4062500000,694,941.4062500000,,, +43.4082031250,694,941.4062500000,,, +43.4101562500,694,941.4062500000,,, +43.4121093750,694,941.4062500000,,, +43.4140625000,694,941.4062500000,,, +43.4160156250,694,941.4062500000,,, +43.4179687500,694,941.4062500000,,, +43.4199218750,694,941.4062500000,,, +43.4218750000,694,941.4062500000,,, +43.4238281250,694,941.4062500000,,, +43.4257812500,694,941.4062500000,,, +43.4277343750,694,941.4062500000,,, +43.4296875000,694,941.4062500000,,, +43.4316406250,694,941.4062500000,,, +43.4335937500,694,941.4062500000,,, +43.4355468750,694,941.4062500000,,, +43.4375000000,695,941.4062500000,,, +43.4394531250,695,941.4062500000,,, +43.4414062500,695,941.4062500000,,, +43.4433593750,695,941.4062500000,,, +43.4453125000,695,941.4062500000,,, +43.4472656250,695,941.4062500000,,, +43.4492187500,695,941.4062500000,,, +43.4511718750,695,941.4062500000,,, +43.4531250000,695,941.4062500000,,, +43.4550781250,695,941.4062500000,,, +43.4570312500,695,941.4062500000,,, +43.4589843750,695,941.4062500000,,, +43.4609375000,695,941.4062500000,,, +43.4628906250,695,941.4062500000,,, +43.4648437500,695,941.4062500000,,, +43.4667968750,695,941.4062500000,,, +43.4687500000,695,941.4062500000,,, +43.4707031250,695,941.4062500000,,, +43.4726562500,695,941.4062500000,,, +43.4746093750,695,941.4062500000,,, +43.4765625000,695,941.4062500000,,, +43.4785156250,695,941.4062500000,,, +43.4804687500,695,941.4062500000,,, +43.4824218750,695,941.4062500000,,, +43.4843750000,695,941.4062500000,,, +43.4863281250,695,941.4062500000,,, +43.4882812500,695,941.4062500000,,, +43.4902343750,695,941.4062500000,,, +43.4921875000,695,941.4062500000,,, +43.4941406250,695,941.4062500000,,, +43.4960937500,695,941.4062500000,,, +43.4980468750,695,941.4062500000,,, +43.5000000000,696,941.4062500000,,, +43.5019531250,696,941.4062500000,,, +43.5039062500,696,941.4062500000,,, +43.5058593750,696,941.4062500000,,, +43.5078125000,696,941.4062500000,,, +43.5097656250,696,941.4062500000,,, +43.5117187500,696,941.4062500000,,, +43.5136718750,696,941.4062500000,,, +43.5156250000,696,941.4062500000,,, +43.5175781250,696,941.4062500000,,, +43.5195312500,696,941.4062500000,,, +43.5214843750,696,941.4062500000,,, +43.5234375000,696,941.4062500000,,, +43.5253906250,696,941.4062500000,,, +43.5273437500,696,941.4062500000,,, +43.5292968750,696,941.4062500000,,, +43.5312500000,696,941.4062500000,,, +43.5332031250,696,941.4062500000,,, +43.5351562500,696,941.4062500000,,, +43.5371093750,696,941.4062500000,,, +43.5390625000,696,941.4062500000,,, +43.5410156250,696,941.4062500000,,, +43.5429687500,696,941.4062500000,,, +43.5449218750,696,941.4062500000,,, +43.5468750000,696,941.4062500000,,, +43.5488281250,696,941.4062500000,,, +43.5507812500,696,941.4062500000,,, +43.5527343750,696,941.4062500000,,, +43.5546875000,696,941.4062500000,,, +43.5566406250,696,941.4062500000,,, +43.5585937500,696,941.4062500000,,, +43.5605468750,696,941.4062500000,,, +43.5625000000,697,941.4062500000,,, +43.5644531250,697,941.4062500000,,, +43.5664062500,697,941.4062500000,,, +43.5683593750,697,941.4062500000,,, +43.5703125000,697,941.4062500000,,, +43.5722656250,697,941.4062500000,,, +43.5742187500,697,941.4062500000,,, +43.5761718750,697,941.4062500000,,, +43.5781250000,697,941.4062500000,,, +43.5800781250,697,941.4062500000,,, +43.5820312500,697,941.4062500000,,, +43.5839843750,697,941.4062500000,,, +43.5859375000,697,941.4062500000,,, +43.5878906250,697,941.4062500000,,, +43.5898437500,697,941.4062500000,,, +43.5917968750,697,941.4062500000,,, +43.5937500000,697,941.4062500000,,, +43.5957031250,697,941.4062500000,,, +43.5976562500,697,941.4062500000,,, +43.5996093750,697,941.4062500000,,, +43.6015625000,697,941.4062500000,,, +43.6035156250,697,941.4062500000,,, +43.6054687500,697,941.4062500000,,, +43.6074218750,697,941.4062500000,,, +43.6093750000,697,941.4062500000,,, +43.6113281250,697,941.4062500000,,, +43.6132812500,697,941.4062500000,,, +43.6152343750,697,941.4062500000,,, +43.6171875000,697,941.4062500000,,, +43.6191406250,697,941.4062500000,,, +43.6210937500,697,941.4062500000,,, +43.6230468750,697,941.4062500000,,, +43.6250000000,698,937.5000000000,,, +43.6269531250,698,937.5000000000,,, +43.6289062500,698,937.5000000000,,, +43.6308593750,698,937.5000000000,,, +43.6328125000,698,937.5000000000,,, +43.6347656250,698,937.5000000000,,, +43.6367187500,698,937.5000000000,,, +43.6386718750,698,937.5000000000,,, +43.6406250000,698,937.5000000000,,, +43.6425781250,698,937.5000000000,,, +43.6445312500,698,937.5000000000,,, +43.6464843750,698,937.5000000000,,, +43.6484375000,698,937.5000000000,,, +43.6503906250,698,937.5000000000,,, +43.6523437500,698,937.5000000000,,, +43.6542968750,698,937.5000000000,,, +43.6562500000,698,937.5000000000,,, +43.6582031250,698,937.5000000000,,, +43.6601562500,698,937.5000000000,,, +43.6621093750,698,937.5000000000,,, +43.6640625000,698,937.5000000000,,, +43.6660156250,698,937.5000000000,,, +43.6679687500,698,937.5000000000,,, +43.6699218750,698,937.5000000000,,, +43.6718750000,698,937.5000000000,,, +43.6738281250,698,937.5000000000,,, +43.6757812500,698,937.5000000000,,, +43.6777343750,698,937.5000000000,,, +43.6796875000,698,937.5000000000,,, +43.6816406250,698,937.5000000000,,, +43.6835937500,698,937.5000000000,,, +43.6855468750,698,937.5000000000,,, +43.6875000000,699,937.5000000000,,, +43.6894531250,699,937.5000000000,,, +43.6914062500,699,937.5000000000,,, +43.6933593750,699,937.5000000000,,, +43.6953125000,699,937.5000000000,,, +43.6972656250,699,937.5000000000,,, +43.6992187500,699,937.5000000000,,, +43.7011718750,699,937.5000000000,,, +43.7031250000,699,937.5000000000,,, +43.7050781250,699,937.5000000000,,, +43.7070312500,699,937.5000000000,,, +43.7089843750,699,937.5000000000,,, +43.7109375000,699,937.5000000000,,, +43.7128906250,699,937.5000000000,,, +43.7148437500,699,937.5000000000,,, +43.7167968750,699,937.5000000000,,, +43.7187500000,699,937.5000000000,,, +43.7207031250,699,937.5000000000,,, +43.7226562500,699,937.5000000000,,, +43.7246093750,699,937.5000000000,,, +43.7265625000,699,937.5000000000,,, +43.7285156250,699,937.5000000000,,, +43.7304687500,699,937.5000000000,,, +43.7324218750,699,937.5000000000,,, +43.7343750000,699,937.5000000000,,, +43.7363281250,699,937.5000000000,,, +43.7382812500,699,937.5000000000,,, +43.7402343750,699,937.5000000000,,, +43.7421875000,699,937.5000000000,,, +43.7441406250,699,937.5000000000,,, +43.7460937500,699,937.5000000000,,, +43.7480468750,699,937.5000000000,,, +43.7500000000,700,937.5000000000,,, +43.7519531250,700,937.5000000000,,, +43.7539062500,700,937.5000000000,,, +43.7558593750,700,937.5000000000,,, +43.7578125000,700,937.5000000000,,, +43.7597656250,700,937.5000000000,,, +43.7617187500,700,937.5000000000,,, +43.7636718750,700,937.5000000000,,, +43.7656250000,700,937.5000000000,,, +43.7675781250,700,937.5000000000,,, +43.7695312500,700,937.5000000000,,, +43.7714843750,700,937.5000000000,,, +43.7734375000,700,937.5000000000,,, +43.7753906250,700,937.5000000000,,, +43.7773437500,700,937.5000000000,,, +43.7792968750,700,937.5000000000,,, +43.7812500000,700,937.5000000000,,, +43.7832031250,700,937.5000000000,,, +43.7851562500,700,937.5000000000,,, +43.7871093750,700,937.5000000000,,, +43.7890625000,700,937.5000000000,,, +43.7910156250,700,937.5000000000,,, +43.7929687500,700,937.5000000000,,, +43.7949218750,700,937.5000000000,,, +43.7968750000,700,937.5000000000,,, +43.7988281250,700,937.5000000000,,, +43.8007812500,700,937.5000000000,,, +43.8027343750,700,937.5000000000,,, +43.8046875000,700,937.5000000000,,, +43.8066406250,700,937.5000000000,,, +43.8085937500,700,937.5000000000,,, +43.8105468750,700,937.5000000000,,, +43.8125000000,701,937.5000000000,,, +43.8144531250,701,937.5000000000,,, +43.8164062500,701,937.5000000000,,, +43.8183593750,701,937.5000000000,,, +43.8203125000,701,937.5000000000,,, +43.8222656250,701,937.5000000000,,, +43.8242187500,701,937.5000000000,,, +43.8261718750,701,937.5000000000,,, +43.8281250000,701,937.5000000000,,, +43.8300781250,701,937.5000000000,,, +43.8320312500,701,937.5000000000,,, +43.8339843750,701,937.5000000000,,, +43.8359375000,701,937.5000000000,,, +43.8378906250,701,937.5000000000,,, +43.8398437500,701,937.5000000000,,, +43.8417968750,701,937.5000000000,,, +43.8437500000,701,937.5000000000,,, +43.8457031250,701,937.5000000000,,, +43.8476562500,701,937.5000000000,,, +43.8496093750,701,937.5000000000,,, +43.8515625000,701,937.5000000000,,, +43.8535156250,701,937.5000000000,,, +43.8554687500,701,937.5000000000,,, +43.8574218750,701,937.5000000000,,, +43.8593750000,701,937.5000000000,,, +43.8613281250,701,937.5000000000,,, +43.8632812500,701,937.5000000000,,, +43.8652343750,701,937.5000000000,,, +43.8671875000,701,937.5000000000,,, +43.8691406250,701,937.5000000000,,, +43.8710937500,701,937.5000000000,,, +43.8730468750,701,937.5000000000,,, +43.8750000000,702,937.5000000000,,, +43.8769531250,702,937.5000000000,,, +43.8789062500,702,937.5000000000,,, +43.8808593750,702,937.5000000000,,, +43.8828125000,702,937.5000000000,,, +43.8847656250,702,937.5000000000,,, +43.8867187500,702,937.5000000000,,, +43.8886718750,702,937.5000000000,,, +43.8906250000,702,937.5000000000,,, +43.8925781250,702,937.5000000000,,, +43.8945312500,702,937.5000000000,,, +43.8964843750,702,937.5000000000,,, +43.8984375000,702,937.5000000000,,, +43.9003906250,702,937.5000000000,,, +43.9023437500,702,937.5000000000,,, +43.9042968750,702,937.5000000000,,, +43.9062500000,702,937.5000000000,,, +43.9082031250,702,937.5000000000,,, +43.9101562500,702,937.5000000000,,, +43.9121093750,702,937.5000000000,,, +43.9140625000,702,937.5000000000,,, +43.9160156250,702,937.5000000000,,, +43.9179687500,702,937.5000000000,,, +43.9199218750,702,937.5000000000,,, +43.9218750000,702,937.5000000000,,, +43.9238281250,702,937.5000000000,,, +43.9257812500,702,937.5000000000,,, +43.9277343750,702,937.5000000000,,, +43.9296875000,702,937.5000000000,,, +43.9316406250,702,937.5000000000,,, +43.9335937500,702,937.5000000000,,, +43.9355468750,702,937.5000000000,,, +43.9375000000,703,937.5000000000,,, +43.9394531250,703,937.5000000000,,, +43.9414062500,703,937.5000000000,,, +43.9433593750,703,937.5000000000,,, +43.9453125000,703,937.5000000000,,, +43.9472656250,703,937.5000000000,,, +43.9492187500,703,937.5000000000,,, +43.9511718750,703,937.5000000000,,, +43.9531250000,703,937.5000000000,,, +43.9550781250,703,937.5000000000,,, +43.9570312500,703,937.5000000000,,, +43.9589843750,703,937.5000000000,,, +43.9609375000,703,937.5000000000,,, +43.9628906250,703,937.5000000000,,, +43.9648437500,703,937.5000000000,,, +43.9667968750,703,937.5000000000,,, +43.9687500000,703,937.5000000000,,, +43.9707031250,703,937.5000000000,,, +43.9726562500,703,937.5000000000,,, +43.9746093750,703,937.5000000000,,, +43.9765625000,703,937.5000000000,,, +43.9785156250,703,937.5000000000,,, +43.9804687500,703,937.5000000000,,, +43.9824218750,703,937.5000000000,,, +43.9843750000,703,937.5000000000,,, +43.9863281250,703,937.5000000000,,, +43.9882812500,703,937.5000000000,,, +43.9902343750,703,937.5000000000,,, +43.9921875000,703,937.5000000000,,, +43.9941406250,703,937.5000000000,,, +43.9960937500,703,937.5000000000,,, +43.9980468750,703,937.5000000000,,, +44.0000000000,704,937.5000000000,,, +44.0019531250,704,937.5000000000,,, +44.0039062500,704,937.5000000000,,, +44.0058593750,704,937.5000000000,,, +44.0078125000,704,937.5000000000,,, +44.0097656250,704,937.5000000000,,, +44.0117187500,704,937.5000000000,,, +44.0136718750,704,937.5000000000,,, +44.0156250000,704,937.5000000000,,, +44.0175781250,704,937.5000000000,,, +44.0195312500,704,937.5000000000,,, +44.0214843750,704,937.5000000000,,, +44.0234375000,704,937.5000000000,,, +44.0253906250,704,937.5000000000,,, +44.0273437500,704,937.5000000000,,, +44.0292968750,704,937.5000000000,,, +44.0312500000,704,937.5000000000,,, +44.0332031250,704,937.5000000000,,, +44.0351562500,704,937.5000000000,,, +44.0371093750,704,937.5000000000,,, +44.0390625000,704,937.5000000000,,, +44.0410156250,704,937.5000000000,,, +44.0429687500,704,937.5000000000,,, +44.0449218750,704,937.5000000000,,, +44.0468750000,704,937.5000000000,,, +44.0488281250,704,937.5000000000,,, +44.0507812500,704,937.5000000000,,, +44.0527343750,704,937.5000000000,,, +44.0546875000,704,937.5000000000,,, +44.0566406250,704,937.5000000000,,, +44.0585937500,704,937.5000000000,,, +44.0605468750,704,937.5000000000,,, +44.0625000000,705,937.5000000000,,, +44.0644531250,705,937.5000000000,,, +44.0664062500,705,937.5000000000,,, +44.0683593750,705,937.5000000000,,, +44.0703125000,705,937.5000000000,,, +44.0722656250,705,937.5000000000,,, +44.0742187500,705,937.5000000000,,, +44.0761718750,705,937.5000000000,,, +44.0781250000,705,937.5000000000,,, +44.0800781250,705,937.5000000000,,, +44.0820312500,705,937.5000000000,,, +44.0839843750,705,937.5000000000,,, +44.0859375000,705,937.5000000000,,, +44.0878906250,705,937.5000000000,,, +44.0898437500,705,937.5000000000,,, +44.0917968750,705,937.5000000000,,, +44.0937500000,705,937.5000000000,,, +44.0957031250,705,937.5000000000,,, +44.0976562500,705,937.5000000000,,, +44.0996093750,705,937.5000000000,,, +44.1015625000,705,937.5000000000,,, +44.1035156250,705,937.5000000000,,, +44.1054687500,705,937.5000000000,,, +44.1074218750,705,937.5000000000,,, +44.1093750000,705,937.5000000000,,, +44.1113281250,705,937.5000000000,,, +44.1132812500,705,937.5000000000,,, +44.1152343750,705,937.5000000000,,, +44.1171875000,705,937.5000000000,,, +44.1191406250,705,937.5000000000,,, +44.1210937500,705,937.5000000000,,, +44.1230468750,705,937.5000000000,,, +44.1250000000,706,937.5000000000,,, +44.1269531250,706,937.5000000000,,, +44.1289062500,706,937.5000000000,,, +44.1308593750,706,937.5000000000,,, +44.1328125000,706,937.5000000000,,, +44.1347656250,706,937.5000000000,,, +44.1367187500,706,937.5000000000,,, +44.1386718750,706,937.5000000000,,, +44.1406250000,706,937.5000000000,,, +44.1425781250,706,937.5000000000,,, +44.1445312500,706,937.5000000000,,, +44.1464843750,706,937.5000000000,,, +44.1484375000,706,937.5000000000,,, +44.1503906250,706,937.5000000000,,, +44.1523437500,706,937.5000000000,,, +44.1542968750,706,937.5000000000,,, +44.1562500000,706,937.5000000000,,, +44.1582031250,706,937.5000000000,,, +44.1601562500,706,937.5000000000,,, +44.1621093750,706,937.5000000000,,, +44.1640625000,706,937.5000000000,,, +44.1660156250,706,937.5000000000,,, +44.1679687500,706,937.5000000000,,, +44.1699218750,706,937.5000000000,,, +44.1718750000,706,937.5000000000,,, +44.1738281250,706,937.5000000000,,, +44.1757812500,706,937.5000000000,,, +44.1777343750,706,937.5000000000,,, +44.1796875000,706,937.5000000000,,, +44.1816406250,706,937.5000000000,,, +44.1835937500,706,937.5000000000,,, +44.1855468750,706,937.5000000000,,, +44.1875000000,707,937.5000000000,,, +44.1894531250,707,937.5000000000,,, +44.1914062500,707,937.5000000000,,, +44.1933593750,707,937.5000000000,,, +44.1953125000,707,937.5000000000,,, +44.1972656250,707,937.5000000000,,, +44.1992187500,707,937.5000000000,,, +44.2011718750,707,937.5000000000,,, +44.2031250000,707,937.5000000000,,, +44.2050781250,707,937.5000000000,,, +44.2070312500,707,937.5000000000,,, +44.2089843750,707,937.5000000000,,, +44.2109375000,707,937.5000000000,,, +44.2128906250,707,937.5000000000,,, +44.2148437500,707,937.5000000000,,, +44.2167968750,707,937.5000000000,,, +44.2187500000,707,937.5000000000,,, +44.2207031250,707,937.5000000000,,, +44.2226562500,707,937.5000000000,,, +44.2246093750,707,937.5000000000,,, +44.2265625000,707,937.5000000000,,, +44.2285156250,707,937.5000000000,,, +44.2304687500,707,937.5000000000,,, +44.2324218750,707,937.5000000000,,, +44.2343750000,707,937.5000000000,,, +44.2363281250,707,937.5000000000,,, +44.2382812500,707,937.5000000000,,, +44.2402343750,707,937.5000000000,,, +44.2421875000,707,937.5000000000,,, +44.2441406250,707,937.5000000000,,, +44.2460937500,707,937.5000000000,,, +44.2480468750,707,937.5000000000,,, +44.2500000000,708,937.5000000000,,, +44.2519531250,708,937.5000000000,,, +44.2539062500,708,937.5000000000,,, +44.2558593750,708,937.5000000000,,, +44.2578125000,708,937.5000000000,,, +44.2597656250,708,937.5000000000,,, +44.2617187500,708,937.5000000000,,, +44.2636718750,708,937.5000000000,,, +44.2656250000,708,937.5000000000,,, +44.2675781250,708,937.5000000000,,, +44.2695312500,708,937.5000000000,,, +44.2714843750,708,937.5000000000,,, +44.2734375000,708,937.5000000000,,, +44.2753906250,708,937.5000000000,,, +44.2773437500,708,937.5000000000,,, +44.2792968750,708,937.5000000000,,, +44.2812500000,708,937.5000000000,,, +44.2832031250,708,937.5000000000,,, +44.2851562500,708,937.5000000000,,, +44.2871093750,708,937.5000000000,,, +44.2890625000,708,937.5000000000,,, +44.2910156250,708,937.5000000000,,, +44.2929687500,708,937.5000000000,,, +44.2949218750,708,937.5000000000,,, +44.2968750000,708,937.5000000000,,, +44.2988281250,708,937.5000000000,,, +44.3007812500,708,937.5000000000,,, +44.3027343750,708,937.5000000000,,, +44.3046875000,708,937.5000000000,,, +44.3066406250,708,937.5000000000,,, +44.3085937500,708,937.5000000000,,, +44.3105468750,708,937.5000000000,,, +44.3125000000,709,937.5000000000,,, +44.3144531250,709,937.5000000000,,, +44.3164062500,709,937.5000000000,,, +44.3183593750,709,937.5000000000,,, +44.3203125000,709,937.5000000000,,, +44.3222656250,709,937.5000000000,,, +44.3242187500,709,937.5000000000,,, +44.3261718750,709,937.5000000000,,, +44.3281250000,709,937.5000000000,,, +44.3300781250,709,937.5000000000,,, +44.3320312500,709,937.5000000000,,, +44.3339843750,709,937.5000000000,,, +44.3359375000,709,937.5000000000,,, +44.3378906250,709,937.5000000000,,, +44.3398437500,709,937.5000000000,,, +44.3417968750,709,937.5000000000,,, +44.3437500000,709,937.5000000000,,, +44.3457031250,709,937.5000000000,,, +44.3476562500,709,937.5000000000,,, +44.3496093750,709,937.5000000000,,, +44.3515625000,709,937.5000000000,,, +44.3535156250,709,937.5000000000,,, +44.3554687500,709,937.5000000000,,, +44.3574218750,709,937.5000000000,,, +44.3593750000,709,937.5000000000,,, +44.3613281250,709,937.5000000000,,, +44.3632812500,709,937.5000000000,,, +44.3652343750,709,937.5000000000,,, +44.3671875000,709,937.5000000000,,, +44.3691406250,709,937.5000000000,,, +44.3710937500,709,937.5000000000,,, +44.3730468750,709,937.5000000000,,, +44.3750000000,710,937.5000000000,,, +44.3769531250,710,937.5000000000,,, +44.3789062500,710,937.5000000000,,, +44.3808593750,710,937.5000000000,,, +44.3828125000,710,937.5000000000,,, +44.3847656250,710,937.5000000000,,, +44.3867187500,710,937.5000000000,,, +44.3886718750,710,937.5000000000,,, +44.3906250000,710,937.5000000000,,, +44.3925781250,710,937.5000000000,,, +44.3945312500,710,937.5000000000,,, +44.3964843750,710,937.5000000000,,, +44.3984375000,710,937.5000000000,,, +44.4003906250,710,937.5000000000,,, +44.4023437500,710,937.5000000000,,, +44.4042968750,710,937.5000000000,,, +44.4062500000,710,937.5000000000,,, +44.4082031250,710,937.5000000000,,, +44.4101562500,710,937.5000000000,,, +44.4121093750,710,937.5000000000,,, +44.4140625000,710,937.5000000000,,, +44.4160156250,710,937.5000000000,,, +44.4179687500,710,937.5000000000,,, +44.4199218750,710,937.5000000000,,, +44.4218750000,710,937.5000000000,,, +44.4238281250,710,937.5000000000,,, +44.4257812500,710,937.5000000000,,, +44.4277343750,710,937.5000000000,,, +44.4296875000,710,937.5000000000,,, +44.4316406250,710,937.5000000000,,, +44.4335937500,710,937.5000000000,,, +44.4355468750,710,937.5000000000,,, +44.4375000000,711,937.5000000000,,, +44.4394531250,711,937.5000000000,,, +44.4414062500,711,937.5000000000,,, +44.4433593750,711,937.5000000000,,, +44.4453125000,711,937.5000000000,,, +44.4472656250,711,937.5000000000,,, +44.4492187500,711,937.5000000000,,, +44.4511718750,711,937.5000000000,,, +44.4531250000,711,937.5000000000,,, +44.4550781250,711,937.5000000000,,, +44.4570312500,711,937.5000000000,,, +44.4589843750,711,937.5000000000,,, +44.4609375000,711,937.5000000000,,, +44.4628906250,711,937.5000000000,,, +44.4648437500,711,937.5000000000,,, +44.4667968750,711,937.5000000000,,, +44.4687500000,711,937.5000000000,,, +44.4707031250,711,937.5000000000,,, +44.4726562500,711,937.5000000000,,, +44.4746093750,711,937.5000000000,,, +44.4765625000,711,937.5000000000,,, +44.4785156250,711,937.5000000000,,, +44.4804687500,711,937.5000000000,,, +44.4824218750,711,937.5000000000,,, +44.4843750000,711,937.5000000000,,, +44.4863281250,711,937.5000000000,,, +44.4882812500,711,937.5000000000,,, +44.4902343750,711,937.5000000000,,, +44.4921875000,711,937.5000000000,,, +44.4941406250,711,937.5000000000,,, +44.4960937500,711,937.5000000000,,, +44.4980468750,711,937.5000000000,,, +44.5000000000,712,937.5000000000,,, +44.5019531250,712,937.5000000000,,, +44.5039062500,712,937.5000000000,,, +44.5058593750,712,937.5000000000,,, +44.5078125000,712,937.5000000000,,, +44.5097656250,712,937.5000000000,,, +44.5117187500,712,937.5000000000,,, +44.5136718750,712,937.5000000000,,, +44.5156250000,712,937.5000000000,,, +44.5175781250,712,937.5000000000,,, +44.5195312500,712,937.5000000000,,, +44.5214843750,712,937.5000000000,,, +44.5234375000,712,937.5000000000,,, +44.5253906250,712,937.5000000000,,, +44.5273437500,712,937.5000000000,,, +44.5292968750,712,937.5000000000,,, +44.5312500000,712,937.5000000000,,, +44.5332031250,712,937.5000000000,,, +44.5351562500,712,937.5000000000,,, +44.5371093750,712,937.5000000000,,, +44.5390625000,712,937.5000000000,,, +44.5410156250,712,937.5000000000,,, +44.5429687500,712,937.5000000000,,, +44.5449218750,712,937.5000000000,,, +44.5468750000,712,937.5000000000,,, +44.5488281250,712,937.5000000000,,, +44.5507812500,712,937.5000000000,,, +44.5527343750,712,937.5000000000,,, +44.5546875000,712,937.5000000000,,, +44.5566406250,712,937.5000000000,,, +44.5585937500,712,937.5000000000,,, +44.5605468750,712,937.5000000000,,, +44.5625000000,713,949.2187500000,,, +44.5644531250,713,949.2187500000,,, +44.5664062500,713,949.2187500000,,, +44.5683593750,713,949.2187500000,,, +44.5703125000,713,949.2187500000,,, +44.5722656250,713,949.2187500000,,, +44.5742187500,713,949.2187500000,,, +44.5761718750,713,949.2187500000,,, +44.5781250000,713,949.2187500000,,, +44.5800781250,713,949.2187500000,,, +44.5820312500,713,949.2187500000,,, +44.5839843750,713,949.2187500000,,, +44.5859375000,713,949.2187500000,,, +44.5878906250,713,949.2187500000,,, +44.5898437500,713,949.2187500000,,, +44.5917968750,713,949.2187500000,,, +44.5937500000,713,949.2187500000,,, +44.5957031250,713,949.2187500000,,, +44.5976562500,713,949.2187500000,,, +44.5996093750,713,949.2187500000,,, +44.6015625000,713,949.2187500000,,, +44.6035156250,713,949.2187500000,,, +44.6054687500,713,949.2187500000,,, +44.6074218750,713,949.2187500000,,, +44.6093750000,713,949.2187500000,,, +44.6113281250,713,949.2187500000,,, +44.6132812500,713,949.2187500000,,, +44.6152343750,713,949.2187500000,,, +44.6171875000,713,949.2187500000,,, +44.6191406250,713,949.2187500000,,, +44.6210937500,713,949.2187500000,,, +44.6230468750,713,949.2187500000,,, +44.6250000000,714,949.2187500000,,, +44.6269531250,714,949.2187500000,,, +44.6289062500,714,949.2187500000,,, +44.6308593750,714,949.2187500000,,, +44.6328125000,714,949.2187500000,,, +44.6347656250,714,949.2187500000,,, +44.6367187500,714,949.2187500000,,, +44.6386718750,714,949.2187500000,,, +44.6406250000,714,949.2187500000,,, +44.6425781250,714,949.2187500000,,, +44.6445312500,714,949.2187500000,,, +44.6464843750,714,949.2187500000,,, +44.6484375000,714,949.2187500000,,, +44.6503906250,714,949.2187500000,,, +44.6523437500,714,949.2187500000,,, +44.6542968750,714,949.2187500000,,, +44.6562500000,714,949.2187500000,,, +44.6582031250,714,949.2187500000,,, +44.6601562500,714,949.2187500000,,, +44.6621093750,714,949.2187500000,,, +44.6640625000,714,949.2187500000,,, +44.6660156250,714,949.2187500000,,, +44.6679687500,714,949.2187500000,,, +44.6699218750,714,949.2187500000,,, +44.6718750000,714,949.2187500000,,, +44.6738281250,714,949.2187500000,,, +44.6757812500,714,949.2187500000,,, +44.6777343750,714,949.2187500000,,, +44.6796875000,714,949.2187500000,,, +44.6816406250,714,949.2187500000,,, +44.6835937500,714,949.2187500000,,, +44.6855468750,714,949.2187500000,,, +44.6875000000,715,949.2187500000,,, +44.6894531250,715,949.2187500000,,, +44.6914062500,715,949.2187500000,,, +44.6933593750,715,949.2187500000,,, +44.6953125000,715,949.2187500000,,, +44.6972656250,715,949.2187500000,,, +44.6992187500,715,949.2187500000,,, +44.7011718750,715,949.2187500000,,, +44.7031250000,715,949.2187500000,,, +44.7050781250,715,949.2187500000,,, +44.7070312500,715,949.2187500000,,, +44.7089843750,715,949.2187500000,,, +44.7109375000,715,949.2187500000,,, +44.7128906250,715,949.2187500000,,, +44.7148437500,715,949.2187500000,,, +44.7167968750,715,949.2187500000,,, +44.7187500000,715,949.2187500000,,, +44.7207031250,715,949.2187500000,,, +44.7226562500,715,949.2187500000,,, +44.7246093750,715,949.2187500000,,, +44.7265625000,715,949.2187500000,,, +44.7285156250,715,949.2187500000,,, +44.7304687500,715,949.2187500000,,, +44.7324218750,715,949.2187500000,,, +44.7343750000,715,949.2187500000,,, +44.7363281250,715,949.2187500000,,, +44.7382812500,715,949.2187500000,,, +44.7402343750,715,949.2187500000,,, +44.7421875000,715,949.2187500000,,, +44.7441406250,715,949.2187500000,,, +44.7460937500,715,949.2187500000,,, +44.7480468750,715,949.2187500000,,, +44.7500000000,716,949.2187500000,,, +44.7519531250,716,949.2187500000,,, +44.7539062500,716,949.2187500000,,, +44.7558593750,716,949.2187500000,,, +44.7578125000,716,949.2187500000,,, +44.7597656250,716,949.2187500000,,, +44.7617187500,716,949.2187500000,,, +44.7636718750,716,949.2187500000,,, +44.7656250000,716,949.2187500000,,, +44.7675781250,716,949.2187500000,,, +44.7695312500,716,949.2187500000,,, +44.7714843750,716,949.2187500000,,, +44.7734375000,716,949.2187500000,,, +44.7753906250,716,949.2187500000,,, +44.7773437500,716,949.2187500000,,, +44.7792968750,716,949.2187500000,,, +44.7812500000,716,949.2187500000,,, +44.7832031250,716,949.2187500000,,, +44.7851562500,716,949.2187500000,,, +44.7871093750,716,949.2187500000,,, +44.7890625000,716,949.2187500000,,, +44.7910156250,716,949.2187500000,,, +44.7929687500,716,949.2187500000,,, +44.7949218750,716,949.2187500000,,, +44.7968750000,716,949.2187500000,,, +44.7988281250,716,949.2187500000,,, +44.8007812500,716,949.2187500000,,, +44.8027343750,716,949.2187500000,,, +44.8046875000,716,949.2187500000,,, +44.8066406250,716,949.2187500000,,, +44.8085937500,716,949.2187500000,,, +44.8105468750,716,949.2187500000,,, +44.8125000000,717,949.2187500000,,, +44.8144531250,717,949.2187500000,,, +44.8164062500,717,949.2187500000,,, +44.8183593750,717,949.2187500000,,, +44.8203125000,717,949.2187500000,,, +44.8222656250,717,949.2187500000,,, +44.8242187500,717,949.2187500000,,, +44.8261718750,717,949.2187500000,,, +44.8281250000,717,949.2187500000,,, +44.8300781250,717,949.2187500000,,, +44.8320312500,717,949.2187500000,,, +44.8339843750,717,949.2187500000,,, +44.8359375000,717,949.2187500000,,, +44.8378906250,717,949.2187500000,,, +44.8398437500,717,949.2187500000,,, +44.8417968750,717,949.2187500000,,, +44.8437500000,717,949.2187500000,,, +44.8457031250,717,949.2187500000,,, +44.8476562500,717,949.2187500000,,, +44.8496093750,717,949.2187500000,,, +44.8515625000,717,949.2187500000,,, +44.8535156250,717,949.2187500000,,, +44.8554687500,717,949.2187500000,,, +44.8574218750,717,949.2187500000,,, +44.8593750000,717,949.2187500000,,, +44.8613281250,717,949.2187500000,,, +44.8632812500,717,949.2187500000,,, +44.8652343750,717,949.2187500000,,, +44.8671875000,717,949.2187500000,,, +44.8691406250,717,949.2187500000,,, +44.8710937500,717,949.2187500000,,, +44.8730468750,717,949.2187500000,,, +44.8750000000,718,949.2187500000,,, +44.8769531250,718,949.2187500000,,, +44.8789062500,718,949.2187500000,,, +44.8808593750,718,949.2187500000,,, +44.8828125000,718,949.2187500000,,, +44.8847656250,718,949.2187500000,,, +44.8867187500,718,949.2187500000,,, +44.8886718750,718,949.2187500000,,, +44.8906250000,718,949.2187500000,,, +44.8925781250,718,949.2187500000,,, +44.8945312500,718,949.2187500000,,, +44.8964843750,718,949.2187500000,,, +44.8984375000,718,949.2187500000,,, +44.9003906250,718,949.2187500000,,, +44.9023437500,718,949.2187500000,,, +44.9042968750,718,949.2187500000,,, +44.9062500000,718,949.2187500000,,, +44.9082031250,718,949.2187500000,,, +44.9101562500,718,949.2187500000,,, +44.9121093750,718,949.2187500000,,, +44.9140625000,718,949.2187500000,,, +44.9160156250,718,949.2187500000,,, +44.9179687500,718,949.2187500000,,, +44.9199218750,718,949.2187500000,,, +44.9218750000,718,949.2187500000,,, +44.9238281250,718,949.2187500000,,, +44.9257812500,718,949.2187500000,,, +44.9277343750,718,949.2187500000,,, +44.9296875000,718,949.2187500000,,, +44.9316406250,718,949.2187500000,,, +44.9335937500,718,949.2187500000,,, +44.9355468750,718,949.2187500000,,, +44.9375000000,719,949.2187500000,,, +44.9394531250,719,949.2187500000,,, +44.9414062500,719,949.2187500000,,, +44.9433593750,719,949.2187500000,,, +44.9453125000,719,949.2187500000,,, +44.9472656250,719,949.2187500000,,, +44.9492187500,719,949.2187500000,,, +44.9511718750,719,949.2187500000,,, +44.9531250000,719,949.2187500000,,, +44.9550781250,719,949.2187500000,,, +44.9570312500,719,949.2187500000,,, +44.9589843750,719,949.2187500000,,, +44.9609375000,719,949.2187500000,,, +44.9628906250,719,949.2187500000,,, +44.9648437500,719,949.2187500000,,, +44.9667968750,719,949.2187500000,,, +44.9687500000,719,949.2187500000,,, +44.9707031250,719,949.2187500000,,, +44.9726562500,719,949.2187500000,,, +44.9746093750,719,949.2187500000,,, +44.9765625000,719,949.2187500000,,, +44.9785156250,719,949.2187500000,,, +44.9804687500,719,949.2187500000,,, +44.9824218750,719,949.2187500000,,, +44.9843750000,719,949.2187500000,,, +44.9863281250,719,949.2187500000,,, +44.9882812500,719,949.2187500000,,, +44.9902343750,719,949.2187500000,,, +44.9921875000,719,949.2187500000,,, +44.9941406250,719,949.2187500000,,, +44.9960937500,719,949.2187500000,,, +44.9980468750,719,949.2187500000,,, +45.0000000000,720,949.2187500000,,, +45.0019531250,720,949.2187500000,,, +45.0039062500,720,949.2187500000,,, +45.0058593750,720,949.2187500000,,, +45.0078125000,720,949.2187500000,,, +45.0097656250,720,949.2187500000,,, +45.0117187500,720,949.2187500000,,, +45.0136718750,720,949.2187500000,,, +45.0156250000,720,949.2187500000,,, +45.0175781250,720,949.2187500000,,, +45.0195312500,720,949.2187500000,,, +45.0214843750,720,949.2187500000,,, +45.0234375000,720,949.2187500000,,, +45.0253906250,720,949.2187500000,,, +45.0273437500,720,949.2187500000,,, +45.0292968750,720,949.2187500000,,, +45.0312500000,720,949.2187500000,,, +45.0332031250,720,949.2187500000,,, +45.0351562500,720,949.2187500000,,, +45.0371093750,720,949.2187500000,,, +45.0390625000,720,949.2187500000,,, +45.0410156250,720,949.2187500000,,, +45.0429687500,720,949.2187500000,,, +45.0449218750,720,949.2187500000,,, +45.0468750000,720,949.2187500000,,, +45.0488281250,720,949.2187500000,,, +45.0507812500,720,949.2187500000,,, +45.0527343750,720,949.2187500000,,, +45.0546875000,720,949.2187500000,,, +45.0566406250,720,949.2187500000,,, +45.0585937500,720,949.2187500000,,, +45.0605468750,720,949.2187500000,,, +45.0625000000,721,949.2187500000,,, +45.0644531250,721,949.2187500000,,, +45.0664062500,721,949.2187500000,,, +45.0683593750,721,949.2187500000,,, +45.0703125000,721,949.2187500000,,, +45.0722656250,721,949.2187500000,,, +45.0742187500,721,949.2187500000,,, +45.0761718750,721,949.2187500000,,, +45.0781250000,721,949.2187500000,,, +45.0800781250,721,949.2187500000,,, +45.0820312500,721,949.2187500000,,, +45.0839843750,721,949.2187500000,,, +45.0859375000,721,949.2187500000,,, +45.0878906250,721,949.2187500000,,, +45.0898437500,721,949.2187500000,,, +45.0917968750,721,949.2187500000,,, +45.0937500000,721,949.2187500000,,, +45.0957031250,721,949.2187500000,,, +45.0976562500,721,949.2187500000,,, +45.0996093750,721,949.2187500000,,, +45.1015625000,721,949.2187500000,,, +45.1035156250,721,949.2187500000,,, +45.1054687500,721,949.2187500000,,, +45.1074218750,721,949.2187500000,,, +45.1093750000,721,949.2187500000,,, +45.1113281250,721,949.2187500000,,, +45.1132812500,721,949.2187500000,,, +45.1152343750,721,949.2187500000,,, +45.1171875000,721,949.2187500000,,, +45.1191406250,721,949.2187500000,,, +45.1210937500,721,949.2187500000,,, +45.1230468750,721,949.2187500000,,, +45.1250000000,722,949.2187500000,,, +45.1269531250,722,949.2187500000,,, +45.1289062500,722,949.2187500000,,, +45.1308593750,722,949.2187500000,,, +45.1328125000,722,949.2187500000,,, +45.1347656250,722,949.2187500000,,, +45.1367187500,722,949.2187500000,,, +45.1386718750,722,949.2187500000,,, +45.1406250000,722,949.2187500000,,, +45.1425781250,722,949.2187500000,,, +45.1445312500,722,949.2187500000,,, +45.1464843750,722,949.2187500000,,, +45.1484375000,722,949.2187500000,,, +45.1503906250,722,949.2187500000,,, +45.1523437500,722,949.2187500000,,, +45.1542968750,722,949.2187500000,,, +45.1562500000,722,949.2187500000,,, +45.1582031250,722,949.2187500000,,, +45.1601562500,722,949.2187500000,,, +45.1621093750,722,949.2187500000,,, +45.1640625000,722,949.2187500000,,, +45.1660156250,722,949.2187500000,,, +45.1679687500,722,949.2187500000,,, +45.1699218750,722,949.2187500000,,, +45.1718750000,722,949.2187500000,,, +45.1738281250,722,949.2187500000,,, +45.1757812500,722,949.2187500000,,, +45.1777343750,722,949.2187500000,,, +45.1796875000,722,949.2187500000,,, +45.1816406250,722,949.2187500000,,, +45.1835937500,722,949.2187500000,,, +45.1855468750,722,949.2187500000,,, +45.1875000000,723,949.2187500000,,, +45.1894531250,723,949.2187500000,,, +45.1914062500,723,949.2187500000,,, +45.1933593750,723,949.2187500000,,, +45.1953125000,723,949.2187500000,,, +45.1972656250,723,949.2187500000,,, +45.1992187500,723,949.2187500000,,, +45.2011718750,723,949.2187500000,,, +45.2031250000,723,949.2187500000,,, +45.2050781250,723,949.2187500000,,, +45.2070312500,723,949.2187500000,,, +45.2089843750,723,949.2187500000,,, +45.2109375000,723,949.2187500000,,, +45.2128906250,723,949.2187500000,,, +45.2148437500,723,949.2187500000,,, +45.2167968750,723,949.2187500000,,, +45.2187500000,723,949.2187500000,,, +45.2207031250,723,949.2187500000,,, +45.2226562500,723,949.2187500000,,, +45.2246093750,723,949.2187500000,,, +45.2265625000,723,949.2187500000,,, +45.2285156250,723,949.2187500000,,, +45.2304687500,723,949.2187500000,,, +45.2324218750,723,949.2187500000,,, +45.2343750000,723,949.2187500000,,, +45.2363281250,723,949.2187500000,,, +45.2382812500,723,949.2187500000,,, +45.2402343750,723,949.2187500000,,, +45.2421875000,723,949.2187500000,,, +45.2441406250,723,949.2187500000,,, +45.2460937500,723,949.2187500000,,, +45.2480468750,723,949.2187500000,,, +45.2500000000,724,949.2187500000,,, +45.2519531250,724,949.2187500000,,, +45.2539062500,724,949.2187500000,,, +45.2558593750,724,949.2187500000,,, +45.2578125000,724,949.2187500000,,, +45.2597656250,724,949.2187500000,,, +45.2617187500,724,949.2187500000,,, +45.2636718750,724,949.2187500000,,, +45.2656250000,724,949.2187500000,,, +45.2675781250,724,949.2187500000,,, +45.2695312500,724,949.2187500000,,, +45.2714843750,724,949.2187500000,,, +45.2734375000,724,949.2187500000,,, +45.2753906250,724,949.2187500000,,, +45.2773437500,724,949.2187500000,,, +45.2792968750,724,949.2187500000,,, +45.2812500000,724,949.2187500000,,, +45.2832031250,724,949.2187500000,,, +45.2851562500,724,949.2187500000,,, +45.2871093750,724,949.2187500000,,, +45.2890625000,724,949.2187500000,,, +45.2910156250,724,949.2187500000,,, +45.2929687500,724,949.2187500000,,, +45.2949218750,724,949.2187500000,,, +45.2968750000,724,949.2187500000,,, +45.2988281250,724,949.2187500000,,, +45.3007812500,724,949.2187500000,,, +45.3027343750,724,949.2187500000,,, +45.3046875000,724,949.2187500000,,, +45.3066406250,724,949.2187500000,,, +45.3085937500,724,949.2187500000,,, +45.3105468750,724,949.2187500000,,, +45.3125000000,725,949.2187500000,,, +45.3144531250,725,949.2187500000,,, +45.3164062500,725,949.2187500000,,, +45.3183593750,725,949.2187500000,,, +45.3203125000,725,949.2187500000,,, +45.3222656250,725,949.2187500000,,, +45.3242187500,725,949.2187500000,,, +45.3261718750,725,949.2187500000,,, +45.3281250000,725,949.2187500000,,, +45.3300781250,725,949.2187500000,,, +45.3320312500,725,949.2187500000,,, +45.3339843750,725,949.2187500000,,, +45.3359375000,725,949.2187500000,,, +45.3378906250,725,949.2187500000,,, +45.3398437500,725,949.2187500000,,, +45.3417968750,725,949.2187500000,,, +45.3437500000,725,949.2187500000,,, +45.3457031250,725,949.2187500000,,, +45.3476562500,725,949.2187500000,,, +45.3496093750,725,949.2187500000,,, +45.3515625000,725,949.2187500000,,, +45.3535156250,725,949.2187500000,,, +45.3554687500,725,949.2187500000,,, +45.3574218750,725,949.2187500000,,, +45.3593750000,725,949.2187500000,,, +45.3613281250,725,949.2187500000,,, +45.3632812500,725,949.2187500000,,, +45.3652343750,725,949.2187500000,,, +45.3671875000,725,949.2187500000,,, +45.3691406250,725,949.2187500000,,, +45.3710937500,725,949.2187500000,,, +45.3730468750,725,949.2187500000,,, +45.3750000000,726,949.2187500000,,, +45.3769531250,726,949.2187500000,,, +45.3789062500,726,949.2187500000,,, +45.3808593750,726,949.2187500000,,, +45.3828125000,726,949.2187500000,,, +45.3847656250,726,949.2187500000,,, +45.3867187500,726,949.2187500000,,, +45.3886718750,726,949.2187500000,,, +45.3906250000,726,949.2187500000,,, +45.3925781250,726,949.2187500000,,, +45.3945312500,726,949.2187500000,,, +45.3964843750,726,949.2187500000,,, +45.3984375000,726,949.2187500000,,, +45.4003906250,726,949.2187500000,,, +45.4023437500,726,949.2187500000,,, +45.4042968750,726,949.2187500000,,, +45.4062500000,726,949.2187500000,,, +45.4082031250,726,949.2187500000,,, +45.4101562500,726,949.2187500000,,, +45.4121093750,726,949.2187500000,,, +45.4140625000,726,949.2187500000,,, +45.4160156250,726,949.2187500000,,, +45.4179687500,726,949.2187500000,,, +45.4199218750,726,949.2187500000,,, +45.4218750000,726,949.2187500000,,, +45.4238281250,726,949.2187500000,,, +45.4257812500,726,949.2187500000,,, +45.4277343750,726,949.2187500000,,, +45.4296875000,726,949.2187500000,,, +45.4316406250,726,949.2187500000,,, +45.4335937500,726,949.2187500000,,, +45.4355468750,726,949.2187500000,,, +45.4375000000,727,949.2187500000,,, +45.4394531250,727,949.2187500000,,, +45.4414062500,727,949.2187500000,,, +45.4433593750,727,949.2187500000,,, +45.4453125000,727,949.2187500000,,, +45.4472656250,727,949.2187500000,,, +45.4492187500,727,949.2187500000,,, +45.4511718750,727,949.2187500000,,, +45.4531250000,727,949.2187500000,,, +45.4550781250,727,949.2187500000,,, +45.4570312500,727,949.2187500000,,, +45.4589843750,727,949.2187500000,,, +45.4609375000,727,949.2187500000,,, +45.4628906250,727,949.2187500000,,, +45.4648437500,727,949.2187500000,,, +45.4667968750,727,949.2187500000,,, +45.4687500000,727,949.2187500000,,, +45.4707031250,727,949.2187500000,,, +45.4726562500,727,949.2187500000,,, +45.4746093750,727,949.2187500000,,, +45.4765625000,727,949.2187500000,,, +45.4785156250,727,949.2187500000,,, +45.4804687500,727,949.2187500000,,, +45.4824218750,727,949.2187500000,,, +45.4843750000,727,949.2187500000,,, +45.4863281250,727,949.2187500000,,, +45.4882812500,727,949.2187500000,,, +45.4902343750,727,949.2187500000,,, +45.4921875000,727,949.2187500000,,, +45.4941406250,727,949.2187500000,,, +45.4960937500,727,949.2187500000,,, +45.4980468750,727,949.2187500000,,, +45.5000000000,728,951.1718750000,,, +45.5019531250,728,951.1718750000,,, +45.5039062500,728,951.1718750000,,, +45.5058593750,728,951.1718750000,,, +45.5078125000,728,951.1718750000,,, +45.5097656250,728,951.1718750000,,, +45.5117187500,728,951.1718750000,,, +45.5136718750,728,951.1718750000,,, +45.5156250000,728,951.1718750000,,, +45.5175781250,728,951.1718750000,,, +45.5195312500,728,951.1718750000,,, +45.5214843750,728,951.1718750000,,, +45.5234375000,728,951.1718750000,,, +45.5253906250,728,951.1718750000,,, +45.5273437500,728,951.1718750000,,, +45.5292968750,728,951.1718750000,,, +45.5312500000,728,951.1718750000,,, +45.5332031250,728,951.1718750000,,, +45.5351562500,728,951.1718750000,,, +45.5371093750,728,951.1718750000,,, +45.5390625000,728,951.1718750000,,, +45.5410156250,728,951.1718750000,,, +45.5429687500,728,951.1718750000,,, +45.5449218750,728,951.1718750000,,, +45.5468750000,728,951.1718750000,,, +45.5488281250,728,951.1718750000,,, +45.5507812500,728,951.1718750000,,, +45.5527343750,728,951.1718750000,,, +45.5546875000,728,951.1718750000,,, +45.5566406250,728,951.1718750000,,, +45.5585937500,728,951.1718750000,,, +45.5605468750,728,951.1718750000,,, +45.5625000000,729,951.1718750000,,, +45.5644531250,729,951.1718750000,,, +45.5664062500,729,951.1718750000,,, +45.5683593750,729,951.1718750000,,, +45.5703125000,729,951.1718750000,,, +45.5722656250,729,951.1718750000,,, +45.5742187500,729,951.1718750000,,, +45.5761718750,729,951.1718750000,,, +45.5781250000,729,951.1718750000,,, +45.5800781250,729,951.1718750000,,, +45.5820312500,729,951.1718750000,,, +45.5839843750,729,951.1718750000,,, +45.5859375000,729,951.1718750000,,, +45.5878906250,729,951.1718750000,,, +45.5898437500,729,951.1718750000,,, +45.5917968750,729,951.1718750000,,, +45.5937500000,729,951.1718750000,,, +45.5957031250,729,951.1718750000,,, +45.5976562500,729,951.1718750000,,, +45.5996093750,729,951.1718750000,,, +45.6015625000,729,951.1718750000,,, +45.6035156250,729,951.1718750000,,, +45.6054687500,729,951.1718750000,,, +45.6074218750,729,951.1718750000,,, +45.6093750000,729,951.1718750000,,, +45.6113281250,729,951.1718750000,,, +45.6132812500,729,951.1718750000,,, +45.6152343750,729,951.1718750000,,, +45.6171875000,729,951.1718750000,,, +45.6191406250,729,951.1718750000,,, +45.6210937500,729,951.1718750000,,, +45.6230468750,729,951.1718750000,,, +45.6250000000,730,951.1718750000,,, +45.6269531250,730,951.1718750000,,, +45.6289062500,730,951.1718750000,,, +45.6308593750,730,951.1718750000,,, +45.6328125000,730,951.1718750000,,, +45.6347656250,730,951.1718750000,,, +45.6367187500,730,951.1718750000,,, +45.6386718750,730,951.1718750000,,, +45.6406250000,730,951.1718750000,,, +45.6425781250,730,951.1718750000,,, +45.6445312500,730,951.1718750000,,, +45.6464843750,730,951.1718750000,,, +45.6484375000,730,951.1718750000,,, +45.6503906250,730,951.1718750000,,, +45.6523437500,730,951.1718750000,,, +45.6542968750,730,951.1718750000,,, +45.6562500000,730,951.1718750000,,, +45.6582031250,730,951.1718750000,,, +45.6601562500,730,951.1718750000,,, +45.6621093750,730,951.1718750000,,, +45.6640625000,730,951.1718750000,,, +45.6660156250,730,951.1718750000,,, +45.6679687500,730,951.1718750000,,, +45.6699218750,730,951.1718750000,,, +45.6718750000,730,951.1718750000,,, +45.6738281250,730,951.1718750000,,, +45.6757812500,730,951.1718750000,,, +45.6777343750,730,951.1718750000,,, +45.6796875000,730,951.1718750000,,, +45.6816406250,730,951.1718750000,,, +45.6835937500,730,951.1718750000,,, +45.6855468750,730,951.1718750000,,, +45.6875000000,731,951.1718750000,,, +45.6894531250,731,951.1718750000,,, +45.6914062500,731,951.1718750000,,, +45.6933593750,731,951.1718750000,,, +45.6953125000,731,951.1718750000,,, +45.6972656250,731,951.1718750000,,, +45.6992187500,731,951.1718750000,,, +45.7011718750,731,951.1718750000,,, +45.7031250000,731,951.1718750000,,, +45.7050781250,731,951.1718750000,,, +45.7070312500,731,951.1718750000,,, +45.7089843750,731,951.1718750000,,, +45.7109375000,731,951.1718750000,,, +45.7128906250,731,951.1718750000,,, +45.7148437500,731,951.1718750000,,, +45.7167968750,731,951.1718750000,,, +45.7187500000,731,951.1718750000,,, +45.7207031250,731,951.1718750000,,, +45.7226562500,731,951.1718750000,,, +45.7246093750,731,951.1718750000,,, +45.7265625000,731,951.1718750000,,, +45.7285156250,731,951.1718750000,,, +45.7304687500,731,951.1718750000,,, +45.7324218750,731,951.1718750000,,, +45.7343750000,731,951.1718750000,,, +45.7363281250,731,951.1718750000,,, +45.7382812500,731,951.1718750000,,, +45.7402343750,731,951.1718750000,,, +45.7421875000,731,951.1718750000,,, +45.7441406250,731,951.1718750000,,, +45.7460937500,731,951.1718750000,,, +45.7480468750,731,951.1718750000,,, +45.7500000000,732,951.1718750000,,, +45.7519531250,732,951.1718750000,,, +45.7539062500,732,951.1718750000,,, +45.7558593750,732,951.1718750000,,, +45.7578125000,732,951.1718750000,,, +45.7597656250,732,951.1718750000,,, +45.7617187500,732,951.1718750000,,, +45.7636718750,732,951.1718750000,,, +45.7656250000,732,951.1718750000,,, +45.7675781250,732,951.1718750000,,, +45.7695312500,732,951.1718750000,,, +45.7714843750,732,951.1718750000,,, +45.7734375000,732,951.1718750000,,, +45.7753906250,732,951.1718750000,,, +45.7773437500,732,951.1718750000,,, +45.7792968750,732,951.1718750000,,, +45.7812500000,732,951.1718750000,,, +45.7832031250,732,951.1718750000,,, +45.7851562500,732,951.1718750000,,, +45.7871093750,732,951.1718750000,,, +45.7890625000,732,951.1718750000,,, +45.7910156250,732,951.1718750000,,, +45.7929687500,732,951.1718750000,,, +45.7949218750,732,951.1718750000,,, +45.7968750000,732,951.1718750000,,, +45.7988281250,732,951.1718750000,,, +45.8007812500,732,951.1718750000,,, +45.8027343750,732,951.1718750000,,, +45.8046875000,732,951.1718750000,,, +45.8066406250,732,951.1718750000,,, +45.8085937500,732,951.1718750000,,, +45.8105468750,732,951.1718750000,,, +45.8125000000,733,951.1718750000,,, +45.8144531250,733,951.1718750000,,, +45.8164062500,733,951.1718750000,,, +45.8183593750,733,951.1718750000,,, +45.8203125000,733,951.1718750000,,, +45.8222656250,733,951.1718750000,,, +45.8242187500,733,951.1718750000,,, +45.8261718750,733,951.1718750000,,, +45.8281250000,733,951.1718750000,,, +45.8300781250,733,951.1718750000,,, +45.8320312500,733,951.1718750000,,, +45.8339843750,733,951.1718750000,,, +45.8359375000,733,951.1718750000,,, +45.8378906250,733,951.1718750000,,, +45.8398437500,733,951.1718750000,,, +45.8417968750,733,951.1718750000,,, +45.8437500000,733,951.1718750000,,, +45.8457031250,733,951.1718750000,,, +45.8476562500,733,951.1718750000,,, +45.8496093750,733,951.1718750000,,, +45.8515625000,733,951.1718750000,,, +45.8535156250,733,951.1718750000,,, +45.8554687500,733,951.1718750000,,, +45.8574218750,733,951.1718750000,,, +45.8593750000,733,951.1718750000,,, +45.8613281250,733,951.1718750000,,, +45.8632812500,733,951.1718750000,,, +45.8652343750,733,951.1718750000,,, +45.8671875000,733,951.1718750000,,, +45.8691406250,733,951.1718750000,,, +45.8710937500,733,951.1718750000,,, +45.8730468750,733,951.1718750000,,, +45.8750000000,734,951.1718750000,,, +45.8769531250,734,951.1718750000,,, +45.8789062500,734,951.1718750000,,, +45.8808593750,734,951.1718750000,,, +45.8828125000,734,951.1718750000,,, +45.8847656250,734,951.1718750000,,, +45.8867187500,734,951.1718750000,,, +45.8886718750,734,951.1718750000,,, +45.8906250000,734,951.1718750000,,, +45.8925781250,734,951.1718750000,,, +45.8945312500,734,951.1718750000,,, +45.8964843750,734,951.1718750000,,, +45.8984375000,734,951.1718750000,,, +45.9003906250,734,951.1718750000,,, +45.9023437500,734,951.1718750000,,, +45.9042968750,734,951.1718750000,,, +45.9062500000,734,951.1718750000,,, +45.9082031250,734,951.1718750000,,, +45.9101562500,734,951.1718750000,,, +45.9121093750,734,951.1718750000,,, +45.9140625000,734,951.1718750000,,, +45.9160156250,734,951.1718750000,,, +45.9179687500,734,951.1718750000,,, +45.9199218750,734,951.1718750000,,, +45.9218750000,734,951.1718750000,,, +45.9238281250,734,951.1718750000,,, +45.9257812500,734,951.1718750000,,, +45.9277343750,734,951.1718750000,,, +45.9296875000,734,951.1718750000,,, +45.9316406250,734,951.1718750000,,, +45.9335937500,734,951.1718750000,,, +45.9355468750,734,951.1718750000,,, +45.9375000000,735,951.1718750000,,, +45.9394531250,735,951.1718750000,,, +45.9414062500,735,951.1718750000,,, +45.9433593750,735,951.1718750000,,, +45.9453125000,735,951.1718750000,,, +45.9472656250,735,951.1718750000,,, +45.9492187500,735,951.1718750000,,, +45.9511718750,735,951.1718750000,,, +45.9531250000,735,951.1718750000,,, +45.9550781250,735,951.1718750000,,, +45.9570312500,735,951.1718750000,,, +45.9589843750,735,951.1718750000,,, +45.9609375000,735,951.1718750000,,, +45.9628906250,735,951.1718750000,,, +45.9648437500,735,951.1718750000,,, +45.9667968750,735,951.1718750000,,, +45.9687500000,735,951.1718750000,,, +45.9707031250,735,951.1718750000,,, +45.9726562500,735,951.1718750000,,, +45.9746093750,735,951.1718750000,,, +45.9765625000,735,951.1718750000,,, +45.9785156250,735,951.1718750000,,, +45.9804687500,735,951.1718750000,,, +45.9824218750,735,951.1718750000,,, +45.9843750000,735,951.1718750000,,, +45.9863281250,735,951.1718750000,,, +45.9882812500,735,951.1718750000,,, +45.9902343750,735,951.1718750000,,, +45.9921875000,735,951.1718750000,,, +45.9941406250,735,951.1718750000,,, +45.9960937500,735,951.1718750000,,, +45.9980468750,735,951.1718750000,,, +46.0000000000,736,951.1718750000,,, +46.0019531250,736,951.1718750000,,, +46.0039062500,736,951.1718750000,,, +46.0058593750,736,951.1718750000,,, +46.0078125000,736,951.1718750000,,, +46.0097656250,736,951.1718750000,,, +46.0117187500,736,951.1718750000,,, +46.0136718750,736,951.1718750000,,, +46.0156250000,736,951.1718750000,,, +46.0175781250,736,951.1718750000,,, +46.0195312500,736,951.1718750000,,, +46.0214843750,736,951.1718750000,,, +46.0234375000,736,951.1718750000,,, +46.0253906250,736,951.1718750000,,, +46.0273437500,736,951.1718750000,,, +46.0292968750,736,951.1718750000,,, +46.0312500000,736,951.1718750000,,, +46.0332031250,736,951.1718750000,,, +46.0351562500,736,951.1718750000,,, +46.0371093750,736,951.1718750000,,, +46.0390625000,736,951.1718750000,,, +46.0410156250,736,951.1718750000,,, +46.0429687500,736,951.1718750000,,, +46.0449218750,736,951.1718750000,,, +46.0468750000,736,951.1718750000,,, +46.0488281250,736,951.1718750000,,, +46.0507812500,736,951.1718750000,,, +46.0527343750,736,951.1718750000,,, +46.0546875000,736,951.1718750000,,, +46.0566406250,736,951.1718750000,,, +46.0585937500,736,951.1718750000,,, +46.0605468750,736,951.1718750000,,, +46.0625000000,737,951.1718750000,,, +46.0644531250,737,951.1718750000,,, +46.0664062500,737,951.1718750000,,, +46.0683593750,737,951.1718750000,,, +46.0703125000,737,951.1718750000,,, +46.0722656250,737,951.1718750000,,, +46.0742187500,737,951.1718750000,,, +46.0761718750,737,951.1718750000,,, +46.0781250000,737,951.1718750000,,, +46.0800781250,737,951.1718750000,,, +46.0820312500,737,951.1718750000,,, +46.0839843750,737,951.1718750000,,, +46.0859375000,737,951.1718750000,,, +46.0878906250,737,951.1718750000,,, +46.0898437500,737,951.1718750000,,, +46.0917968750,737,951.1718750000,,, +46.0937500000,737,951.1718750000,,, +46.0957031250,737,951.1718750000,,, +46.0976562500,737,951.1718750000,,, +46.0996093750,737,951.1718750000,,, +46.1015625000,737,951.1718750000,,, +46.1035156250,737,951.1718750000,,, +46.1054687500,737,951.1718750000,,, +46.1074218750,737,951.1718750000,,, +46.1093750000,737,951.1718750000,,, +46.1113281250,737,951.1718750000,,, +46.1132812500,737,951.1718750000,,, +46.1152343750,737,951.1718750000,,, +46.1171875000,737,951.1718750000,,, +46.1191406250,737,951.1718750000,,, +46.1210937500,737,951.1718750000,,, +46.1230468750,737,951.1718750000,,, +46.1250000000,738,951.1718750000,,, +46.1269531250,738,951.1718750000,,, +46.1289062500,738,951.1718750000,,, +46.1308593750,738,951.1718750000,,, +46.1328125000,738,951.1718750000,,, +46.1347656250,738,951.1718750000,,, +46.1367187500,738,951.1718750000,,, +46.1386718750,738,951.1718750000,,, +46.1406250000,738,951.1718750000,,, +46.1425781250,738,951.1718750000,,, +46.1445312500,738,951.1718750000,,, +46.1464843750,738,951.1718750000,,, +46.1484375000,738,951.1718750000,,, +46.1503906250,738,951.1718750000,,, +46.1523437500,738,951.1718750000,,, +46.1542968750,738,951.1718750000,,, +46.1562500000,738,951.1718750000,,, +46.1582031250,738,951.1718750000,,, +46.1601562500,738,951.1718750000,,, +46.1621093750,738,951.1718750000,,, +46.1640625000,738,951.1718750000,,, +46.1660156250,738,951.1718750000,,, +46.1679687500,738,951.1718750000,,, +46.1699218750,738,951.1718750000,,, +46.1718750000,738,951.1718750000,,, +46.1738281250,738,951.1718750000,,, +46.1757812500,738,951.1718750000,,, +46.1777343750,738,951.1718750000,,, +46.1796875000,738,951.1718750000,,, +46.1816406250,738,951.1718750000,,, +46.1835937500,738,951.1718750000,,, +46.1855468750,738,951.1718750000,,, +46.1875000000,739,951.1718750000,,, +46.1894531250,739,951.1718750000,,, +46.1914062500,739,951.1718750000,,, +46.1933593750,739,951.1718750000,,, +46.1953125000,739,951.1718750000,,, +46.1972656250,739,951.1718750000,,, +46.1992187500,739,951.1718750000,,, +46.2011718750,739,951.1718750000,,, +46.2031250000,739,951.1718750000,,, +46.2050781250,739,951.1718750000,,, +46.2070312500,739,951.1718750000,,, +46.2089843750,739,951.1718750000,,, +46.2109375000,739,951.1718750000,,, +46.2128906250,739,951.1718750000,,, +46.2148437500,739,951.1718750000,,, +46.2167968750,739,951.1718750000,,, +46.2187500000,739,951.1718750000,,, +46.2207031250,739,951.1718750000,,, +46.2226562500,739,951.1718750000,,, +46.2246093750,739,951.1718750000,,, +46.2265625000,739,951.1718750000,,, +46.2285156250,739,951.1718750000,,, +46.2304687500,739,951.1718750000,,, +46.2324218750,739,951.1718750000,,, +46.2343750000,739,951.1718750000,,, +46.2363281250,739,951.1718750000,,, +46.2382812500,739,951.1718750000,,, +46.2402343750,739,951.1718750000,,, +46.2421875000,739,951.1718750000,,, +46.2441406250,739,951.1718750000,,, +46.2460937500,739,951.1718750000,,, +46.2480468750,739,951.1718750000,,, +46.2500000000,740,951.1718750000,,, +46.2519531250,740,951.1718750000,,, +46.2539062500,740,951.1718750000,,, +46.2558593750,740,951.1718750000,,, +46.2578125000,740,951.1718750000,,, +46.2597656250,740,951.1718750000,,, +46.2617187500,740,951.1718750000,,, +46.2636718750,740,951.1718750000,,, +46.2656250000,740,951.1718750000,,, +46.2675781250,740,951.1718750000,,, +46.2695312500,740,951.1718750000,,, +46.2714843750,740,951.1718750000,,, +46.2734375000,740,951.1718750000,,, +46.2753906250,740,951.1718750000,,, +46.2773437500,740,951.1718750000,,, +46.2792968750,740,951.1718750000,,, +46.2812500000,740,951.1718750000,,, +46.2832031250,740,951.1718750000,,, +46.2851562500,740,951.1718750000,,, +46.2871093750,740,951.1718750000,,, +46.2890625000,740,951.1718750000,,, +46.2910156250,740,951.1718750000,,, +46.2929687500,740,951.1718750000,,, +46.2949218750,740,951.1718750000,,, +46.2968750000,740,951.1718750000,,, +46.2988281250,740,951.1718750000,,, +46.3007812500,740,951.1718750000,,, +46.3027343750,740,951.1718750000,,, +46.3046875000,740,951.1718750000,,, +46.3066406250,740,951.1718750000,,, +46.3085937500,740,951.1718750000,,, +46.3105468750,740,951.1718750000,,, +46.3125000000,741,951.1718750000,,, +46.3144531250,741,951.1718750000,,, +46.3164062500,741,951.1718750000,,, +46.3183593750,741,951.1718750000,,, +46.3203125000,741,951.1718750000,,, +46.3222656250,741,951.1718750000,,, +46.3242187500,741,951.1718750000,,, +46.3261718750,741,951.1718750000,,, +46.3281250000,741,951.1718750000,,, +46.3300781250,741,951.1718750000,,, +46.3320312500,741,951.1718750000,,, +46.3339843750,741,951.1718750000,,, +46.3359375000,741,951.1718750000,,, +46.3378906250,741,951.1718750000,,, +46.3398437500,741,951.1718750000,,, +46.3417968750,741,951.1718750000,,, +46.3437500000,741,951.1718750000,,, +46.3457031250,741,951.1718750000,,, +46.3476562500,741,951.1718750000,,, +46.3496093750,741,951.1718750000,,, +46.3515625000,741,951.1718750000,,, +46.3535156250,741,951.1718750000,,, +46.3554687500,741,951.1718750000,,, +46.3574218750,741,951.1718750000,,, +46.3593750000,741,951.1718750000,,, +46.3613281250,741,951.1718750000,,, +46.3632812500,741,951.1718750000,,, +46.3652343750,741,951.1718750000,,, +46.3671875000,741,951.1718750000,,, +46.3691406250,741,951.1718750000,,, +46.3710937500,741,951.1718750000,,, +46.3730468750,741,951.1718750000,,, +46.3750000000,742,884.7656250000,,, +46.3769531250,742,884.7656250000,,, +46.3789062500,742,884.7656250000,,, +46.3808593750,742,884.7656250000,,, +46.3828125000,742,884.7656250000,,, +46.3847656250,742,884.7656250000,,, +46.3867187500,742,884.7656250000,,, +46.3886718750,742,884.7656250000,,, +46.3906250000,742,884.7656250000,,, +46.3925781250,742,884.7656250000,,, +46.3945312500,742,884.7656250000,,, +46.3964843750,742,884.7656250000,,, +46.3984375000,742,884.7656250000,,, +46.4003906250,742,884.7656250000,,, +46.4023437500,742,884.7656250000,,, +46.4042968750,742,884.7656250000,,, +46.4062500000,742,884.7656250000,,, +46.4082031250,742,884.7656250000,,, +46.4101562500,742,884.7656250000,,, +46.4121093750,742,884.7656250000,,, +46.4140625000,742,884.7656250000,,, +46.4160156250,742,884.7656250000,,, +46.4179687500,742,884.7656250000,,, +46.4199218750,742,884.7656250000,,, +46.4218750000,742,884.7656250000,,, +46.4238281250,742,884.7656250000,,, +46.4257812500,742,884.7656250000,,, +46.4277343750,742,884.7656250000,,, +46.4296875000,742,884.7656250000,,, +46.4316406250,742,884.7656250000,,, +46.4335937500,742,884.7656250000,,, +46.4355468750,742,884.7656250000,,, +46.4375000000,743,884.7656250000,,, +46.4394531250,743,884.7656250000,,, +46.4414062500,743,884.7656250000,,, +46.4433593750,743,884.7656250000,,, +46.4453125000,743,884.7656250000,,, +46.4472656250,743,884.7656250000,,, +46.4492187500,743,884.7656250000,,, +46.4511718750,743,884.7656250000,,, +46.4531250000,743,884.7656250000,,, +46.4550781250,743,884.7656250000,,, +46.4570312500,743,884.7656250000,,, +46.4589843750,743,884.7656250000,,, +46.4609375000,743,884.7656250000,,, +46.4628906250,743,884.7656250000,,, +46.4648437500,743,884.7656250000,,, +46.4667968750,743,884.7656250000,,, +46.4687500000,743,884.7656250000,,, +46.4707031250,743,884.7656250000,,, +46.4726562500,743,884.7656250000,,, +46.4746093750,743,884.7656250000,,, +46.4765625000,743,884.7656250000,,, +46.4785156250,743,884.7656250000,,, +46.4804687500,743,884.7656250000,,, +46.4824218750,743,884.7656250000,,, +46.4843750000,743,884.7656250000,,, +46.4863281250,743,884.7656250000,,, +46.4882812500,743,884.7656250000,,, +46.4902343750,743,884.7656250000,,, +46.4921875000,743,884.7656250000,,, +46.4941406250,743,884.7656250000,,, +46.4960937500,743,884.7656250000,,, +46.4980468750,743,884.7656250000,,, +46.5000000000,744,884.7656250000,,, +46.5019531250,744,884.7656250000,,, +46.5039062500,744,884.7656250000,,, +46.5058593750,744,884.7656250000,,, +46.5078125000,744,884.7656250000,,, +46.5097656250,744,884.7656250000,,, +46.5117187500,744,884.7656250000,,, +46.5136718750,744,884.7656250000,,, +46.5156250000,744,884.7656250000,,, +46.5175781250,744,884.7656250000,,, +46.5195312500,744,884.7656250000,,, +46.5214843750,744,884.7656250000,,, +46.5234375000,744,884.7656250000,,, +46.5253906250,744,884.7656250000,,, +46.5273437500,744,884.7656250000,,, +46.5292968750,744,884.7656250000,,, +46.5312500000,744,884.7656250000,,, +46.5332031250,744,884.7656250000,,, +46.5351562500,744,884.7656250000,,, +46.5371093750,744,884.7656250000,,, +46.5390625000,744,884.7656250000,,, +46.5410156250,744,884.7656250000,,, +46.5429687500,744,884.7656250000,,, +46.5449218750,744,884.7656250000,,, +46.5468750000,744,884.7656250000,,, +46.5488281250,744,884.7656250000,,, +46.5507812500,744,884.7656250000,,, +46.5527343750,744,884.7656250000,,, +46.5546875000,744,884.7656250000,,, +46.5566406250,744,884.7656250000,,, +46.5585937500,744,884.7656250000,,, +46.5605468750,744,884.7656250000,,, +46.5625000000,745,884.7656250000,,, +46.5644531250,745,884.7656250000,,, +46.5664062500,745,884.7656250000,,, +46.5683593750,745,884.7656250000,,, +46.5703125000,745,884.7656250000,,, +46.5722656250,745,884.7656250000,,, +46.5742187500,745,884.7656250000,,, +46.5761718750,745,884.7656250000,,, +46.5781250000,745,884.7656250000,,, +46.5800781250,745,884.7656250000,,, +46.5820312500,745,884.7656250000,,, +46.5839843750,745,884.7656250000,,, +46.5859375000,745,884.7656250000,,, +46.5878906250,745,884.7656250000,,, +46.5898437500,745,884.7656250000,,, +46.5917968750,745,884.7656250000,,, +46.5937500000,745,884.7656250000,,, +46.5957031250,745,884.7656250000,,, +46.5976562500,745,884.7656250000,,, +46.5996093750,745,884.7656250000,,, +46.6015625000,745,884.7656250000,,, +46.6035156250,745,884.7656250000,,, +46.6054687500,745,884.7656250000,,, +46.6074218750,745,884.7656250000,,, +46.6093750000,745,884.7656250000,,, +46.6113281250,745,884.7656250000,,, +46.6132812500,745,884.7656250000,,, +46.6152343750,745,884.7656250000,,, +46.6171875000,745,884.7656250000,,, +46.6191406250,745,884.7656250000,,, +46.6210937500,745,884.7656250000,,, +46.6230468750,745,884.7656250000,,, +46.6250000000,746,884.7656250000,,, +46.6269531250,746,884.7656250000,,, +46.6289062500,746,884.7656250000,,, +46.6308593750,746,884.7656250000,,, +46.6328125000,746,884.7656250000,,, +46.6347656250,746,884.7656250000,,, +46.6367187500,746,884.7656250000,,, +46.6386718750,746,884.7656250000,,, +46.6406250000,746,884.7656250000,,, +46.6425781250,746,884.7656250000,,, +46.6445312500,746,884.7656250000,,, +46.6464843750,746,884.7656250000,,, +46.6484375000,746,884.7656250000,,, +46.6503906250,746,884.7656250000,,, +46.6523437500,746,884.7656250000,,, +46.6542968750,746,884.7656250000,,, +46.6562500000,746,884.7656250000,,, +46.6582031250,746,884.7656250000,,, +46.6601562500,746,884.7656250000,,, +46.6621093750,746,884.7656250000,,, +46.6640625000,746,884.7656250000,,, +46.6660156250,746,884.7656250000,,, +46.6679687500,746,884.7656250000,,, +46.6699218750,746,884.7656250000,,, +46.6718750000,746,884.7656250000,,, +46.6738281250,746,884.7656250000,,, +46.6757812500,746,884.7656250000,,, +46.6777343750,746,884.7656250000,,, +46.6796875000,746,884.7656250000,,, +46.6816406250,746,884.7656250000,,, +46.6835937500,746,884.7656250000,,, +46.6855468750,746,884.7656250000,,, +46.6875000000,747,884.7656250000,,, +46.6894531250,747,884.7656250000,,, +46.6914062500,747,884.7656250000,,, +46.6933593750,747,884.7656250000,,, +46.6953125000,747,884.7656250000,,, +46.6972656250,747,884.7656250000,,, +46.6992187500,747,884.7656250000,,, +46.7011718750,747,884.7656250000,,, +46.7031250000,747,884.7656250000,,, +46.7050781250,747,884.7656250000,,, +46.7070312500,747,884.7656250000,,, +46.7089843750,747,884.7656250000,,, +46.7109375000,747,884.7656250000,,, +46.7128906250,747,884.7656250000,,, +46.7148437500,747,884.7656250000,,, +46.7167968750,747,884.7656250000,,, +46.7187500000,747,884.7656250000,,, +46.7207031250,747,884.7656250000,,, +46.7226562500,747,884.7656250000,,, +46.7246093750,747,884.7656250000,,, +46.7265625000,747,884.7656250000,,, +46.7285156250,747,884.7656250000,,, +46.7304687500,747,884.7656250000,,, +46.7324218750,747,884.7656250000,,, +46.7343750000,747,884.7656250000,,, +46.7363281250,747,884.7656250000,,, +46.7382812500,747,884.7656250000,,, +46.7402343750,747,884.7656250000,,, +46.7421875000,747,884.7656250000,,, +46.7441406250,747,884.7656250000,,, +46.7460937500,747,884.7656250000,,, +46.7480468750,747,884.7656250000,,, +46.7500000000,748,884.7656250000,,, +46.7519531250,748,884.7656250000,,, +46.7539062500,748,884.7656250000,,, +46.7558593750,748,884.7656250000,,, +46.7578125000,748,884.7656250000,,, +46.7597656250,748,884.7656250000,,, +46.7617187500,748,884.7656250000,,, +46.7636718750,748,884.7656250000,,, +46.7656250000,748,884.7656250000,,, +46.7675781250,748,884.7656250000,,, +46.7695312500,748,884.7656250000,,, +46.7714843750,748,884.7656250000,,, +46.7734375000,748,884.7656250000,,, +46.7753906250,748,884.7656250000,,, +46.7773437500,748,884.7656250000,,, +46.7792968750,748,884.7656250000,,, +46.7812500000,748,884.7656250000,,, +46.7832031250,748,884.7656250000,,, +46.7851562500,748,884.7656250000,,, +46.7871093750,748,884.7656250000,,, +46.7890625000,748,884.7656250000,,, +46.7910156250,748,884.7656250000,,, +46.7929687500,748,884.7656250000,,, +46.7949218750,748,884.7656250000,,, +46.7968750000,748,884.7656250000,,, +46.7988281250,748,884.7656250000,,, +46.8007812500,748,884.7656250000,,, +46.8027343750,748,884.7656250000,,, +46.8046875000,748,884.7656250000,,, +46.8066406250,748,884.7656250000,,, +46.8085937500,748,884.7656250000,,, +46.8105468750,748,884.7656250000,,, +46.8125000000,749,884.7656250000,,, +46.8144531250,749,884.7656250000,,, +46.8164062500,749,884.7656250000,,, +46.8183593750,749,884.7656250000,,, +46.8203125000,749,884.7656250000,,, +46.8222656250,749,884.7656250000,,, +46.8242187500,749,884.7656250000,,, +46.8261718750,749,884.7656250000,,, +46.8281250000,749,884.7656250000,,, +46.8300781250,749,884.7656250000,,, +46.8320312500,749,884.7656250000,,, +46.8339843750,749,884.7656250000,,, +46.8359375000,749,884.7656250000,,, +46.8378906250,749,884.7656250000,,, +46.8398437500,749,884.7656250000,,, +46.8417968750,749,884.7656250000,,, +46.8437500000,749,884.7656250000,,, +46.8457031250,749,884.7656250000,,, +46.8476562500,749,884.7656250000,,, +46.8496093750,749,884.7656250000,,, +46.8515625000,749,884.7656250000,,, +46.8535156250,749,884.7656250000,,, +46.8554687500,749,884.7656250000,,, +46.8574218750,749,884.7656250000,,, +46.8593750000,749,884.7656250000,,, +46.8613281250,749,884.7656250000,,, +46.8632812500,749,884.7656250000,,, +46.8652343750,749,884.7656250000,,, +46.8671875000,749,884.7656250000,,, +46.8691406250,749,884.7656250000,,, +46.8710937500,749,884.7656250000,,, +46.8730468750,749,884.7656250000,,, +46.8750000000,750,884.7656250000,,, +46.8769531250,750,884.7656250000,,, +46.8789062500,750,884.7656250000,,, +46.8808593750,750,884.7656250000,,, +46.8828125000,750,884.7656250000,,, +46.8847656250,750,884.7656250000,,, +46.8867187500,750,884.7656250000,,, +46.8886718750,750,884.7656250000,,, +46.8906250000,750,884.7656250000,,, +46.8925781250,750,884.7656250000,,, +46.8945312500,750,884.7656250000,,, +46.8964843750,750,884.7656250000,,, +46.8984375000,750,884.7656250000,,, +46.9003906250,750,884.7656250000,,, +46.9023437500,750,884.7656250000,,, +46.9042968750,750,884.7656250000,,, +46.9062500000,750,884.7656250000,,, +46.9082031250,750,884.7656250000,,, +46.9101562500,750,884.7656250000,,, +46.9121093750,750,884.7656250000,,, +46.9140625000,750,884.7656250000,,, +46.9160156250,750,884.7656250000,,, +46.9179687500,750,884.7656250000,,, +46.9199218750,750,884.7656250000,,, +46.9218750000,750,884.7656250000,,, +46.9238281250,750,884.7656250000,,, +46.9257812500,750,884.7656250000,,, +46.9277343750,750,884.7656250000,,, +46.9296875000,750,884.7656250000,,, +46.9316406250,750,884.7656250000,,, +46.9335937500,750,884.7656250000,,, +46.9355468750,750,884.7656250000,,, +46.9375000000,751,884.7656250000,,, +46.9394531250,751,884.7656250000,,, +46.9414062500,751,884.7656250000,,, +46.9433593750,751,884.7656250000,,, +46.9453125000,751,884.7656250000,,, +46.9472656250,751,884.7656250000,,, +46.9492187500,751,884.7656250000,,, +46.9511718750,751,884.7656250000,,, +46.9531250000,751,884.7656250000,,, +46.9550781250,751,884.7656250000,,, +46.9570312500,751,884.7656250000,,, +46.9589843750,751,884.7656250000,,, +46.9609375000,751,884.7656250000,,, +46.9628906250,751,884.7656250000,,, +46.9648437500,751,884.7656250000,,, +46.9667968750,751,884.7656250000,,, +46.9687500000,751,884.7656250000,,, +46.9707031250,751,884.7656250000,,, +46.9726562500,751,884.7656250000,,, +46.9746093750,751,884.7656250000,,, +46.9765625000,751,884.7656250000,,, +46.9785156250,751,884.7656250000,,, +46.9804687500,751,884.7656250000,,, +46.9824218750,751,884.7656250000,,, +46.9843750000,751,884.7656250000,,, +46.9863281250,751,884.7656250000,,, +46.9882812500,751,884.7656250000,,, +46.9902343750,751,884.7656250000,,, +46.9921875000,751,884.7656250000,,, +46.9941406250,751,884.7656250000,,, +46.9960937500,751,884.7656250000,,, +46.9980468750,751,884.7656250000,,, +47.0000000000,752,884.7656250000,,, +47.0019531250,752,884.7656250000,,, +47.0039062500,752,884.7656250000,,, +47.0058593750,752,884.7656250000,,, +47.0078125000,752,884.7656250000,,, +47.0097656250,752,884.7656250000,,, +47.0117187500,752,884.7656250000,,, +47.0136718750,752,884.7656250000,,, +47.0156250000,752,884.7656250000,,, +47.0175781250,752,884.7656250000,,, +47.0195312500,752,884.7656250000,,, +47.0214843750,752,884.7656250000,,, +47.0234375000,752,884.7656250000,,, +47.0253906250,752,884.7656250000,,, +47.0273437500,752,884.7656250000,,, +47.0292968750,752,884.7656250000,,, +47.0312500000,752,884.7656250000,,, +47.0332031250,752,884.7656250000,,, +47.0351562500,752,884.7656250000,,, +47.0371093750,752,884.7656250000,,, +47.0390625000,752,884.7656250000,,, +47.0410156250,752,884.7656250000,,, +47.0429687500,752,884.7656250000,,, +47.0449218750,752,884.7656250000,,, +47.0468750000,752,884.7656250000,,, +47.0488281250,752,884.7656250000,,, +47.0507812500,752,884.7656250000,,, +47.0527343750,752,884.7656250000,,, +47.0546875000,752,884.7656250000,,, +47.0566406250,752,884.7656250000,,, +47.0585937500,752,884.7656250000,,, +47.0605468750,752,884.7656250000,,, +47.0625000000,753,884.7656250000,,, +47.0644531250,753,884.7656250000,,, +47.0664062500,753,884.7656250000,,, +47.0683593750,753,884.7656250000,,, +47.0703125000,753,884.7656250000,,, +47.0722656250,753,884.7656250000,,, +47.0742187500,753,884.7656250000,,, +47.0761718750,753,884.7656250000,,, +47.0781250000,753,884.7656250000,,, +47.0800781250,753,884.7656250000,,, +47.0820312500,753,884.7656250000,,, +47.0839843750,753,884.7656250000,,, +47.0859375000,753,884.7656250000,,, +47.0878906250,753,884.7656250000,,, +47.0898437500,753,884.7656250000,,, +47.0917968750,753,884.7656250000,,, +47.0937500000,753,884.7656250000,,, +47.0957031250,753,884.7656250000,,, +47.0976562500,753,884.7656250000,,, +47.0996093750,753,884.7656250000,,, +47.1015625000,753,884.7656250000,,, +47.1035156250,753,884.7656250000,,, +47.1054687500,753,884.7656250000,,, +47.1074218750,753,884.7656250000,,, +47.1093750000,753,884.7656250000,,, +47.1113281250,753,884.7656250000,,, +47.1132812500,753,884.7656250000,,, +47.1152343750,753,884.7656250000,,, +47.1171875000,753,884.7656250000,,, +47.1191406250,753,884.7656250000,,, +47.1210937500,753,884.7656250000,,, +47.1230468750,753,884.7656250000,,, +47.1250000000,754,884.7656250000,,, +47.1269531250,754,884.7656250000,,, +47.1289062500,754,884.7656250000,,, +47.1308593750,754,884.7656250000,,, +47.1328125000,754,884.7656250000,,, +47.1347656250,754,884.7656250000,,, +47.1367187500,754,884.7656250000,,, +47.1386718750,754,884.7656250000,,, +47.1406250000,754,884.7656250000,,, +47.1425781250,754,884.7656250000,,, +47.1445312500,754,884.7656250000,,, +47.1464843750,754,884.7656250000,,, +47.1484375000,754,884.7656250000,,, +47.1503906250,754,884.7656250000,,, +47.1523437500,754,884.7656250000,,, +47.1542968750,754,884.7656250000,,, +47.1562500000,754,884.7656250000,,, +47.1582031250,754,884.7656250000,,, +47.1601562500,754,884.7656250000,,, +47.1621093750,754,884.7656250000,,, +47.1640625000,754,884.7656250000,,, +47.1660156250,754,884.7656250000,,, +47.1679687500,754,884.7656250000,,, +47.1699218750,754,884.7656250000,,, +47.1718750000,754,884.7656250000,,, +47.1738281250,754,884.7656250000,,, +47.1757812500,754,884.7656250000,,, +47.1777343750,754,884.7656250000,,, +47.1796875000,754,884.7656250000,,, +47.1816406250,754,884.7656250000,,, +47.1835937500,754,884.7656250000,,, +47.1855468750,754,884.7656250000,,, +47.1875000000,755,884.7656250000,,, +47.1894531250,755,884.7656250000,,, +47.1914062500,755,884.7656250000,,, +47.1933593750,755,884.7656250000,,, +47.1953125000,755,884.7656250000,,, +47.1972656250,755,884.7656250000,,, +47.1992187500,755,884.7656250000,,, +47.2011718750,755,884.7656250000,,, +47.2031250000,755,884.7656250000,,, +47.2050781250,755,884.7656250000,,, +47.2070312500,755,884.7656250000,,, +47.2089843750,755,884.7656250000,,, +47.2109375000,755,884.7656250000,,, +47.2128906250,755,884.7656250000,,, +47.2148437500,755,884.7656250000,,, +47.2167968750,755,884.7656250000,,, +47.2187500000,755,884.7656250000,,, +47.2207031250,755,884.7656250000,,, +47.2226562500,755,884.7656250000,,, +47.2246093750,755,884.7656250000,,, +47.2265625000,755,884.7656250000,,, +47.2285156250,755,884.7656250000,,, +47.2304687500,755,884.7656250000,,, +47.2324218750,755,884.7656250000,,, +47.2343750000,755,884.7656250000,,, +47.2363281250,755,884.7656250000,,, +47.2382812500,755,884.7656250000,,, +47.2402343750,755,884.7656250000,,, +47.2421875000,755,884.7656250000,,, +47.2441406250,755,884.7656250000,,, +47.2460937500,755,884.7656250000,,, +47.2480468750,755,884.7656250000,,, +47.2500000000,756,880.8593750000,,, +47.2519531250,756,880.8593750000,,, +47.2539062500,756,880.8593750000,,, +47.2558593750,756,880.8593750000,,, +47.2578125000,756,880.8593750000,,, +47.2597656250,756,880.8593750000,,, +47.2617187500,756,880.8593750000,,, +47.2636718750,756,880.8593750000,,, +47.2656250000,756,880.8593750000,,, +47.2675781250,756,880.8593750000,,, +47.2695312500,756,880.8593750000,,, +47.2714843750,756,880.8593750000,,, +47.2734375000,756,880.8593750000,,, +47.2753906250,756,880.8593750000,,, +47.2773437500,756,880.8593750000,,, +47.2792968750,756,880.8593750000,,, +47.2812500000,756,880.8593750000,,, +47.2832031250,756,880.8593750000,,, +47.2851562500,756,880.8593750000,,, +47.2871093750,756,880.8593750000,,, +47.2890625000,756,880.8593750000,,, +47.2910156250,756,880.8593750000,,, +47.2929687500,756,880.8593750000,,, +47.2949218750,756,880.8593750000,,, +47.2968750000,756,880.8593750000,,, +47.2988281250,756,880.8593750000,,, +47.3007812500,756,880.8593750000,,, +47.3027343750,756,880.8593750000,,, +47.3046875000,756,880.8593750000,,, +47.3066406250,756,880.8593750000,,, +47.3085937500,756,880.8593750000,,, +47.3105468750,756,880.8593750000,,, +47.3125000000,757,880.8593750000,,, +47.3144531250,757,880.8593750000,,, +47.3164062500,757,880.8593750000,,, +47.3183593750,757,880.8593750000,,, +47.3203125000,757,880.8593750000,,, +47.3222656250,757,880.8593750000,,, +47.3242187500,757,880.8593750000,,, +47.3261718750,757,880.8593750000,,, +47.3281250000,757,880.8593750000,,, +47.3300781250,757,880.8593750000,,, +47.3320312500,757,880.8593750000,,, +47.3339843750,757,880.8593750000,,, +47.3359375000,757,880.8593750000,,, +47.3378906250,757,880.8593750000,,, +47.3398437500,757,880.8593750000,,, +47.3417968750,757,880.8593750000,,, +47.3437500000,757,880.8593750000,,, +47.3457031250,757,880.8593750000,,, +47.3476562500,757,880.8593750000,,, +47.3496093750,757,880.8593750000,,, +47.3515625000,757,880.8593750000,,, +47.3535156250,757,880.8593750000,,, +47.3554687500,757,880.8593750000,,, +47.3574218750,757,880.8593750000,,, +47.3593750000,757,880.8593750000,,, +47.3613281250,757,880.8593750000,,, +47.3632812500,757,880.8593750000,,, +47.3652343750,757,880.8593750000,,, +47.3671875000,757,880.8593750000,,, +47.3691406250,757,880.8593750000,,, +47.3710937500,757,880.8593750000,,, +47.3730468750,757,880.8593750000,,, +47.3750000000,758,880.8593750000,,, +47.3769531250,758,880.8593750000,,, +47.3789062500,758,880.8593750000,,, +47.3808593750,758,880.8593750000,,, +47.3828125000,758,880.8593750000,,, +47.3847656250,758,880.8593750000,,, +47.3867187500,758,880.8593750000,,, +47.3886718750,758,880.8593750000,,, +47.3906250000,758,880.8593750000,,, +47.3925781250,758,880.8593750000,,, +47.3945312500,758,880.8593750000,,, +47.3964843750,758,880.8593750000,,, +47.3984375000,758,880.8593750000,,, +47.4003906250,758,880.8593750000,,, +47.4023437500,758,880.8593750000,,, +47.4042968750,758,880.8593750000,,, +47.4062500000,758,880.8593750000,,, +47.4082031250,758,880.8593750000,,, +47.4101562500,758,880.8593750000,,, +47.4121093750,758,880.8593750000,,, +47.4140625000,758,880.8593750000,,, +47.4160156250,758,880.8593750000,,, +47.4179687500,758,880.8593750000,,, +47.4199218750,758,880.8593750000,,, +47.4218750000,758,880.8593750000,,, +47.4238281250,758,880.8593750000,,, +47.4257812500,758,880.8593750000,,, +47.4277343750,758,880.8593750000,,, +47.4296875000,758,880.8593750000,,, +47.4316406250,758,880.8593750000,,, +47.4335937500,758,880.8593750000,,, +47.4355468750,758,880.8593750000,,, +47.4375000000,759,880.8593750000,,, +47.4394531250,759,880.8593750000,,, +47.4414062500,759,880.8593750000,,, +47.4433593750,759,880.8593750000,,, +47.4453125000,759,880.8593750000,,, +47.4472656250,759,880.8593750000,,, +47.4492187500,759,880.8593750000,,, +47.4511718750,759,880.8593750000,,, +47.4531250000,759,880.8593750000,,, +47.4550781250,759,880.8593750000,,, +47.4570312500,759,880.8593750000,,, +47.4589843750,759,880.8593750000,,, +47.4609375000,759,880.8593750000,,, +47.4628906250,759,880.8593750000,,, +47.4648437500,759,880.8593750000,,, +47.4667968750,759,880.8593750000,,, +47.4687500000,759,880.8593750000,,, +47.4707031250,759,880.8593750000,,, +47.4726562500,759,880.8593750000,,, +47.4746093750,759,880.8593750000,,, +47.4765625000,759,880.8593750000,,, +47.4785156250,759,880.8593750000,,, +47.4804687500,759,880.8593750000,,, +47.4824218750,759,880.8593750000,,, +47.4843750000,759,880.8593750000,,, +47.4863281250,759,880.8593750000,,, +47.4882812500,759,880.8593750000,,, +47.4902343750,759,880.8593750000,,, +47.4921875000,759,880.8593750000,,, +47.4941406250,759,880.8593750000,,, +47.4960937500,759,880.8593750000,,, +47.4980468750,759,880.8593750000,,, +47.5000000000,760,880.8593750000,,, +47.5019531250,760,880.8593750000,,, +47.5039062500,760,880.8593750000,,, +47.5058593750,760,880.8593750000,,, +47.5078125000,760,880.8593750000,,, +47.5097656250,760,880.8593750000,,, +47.5117187500,760,880.8593750000,,, +47.5136718750,760,880.8593750000,,, +47.5156250000,760,880.8593750000,,, +47.5175781250,760,880.8593750000,,, +47.5195312500,760,880.8593750000,,, +47.5214843750,760,880.8593750000,,, +47.5234375000,760,880.8593750000,,, +47.5253906250,760,880.8593750000,,, +47.5273437500,760,880.8593750000,,, +47.5292968750,760,880.8593750000,,, +47.5312500000,760,880.8593750000,,, +47.5332031250,760,880.8593750000,,, +47.5351562500,760,880.8593750000,,, +47.5371093750,760,880.8593750000,,, +47.5390625000,760,880.8593750000,,, +47.5410156250,760,880.8593750000,,, +47.5429687500,760,880.8593750000,,, +47.5449218750,760,880.8593750000,,, +47.5468750000,760,880.8593750000,,, +47.5488281250,760,880.8593750000,,, +47.5507812500,760,880.8593750000,,, +47.5527343750,760,880.8593750000,,, +47.5546875000,760,880.8593750000,,, +47.5566406250,760,880.8593750000,,, +47.5585937500,760,880.8593750000,,, +47.5605468750,760,880.8593750000,,, +47.5625000000,761,880.8593750000,,, +47.5644531250,761,880.8593750000,,, +47.5664062500,761,880.8593750000,,, +47.5683593750,761,880.8593750000,,, +47.5703125000,761,880.8593750000,,, +47.5722656250,761,880.8593750000,,, +47.5742187500,761,880.8593750000,,, +47.5761718750,761,880.8593750000,,, +47.5781250000,761,880.8593750000,,, +47.5800781250,761,880.8593750000,,, +47.5820312500,761,880.8593750000,,, +47.5839843750,761,880.8593750000,,, +47.5859375000,761,880.8593750000,,, +47.5878906250,761,880.8593750000,,, +47.5898437500,761,880.8593750000,,, +47.5917968750,761,880.8593750000,,, +47.5937500000,761,880.8593750000,,, +47.5957031250,761,880.8593750000,,, +47.5976562500,761,880.8593750000,,, +47.5996093750,761,880.8593750000,,, +47.6015625000,761,880.8593750000,,, +47.6035156250,761,880.8593750000,,, +47.6054687500,761,880.8593750000,,, +47.6074218750,761,880.8593750000,,, +47.6093750000,761,880.8593750000,,, +47.6113281250,761,880.8593750000,,, +47.6132812500,761,880.8593750000,,, +47.6152343750,761,880.8593750000,,, +47.6171875000,761,880.8593750000,,, +47.6191406250,761,880.8593750000,,, +47.6210937500,761,880.8593750000,,, +47.6230468750,761,880.8593750000,,, +47.6250000000,762,880.8593750000,,, +47.6269531250,762,880.8593750000,,, +47.6289062500,762,880.8593750000,,, +47.6308593750,762,880.8593750000,,, +47.6328125000,762,880.8593750000,,, +47.6347656250,762,880.8593750000,,, +47.6367187500,762,880.8593750000,,, +47.6386718750,762,880.8593750000,,, +47.6406250000,762,880.8593750000,,, +47.6425781250,762,880.8593750000,,, +47.6445312500,762,880.8593750000,,, +47.6464843750,762,880.8593750000,,, +47.6484375000,762,880.8593750000,,, +47.6503906250,762,880.8593750000,,, +47.6523437500,762,880.8593750000,,, +47.6542968750,762,880.8593750000,,, +47.6562500000,762,880.8593750000,,, +47.6582031250,762,880.8593750000,,, +47.6601562500,762,880.8593750000,,, +47.6621093750,762,880.8593750000,,, +47.6640625000,762,880.8593750000,,, +47.6660156250,762,880.8593750000,,, +47.6679687500,762,880.8593750000,,, +47.6699218750,762,880.8593750000,,, +47.6718750000,762,880.8593750000,,, +47.6738281250,762,880.8593750000,,, +47.6757812500,762,880.8593750000,,, +47.6777343750,762,880.8593750000,,, +47.6796875000,762,880.8593750000,,, +47.6816406250,762,880.8593750000,,, +47.6835937500,762,880.8593750000,,, +47.6855468750,762,880.8593750000,,, +47.6875000000,763,880.8593750000,,, +47.6894531250,763,880.8593750000,,, +47.6914062500,763,880.8593750000,,, +47.6933593750,763,880.8593750000,,, +47.6953125000,763,880.8593750000,,, +47.6972656250,763,880.8593750000,,, +47.6992187500,763,880.8593750000,,, +47.7011718750,763,880.8593750000,,, +47.7031250000,763,880.8593750000,,, +47.7050781250,763,880.8593750000,,, +47.7070312500,763,880.8593750000,,, +47.7089843750,763,880.8593750000,,, +47.7109375000,763,880.8593750000,,, +47.7128906250,763,880.8593750000,,, +47.7148437500,763,880.8593750000,,, +47.7167968750,763,880.8593750000,,, +47.7187500000,763,880.8593750000,,, +47.7207031250,763,880.8593750000,,, +47.7226562500,763,880.8593750000,,, +47.7246093750,763,880.8593750000,,, +47.7265625000,763,880.8593750000,,, +47.7285156250,763,880.8593750000,,, +47.7304687500,763,880.8593750000,,, +47.7324218750,763,880.8593750000,,, +47.7343750000,763,880.8593750000,,, +47.7363281250,763,880.8593750000,,, +47.7382812500,763,880.8593750000,,, +47.7402343750,763,880.8593750000,,, +47.7421875000,763,880.8593750000,,, +47.7441406250,763,880.8593750000,,, +47.7460937500,763,880.8593750000,,, +47.7480468750,763,880.8593750000,,, +47.7500000000,764,880.8593750000,,, +47.7519531250,764,880.8593750000,,, +47.7539062500,764,880.8593750000,,, +47.7558593750,764,880.8593750000,,, +47.7578125000,764,880.8593750000,,, +47.7597656250,764,880.8593750000,,, +47.7617187500,764,880.8593750000,,, +47.7636718750,764,880.8593750000,,, +47.7656250000,764,880.8593750000,,, +47.7675781250,764,880.8593750000,,, +47.7695312500,764,880.8593750000,,, +47.7714843750,764,880.8593750000,,, +47.7734375000,764,880.8593750000,,, +47.7753906250,764,880.8593750000,,, +47.7773437500,764,880.8593750000,,, +47.7792968750,764,880.8593750000,,, +47.7812500000,764,880.8593750000,,, +47.7832031250,764,880.8593750000,,, +47.7851562500,764,880.8593750000,,, +47.7871093750,764,880.8593750000,,, +47.7890625000,764,880.8593750000,,, +47.7910156250,764,880.8593750000,,, +47.7929687500,764,880.8593750000,,, +47.7949218750,764,880.8593750000,,, +47.7968750000,764,880.8593750000,,, +47.7988281250,764,880.8593750000,,, +47.8007812500,764,880.8593750000,,, +47.8027343750,764,880.8593750000,,, +47.8046875000,764,880.8593750000,,, +47.8066406250,764,880.8593750000,,, +47.8085937500,764,880.8593750000,,, +47.8105468750,764,880.8593750000,,, +47.8125000000,765,880.8593750000,,, +47.8144531250,765,880.8593750000,,, +47.8164062500,765,880.8593750000,,, +47.8183593750,765,880.8593750000,,, +47.8203125000,765,880.8593750000,,, +47.8222656250,765,880.8593750000,,, +47.8242187500,765,880.8593750000,,, +47.8261718750,765,880.8593750000,,, +47.8281250000,765,880.8593750000,,, +47.8300781250,765,880.8593750000,,, +47.8320312500,765,880.8593750000,,, +47.8339843750,765,880.8593750000,,, +47.8359375000,765,880.8593750000,,, +47.8378906250,765,880.8593750000,,, +47.8398437500,765,880.8593750000,,, +47.8417968750,765,880.8593750000,,, +47.8437500000,765,880.8593750000,,, +47.8457031250,765,880.8593750000,,, +47.8476562500,765,880.8593750000,,, +47.8496093750,765,880.8593750000,,, +47.8515625000,765,880.8593750000,,, +47.8535156250,765,880.8593750000,,, +47.8554687500,765,880.8593750000,,, +47.8574218750,765,880.8593750000,,, +47.8593750000,765,880.8593750000,,, +47.8613281250,765,880.8593750000,,, +47.8632812500,765,880.8593750000,,, +47.8652343750,765,880.8593750000,,, +47.8671875000,765,880.8593750000,,, +47.8691406250,765,880.8593750000,,, +47.8710937500,765,880.8593750000,,, +47.8730468750,765,880.8593750000,,, +47.8750000000,766,880.8593750000,,, +47.8769531250,766,880.8593750000,,, +47.8789062500,766,880.8593750000,,, +47.8808593750,766,880.8593750000,,, +47.8828125000,766,880.8593750000,,, +47.8847656250,766,880.8593750000,,, +47.8867187500,766,880.8593750000,,, +47.8886718750,766,880.8593750000,,, +47.8906250000,766,880.8593750000,,, +47.8925781250,766,880.8593750000,,, +47.8945312500,766,880.8593750000,,, +47.8964843750,766,880.8593750000,,, +47.8984375000,766,880.8593750000,,, +47.9003906250,766,880.8593750000,,, +47.9023437500,766,880.8593750000,,, +47.9042968750,766,880.8593750000,,, +47.9062500000,766,880.8593750000,,, +47.9082031250,766,880.8593750000,,, +47.9101562500,766,880.8593750000,,, +47.9121093750,766,880.8593750000,,, +47.9140625000,766,880.8593750000,,, +47.9160156250,766,880.8593750000,,, +47.9179687500,766,880.8593750000,,, +47.9199218750,766,880.8593750000,,, +47.9218750000,766,880.8593750000,,, +47.9238281250,766,880.8593750000,,, +47.9257812500,766,880.8593750000,,, +47.9277343750,766,880.8593750000,,, +47.9296875000,766,880.8593750000,,, +47.9316406250,766,880.8593750000,,, +47.9335937500,766,880.8593750000,,, +47.9355468750,766,880.8593750000,,, +47.9375000000,767,880.8593750000,,, +47.9394531250,767,880.8593750000,,, +47.9414062500,767,880.8593750000,,, +47.9433593750,767,880.8593750000,,, +47.9453125000,767,880.8593750000,,, +47.9472656250,767,880.8593750000,,, +47.9492187500,767,880.8593750000,,, +47.9511718750,767,880.8593750000,,, +47.9531250000,767,880.8593750000,,, +47.9550781250,767,880.8593750000,,, +47.9570312500,767,880.8593750000,,, +47.9589843750,767,880.8593750000,,, +47.9609375000,767,880.8593750000,,, +47.9628906250,767,880.8593750000,,, +47.9648437500,767,880.8593750000,,, +47.9667968750,767,880.8593750000,,, +47.9687500000,767,880.8593750000,,, +47.9707031250,767,880.8593750000,,, +47.9726562500,767,880.8593750000,,, +47.9746093750,767,880.8593750000,,, +47.9765625000,767,880.8593750000,,, +47.9785156250,767,880.8593750000,,, +47.9804687500,767,880.8593750000,,, +47.9824218750,767,880.8593750000,,, +47.9843750000,767,880.8593750000,,, +47.9863281250,767,880.8593750000,,, +47.9882812500,767,880.8593750000,,, +47.9902343750,767,880.8593750000,,, +47.9921875000,767,880.8593750000,,, +47.9941406250,767,880.8593750000,,, +47.9960937500,767,880.8593750000,,, +47.9980468750,767,880.8593750000,,, +48.0000000000,768,880.8593750000,,, +48.0019531250,768,880.8593750000,,, +48.0039062500,768,880.8593750000,,, +48.0058593750,768,880.8593750000,,, +48.0078125000,768,880.8593750000,,, +48.0097656250,768,880.8593750000,,, +48.0117187500,768,880.8593750000,,, +48.0136718750,768,880.8593750000,,, +48.0156250000,768,880.8593750000,,, +48.0175781250,768,880.8593750000,,, +48.0195312500,768,880.8593750000,,, +48.0214843750,768,880.8593750000,,, +48.0234375000,768,880.8593750000,,, +48.0253906250,768,880.8593750000,,, +48.0273437500,768,880.8593750000,,, +48.0292968750,768,880.8593750000,,, +48.0312500000,768,880.8593750000,,, +48.0332031250,768,880.8593750000,,, +48.0351562500,768,880.8593750000,,, +48.0371093750,768,880.8593750000,,, +48.0390625000,768,880.8593750000,,, +48.0410156250,768,880.8593750000,,, +48.0429687500,768,880.8593750000,,, +48.0449218750,768,880.8593750000,,, +48.0468750000,768,880.8593750000,,, +48.0488281250,768,880.8593750000,,, +48.0507812500,768,880.8593750000,,, +48.0527343750,768,880.8593750000,,, +48.0546875000,768,880.8593750000,,, +48.0566406250,768,880.8593750000,,, +48.0585937500,768,880.8593750000,,, +48.0605468750,768,880.8593750000,,, +48.0625000000,769,880.8593750000,,, +48.0644531250,769,880.8593750000,,, +48.0664062500,769,880.8593750000,,, +48.0683593750,769,880.8593750000,,, +48.0703125000,769,880.8593750000,,, +48.0722656250,769,880.8593750000,,, +48.0742187500,769,880.8593750000,,, +48.0761718750,769,880.8593750000,,, +48.0781250000,769,880.8593750000,,, +48.0800781250,769,880.8593750000,,, +48.0820312500,769,880.8593750000,,, +48.0839843750,769,880.8593750000,,, +48.0859375000,769,880.8593750000,,, +48.0878906250,769,880.8593750000,,, +48.0898437500,769,880.8593750000,,, +48.0917968750,769,880.8593750000,,, +48.0937500000,769,880.8593750000,,, +48.0957031250,769,880.8593750000,,, +48.0976562500,769,880.8593750000,,, +48.0996093750,769,880.8593750000,,, +48.1015625000,769,880.8593750000,,, +48.1035156250,769,880.8593750000,,, +48.1054687500,769,880.8593750000,,, +48.1074218750,769,880.8593750000,,, +48.1093750000,769,880.8593750000,,, +48.1113281250,769,880.8593750000,,, +48.1132812500,769,880.8593750000,,, +48.1152343750,769,880.8593750000,,, +48.1171875000,769,880.8593750000,,, +48.1191406250,769,880.8593750000,,, +48.1210937500,769,880.8593750000,,, +48.1230468750,769,880.8593750000,,, +48.1250000000,770,880.8593750000,,, +48.1269531250,770,880.8593750000,,, +48.1289062500,770,880.8593750000,,, +48.1308593750,770,880.8593750000,,, +48.1328125000,770,880.8593750000,,, +48.1347656250,770,880.8593750000,,, +48.1367187500,770,880.8593750000,,, +48.1386718750,770,880.8593750000,,, +48.1406250000,770,880.8593750000,,, +48.1425781250,770,880.8593750000,,, +48.1445312500,770,880.8593750000,,, +48.1464843750,770,880.8593750000,,, +48.1484375000,770,880.8593750000,,, +48.1503906250,770,880.8593750000,,, +48.1523437500,770,880.8593750000,,, +48.1542968750,770,880.8593750000,,, +48.1562500000,770,880.8593750000,,, +48.1582031250,770,880.8593750000,,, +48.1601562500,770,880.8593750000,,, +48.1621093750,770,880.8593750000,,, +48.1640625000,770,880.8593750000,,, +48.1660156250,770,880.8593750000,,, +48.1679687500,770,880.8593750000,,, +48.1699218750,770,880.8593750000,,, +48.1718750000,770,880.8593750000,,, +48.1738281250,770,880.8593750000,,, +48.1757812500,770,880.8593750000,,, +48.1777343750,770,880.8593750000,,, +48.1796875000,770,880.8593750000,,, +48.1816406250,770,880.8593750000,,, +48.1835937500,770,880.8593750000,,, +48.1855468750,770,880.8593750000,,, +48.1875000000,771,880.8593750000,,, +48.1894531250,771,880.8593750000,,, +48.1914062500,771,880.8593750000,,, +48.1933593750,771,880.8593750000,,, +48.1953125000,771,880.8593750000,,, +48.1972656250,771,880.8593750000,,, +48.1992187500,771,880.8593750000,,, +48.2011718750,771,880.8593750000,,, +48.2031250000,771,880.8593750000,,, +48.2050781250,771,880.8593750000,,, +48.2070312500,771,880.8593750000,,, +48.2089843750,771,880.8593750000,,, +48.2109375000,771,880.8593750000,,, +48.2128906250,771,880.8593750000,,, +48.2148437500,771,880.8593750000,,, +48.2167968750,771,880.8593750000,,, +48.2187500000,771,880.8593750000,,, +48.2207031250,771,880.8593750000,,, +48.2226562500,771,880.8593750000,,, +48.2246093750,771,880.8593750000,,, +48.2265625000,771,880.8593750000,,, +48.2285156250,771,880.8593750000,,, +48.2304687500,771,880.8593750000,,, +48.2324218750,771,880.8593750000,,, +48.2343750000,771,880.8593750000,,, +48.2363281250,771,880.8593750000,,, +48.2382812500,771,880.8593750000,,, +48.2402343750,771,880.8593750000,,, +48.2421875000,771,880.8593750000,,, +48.2441406250,771,880.8593750000,,, +48.2460937500,771,880.8593750000,,, +48.2480468750,771,880.8593750000,,, +48.2500000000,772,916.0156250000,,, +48.2519531250,772,916.0156250000,,, +48.2539062500,772,916.0156250000,,, +48.2558593750,772,916.0156250000,,, +48.2578125000,772,916.0156250000,,, +48.2597656250,772,916.0156250000,,, +48.2617187500,772,916.0156250000,,, +48.2636718750,772,916.0156250000,,, +48.2656250000,772,916.0156250000,,, +48.2675781250,772,916.0156250000,,, +48.2695312500,772,916.0156250000,,, +48.2714843750,772,916.0156250000,,, +48.2734375000,772,916.0156250000,,, +48.2753906250,772,916.0156250000,,, +48.2773437500,772,916.0156250000,,, +48.2792968750,772,916.0156250000,,, +48.2812500000,772,916.0156250000,,, +48.2832031250,772,916.0156250000,,, +48.2851562500,772,916.0156250000,,, +48.2871093750,772,916.0156250000,,, +48.2890625000,772,916.0156250000,,, +48.2910156250,772,916.0156250000,,, +48.2929687500,772,916.0156250000,,, +48.2949218750,772,916.0156250000,,, +48.2968750000,772,916.0156250000,,, +48.2988281250,772,916.0156250000,,, +48.3007812500,772,916.0156250000,,, +48.3027343750,772,916.0156250000,,, +48.3046875000,772,916.0156250000,,, +48.3066406250,772,916.0156250000,,, +48.3085937500,772,916.0156250000,,, +48.3105468750,772,916.0156250000,,, +48.3125000000,773,916.0156250000,,, +48.3144531250,773,916.0156250000,,, +48.3164062500,773,916.0156250000,,, +48.3183593750,773,916.0156250000,,, +48.3203125000,773,916.0156250000,,, +48.3222656250,773,916.0156250000,,, +48.3242187500,773,916.0156250000,,, +48.3261718750,773,916.0156250000,,, +48.3281250000,773,916.0156250000,,, +48.3300781250,773,916.0156250000,,, +48.3320312500,773,916.0156250000,,, +48.3339843750,773,916.0156250000,,, +48.3359375000,773,916.0156250000,,, +48.3378906250,773,916.0156250000,,, +48.3398437500,773,916.0156250000,,, +48.3417968750,773,916.0156250000,,, +48.3437500000,773,916.0156250000,,, +48.3457031250,773,916.0156250000,,, +48.3476562500,773,916.0156250000,,, +48.3496093750,773,916.0156250000,,, +48.3515625000,773,916.0156250000,,, +48.3535156250,773,916.0156250000,,, +48.3554687500,773,916.0156250000,,, +48.3574218750,773,916.0156250000,,, +48.3593750000,773,916.0156250000,,, +48.3613281250,773,916.0156250000,,, +48.3632812500,773,916.0156250000,,, +48.3652343750,773,916.0156250000,,, +48.3671875000,773,916.0156250000,,, +48.3691406250,773,916.0156250000,,, +48.3710937500,773,916.0156250000,,, +48.3730468750,773,916.0156250000,,, +48.3750000000,774,916.0156250000,,, +48.3769531250,774,916.0156250000,,, +48.3789062500,774,916.0156250000,,, +48.3808593750,774,916.0156250000,,, +48.3828125000,774,916.0156250000,,, +48.3847656250,774,916.0156250000,,, +48.3867187500,774,916.0156250000,,, +48.3886718750,774,916.0156250000,,, +48.3906250000,774,916.0156250000,,, +48.3925781250,774,916.0156250000,,, +48.3945312500,774,916.0156250000,,, +48.3964843750,774,916.0156250000,,, +48.3984375000,774,916.0156250000,,, +48.4003906250,774,916.0156250000,,, +48.4023437500,774,916.0156250000,,, +48.4042968750,774,916.0156250000,,, +48.4062500000,774,916.0156250000,,, +48.4082031250,774,916.0156250000,,, +48.4101562500,774,916.0156250000,,, +48.4121093750,774,916.0156250000,,, +48.4140625000,774,916.0156250000,,, +48.4160156250,774,916.0156250000,,, +48.4179687500,774,916.0156250000,,, +48.4199218750,774,916.0156250000,,, +48.4218750000,774,916.0156250000,,, +48.4238281250,774,916.0156250000,,, +48.4257812500,774,916.0156250000,,, +48.4277343750,774,916.0156250000,,, +48.4296875000,774,916.0156250000,,, +48.4316406250,774,916.0156250000,,, +48.4335937500,774,916.0156250000,,, +48.4355468750,774,916.0156250000,,, +48.4375000000,775,916.0156250000,,, +48.4394531250,775,916.0156250000,,, +48.4414062500,775,916.0156250000,,, +48.4433593750,775,916.0156250000,,, +48.4453125000,775,916.0156250000,,, +48.4472656250,775,916.0156250000,,, +48.4492187500,775,916.0156250000,,, +48.4511718750,775,916.0156250000,,, +48.4531250000,775,916.0156250000,,, +48.4550781250,775,916.0156250000,,, +48.4570312500,775,916.0156250000,,, +48.4589843750,775,916.0156250000,,, +48.4609375000,775,916.0156250000,,, +48.4628906250,775,916.0156250000,,, +48.4648437500,775,916.0156250000,,, +48.4667968750,775,916.0156250000,,, +48.4687500000,775,916.0156250000,,, +48.4707031250,775,916.0156250000,,, +48.4726562500,775,916.0156250000,,, +48.4746093750,775,916.0156250000,,, +48.4765625000,775,916.0156250000,,, +48.4785156250,775,916.0156250000,,, +48.4804687500,775,916.0156250000,,, +48.4824218750,775,916.0156250000,,, +48.4843750000,775,916.0156250000,,, +48.4863281250,775,916.0156250000,,, +48.4882812500,775,916.0156250000,,, +48.4902343750,775,916.0156250000,,, +48.4921875000,775,916.0156250000,,, +48.4941406250,775,916.0156250000,,, +48.4960937500,775,916.0156250000,,, +48.4980468750,775,916.0156250000,,, +48.5000000000,776,916.0156250000,,, +48.5019531250,776,916.0156250000,,, +48.5039062500,776,916.0156250000,,, +48.5058593750,776,916.0156250000,,, +48.5078125000,776,916.0156250000,,, +48.5097656250,776,916.0156250000,,, +48.5117187500,776,916.0156250000,,, +48.5136718750,776,916.0156250000,,, +48.5156250000,776,916.0156250000,,, +48.5175781250,776,916.0156250000,,, +48.5195312500,776,916.0156250000,,, +48.5214843750,776,916.0156250000,,, +48.5234375000,776,916.0156250000,,, +48.5253906250,776,916.0156250000,,, +48.5273437500,776,916.0156250000,,, +48.5292968750,776,916.0156250000,,, +48.5312500000,776,916.0156250000,,, +48.5332031250,776,916.0156250000,,, +48.5351562500,776,916.0156250000,,, +48.5371093750,776,916.0156250000,,, +48.5390625000,776,916.0156250000,,, +48.5410156250,776,916.0156250000,,, +48.5429687500,776,916.0156250000,,, +48.5449218750,776,916.0156250000,,, +48.5468750000,776,916.0156250000,,, +48.5488281250,776,916.0156250000,,, +48.5507812500,776,916.0156250000,,, +48.5527343750,776,916.0156250000,,, +48.5546875000,776,916.0156250000,,, +48.5566406250,776,916.0156250000,,, +48.5585937500,776,916.0156250000,,, +48.5605468750,776,916.0156250000,,, +48.5625000000,777,916.0156250000,,, +48.5644531250,777,916.0156250000,,, +48.5664062500,777,916.0156250000,,, +48.5683593750,777,916.0156250000,,, +48.5703125000,777,916.0156250000,,, +48.5722656250,777,916.0156250000,,, +48.5742187500,777,916.0156250000,,, +48.5761718750,777,916.0156250000,,, +48.5781250000,777,916.0156250000,,, +48.5800781250,777,916.0156250000,,, +48.5820312500,777,916.0156250000,,, +48.5839843750,777,916.0156250000,,, +48.5859375000,777,916.0156250000,,, +48.5878906250,777,916.0156250000,,, +48.5898437500,777,916.0156250000,,, +48.5917968750,777,916.0156250000,,, +48.5937500000,777,916.0156250000,,, +48.5957031250,777,916.0156250000,,, +48.5976562500,777,916.0156250000,,, +48.5996093750,777,916.0156250000,,, +48.6015625000,777,916.0156250000,,, +48.6035156250,777,916.0156250000,,, +48.6054687500,777,916.0156250000,,, +48.6074218750,777,916.0156250000,,, +48.6093750000,777,916.0156250000,,, +48.6113281250,777,916.0156250000,,, +48.6132812500,777,916.0156250000,,, +48.6152343750,777,916.0156250000,,, +48.6171875000,777,916.0156250000,,, +48.6191406250,777,916.0156250000,,, +48.6210937500,777,916.0156250000,,, +48.6230468750,777,916.0156250000,,, +48.6250000000,778,916.0156250000,,, +48.6269531250,778,916.0156250000,,, +48.6289062500,778,916.0156250000,,, +48.6308593750,778,916.0156250000,,, +48.6328125000,778,916.0156250000,,, +48.6347656250,778,916.0156250000,,, +48.6367187500,778,916.0156250000,,, +48.6386718750,778,916.0156250000,,, +48.6406250000,778,916.0156250000,,, +48.6425781250,778,916.0156250000,,, +48.6445312500,778,916.0156250000,,, +48.6464843750,778,916.0156250000,,, +48.6484375000,778,916.0156250000,,, +48.6503906250,778,916.0156250000,,, +48.6523437500,778,916.0156250000,,, +48.6542968750,778,916.0156250000,,, +48.6562500000,778,916.0156250000,,, +48.6582031250,778,916.0156250000,,, +48.6601562500,778,916.0156250000,,, +48.6621093750,778,916.0156250000,,, +48.6640625000,778,916.0156250000,,, +48.6660156250,778,916.0156250000,,, +48.6679687500,778,916.0156250000,,, +48.6699218750,778,916.0156250000,,, +48.6718750000,778,916.0156250000,,, +48.6738281250,778,916.0156250000,,, +48.6757812500,778,916.0156250000,,, +48.6777343750,778,916.0156250000,,, +48.6796875000,778,916.0156250000,,, +48.6816406250,778,916.0156250000,,, +48.6835937500,778,916.0156250000,,, +48.6855468750,778,916.0156250000,,, +48.6875000000,779,916.0156250000,,, +48.6894531250,779,916.0156250000,,, +48.6914062500,779,916.0156250000,,, +48.6933593750,779,916.0156250000,,, +48.6953125000,779,916.0156250000,,, +48.6972656250,779,916.0156250000,,, +48.6992187500,779,916.0156250000,,, +48.7011718750,779,916.0156250000,,, +48.7031250000,779,916.0156250000,,, +48.7050781250,779,916.0156250000,,, +48.7070312500,779,916.0156250000,,, +48.7089843750,779,916.0156250000,,, +48.7109375000,779,916.0156250000,,, +48.7128906250,779,916.0156250000,,, +48.7148437500,779,916.0156250000,,, +48.7167968750,779,916.0156250000,,, +48.7187500000,779,916.0156250000,,, +48.7207031250,779,916.0156250000,,, +48.7226562500,779,916.0156250000,,, +48.7246093750,779,916.0156250000,,, +48.7265625000,779,916.0156250000,,, +48.7285156250,779,916.0156250000,,, +48.7304687500,779,916.0156250000,,, +48.7324218750,779,916.0156250000,,, +48.7343750000,779,916.0156250000,,, +48.7363281250,779,916.0156250000,,, +48.7382812500,779,916.0156250000,,, +48.7402343750,779,916.0156250000,,, +48.7421875000,779,916.0156250000,,, +48.7441406250,779,916.0156250000,,, +48.7460937500,779,916.0156250000,,, +48.7480468750,779,916.0156250000,,, +48.7500000000,780,916.0156250000,,, +48.7519531250,780,916.0156250000,,, +48.7539062500,780,916.0156250000,,, +48.7558593750,780,916.0156250000,,, +48.7578125000,780,916.0156250000,,, +48.7597656250,780,916.0156250000,,, +48.7617187500,780,916.0156250000,,, +48.7636718750,780,916.0156250000,,, +48.7656250000,780,916.0156250000,,, +48.7675781250,780,916.0156250000,,, +48.7695312500,780,916.0156250000,,, +48.7714843750,780,916.0156250000,,, +48.7734375000,780,916.0156250000,,, +48.7753906250,780,916.0156250000,,, +48.7773437500,780,916.0156250000,,, +48.7792968750,780,916.0156250000,,, +48.7812500000,780,916.0156250000,,, +48.7832031250,780,916.0156250000,,, +48.7851562500,780,916.0156250000,,, +48.7871093750,780,916.0156250000,,, +48.7890625000,780,916.0156250000,,, +48.7910156250,780,916.0156250000,,, +48.7929687500,780,916.0156250000,,, +48.7949218750,780,916.0156250000,,, +48.7968750000,780,916.0156250000,,, +48.7988281250,780,916.0156250000,,, +48.8007812500,780,916.0156250000,,, +48.8027343750,780,916.0156250000,,, +48.8046875000,780,916.0156250000,,, +48.8066406250,780,916.0156250000,,, +48.8085937500,780,916.0156250000,,, +48.8105468750,780,916.0156250000,,, +48.8125000000,781,916.0156250000,,, +48.8144531250,781,916.0156250000,,, +48.8164062500,781,916.0156250000,,, +48.8183593750,781,916.0156250000,,, +48.8203125000,781,916.0156250000,,, +48.8222656250,781,916.0156250000,,, +48.8242187500,781,916.0156250000,,, +48.8261718750,781,916.0156250000,,, +48.8281250000,781,916.0156250000,,, +48.8300781250,781,916.0156250000,,, +48.8320312500,781,916.0156250000,,, +48.8339843750,781,916.0156250000,,, +48.8359375000,781,916.0156250000,,, +48.8378906250,781,916.0156250000,,, +48.8398437500,781,916.0156250000,,, +48.8417968750,781,916.0156250000,,, +48.8437500000,781,916.0156250000,,, +48.8457031250,781,916.0156250000,,, +48.8476562500,781,916.0156250000,,, +48.8496093750,781,916.0156250000,,, +48.8515625000,781,916.0156250000,,, +48.8535156250,781,916.0156250000,,, +48.8554687500,781,916.0156250000,,, +48.8574218750,781,916.0156250000,,, +48.8593750000,781,916.0156250000,,, +48.8613281250,781,916.0156250000,,, +48.8632812500,781,916.0156250000,,, +48.8652343750,781,916.0156250000,,, +48.8671875000,781,916.0156250000,,, +48.8691406250,781,916.0156250000,,, +48.8710937500,781,916.0156250000,,, +48.8730468750,781,916.0156250000,,, +48.8750000000,782,916.0156250000,,, +48.8769531250,782,916.0156250000,,, +48.8789062500,782,916.0156250000,,, +48.8808593750,782,916.0156250000,,, +48.8828125000,782,916.0156250000,,, +48.8847656250,782,916.0156250000,,, +48.8867187500,782,916.0156250000,,, +48.8886718750,782,916.0156250000,,, +48.8906250000,782,916.0156250000,,, +48.8925781250,782,916.0156250000,,, +48.8945312500,782,916.0156250000,,, +48.8964843750,782,916.0156250000,,, +48.8984375000,782,916.0156250000,,, +48.9003906250,782,916.0156250000,,, +48.9023437500,782,916.0156250000,,, +48.9042968750,782,916.0156250000,,, +48.9062500000,782,916.0156250000,,, +48.9082031250,782,916.0156250000,,, +48.9101562500,782,916.0156250000,,, +48.9121093750,782,916.0156250000,,, +48.9140625000,782,916.0156250000,,, +48.9160156250,782,916.0156250000,,, +48.9179687500,782,916.0156250000,,, +48.9199218750,782,916.0156250000,,, +48.9218750000,782,916.0156250000,,, +48.9238281250,782,916.0156250000,,, +48.9257812500,782,916.0156250000,,, +48.9277343750,782,916.0156250000,,, +48.9296875000,782,916.0156250000,,, +48.9316406250,782,916.0156250000,,, +48.9335937500,782,916.0156250000,,, +48.9355468750,782,916.0156250000,,, +48.9375000000,783,916.0156250000,,, +48.9394531250,783,916.0156250000,,, +48.9414062500,783,916.0156250000,,, +48.9433593750,783,916.0156250000,,, +48.9453125000,783,916.0156250000,,, +48.9472656250,783,916.0156250000,,, +48.9492187500,783,916.0156250000,,, +48.9511718750,783,916.0156250000,,, +48.9531250000,783,916.0156250000,,, +48.9550781250,783,916.0156250000,,, +48.9570312500,783,916.0156250000,,, +48.9589843750,783,916.0156250000,,, +48.9609375000,783,916.0156250000,,, +48.9628906250,783,916.0156250000,,, +48.9648437500,783,916.0156250000,,, +48.9667968750,783,916.0156250000,,, +48.9687500000,783,916.0156250000,,, +48.9707031250,783,916.0156250000,,, +48.9726562500,783,916.0156250000,,, +48.9746093750,783,916.0156250000,,, +48.9765625000,783,916.0156250000,,, +48.9785156250,783,916.0156250000,,, +48.9804687500,783,916.0156250000,,, +48.9824218750,783,916.0156250000,,, +48.9843750000,783,916.0156250000,,, +48.9863281250,783,916.0156250000,,, +48.9882812500,783,916.0156250000,,, +48.9902343750,783,916.0156250000,,, +48.9921875000,783,916.0156250000,,, +48.9941406250,783,916.0156250000,,, +48.9960937500,783,916.0156250000,,, +48.9980468750,783,916.0156250000,,, +49.0000000000,784,916.0156250000,,, +49.0019531250,784,916.0156250000,,, +49.0039062500,784,916.0156250000,,, +49.0058593750,784,916.0156250000,,, +49.0078125000,784,916.0156250000,,, +49.0097656250,784,916.0156250000,,, +49.0117187500,784,916.0156250000,,, +49.0136718750,784,916.0156250000,,, +49.0156250000,784,916.0156250000,,, +49.0175781250,784,916.0156250000,,, +49.0195312500,784,916.0156250000,,, +49.0214843750,784,916.0156250000,,, +49.0234375000,784,916.0156250000,,, +49.0253906250,784,916.0156250000,,, +49.0273437500,784,916.0156250000,,, +49.0292968750,784,916.0156250000,,, +49.0312500000,784,916.0156250000,,, +49.0332031250,784,916.0156250000,,, +49.0351562500,784,916.0156250000,,, +49.0371093750,784,916.0156250000,,, +49.0390625000,784,916.0156250000,,, +49.0410156250,784,916.0156250000,,, +49.0429687500,784,916.0156250000,,, +49.0449218750,784,916.0156250000,,, +49.0468750000,784,916.0156250000,,, +49.0488281250,784,916.0156250000,,, +49.0507812500,784,916.0156250000,,, +49.0527343750,784,916.0156250000,,, +49.0546875000,784,916.0156250000,,, +49.0566406250,784,916.0156250000,,, +49.0585937500,784,916.0156250000,,, +49.0605468750,784,916.0156250000,,, +49.0625000000,785,916.0156250000,,, +49.0644531250,785,916.0156250000,,, +49.0664062500,785,916.0156250000,,, +49.0683593750,785,916.0156250000,,, +49.0703125000,785,916.0156250000,,, +49.0722656250,785,916.0156250000,,, +49.0742187500,785,916.0156250000,,, +49.0761718750,785,916.0156250000,,, +49.0781250000,785,916.0156250000,,, +49.0800781250,785,916.0156250000,,, +49.0820312500,785,916.0156250000,,, +49.0839843750,785,916.0156250000,,, +49.0859375000,785,916.0156250000,,, +49.0878906250,785,916.0156250000,,, +49.0898437500,785,916.0156250000,,, +49.0917968750,785,916.0156250000,,, +49.0937500000,785,916.0156250000,,, +49.0957031250,785,916.0156250000,,, +49.0976562500,785,916.0156250000,,, +49.0996093750,785,916.0156250000,,, +49.1015625000,785,916.0156250000,,, +49.1035156250,785,916.0156250000,,, +49.1054687500,785,916.0156250000,,, +49.1074218750,785,916.0156250000,,, +49.1093750000,785,916.0156250000,,, +49.1113281250,785,916.0156250000,,, +49.1132812500,785,916.0156250000,,, +49.1152343750,785,916.0156250000,,, +49.1171875000,785,916.0156250000,,, +49.1191406250,785,916.0156250000,,, +49.1210937500,785,916.0156250000,,, +49.1230468750,785,916.0156250000,,, +49.1250000000,786,916.0156250000,,, +49.1269531250,786,916.0156250000,,, +49.1289062500,786,916.0156250000,,, +49.1308593750,786,916.0156250000,,, +49.1328125000,786,916.0156250000,,, +49.1347656250,786,916.0156250000,,, +49.1367187500,786,916.0156250000,,, +49.1386718750,786,916.0156250000,,, +49.1406250000,786,916.0156250000,,, +49.1425781250,786,916.0156250000,,, +49.1445312500,786,916.0156250000,,, +49.1464843750,786,916.0156250000,,, +49.1484375000,786,916.0156250000,,, +49.1503906250,786,916.0156250000,,, +49.1523437500,786,916.0156250000,,, +49.1542968750,786,916.0156250000,,, +49.1562500000,786,916.0156250000,,, +49.1582031250,786,916.0156250000,,, +49.1601562500,786,916.0156250000,,, +49.1621093750,786,916.0156250000,,, +49.1640625000,786,916.0156250000,,, +49.1660156250,786,916.0156250000,,, +49.1679687500,786,916.0156250000,,, +49.1699218750,786,916.0156250000,,, +49.1718750000,786,916.0156250000,,, +49.1738281250,786,916.0156250000,,, +49.1757812500,786,916.0156250000,,, +49.1777343750,786,916.0156250000,,, +49.1796875000,786,916.0156250000,,, +49.1816406250,786,916.0156250000,,, +49.1835937500,786,916.0156250000,,, +49.1855468750,786,916.0156250000,,, +49.1875000000,787,957.0312500000,,, +49.1894531250,787,957.0312500000,,, +49.1914062500,787,957.0312500000,,, +49.1933593750,787,957.0312500000,,, +49.1953125000,787,957.0312500000,,, +49.1972656250,787,957.0312500000,,, +49.1992187500,787,957.0312500000,,, +49.2011718750,787,957.0312500000,,, +49.2031250000,787,957.0312500000,,, +49.2050781250,787,957.0312500000,,, +49.2070312500,787,957.0312500000,,, +49.2089843750,787,957.0312500000,,, +49.2109375000,787,957.0312500000,,, +49.2128906250,787,957.0312500000,,, +49.2148437500,787,957.0312500000,,, +49.2167968750,787,957.0312500000,,, +49.2187500000,787,957.0312500000,,, +49.2207031250,787,957.0312500000,,, +49.2226562500,787,957.0312500000,,, +49.2246093750,787,957.0312500000,,, +49.2265625000,787,957.0312500000,,, +49.2285156250,787,957.0312500000,,, +49.2304687500,787,957.0312500000,,, +49.2324218750,787,957.0312500000,,, +49.2343750000,787,957.0312500000,,, +49.2363281250,787,957.0312500000,,, +49.2382812500,787,957.0312500000,,, +49.2402343750,787,957.0312500000,,, +49.2421875000,787,957.0312500000,,, +49.2441406250,787,957.0312500000,,, +49.2460937500,787,957.0312500000,,, +49.2480468750,787,957.0312500000,,, +49.2500000000,788,957.0312500000,,, +49.2519531250,788,957.0312500000,,, +49.2539062500,788,957.0312500000,,, +49.2558593750,788,957.0312500000,,, +49.2578125000,788,957.0312500000,,, +49.2597656250,788,957.0312500000,,, +49.2617187500,788,957.0312500000,,, +49.2636718750,788,957.0312500000,,, +49.2656250000,788,957.0312500000,,, +49.2675781250,788,957.0312500000,,, +49.2695312500,788,957.0312500000,,, +49.2714843750,788,957.0312500000,,, +49.2734375000,788,957.0312500000,,, +49.2753906250,788,957.0312500000,,, +49.2773437500,788,957.0312500000,,, +49.2792968750,788,957.0312500000,,, +49.2812500000,788,957.0312500000,,, +49.2832031250,788,957.0312500000,,, +49.2851562500,788,957.0312500000,,, +49.2871093750,788,957.0312500000,,, +49.2890625000,788,957.0312500000,,, +49.2910156250,788,957.0312500000,,, +49.2929687500,788,957.0312500000,,, +49.2949218750,788,957.0312500000,,, +49.2968750000,788,957.0312500000,,, +49.2988281250,788,957.0312500000,,, +49.3007812500,788,957.0312500000,,, +49.3027343750,788,957.0312500000,,, +49.3046875000,788,957.0312500000,,, +49.3066406250,788,957.0312500000,,, +49.3085937500,788,957.0312500000,,, +49.3105468750,788,957.0312500000,,, +49.3125000000,789,957.0312500000,,, +49.3144531250,789,957.0312500000,,, +49.3164062500,789,957.0312500000,,, +49.3183593750,789,957.0312500000,,, +49.3203125000,789,957.0312500000,,, +49.3222656250,789,957.0312500000,,, +49.3242187500,789,957.0312500000,,, +49.3261718750,789,957.0312500000,,, +49.3281250000,789,957.0312500000,,, +49.3300781250,789,957.0312500000,,, +49.3320312500,789,957.0312500000,,, +49.3339843750,789,957.0312500000,,, +49.3359375000,789,957.0312500000,,, +49.3378906250,789,957.0312500000,,, +49.3398437500,789,957.0312500000,,, +49.3417968750,789,957.0312500000,,, +49.3437500000,789,957.0312500000,,, +49.3457031250,789,957.0312500000,,, +49.3476562500,789,957.0312500000,,, +49.3496093750,789,957.0312500000,,, +49.3515625000,789,957.0312500000,,, +49.3535156250,789,957.0312500000,,, +49.3554687500,789,957.0312500000,,, +49.3574218750,789,957.0312500000,,, +49.3593750000,789,957.0312500000,,, +49.3613281250,789,957.0312500000,,, +49.3632812500,789,957.0312500000,,, +49.3652343750,789,957.0312500000,,, +49.3671875000,789,957.0312500000,,, +49.3691406250,789,957.0312500000,,, +49.3710937500,789,957.0312500000,,, +49.3730468750,789,957.0312500000,,, +49.3750000000,790,957.0312500000,,, +49.3769531250,790,957.0312500000,,, +49.3789062500,790,957.0312500000,,, +49.3808593750,790,957.0312500000,,, +49.3828125000,790,957.0312500000,,, +49.3847656250,790,957.0312500000,,, +49.3867187500,790,957.0312500000,,, +49.3886718750,790,957.0312500000,,, +49.3906250000,790,957.0312500000,,, +49.3925781250,790,957.0312500000,,, +49.3945312500,790,957.0312500000,,, +49.3964843750,790,957.0312500000,,, +49.3984375000,790,957.0312500000,,, +49.4003906250,790,957.0312500000,,, +49.4023437500,790,957.0312500000,,, +49.4042968750,790,957.0312500000,,, +49.4062500000,790,957.0312500000,,, +49.4082031250,790,957.0312500000,,, +49.4101562500,790,957.0312500000,,, +49.4121093750,790,957.0312500000,,, +49.4140625000,790,957.0312500000,,, +49.4160156250,790,957.0312500000,,, +49.4179687500,790,957.0312500000,,, +49.4199218750,790,957.0312500000,,, +49.4218750000,790,957.0312500000,,, +49.4238281250,790,957.0312500000,,, +49.4257812500,790,957.0312500000,,, +49.4277343750,790,957.0312500000,,, +49.4296875000,790,957.0312500000,,, +49.4316406250,790,957.0312500000,,, +49.4335937500,790,957.0312500000,,, +49.4355468750,790,957.0312500000,,, +49.4375000000,791,957.0312500000,,, +49.4394531250,791,957.0312500000,,, +49.4414062500,791,957.0312500000,,, +49.4433593750,791,957.0312500000,,, +49.4453125000,791,957.0312500000,,, +49.4472656250,791,957.0312500000,,, +49.4492187500,791,957.0312500000,,, +49.4511718750,791,957.0312500000,,, +49.4531250000,791,957.0312500000,,, +49.4550781250,791,957.0312500000,,, +49.4570312500,791,957.0312500000,,, +49.4589843750,791,957.0312500000,,, +49.4609375000,791,957.0312500000,,, +49.4628906250,791,957.0312500000,,, +49.4648437500,791,957.0312500000,,, +49.4667968750,791,957.0312500000,,, +49.4687500000,791,957.0312500000,,, +49.4707031250,791,957.0312500000,,, +49.4726562500,791,957.0312500000,,, +49.4746093750,791,957.0312500000,,, +49.4765625000,791,957.0312500000,,, +49.4785156250,791,957.0312500000,,, +49.4804687500,791,957.0312500000,,, +49.4824218750,791,957.0312500000,,, +49.4843750000,791,957.0312500000,,, +49.4863281250,791,957.0312500000,,, +49.4882812500,791,957.0312500000,,, +49.4902343750,791,957.0312500000,,, +49.4921875000,791,957.0312500000,,, +49.4941406250,791,957.0312500000,,, +49.4960937500,791,957.0312500000,,, +49.4980468750,791,957.0312500000,,, +49.5000000000,792,957.0312500000,,, +49.5019531250,792,957.0312500000,,, +49.5039062500,792,957.0312500000,,, +49.5058593750,792,957.0312500000,,, +49.5078125000,792,957.0312500000,,, +49.5097656250,792,957.0312500000,,, +49.5117187500,792,957.0312500000,,, +49.5136718750,792,957.0312500000,,, +49.5156250000,792,957.0312500000,,, +49.5175781250,792,957.0312500000,,, +49.5195312500,792,957.0312500000,,, +49.5214843750,792,957.0312500000,,, +49.5234375000,792,957.0312500000,,, +49.5253906250,792,957.0312500000,,, +49.5273437500,792,957.0312500000,,, +49.5292968750,792,957.0312500000,,, +49.5312500000,792,957.0312500000,,, +49.5332031250,792,957.0312500000,,, +49.5351562500,792,957.0312500000,,, +49.5371093750,792,957.0312500000,,, +49.5390625000,792,957.0312500000,,, +49.5410156250,792,957.0312500000,,, +49.5429687500,792,957.0312500000,,, +49.5449218750,792,957.0312500000,,, +49.5468750000,792,957.0312500000,,, +49.5488281250,792,957.0312500000,,, +49.5507812500,792,957.0312500000,,, +49.5527343750,792,957.0312500000,,, +49.5546875000,792,957.0312500000,,, +49.5566406250,792,957.0312500000,,, +49.5585937500,792,957.0312500000,,, +49.5605468750,792,957.0312500000,,, +49.5625000000,793,957.0312500000,,, +49.5644531250,793,957.0312500000,,, +49.5664062500,793,957.0312500000,,, +49.5683593750,793,957.0312500000,,, +49.5703125000,793,957.0312500000,,, +49.5722656250,793,957.0312500000,,, +49.5742187500,793,957.0312500000,,, +49.5761718750,793,957.0312500000,,, +49.5781250000,793,957.0312500000,,, +49.5800781250,793,957.0312500000,,, +49.5820312500,793,957.0312500000,,, +49.5839843750,793,957.0312500000,,, +49.5859375000,793,957.0312500000,,, +49.5878906250,793,957.0312500000,,, +49.5898437500,793,957.0312500000,,, +49.5917968750,793,957.0312500000,,, +49.5937500000,793,957.0312500000,,, +49.5957031250,793,957.0312500000,,, +49.5976562500,793,957.0312500000,,, +49.5996093750,793,957.0312500000,,, +49.6015625000,793,957.0312500000,,, +49.6035156250,793,957.0312500000,,, +49.6054687500,793,957.0312500000,,, +49.6074218750,793,957.0312500000,,, +49.6093750000,793,957.0312500000,,, +49.6113281250,793,957.0312500000,,, +49.6132812500,793,957.0312500000,,, +49.6152343750,793,957.0312500000,,, +49.6171875000,793,957.0312500000,,, +49.6191406250,793,957.0312500000,,, +49.6210937500,793,957.0312500000,,, +49.6230468750,793,957.0312500000,,, +49.6250000000,794,957.0312500000,,, +49.6269531250,794,957.0312500000,,, +49.6289062500,794,957.0312500000,,, +49.6308593750,794,957.0312500000,,, +49.6328125000,794,957.0312500000,,, +49.6347656250,794,957.0312500000,,, +49.6367187500,794,957.0312500000,,, +49.6386718750,794,957.0312500000,,, +49.6406250000,794,957.0312500000,,, +49.6425781250,794,957.0312500000,,, +49.6445312500,794,957.0312500000,,, +49.6464843750,794,957.0312500000,,, +49.6484375000,794,957.0312500000,,, +49.6503906250,794,957.0312500000,,, +49.6523437500,794,957.0312500000,,, +49.6542968750,794,957.0312500000,,, +49.6562500000,794,957.0312500000,,, +49.6582031250,794,957.0312500000,,, +49.6601562500,794,957.0312500000,,, +49.6621093750,794,957.0312500000,,, +49.6640625000,794,957.0312500000,,, +49.6660156250,794,957.0312500000,,, +49.6679687500,794,957.0312500000,,, +49.6699218750,794,957.0312500000,,, +49.6718750000,794,957.0312500000,,, +49.6738281250,794,957.0312500000,,, +49.6757812500,794,957.0312500000,,, +49.6777343750,794,957.0312500000,,, +49.6796875000,794,957.0312500000,,, +49.6816406250,794,957.0312500000,,, +49.6835937500,794,957.0312500000,,, +49.6855468750,794,957.0312500000,,, +49.6875000000,795,957.0312500000,,, +49.6894531250,795,957.0312500000,,, +49.6914062500,795,957.0312500000,,, +49.6933593750,795,957.0312500000,,, +49.6953125000,795,957.0312500000,,, +49.6972656250,795,957.0312500000,,, +49.6992187500,795,957.0312500000,,, +49.7011718750,795,957.0312500000,,, +49.7031250000,795,957.0312500000,,, +49.7050781250,795,957.0312500000,,, +49.7070312500,795,957.0312500000,,, +49.7089843750,795,957.0312500000,,, +49.7109375000,795,957.0312500000,,, +49.7128906250,795,957.0312500000,,, +49.7148437500,795,957.0312500000,,, +49.7167968750,795,957.0312500000,,, +49.7187500000,795,957.0312500000,,, +49.7207031250,795,957.0312500000,,, +49.7226562500,795,957.0312500000,,, +49.7246093750,795,957.0312500000,,, +49.7265625000,795,957.0312500000,,, +49.7285156250,795,957.0312500000,,, +49.7304687500,795,957.0312500000,,, +49.7324218750,795,957.0312500000,,, +49.7343750000,795,957.0312500000,,, +49.7363281250,795,957.0312500000,,, +49.7382812500,795,957.0312500000,,, +49.7402343750,795,957.0312500000,,, +49.7421875000,795,957.0312500000,,, +49.7441406250,795,957.0312500000,,, +49.7460937500,795,957.0312500000,,, +49.7480468750,795,957.0312500000,,, +49.7500000000,796,957.0312500000,,, +49.7519531250,796,957.0312500000,,, +49.7539062500,796,957.0312500000,,, +49.7558593750,796,957.0312500000,,, +49.7578125000,796,957.0312500000,,, +49.7597656250,796,957.0312500000,,, +49.7617187500,796,957.0312500000,,, +49.7636718750,796,957.0312500000,,, +49.7656250000,796,957.0312500000,,, +49.7675781250,796,957.0312500000,,, +49.7695312500,796,957.0312500000,,, +49.7714843750,796,957.0312500000,,, +49.7734375000,796,957.0312500000,,, +49.7753906250,796,957.0312500000,,, +49.7773437500,796,957.0312500000,,, +49.7792968750,796,957.0312500000,,, +49.7812500000,796,957.0312500000,,, +49.7832031250,796,957.0312500000,,, +49.7851562500,796,957.0312500000,,, +49.7871093750,796,957.0312500000,,, +49.7890625000,796,957.0312500000,,, +49.7910156250,796,957.0312500000,,, +49.7929687500,796,957.0312500000,,, +49.7949218750,796,957.0312500000,,, +49.7968750000,796,957.0312500000,,, +49.7988281250,796,957.0312500000,,, +49.8007812500,796,957.0312500000,,, +49.8027343750,796,957.0312500000,,, +49.8046875000,796,957.0312500000,,, +49.8066406250,796,957.0312500000,,, +49.8085937500,796,957.0312500000,,, +49.8105468750,796,957.0312500000,,, +49.8125000000,797,957.0312500000,,, +49.8144531250,797,957.0312500000,,, +49.8164062500,797,957.0312500000,,, +49.8183593750,797,957.0312500000,,, +49.8203125000,797,957.0312500000,,, +49.8222656250,797,957.0312500000,,, +49.8242187500,797,957.0312500000,,, +49.8261718750,797,957.0312500000,,, +49.8281250000,797,957.0312500000,,, +49.8300781250,797,957.0312500000,,, +49.8320312500,797,957.0312500000,,, +49.8339843750,797,957.0312500000,,, +49.8359375000,797,957.0312500000,,, +49.8378906250,797,957.0312500000,,, +49.8398437500,797,957.0312500000,,, +49.8417968750,797,957.0312500000,,, +49.8437500000,797,957.0312500000,,, +49.8457031250,797,957.0312500000,,, +49.8476562500,797,957.0312500000,,, +49.8496093750,797,957.0312500000,,, +49.8515625000,797,957.0312500000,,, +49.8535156250,797,957.0312500000,,, +49.8554687500,797,957.0312500000,,, +49.8574218750,797,957.0312500000,,, +49.8593750000,797,957.0312500000,,, +49.8613281250,797,957.0312500000,,, +49.8632812500,797,957.0312500000,,, +49.8652343750,797,957.0312500000,,, +49.8671875000,797,957.0312500000,,, +49.8691406250,797,957.0312500000,,, +49.8710937500,797,957.0312500000,,, +49.8730468750,797,957.0312500000,,, +49.8750000000,798,957.0312500000,,, +49.8769531250,798,957.0312500000,,, +49.8789062500,798,957.0312500000,,, +49.8808593750,798,957.0312500000,,, +49.8828125000,798,957.0312500000,,, +49.8847656250,798,957.0312500000,,, +49.8867187500,798,957.0312500000,,, +49.8886718750,798,957.0312500000,,, +49.8906250000,798,957.0312500000,,, +49.8925781250,798,957.0312500000,,, +49.8945312500,798,957.0312500000,,, +49.8964843750,798,957.0312500000,,, +49.8984375000,798,957.0312500000,,, +49.9003906250,798,957.0312500000,,, +49.9023437500,798,957.0312500000,,, +49.9042968750,798,957.0312500000,,, +49.9062500000,798,957.0312500000,,, +49.9082031250,798,957.0312500000,,, +49.9101562500,798,957.0312500000,,, +49.9121093750,798,957.0312500000,,, +49.9140625000,798,957.0312500000,,, +49.9160156250,798,957.0312500000,,, +49.9179687500,798,957.0312500000,,, +49.9199218750,798,957.0312500000,,, +49.9218750000,798,957.0312500000,,, +49.9238281250,798,957.0312500000,,, +49.9257812500,798,957.0312500000,,, +49.9277343750,798,957.0312500000,,, +49.9296875000,798,957.0312500000,,, +49.9316406250,798,957.0312500000,,, +49.9335937500,798,957.0312500000,,, +49.9355468750,798,957.0312500000,,, +49.9375000000,799,957.0312500000,,, +49.9394531250,799,957.0312500000,,, +49.9414062500,799,957.0312500000,,, +49.9433593750,799,957.0312500000,,, +49.9453125000,799,957.0312500000,,, +49.9472656250,799,957.0312500000,,, +49.9492187500,799,957.0312500000,,, +49.9511718750,799,957.0312500000,,, +49.9531250000,799,957.0312500000,,, +49.9550781250,799,957.0312500000,,, +49.9570312500,799,957.0312500000,,, +49.9589843750,799,957.0312500000,,, +49.9609375000,799,957.0312500000,,, +49.9628906250,799,957.0312500000,,, +49.9648437500,799,957.0312500000,,, +49.9667968750,799,957.0312500000,,, +49.9687500000,799,957.0312500000,,, +49.9707031250,799,957.0312500000,,, +49.9726562500,799,957.0312500000,,, +49.9746093750,799,957.0312500000,,, +49.9765625000,799,957.0312500000,,, +49.9785156250,799,957.0312500000,,, +49.9804687500,799,957.0312500000,,, +49.9824218750,799,957.0312500000,,, +49.9843750000,799,957.0312500000,,, +49.9863281250,799,957.0312500000,,, +49.9882812500,799,957.0312500000,,, +49.9902343750,799,957.0312500000,,, +49.9921875000,799,957.0312500000,,, +49.9941406250,799,957.0312500000,,, +49.9960937500,799,957.0312500000,,, +49.9980468750,799,957.0312500000,,, +50.0000000000,800,957.0312500000,,, +50.0019531250,800,957.0312500000,,, +50.0039062500,800,957.0312500000,,, +50.0058593750,800,957.0312500000,,, +50.0078125000,800,957.0312500000,,, +50.0097656250,800,957.0312500000,,, +50.0117187500,800,957.0312500000,,, +50.0136718750,800,957.0312500000,,, +50.0156250000,800,957.0312500000,,, +50.0175781250,800,957.0312500000,,, +50.0195312500,800,957.0312500000,,, +50.0214843750,800,957.0312500000,,, +50.0234375000,800,957.0312500000,,, +50.0253906250,800,957.0312500000,,, +50.0273437500,800,957.0312500000,,, +50.0292968750,800,957.0312500000,,, +50.0312500000,800,957.0312500000,,, +50.0332031250,800,957.0312500000,,, +50.0351562500,800,957.0312500000,,, +50.0371093750,800,957.0312500000,,, +50.0390625000,800,957.0312500000,,, +50.0410156250,800,957.0312500000,,, +50.0429687500,800,957.0312500000,,, +50.0449218750,800,957.0312500000,,, +50.0468750000,800,957.0312500000,,, +50.0488281250,800,957.0312500000,,, +50.0507812500,800,957.0312500000,,, +50.0527343750,800,957.0312500000,,, +50.0546875000,800,957.0312500000,,, +50.0566406250,800,957.0312500000,,, +50.0585937500,800,957.0312500000,,, +50.0605468750,800,957.0312500000,,, +50.0625000000,801,957.0312500000,,, +50.0644531250,801,957.0312500000,,, +50.0664062500,801,957.0312500000,,, +50.0683593750,801,957.0312500000,,, +50.0703125000,801,957.0312500000,,, +50.0722656250,801,957.0312500000,,, +50.0742187500,801,957.0312500000,,, +50.0761718750,801,957.0312500000,,, +50.0781250000,801,957.0312500000,,, +50.0800781250,801,957.0312500000,,, +50.0820312500,801,957.0312500000,,, +50.0839843750,801,957.0312500000,,, +50.0859375000,801,957.0312500000,,, +50.0878906250,801,957.0312500000,,, +50.0898437500,801,957.0312500000,,, +50.0917968750,801,957.0312500000,,, +50.0937500000,801,957.0312500000,,, +50.0957031250,801,957.0312500000,,, +50.0976562500,801,957.0312500000,,, +50.0996093750,801,957.0312500000,,, +50.1015625000,801,957.0312500000,,, +50.1035156250,801,957.0312500000,,, +50.1054687500,801,957.0312500000,,, +50.1074218750,801,957.0312500000,,, +50.1093750000,801,957.0312500000,,, +50.1113281250,801,957.0312500000,,, +50.1132812500,801,957.0312500000,,, +50.1152343750,801,957.0312500000,,, +50.1171875000,801,957.0312500000,,, +50.1191406250,801,957.0312500000,,, +50.1210937500,801,957.0312500000,,, +50.1230468750,801,957.0312500000,,, +50.1250000000,802,964.8437500000,,, +50.1269531250,802,964.8437500000,,, +50.1289062500,802,964.8437500000,,, +50.1308593750,802,964.8437500000,,, +50.1328125000,802,964.8437500000,,, +50.1347656250,802,964.8437500000,,, +50.1367187500,802,964.8437500000,,, +50.1386718750,802,964.8437500000,,, +50.1406250000,802,964.8437500000,,, +50.1425781250,802,964.8437500000,,, +50.1445312500,802,964.8437500000,,, +50.1464843750,802,964.8437500000,,, +50.1484375000,802,964.8437500000,,, +50.1503906250,802,964.8437500000,,, +50.1523437500,802,964.8437500000,,, +50.1542968750,802,964.8437500000,,, +50.1562500000,802,964.8437500000,,, +50.1582031250,802,964.8437500000,,, +50.1601562500,802,964.8437500000,,, +50.1621093750,802,964.8437500000,,, +50.1640625000,802,964.8437500000,,, +50.1660156250,802,964.8437500000,,, +50.1679687500,802,964.8437500000,,, +50.1699218750,802,964.8437500000,,, +50.1718750000,802,964.8437500000,,, +50.1738281250,802,964.8437500000,,, +50.1757812500,802,964.8437500000,,, +50.1777343750,802,964.8437500000,,, +50.1796875000,802,964.8437500000,,, +50.1816406250,802,964.8437500000,,, +50.1835937500,802,964.8437500000,,, +50.1855468750,802,964.8437500000,,, +50.1875000000,803,964.8437500000,,, +50.1894531250,803,964.8437500000,,, +50.1914062500,803,964.8437500000,,, +50.1933593750,803,964.8437500000,,, +50.1953125000,803,964.8437500000,,, +50.1972656250,803,964.8437500000,,, +50.1992187500,803,964.8437500000,,, +50.2011718750,803,964.8437500000,,, +50.2031250000,803,964.8437500000,,, +50.2050781250,803,964.8437500000,,, +50.2070312500,803,964.8437500000,,, +50.2089843750,803,964.8437500000,,, +50.2109375000,803,964.8437500000,,, +50.2128906250,803,964.8437500000,,, +50.2148437500,803,964.8437500000,,, +50.2167968750,803,964.8437500000,,, +50.2187500000,803,964.8437500000,,, +50.2207031250,803,964.8437500000,,, +50.2226562500,803,964.8437500000,,, +50.2246093750,803,964.8437500000,,, +50.2265625000,803,964.8437500000,,, +50.2285156250,803,964.8437500000,,, +50.2304687500,803,964.8437500000,,, +50.2324218750,803,964.8437500000,,, +50.2343750000,803,964.8437500000,,, +50.2363281250,803,964.8437500000,,, +50.2382812500,803,964.8437500000,,, +50.2402343750,803,964.8437500000,,, +50.2421875000,803,964.8437500000,,, +50.2441406250,803,964.8437500000,,, +50.2460937500,803,964.8437500000,,, +50.2480468750,803,964.8437500000,,, +50.2500000000,804,964.8437500000,,, +50.2519531250,804,964.8437500000,,, +50.2539062500,804,964.8437500000,,, +50.2558593750,804,964.8437500000,,, +50.2578125000,804,964.8437500000,,, +50.2597656250,804,964.8437500000,,, +50.2617187500,804,964.8437500000,,, +50.2636718750,804,964.8437500000,,, +50.2656250000,804,964.8437500000,,, +50.2675781250,804,964.8437500000,,, +50.2695312500,804,964.8437500000,,, +50.2714843750,804,964.8437500000,,, +50.2734375000,804,964.8437500000,,, +50.2753906250,804,964.8437500000,,, +50.2773437500,804,964.8437500000,,, +50.2792968750,804,964.8437500000,,, +50.2812500000,804,964.8437500000,,, +50.2832031250,804,964.8437500000,,, +50.2851562500,804,964.8437500000,,, +50.2871093750,804,964.8437500000,,, +50.2890625000,804,964.8437500000,,, +50.2910156250,804,964.8437500000,,, +50.2929687500,804,964.8437500000,,, +50.2949218750,804,964.8437500000,,, +50.2968750000,804,964.8437500000,,, +50.2988281250,804,964.8437500000,,, +50.3007812500,804,964.8437500000,,, +50.3027343750,804,964.8437500000,,, +50.3046875000,804,964.8437500000,,, +50.3066406250,804,964.8437500000,,, +50.3085937500,804,964.8437500000,,, +50.3105468750,804,964.8437500000,,, +50.3125000000,805,964.8437500000,,, +50.3144531250,805,964.8437500000,,, +50.3164062500,805,964.8437500000,,, +50.3183593750,805,964.8437500000,,, +50.3203125000,805,964.8437500000,,, +50.3222656250,805,964.8437500000,,, +50.3242187500,805,964.8437500000,,, +50.3261718750,805,964.8437500000,,, +50.3281250000,805,964.8437500000,,, +50.3300781250,805,964.8437500000,,, +50.3320312500,805,964.8437500000,,, +50.3339843750,805,964.8437500000,,, +50.3359375000,805,964.8437500000,,, +50.3378906250,805,964.8437500000,,, +50.3398437500,805,964.8437500000,,, +50.3417968750,805,964.8437500000,,, +50.3437500000,805,964.8437500000,,, +50.3457031250,805,964.8437500000,,, +50.3476562500,805,964.8437500000,,, +50.3496093750,805,964.8437500000,,, +50.3515625000,805,964.8437500000,,, +50.3535156250,805,964.8437500000,,, +50.3554687500,805,964.8437500000,,, +50.3574218750,805,964.8437500000,,, +50.3593750000,805,964.8437500000,,, +50.3613281250,805,964.8437500000,,, +50.3632812500,805,964.8437500000,,, +50.3652343750,805,964.8437500000,,, +50.3671875000,805,964.8437500000,,, +50.3691406250,805,964.8437500000,,, +50.3710937500,805,964.8437500000,,, +50.3730468750,805,964.8437500000,,, +50.3750000000,806,964.8437500000,,, +50.3769531250,806,964.8437500000,,, +50.3789062500,806,964.8437500000,,, +50.3808593750,806,964.8437500000,,, +50.3828125000,806,964.8437500000,,, +50.3847656250,806,964.8437500000,,, +50.3867187500,806,964.8437500000,,, +50.3886718750,806,964.8437500000,,, +50.3906250000,806,964.8437500000,,, +50.3925781250,806,964.8437500000,,, +50.3945312500,806,964.8437500000,,, +50.3964843750,806,964.8437500000,,, +50.3984375000,806,964.8437500000,,, +50.4003906250,806,964.8437500000,,, +50.4023437500,806,964.8437500000,,, +50.4042968750,806,964.8437500000,,, +50.4062500000,806,964.8437500000,,, +50.4082031250,806,964.8437500000,,, +50.4101562500,806,964.8437500000,,, +50.4121093750,806,964.8437500000,,, +50.4140625000,806,964.8437500000,,, +50.4160156250,806,964.8437500000,,, +50.4179687500,806,964.8437500000,,, +50.4199218750,806,964.8437500000,,, +50.4218750000,806,964.8437500000,,, +50.4238281250,806,964.8437500000,,, +50.4257812500,806,964.8437500000,,, +50.4277343750,806,964.8437500000,,, +50.4296875000,806,964.8437500000,,, +50.4316406250,806,964.8437500000,,, +50.4335937500,806,964.8437500000,,, +50.4355468750,806,964.8437500000,,, +50.4375000000,807,964.8437500000,,, +50.4394531250,807,964.8437500000,,, +50.4414062500,807,964.8437500000,,, +50.4433593750,807,964.8437500000,,, +50.4453125000,807,964.8437500000,,, +50.4472656250,807,964.8437500000,,, +50.4492187500,807,964.8437500000,,, +50.4511718750,807,964.8437500000,,, +50.4531250000,807,964.8437500000,,, +50.4550781250,807,964.8437500000,,, +50.4570312500,807,964.8437500000,,, +50.4589843750,807,964.8437500000,,, +50.4609375000,807,964.8437500000,,, +50.4628906250,807,964.8437500000,,, +50.4648437500,807,964.8437500000,,, +50.4667968750,807,964.8437500000,,, +50.4687500000,807,964.8437500000,,, +50.4707031250,807,964.8437500000,,, +50.4726562500,807,964.8437500000,,, +50.4746093750,807,964.8437500000,,, +50.4765625000,807,964.8437500000,,, +50.4785156250,807,964.8437500000,,, +50.4804687500,807,964.8437500000,,, +50.4824218750,807,964.8437500000,,, +50.4843750000,807,964.8437500000,,, +50.4863281250,807,964.8437500000,,, +50.4882812500,807,964.8437500000,,, +50.4902343750,807,964.8437500000,,, +50.4921875000,807,964.8437500000,,, +50.4941406250,807,964.8437500000,,, +50.4960937500,807,964.8437500000,,, +50.4980468750,807,964.8437500000,,, +50.5000000000,808,964.8437500000,,, +50.5019531250,808,964.8437500000,,, +50.5039062500,808,964.8437500000,,, +50.5058593750,808,964.8437500000,,, +50.5078125000,808,964.8437500000,,, +50.5097656250,808,964.8437500000,,, +50.5117187500,808,964.8437500000,,, +50.5136718750,808,964.8437500000,,, +50.5156250000,808,964.8437500000,,, +50.5175781250,808,964.8437500000,,, +50.5195312500,808,964.8437500000,,, +50.5214843750,808,964.8437500000,,, +50.5234375000,808,964.8437500000,,, +50.5253906250,808,964.8437500000,,, +50.5273437500,808,964.8437500000,,, +50.5292968750,808,964.8437500000,,, +50.5312500000,808,964.8437500000,,, +50.5332031250,808,964.8437500000,,, +50.5351562500,808,964.8437500000,,, +50.5371093750,808,964.8437500000,,, +50.5390625000,808,964.8437500000,,, +50.5410156250,808,964.8437500000,,, +50.5429687500,808,964.8437500000,,, +50.5449218750,808,964.8437500000,,, +50.5468750000,808,964.8437500000,,, +50.5488281250,808,964.8437500000,,, +50.5507812500,808,964.8437500000,,, +50.5527343750,808,964.8437500000,,, +50.5546875000,808,964.8437500000,,, +50.5566406250,808,964.8437500000,,, +50.5585937500,808,964.8437500000,,, +50.5605468750,808,964.8437500000,,, +50.5625000000,809,964.8437500000,,, +50.5644531250,809,964.8437500000,,, +50.5664062500,809,964.8437500000,,, +50.5683593750,809,964.8437500000,,, +50.5703125000,809,964.8437500000,,, +50.5722656250,809,964.8437500000,,, +50.5742187500,809,964.8437500000,,, +50.5761718750,809,964.8437500000,,, +50.5781250000,809,964.8437500000,,, +50.5800781250,809,964.8437500000,,, +50.5820312500,809,964.8437500000,,, +50.5839843750,809,964.8437500000,,, +50.5859375000,809,964.8437500000,,, +50.5878906250,809,964.8437500000,,, +50.5898437500,809,964.8437500000,,, +50.5917968750,809,964.8437500000,,, +50.5937500000,809,964.8437500000,,, +50.5957031250,809,964.8437500000,,, +50.5976562500,809,964.8437500000,,, +50.5996093750,809,964.8437500000,,, +50.6015625000,809,964.8437500000,,, +50.6035156250,809,964.8437500000,,, +50.6054687500,809,964.8437500000,,, +50.6074218750,809,964.8437500000,,, +50.6093750000,809,964.8437500000,,, +50.6113281250,809,964.8437500000,,, +50.6132812500,809,964.8437500000,,, +50.6152343750,809,964.8437500000,,, +50.6171875000,809,964.8437500000,,, +50.6191406250,809,964.8437500000,,, +50.6210937500,809,964.8437500000,,, +50.6230468750,809,964.8437500000,,, +50.6250000000,810,964.8437500000,,, +50.6269531250,810,964.8437500000,,, +50.6289062500,810,964.8437500000,,, +50.6308593750,810,964.8437500000,,, +50.6328125000,810,964.8437500000,,, +50.6347656250,810,964.8437500000,,, +50.6367187500,810,964.8437500000,,, +50.6386718750,810,964.8437500000,,, +50.6406250000,810,964.8437500000,,, +50.6425781250,810,964.8437500000,,, +50.6445312500,810,964.8437500000,,, +50.6464843750,810,964.8437500000,,, +50.6484375000,810,964.8437500000,,, +50.6503906250,810,964.8437500000,,, +50.6523437500,810,964.8437500000,,, +50.6542968750,810,964.8437500000,,, +50.6562500000,810,964.8437500000,,, +50.6582031250,810,964.8437500000,,, +50.6601562500,810,964.8437500000,,, +50.6621093750,810,964.8437500000,,, +50.6640625000,810,964.8437500000,,, +50.6660156250,810,964.8437500000,,, +50.6679687500,810,964.8437500000,,, +50.6699218750,810,964.8437500000,,, +50.6718750000,810,964.8437500000,,, +50.6738281250,810,964.8437500000,,, +50.6757812500,810,964.8437500000,,, +50.6777343750,810,964.8437500000,,, +50.6796875000,810,964.8437500000,,, +50.6816406250,810,964.8437500000,,, +50.6835937500,810,964.8437500000,,, +50.6855468750,810,964.8437500000,,, +50.6875000000,811,964.8437500000,,, +50.6894531250,811,964.8437500000,,, +50.6914062500,811,964.8437500000,,, +50.6933593750,811,964.8437500000,,, +50.6953125000,811,964.8437500000,,, +50.6972656250,811,964.8437500000,,, +50.6992187500,811,964.8437500000,,, +50.7011718750,811,964.8437500000,,, +50.7031250000,811,964.8437500000,,, +50.7050781250,811,964.8437500000,,, +50.7070312500,811,964.8437500000,,, +50.7089843750,811,964.8437500000,,, +50.7109375000,811,964.8437500000,,, +50.7128906250,811,964.8437500000,,, +50.7148437500,811,964.8437500000,,, +50.7167968750,811,964.8437500000,,, +50.7187500000,811,964.8437500000,,, +50.7207031250,811,964.8437500000,,, +50.7226562500,811,964.8437500000,,, +50.7246093750,811,964.8437500000,,, +50.7265625000,811,964.8437500000,,, +50.7285156250,811,964.8437500000,,, +50.7304687500,811,964.8437500000,,, +50.7324218750,811,964.8437500000,,, +50.7343750000,811,964.8437500000,,, +50.7363281250,811,964.8437500000,,, +50.7382812500,811,964.8437500000,,, +50.7402343750,811,964.8437500000,,, +50.7421875000,811,964.8437500000,,, +50.7441406250,811,964.8437500000,,, +50.7460937500,811,964.8437500000,,, +50.7480468750,811,964.8437500000,,, +50.7500000000,812,964.8437500000,,, +50.7519531250,812,964.8437500000,,, +50.7539062500,812,964.8437500000,,, +50.7558593750,812,964.8437500000,,, +50.7578125000,812,964.8437500000,,, +50.7597656250,812,964.8437500000,,, +50.7617187500,812,964.8437500000,,, +50.7636718750,812,964.8437500000,,, +50.7656250000,812,964.8437500000,,, +50.7675781250,812,964.8437500000,,, +50.7695312500,812,964.8437500000,,, +50.7714843750,812,964.8437500000,,, +50.7734375000,812,964.8437500000,,, +50.7753906250,812,964.8437500000,,, +50.7773437500,812,964.8437500000,,, +50.7792968750,812,964.8437500000,,, +50.7812500000,812,964.8437500000,,, +50.7832031250,812,964.8437500000,,, +50.7851562500,812,964.8437500000,,, +50.7871093750,812,964.8437500000,,, +50.7890625000,812,964.8437500000,,, +50.7910156250,812,964.8437500000,,, +50.7929687500,812,964.8437500000,,, +50.7949218750,812,964.8437500000,,, +50.7968750000,812,964.8437500000,,, +50.7988281250,812,964.8437500000,,, +50.8007812500,812,964.8437500000,,, +50.8027343750,812,964.8437500000,,, +50.8046875000,812,964.8437500000,,, +50.8066406250,812,964.8437500000,,, +50.8085937500,812,964.8437500000,,, +50.8105468750,812,964.8437500000,,, +50.8125000000,813,964.8437500000,,, +50.8144531250,813,964.8437500000,,, +50.8164062500,813,964.8437500000,,, +50.8183593750,813,964.8437500000,,, +50.8203125000,813,964.8437500000,,, +50.8222656250,813,964.8437500000,,, +50.8242187500,813,964.8437500000,,, +50.8261718750,813,964.8437500000,,, +50.8281250000,813,964.8437500000,,, +50.8300781250,813,964.8437500000,,, +50.8320312500,813,964.8437500000,,, +50.8339843750,813,964.8437500000,,, +50.8359375000,813,964.8437500000,,, +50.8378906250,813,964.8437500000,,, +50.8398437500,813,964.8437500000,,, +50.8417968750,813,964.8437500000,,, +50.8437500000,813,964.8437500000,,, +50.8457031250,813,964.8437500000,,, +50.8476562500,813,964.8437500000,,, +50.8496093750,813,964.8437500000,,, +50.8515625000,813,964.8437500000,,, +50.8535156250,813,964.8437500000,,, +50.8554687500,813,964.8437500000,,, +50.8574218750,813,964.8437500000,,, +50.8593750000,813,964.8437500000,,, +50.8613281250,813,964.8437500000,,, +50.8632812500,813,964.8437500000,,, +50.8652343750,813,964.8437500000,,, +50.8671875000,813,964.8437500000,,, +50.8691406250,813,964.8437500000,,, +50.8710937500,813,964.8437500000,,, +50.8730468750,813,964.8437500000,,, +50.8750000000,814,964.8437500000,,, +50.8769531250,814,964.8437500000,,, +50.8789062500,814,964.8437500000,,, +50.8808593750,814,964.8437500000,,, +50.8828125000,814,964.8437500000,,, +50.8847656250,814,964.8437500000,,, +50.8867187500,814,964.8437500000,,, +50.8886718750,814,964.8437500000,,, +50.8906250000,814,964.8437500000,,, +50.8925781250,814,964.8437500000,,, +50.8945312500,814,964.8437500000,,, +50.8964843750,814,964.8437500000,,, +50.8984375000,814,964.8437500000,,, +50.9003906250,814,964.8437500000,,, +50.9023437500,814,964.8437500000,,, +50.9042968750,814,964.8437500000,,, +50.9062500000,814,964.8437500000,,, +50.9082031250,814,964.8437500000,,, +50.9101562500,814,964.8437500000,,, +50.9121093750,814,964.8437500000,,, +50.9140625000,814,964.8437500000,,, +50.9160156250,814,964.8437500000,,, +50.9179687500,814,964.8437500000,,, +50.9199218750,814,964.8437500000,,, +50.9218750000,814,964.8437500000,,, +50.9238281250,814,964.8437500000,,, +50.9257812500,814,964.8437500000,,, +50.9277343750,814,964.8437500000,,, +50.9296875000,814,964.8437500000,,, +50.9316406250,814,964.8437500000,,, +50.9335937500,814,964.8437500000,,, +50.9355468750,814,964.8437500000,,, +50.9375000000,815,917.9687500000,,, +50.9394531250,815,917.9687500000,,, +50.9414062500,815,917.9687500000,,, +50.9433593750,815,917.9687500000,,, +50.9453125000,815,917.9687500000,,, +50.9472656250,815,917.9687500000,,, +50.9492187500,815,917.9687500000,,, +50.9511718750,815,917.9687500000,,, +50.9531250000,815,917.9687500000,,, +50.9550781250,815,917.9687500000,,, +50.9570312500,815,917.9687500000,,, +50.9589843750,815,917.9687500000,,, +50.9609375000,815,917.9687500000,,, +50.9628906250,815,917.9687500000,,, +50.9648437500,815,917.9687500000,,, +50.9667968750,815,917.9687500000,,, +50.9687500000,815,917.9687500000,,, +50.9707031250,815,917.9687500000,,, +50.9726562500,815,917.9687500000,,, +50.9746093750,815,917.9687500000,,, +50.9765625000,815,917.9687500000,,, +50.9785156250,815,917.9687500000,,, +50.9804687500,815,917.9687500000,,, +50.9824218750,815,917.9687500000,,, +50.9843750000,815,917.9687500000,,, +50.9863281250,815,917.9687500000,,, +50.9882812500,815,917.9687500000,,, +50.9902343750,815,917.9687500000,,, +50.9921875000,815,917.9687500000,,, +50.9941406250,815,917.9687500000,,, +50.9960937500,815,917.9687500000,,, +50.9980468750,815,917.9687500000,,, +51.0000000000,816,917.9687500000,,, +51.0019531250,816,917.9687500000,,, +51.0039062500,816,917.9687500000,,, +51.0058593750,816,917.9687500000,,, +51.0078125000,816,917.9687500000,,, +51.0097656250,816,917.9687500000,,, +51.0117187500,816,917.9687500000,,, +51.0136718750,816,917.9687500000,,, +51.0156250000,816,917.9687500000,,, +51.0175781250,816,917.9687500000,,, +51.0195312500,816,917.9687500000,,, +51.0214843750,816,917.9687500000,,, +51.0234375000,816,917.9687500000,,, +51.0253906250,816,917.9687500000,,, +51.0273437500,816,917.9687500000,,, +51.0292968750,816,917.9687500000,,, +51.0312500000,816,917.9687500000,,, +51.0332031250,816,917.9687500000,,, +51.0351562500,816,917.9687500000,,, +51.0371093750,816,917.9687500000,,, +51.0390625000,816,917.9687500000,,, +51.0410156250,816,917.9687500000,,, +51.0429687500,816,917.9687500000,,, +51.0449218750,816,917.9687500000,,, +51.0468750000,816,917.9687500000,,, +51.0488281250,816,917.9687500000,,, +51.0507812500,816,917.9687500000,,, +51.0527343750,816,917.9687500000,,, +51.0546875000,816,917.9687500000,,, +51.0566406250,816,917.9687500000,,, +51.0585937500,816,917.9687500000,,, +51.0605468750,816,917.9687500000,,, +51.0625000000,817,917.9687500000,,, +51.0644531250,817,917.9687500000,,, +51.0664062500,817,917.9687500000,,, +51.0683593750,817,917.9687500000,,, +51.0703125000,817,917.9687500000,,, +51.0722656250,817,917.9687500000,,, +51.0742187500,817,917.9687500000,,, +51.0761718750,817,917.9687500000,,, +51.0781250000,817,917.9687500000,,, +51.0800781250,817,917.9687500000,,, +51.0820312500,817,917.9687500000,,, +51.0839843750,817,917.9687500000,,, +51.0859375000,817,917.9687500000,,, +51.0878906250,817,917.9687500000,,, +51.0898437500,817,917.9687500000,,, +51.0917968750,817,917.9687500000,,, +51.0937500000,817,917.9687500000,,, +51.0957031250,817,917.9687500000,,, +51.0976562500,817,917.9687500000,,, +51.0996093750,817,917.9687500000,,, +51.1015625000,817,917.9687500000,,, +51.1035156250,817,917.9687500000,,, +51.1054687500,817,917.9687500000,,, +51.1074218750,817,917.9687500000,,, +51.1093750000,817,917.9687500000,,, +51.1113281250,817,917.9687500000,,, +51.1132812500,817,917.9687500000,,, +51.1152343750,817,917.9687500000,,, +51.1171875000,817,917.9687500000,,, +51.1191406250,817,917.9687500000,,, +51.1210937500,817,917.9687500000,,, +51.1230468750,817,917.9687500000,,, +51.1250000000,818,917.9687500000,,, +51.1269531250,818,917.9687500000,,, +51.1289062500,818,917.9687500000,,, +51.1308593750,818,917.9687500000,,, +51.1328125000,818,917.9687500000,,, +51.1347656250,818,917.9687500000,,, +51.1367187500,818,917.9687500000,,, +51.1386718750,818,917.9687500000,,, +51.1406250000,818,917.9687500000,,, +51.1425781250,818,917.9687500000,,, +51.1445312500,818,917.9687500000,,, +51.1464843750,818,917.9687500000,,, +51.1484375000,818,917.9687500000,,, +51.1503906250,818,917.9687500000,,, +51.1523437500,818,917.9687500000,,, +51.1542968750,818,917.9687500000,,, +51.1562500000,818,917.9687500000,,, +51.1582031250,818,917.9687500000,,, +51.1601562500,818,917.9687500000,,, +51.1621093750,818,917.9687500000,,, +51.1640625000,818,917.9687500000,,, +51.1660156250,818,917.9687500000,,, +51.1679687500,818,917.9687500000,,, +51.1699218750,818,917.9687500000,,, +51.1718750000,818,917.9687500000,,, +51.1738281250,818,917.9687500000,,, +51.1757812500,818,917.9687500000,,, +51.1777343750,818,917.9687500000,,, +51.1796875000,818,917.9687500000,,, +51.1816406250,818,917.9687500000,,, +51.1835937500,818,917.9687500000,,, +51.1855468750,818,917.9687500000,,, +51.1875000000,819,917.9687500000,,, +51.1894531250,819,917.9687500000,,, +51.1914062500,819,917.9687500000,,, +51.1933593750,819,917.9687500000,,, +51.1953125000,819,917.9687500000,,, +51.1972656250,819,917.9687500000,,, +51.1992187500,819,917.9687500000,,, +51.2011718750,819,917.9687500000,,, +51.2031250000,819,917.9687500000,,, +51.2050781250,819,917.9687500000,,, +51.2070312500,819,917.9687500000,,, +51.2089843750,819,917.9687500000,,, +51.2109375000,819,917.9687500000,,, +51.2128906250,819,917.9687500000,,, +51.2148437500,819,917.9687500000,,, +51.2167968750,819,917.9687500000,,, +51.2187500000,819,917.9687500000,,, +51.2207031250,819,917.9687500000,,, +51.2226562500,819,917.9687500000,,, +51.2246093750,819,917.9687500000,,, +51.2265625000,819,917.9687500000,,, +51.2285156250,819,917.9687500000,,, +51.2304687500,819,917.9687500000,,, +51.2324218750,819,917.9687500000,,, +51.2343750000,819,917.9687500000,,, +51.2363281250,819,917.9687500000,,, +51.2382812500,819,917.9687500000,,, +51.2402343750,819,917.9687500000,,, +51.2421875000,819,917.9687500000,,, +51.2441406250,819,917.9687500000,,, +51.2460937500,819,917.9687500000,,, +51.2480468750,819,917.9687500000,,, +51.2500000000,820,917.9687500000,,, +51.2519531250,820,917.9687500000,,, +51.2539062500,820,917.9687500000,,, +51.2558593750,820,917.9687500000,,, +51.2578125000,820,917.9687500000,,, +51.2597656250,820,917.9687500000,,, +51.2617187500,820,917.9687500000,,, +51.2636718750,820,917.9687500000,,, +51.2656250000,820,917.9687500000,,, +51.2675781250,820,917.9687500000,,, +51.2695312500,820,917.9687500000,,, +51.2714843750,820,917.9687500000,,, +51.2734375000,820,917.9687500000,,, +51.2753906250,820,917.9687500000,,, +51.2773437500,820,917.9687500000,,, +51.2792968750,820,917.9687500000,,, +51.2812500000,820,917.9687500000,,, +51.2832031250,820,917.9687500000,,, +51.2851562500,820,917.9687500000,,, +51.2871093750,820,917.9687500000,,, +51.2890625000,820,917.9687500000,,, +51.2910156250,820,917.9687500000,,, +51.2929687500,820,917.9687500000,,, +51.2949218750,820,917.9687500000,,, +51.2968750000,820,917.9687500000,,, +51.2988281250,820,917.9687500000,,, +51.3007812500,820,917.9687500000,,, +51.3027343750,820,917.9687500000,,, +51.3046875000,820,917.9687500000,,, +51.3066406250,820,917.9687500000,,, +51.3085937500,820,917.9687500000,,, +51.3105468750,820,917.9687500000,,, +51.3125000000,821,917.9687500000,,, +51.3144531250,821,917.9687500000,,, +51.3164062500,821,917.9687500000,,, +51.3183593750,821,917.9687500000,,, +51.3203125000,821,917.9687500000,,, +51.3222656250,821,917.9687500000,,, +51.3242187500,821,917.9687500000,,, +51.3261718750,821,917.9687500000,,, +51.3281250000,821,917.9687500000,,, +51.3300781250,821,917.9687500000,,, +51.3320312500,821,917.9687500000,,, +51.3339843750,821,917.9687500000,,, +51.3359375000,821,917.9687500000,,, +51.3378906250,821,917.9687500000,,, +51.3398437500,821,917.9687500000,,, +51.3417968750,821,917.9687500000,,, +51.3437500000,821,917.9687500000,,, +51.3457031250,821,917.9687500000,,, +51.3476562500,821,917.9687500000,,, +51.3496093750,821,917.9687500000,,, +51.3515625000,821,917.9687500000,,, +51.3535156250,821,917.9687500000,,, +51.3554687500,821,917.9687500000,,, +51.3574218750,821,917.9687500000,,, +51.3593750000,821,917.9687500000,,, +51.3613281250,821,917.9687500000,,, +51.3632812500,821,917.9687500000,,, +51.3652343750,821,917.9687500000,,, +51.3671875000,821,917.9687500000,,, +51.3691406250,821,917.9687500000,,, +51.3710937500,821,917.9687500000,,, +51.3730468750,821,917.9687500000,,, +51.3750000000,822,917.9687500000,,, +51.3769531250,822,917.9687500000,,, +51.3789062500,822,917.9687500000,,, +51.3808593750,822,917.9687500000,,, +51.3828125000,822,917.9687500000,,, +51.3847656250,822,917.9687500000,,, +51.3867187500,822,917.9687500000,,, +51.3886718750,822,917.9687500000,,, +51.3906250000,822,917.9687500000,,, +51.3925781250,822,917.9687500000,,, +51.3945312500,822,917.9687500000,,, +51.3964843750,822,917.9687500000,,, +51.3984375000,822,917.9687500000,,, +51.4003906250,822,917.9687500000,,, +51.4023437500,822,917.9687500000,,, +51.4042968750,822,917.9687500000,,, +51.4062500000,822,917.9687500000,,, +51.4082031250,822,917.9687500000,,, +51.4101562500,822,917.9687500000,,, +51.4121093750,822,917.9687500000,,, +51.4140625000,822,917.9687500000,,, +51.4160156250,822,917.9687500000,,, +51.4179687500,822,917.9687500000,,, +51.4199218750,822,917.9687500000,,, +51.4218750000,822,917.9687500000,,, +51.4238281250,822,917.9687500000,,, +51.4257812500,822,917.9687500000,,, +51.4277343750,822,917.9687500000,,, +51.4296875000,822,917.9687500000,,, +51.4316406250,822,917.9687500000,,, +51.4335937500,822,917.9687500000,,, +51.4355468750,822,917.9687500000,,, +51.4375000000,823,917.9687500000,,, +51.4394531250,823,917.9687500000,,, +51.4414062500,823,917.9687500000,,, +51.4433593750,823,917.9687500000,,, +51.4453125000,823,917.9687500000,,, +51.4472656250,823,917.9687500000,,, +51.4492187500,823,917.9687500000,,, +51.4511718750,823,917.9687500000,,, +51.4531250000,823,917.9687500000,,, +51.4550781250,823,917.9687500000,,, +51.4570312500,823,917.9687500000,,, +51.4589843750,823,917.9687500000,,, +51.4609375000,823,917.9687500000,,, +51.4628906250,823,917.9687500000,,, +51.4648437500,823,917.9687500000,,, +51.4667968750,823,917.9687500000,,, +51.4687500000,823,917.9687500000,,, +51.4707031250,823,917.9687500000,,, +51.4726562500,823,917.9687500000,,, +51.4746093750,823,917.9687500000,,, +51.4765625000,823,917.9687500000,,, +51.4785156250,823,917.9687500000,,, +51.4804687500,823,917.9687500000,,, +51.4824218750,823,917.9687500000,,, +51.4843750000,823,917.9687500000,,, +51.4863281250,823,917.9687500000,,, +51.4882812500,823,917.9687500000,,, +51.4902343750,823,917.9687500000,,, +51.4921875000,823,917.9687500000,,, +51.4941406250,823,917.9687500000,,, +51.4960937500,823,917.9687500000,,, +51.4980468750,823,917.9687500000,,, +51.5000000000,824,917.9687500000,,, +51.5019531250,824,917.9687500000,,, +51.5039062500,824,917.9687500000,,, +51.5058593750,824,917.9687500000,,, +51.5078125000,824,917.9687500000,,, +51.5097656250,824,917.9687500000,,, +51.5117187500,824,917.9687500000,,, +51.5136718750,824,917.9687500000,,, +51.5156250000,824,917.9687500000,,, +51.5175781250,824,917.9687500000,,, +51.5195312500,824,917.9687500000,,, +51.5214843750,824,917.9687500000,,, +51.5234375000,824,917.9687500000,,, +51.5253906250,824,917.9687500000,,, +51.5273437500,824,917.9687500000,,, +51.5292968750,824,917.9687500000,,, +51.5312500000,824,917.9687500000,,, +51.5332031250,824,917.9687500000,,, +51.5351562500,824,917.9687500000,,, +51.5371093750,824,917.9687500000,,, +51.5390625000,824,917.9687500000,,, +51.5410156250,824,917.9687500000,,, +51.5429687500,824,917.9687500000,,, +51.5449218750,824,917.9687500000,,, +51.5468750000,824,917.9687500000,,, +51.5488281250,824,917.9687500000,,, +51.5507812500,824,917.9687500000,,, +51.5527343750,824,917.9687500000,,, +51.5546875000,824,917.9687500000,,, +51.5566406250,824,917.9687500000,,, +51.5585937500,824,917.9687500000,,, +51.5605468750,824,917.9687500000,,, +51.5625000000,825,917.9687500000,,, +51.5644531250,825,917.9687500000,,, +51.5664062500,825,917.9687500000,,, +51.5683593750,825,917.9687500000,,, +51.5703125000,825,917.9687500000,,, +51.5722656250,825,917.9687500000,,, +51.5742187500,825,917.9687500000,,, +51.5761718750,825,917.9687500000,,, +51.5781250000,825,917.9687500000,,, +51.5800781250,825,917.9687500000,,, +51.5820312500,825,917.9687500000,,, +51.5839843750,825,917.9687500000,,, +51.5859375000,825,917.9687500000,,, +51.5878906250,825,917.9687500000,,, +51.5898437500,825,917.9687500000,,, +51.5917968750,825,917.9687500000,,, +51.5937500000,825,917.9687500000,,, +51.5957031250,825,917.9687500000,,, +51.5976562500,825,917.9687500000,,, +51.5996093750,825,917.9687500000,,, +51.6015625000,825,917.9687500000,,, +51.6035156250,825,917.9687500000,,, +51.6054687500,825,917.9687500000,,, +51.6074218750,825,917.9687500000,,, +51.6093750000,825,917.9687500000,,, +51.6113281250,825,917.9687500000,,, +51.6132812500,825,917.9687500000,,, +51.6152343750,825,917.9687500000,,, +51.6171875000,825,917.9687500000,,, +51.6191406250,825,917.9687500000,,, +51.6210937500,825,917.9687500000,,, +51.6230468750,825,917.9687500000,,, +51.6250000000,826,917.9687500000,,, +51.6269531250,826,917.9687500000,,, +51.6289062500,826,917.9687500000,,, +51.6308593750,826,917.9687500000,,, +51.6328125000,826,917.9687500000,,, +51.6347656250,826,917.9687500000,,, +51.6367187500,826,917.9687500000,,, +51.6386718750,826,917.9687500000,,, +51.6406250000,826,917.9687500000,,, +51.6425781250,826,917.9687500000,,, +51.6445312500,826,917.9687500000,,, +51.6464843750,826,917.9687500000,,, +51.6484375000,826,917.9687500000,,, +51.6503906250,826,917.9687500000,,, +51.6523437500,826,917.9687500000,,, +51.6542968750,826,917.9687500000,,, +51.6562500000,826,917.9687500000,,, +51.6582031250,826,917.9687500000,,, +51.6601562500,826,917.9687500000,,, +51.6621093750,826,917.9687500000,,, +51.6640625000,826,917.9687500000,,, +51.6660156250,826,917.9687500000,,, +51.6679687500,826,917.9687500000,,, +51.6699218750,826,917.9687500000,,, +51.6718750000,826,917.9687500000,,, +51.6738281250,826,917.9687500000,,, +51.6757812500,826,917.9687500000,,, +51.6777343750,826,917.9687500000,,, +51.6796875000,826,917.9687500000,,, +51.6816406250,826,917.9687500000,,, +51.6835937500,826,917.9687500000,,, +51.6855468750,826,917.9687500000,,, +51.6875000000,827,917.9687500000,,, +51.6894531250,827,917.9687500000,,, +51.6914062500,827,917.9687500000,,, +51.6933593750,827,917.9687500000,,, +51.6953125000,827,917.9687500000,,, +51.6972656250,827,917.9687500000,,, +51.6992187500,827,917.9687500000,,, +51.7011718750,827,917.9687500000,,, +51.7031250000,827,917.9687500000,,, +51.7050781250,827,917.9687500000,,, +51.7070312500,827,917.9687500000,,, +51.7089843750,827,917.9687500000,,, +51.7109375000,827,917.9687500000,,, +51.7128906250,827,917.9687500000,,, +51.7148437500,827,917.9687500000,,, +51.7167968750,827,917.9687500000,,, +51.7187500000,827,917.9687500000,,, +51.7207031250,827,917.9687500000,,, +51.7226562500,827,917.9687500000,,, +51.7246093750,827,917.9687500000,,, +51.7265625000,827,917.9687500000,,, +51.7285156250,827,917.9687500000,,, +51.7304687500,827,917.9687500000,,, +51.7324218750,827,917.9687500000,,, +51.7343750000,827,917.9687500000,,, +51.7363281250,827,917.9687500000,,, +51.7382812500,827,917.9687500000,,, +51.7402343750,827,917.9687500000,,, +51.7421875000,827,917.9687500000,,, +51.7441406250,827,917.9687500000,,, +51.7460937500,827,917.9687500000,,, +51.7480468750,827,917.9687500000,,, +51.7500000000,828,917.9687500000,,, +51.7519531250,828,917.9687500000,,, +51.7539062500,828,917.9687500000,,, +51.7558593750,828,917.9687500000,,, +51.7578125000,828,917.9687500000,,, +51.7597656250,828,917.9687500000,,, +51.7617187500,828,917.9687500000,,, +51.7636718750,828,917.9687500000,,, +51.7656250000,828,917.9687500000,,, +51.7675781250,828,917.9687500000,,, +51.7695312500,828,917.9687500000,,, +51.7714843750,828,917.9687500000,,, +51.7734375000,828,917.9687500000,,, +51.7753906250,828,917.9687500000,,, +51.7773437500,828,917.9687500000,,, +51.7792968750,828,917.9687500000,,, +51.7812500000,828,917.9687500000,,, +51.7832031250,828,917.9687500000,,, +51.7851562500,828,917.9687500000,,, +51.7871093750,828,917.9687500000,,, +51.7890625000,828,917.9687500000,,, +51.7910156250,828,917.9687500000,,, +51.7929687500,828,917.9687500000,,, +51.7949218750,828,917.9687500000,,, +51.7968750000,828,917.9687500000,,, +51.7988281250,828,917.9687500000,,, +51.8007812500,828,917.9687500000,,, +51.8027343750,828,917.9687500000,,, +51.8046875000,828,917.9687500000,,, +51.8066406250,828,917.9687500000,,, +51.8085937500,828,917.9687500000,,, +51.8105468750,828,917.9687500000,,, +51.8125000000,829,843.7500000000,,, +51.8144531250,829,843.7500000000,,, +51.8164062500,829,843.7500000000,,, +51.8183593750,829,843.7500000000,,, +51.8203125000,829,843.7500000000,,, +51.8222656250,829,843.7500000000,,, +51.8242187500,829,843.7500000000,,, +51.8261718750,829,843.7500000000,,, +51.8281250000,829,843.7500000000,,, +51.8300781250,829,843.7500000000,,, +51.8320312500,829,843.7500000000,,, +51.8339843750,829,843.7500000000,,, +51.8359375000,829,843.7500000000,,, +51.8378906250,829,843.7500000000,,, +51.8398437500,829,843.7500000000,,, +51.8417968750,829,843.7500000000,,, +51.8437500000,829,843.7500000000,,, +51.8457031250,829,843.7500000000,,, +51.8476562500,829,843.7500000000,,, +51.8496093750,829,843.7500000000,,, +51.8515625000,829,843.7500000000,,, +51.8535156250,829,843.7500000000,,, +51.8554687500,829,843.7500000000,,, +51.8574218750,829,843.7500000000,,, +51.8593750000,829,843.7500000000,,, +51.8613281250,829,843.7500000000,,, +51.8632812500,829,843.7500000000,,, +51.8652343750,829,843.7500000000,,, +51.8671875000,829,843.7500000000,,, +51.8691406250,829,843.7500000000,,, +51.8710937500,829,843.7500000000,,, +51.8730468750,829,843.7500000000,,, +51.8750000000,830,843.7500000000,,, +51.8769531250,830,843.7500000000,,, +51.8789062500,830,843.7500000000,,, +51.8808593750,830,843.7500000000,,, +51.8828125000,830,843.7500000000,,, +51.8847656250,830,843.7500000000,,, +51.8867187500,830,843.7500000000,,, +51.8886718750,830,843.7500000000,,, +51.8906250000,830,843.7500000000,,, +51.8925781250,830,843.7500000000,,, +51.8945312500,830,843.7500000000,,, +51.8964843750,830,843.7500000000,,, +51.8984375000,830,843.7500000000,,, +51.9003906250,830,843.7500000000,,, +51.9023437500,830,843.7500000000,,, +51.9042968750,830,843.7500000000,,, +51.9062500000,830,843.7500000000,,, +51.9082031250,830,843.7500000000,,, +51.9101562500,830,843.7500000000,,, +51.9121093750,830,843.7500000000,,, +51.9140625000,830,843.7500000000,,, +51.9160156250,830,843.7500000000,,, +51.9179687500,830,843.7500000000,,, +51.9199218750,830,843.7500000000,,, +51.9218750000,830,843.7500000000,,, +51.9238281250,830,843.7500000000,,, +51.9257812500,830,843.7500000000,,, +51.9277343750,830,843.7500000000,,, +51.9296875000,830,843.7500000000,,, +51.9316406250,830,843.7500000000,,, +51.9335937500,830,843.7500000000,,, +51.9355468750,830,843.7500000000,,, +51.9375000000,831,843.7500000000,,, +51.9394531250,831,843.7500000000,,, +51.9414062500,831,843.7500000000,,, +51.9433593750,831,843.7500000000,,, +51.9453125000,831,843.7500000000,,, +51.9472656250,831,843.7500000000,,, +51.9492187500,831,843.7500000000,,, +51.9511718750,831,843.7500000000,,, +51.9531250000,831,843.7500000000,,, +51.9550781250,831,843.7500000000,,, +51.9570312500,831,843.7500000000,,, +51.9589843750,831,843.7500000000,,, +51.9609375000,831,843.7500000000,,, +51.9628906250,831,843.7500000000,,, +51.9648437500,831,843.7500000000,,, +51.9667968750,831,843.7500000000,,, +51.9687500000,831,843.7500000000,,, +51.9707031250,831,843.7500000000,,, +51.9726562500,831,843.7500000000,,, +51.9746093750,831,843.7500000000,,, +51.9765625000,831,843.7500000000,,, +51.9785156250,831,843.7500000000,,, +51.9804687500,831,843.7500000000,,, +51.9824218750,831,843.7500000000,,, +51.9843750000,831,843.7500000000,,, +51.9863281250,831,843.7500000000,,, +51.9882812500,831,843.7500000000,,, +51.9902343750,831,843.7500000000,,, +51.9921875000,831,843.7500000000,,, +51.9941406250,831,843.7500000000,,, +51.9960937500,831,843.7500000000,,, +51.9980468750,831,843.7500000000,,, +52.0000000000,832,843.7500000000,,, +52.0019531250,832,843.7500000000,,, +52.0039062500,832,843.7500000000,,, +52.0058593750,832,843.7500000000,,, +52.0078125000,832,843.7500000000,,, +52.0097656250,832,843.7500000000,,, +52.0117187500,832,843.7500000000,,, +52.0136718750,832,843.7500000000,,, +52.0156250000,832,843.7500000000,,, +52.0175781250,832,843.7500000000,,, +52.0195312500,832,843.7500000000,,, +52.0214843750,832,843.7500000000,,, +52.0234375000,832,843.7500000000,,, +52.0253906250,832,843.7500000000,,, +52.0273437500,832,843.7500000000,,, +52.0292968750,832,843.7500000000,,, +52.0312500000,832,843.7500000000,,, +52.0332031250,832,843.7500000000,,, +52.0351562500,832,843.7500000000,,, +52.0371093750,832,843.7500000000,,, +52.0390625000,832,843.7500000000,,, +52.0410156250,832,843.7500000000,,, +52.0429687500,832,843.7500000000,,, +52.0449218750,832,843.7500000000,,, +52.0468750000,832,843.7500000000,,, +52.0488281250,832,843.7500000000,,, +52.0507812500,832,843.7500000000,,, +52.0527343750,832,843.7500000000,,, +52.0546875000,832,843.7500000000,,, +52.0566406250,832,843.7500000000,,, +52.0585937500,832,843.7500000000,,, +52.0605468750,832,843.7500000000,,, +52.0625000000,833,843.7500000000,,, +52.0644531250,833,843.7500000000,,, +52.0664062500,833,843.7500000000,,, +52.0683593750,833,843.7500000000,,, +52.0703125000,833,843.7500000000,,, +52.0722656250,833,843.7500000000,,, +52.0742187500,833,843.7500000000,,, +52.0761718750,833,843.7500000000,,, +52.0781250000,833,843.7500000000,,, +52.0800781250,833,843.7500000000,,, +52.0820312500,833,843.7500000000,,, +52.0839843750,833,843.7500000000,,, +52.0859375000,833,843.7500000000,,, +52.0878906250,833,843.7500000000,,, +52.0898437500,833,843.7500000000,,, +52.0917968750,833,843.7500000000,,, +52.0937500000,833,843.7500000000,,, +52.0957031250,833,843.7500000000,,, +52.0976562500,833,843.7500000000,,, +52.0996093750,833,843.7500000000,,, +52.1015625000,833,843.7500000000,,, +52.1035156250,833,843.7500000000,,, +52.1054687500,833,843.7500000000,,, +52.1074218750,833,843.7500000000,,, +52.1093750000,833,843.7500000000,,, +52.1113281250,833,843.7500000000,,, +52.1132812500,833,843.7500000000,,, +52.1152343750,833,843.7500000000,,, +52.1171875000,833,843.7500000000,,, +52.1191406250,833,843.7500000000,,, +52.1210937500,833,843.7500000000,,, +52.1230468750,833,843.7500000000,,, +52.1250000000,834,843.7500000000,,, +52.1269531250,834,843.7500000000,,, +52.1289062500,834,843.7500000000,,, +52.1308593750,834,843.7500000000,,, +52.1328125000,834,843.7500000000,,, +52.1347656250,834,843.7500000000,,, +52.1367187500,834,843.7500000000,,, +52.1386718750,834,843.7500000000,,, +52.1406250000,834,843.7500000000,,, +52.1425781250,834,843.7500000000,,, +52.1445312500,834,843.7500000000,,, +52.1464843750,834,843.7500000000,,, +52.1484375000,834,843.7500000000,,, +52.1503906250,834,843.7500000000,,, +52.1523437500,834,843.7500000000,,, +52.1542968750,834,843.7500000000,,, +52.1562500000,834,843.7500000000,,, +52.1582031250,834,843.7500000000,,, +52.1601562500,834,843.7500000000,,, +52.1621093750,834,843.7500000000,,, +52.1640625000,834,843.7500000000,,, +52.1660156250,834,843.7500000000,,, +52.1679687500,834,843.7500000000,,, +52.1699218750,834,843.7500000000,,, +52.1718750000,834,843.7500000000,,, +52.1738281250,834,843.7500000000,,, +52.1757812500,834,843.7500000000,,, +52.1777343750,834,843.7500000000,,, +52.1796875000,834,843.7500000000,,, +52.1816406250,834,843.7500000000,,, +52.1835937500,834,843.7500000000,,, +52.1855468750,834,843.7500000000,,, +52.1875000000,835,843.7500000000,,, +52.1894531250,835,843.7500000000,,, +52.1914062500,835,843.7500000000,,, +52.1933593750,835,843.7500000000,,, +52.1953125000,835,843.7500000000,,, +52.1972656250,835,843.7500000000,,, +52.1992187500,835,843.7500000000,,, +52.2011718750,835,843.7500000000,,, +52.2031250000,835,843.7500000000,,, +52.2050781250,835,843.7500000000,,, +52.2070312500,835,843.7500000000,,, +52.2089843750,835,843.7500000000,,, +52.2109375000,835,843.7500000000,,, +52.2128906250,835,843.7500000000,,, +52.2148437500,835,843.7500000000,,, +52.2167968750,835,843.7500000000,,, +52.2187500000,835,843.7500000000,,, +52.2207031250,835,843.7500000000,,, +52.2226562500,835,843.7500000000,,, +52.2246093750,835,843.7500000000,,, +52.2265625000,835,843.7500000000,,, +52.2285156250,835,843.7500000000,,, +52.2304687500,835,843.7500000000,,, +52.2324218750,835,843.7500000000,,, +52.2343750000,835,843.7500000000,,, +52.2363281250,835,843.7500000000,,, +52.2382812500,835,843.7500000000,,, +52.2402343750,835,843.7500000000,,, +52.2421875000,835,843.7500000000,,, +52.2441406250,835,843.7500000000,,, +52.2460937500,835,843.7500000000,,, +52.2480468750,835,843.7500000000,,, +52.2500000000,836,843.7500000000,,, +52.2519531250,836,843.7500000000,,, +52.2539062500,836,843.7500000000,,, +52.2558593750,836,843.7500000000,,, +52.2578125000,836,843.7500000000,,, +52.2597656250,836,843.7500000000,,, +52.2617187500,836,843.7500000000,,, +52.2636718750,836,843.7500000000,,, +52.2656250000,836,843.7500000000,,, +52.2675781250,836,843.7500000000,,, +52.2695312500,836,843.7500000000,,, +52.2714843750,836,843.7500000000,,, +52.2734375000,836,843.7500000000,,, +52.2753906250,836,843.7500000000,,, +52.2773437500,836,843.7500000000,,, +52.2792968750,836,843.7500000000,,, +52.2812500000,836,843.7500000000,,, +52.2832031250,836,843.7500000000,,, +52.2851562500,836,843.7500000000,,, +52.2871093750,836,843.7500000000,,, +52.2890625000,836,843.7500000000,,, +52.2910156250,836,843.7500000000,,, +52.2929687500,836,843.7500000000,,, +52.2949218750,836,843.7500000000,,, +52.2968750000,836,843.7500000000,,, +52.2988281250,836,843.7500000000,,, +52.3007812500,836,843.7500000000,,, +52.3027343750,836,843.7500000000,,, +52.3046875000,836,843.7500000000,,, +52.3066406250,836,843.7500000000,,, +52.3085937500,836,843.7500000000,,, +52.3105468750,836,843.7500000000,,, +52.3125000000,837,843.7500000000,,, +52.3144531250,837,843.7500000000,,, +52.3164062500,837,843.7500000000,,, +52.3183593750,837,843.7500000000,,, +52.3203125000,837,843.7500000000,,, +52.3222656250,837,843.7500000000,,, +52.3242187500,837,843.7500000000,,, +52.3261718750,837,843.7500000000,,, +52.3281250000,837,843.7500000000,,, +52.3300781250,837,843.7500000000,,, +52.3320312500,837,843.7500000000,,, +52.3339843750,837,843.7500000000,,, +52.3359375000,837,843.7500000000,,, +52.3378906250,837,843.7500000000,,, +52.3398437500,837,843.7500000000,,, +52.3417968750,837,843.7500000000,,, +52.3437500000,837,843.7500000000,,, +52.3457031250,837,843.7500000000,,, +52.3476562500,837,843.7500000000,,, +52.3496093750,837,843.7500000000,,, +52.3515625000,837,843.7500000000,,, +52.3535156250,837,843.7500000000,,, +52.3554687500,837,843.7500000000,,, +52.3574218750,837,843.7500000000,,, +52.3593750000,837,843.7500000000,,, +52.3613281250,837,843.7500000000,,, +52.3632812500,837,843.7500000000,,, +52.3652343750,837,843.7500000000,,, +52.3671875000,837,843.7500000000,,, +52.3691406250,837,843.7500000000,,, +52.3710937500,837,843.7500000000,,, +52.3730468750,837,843.7500000000,,, +52.3750000000,838,843.7500000000,,, +52.3769531250,838,843.7500000000,,, +52.3789062500,838,843.7500000000,,, +52.3808593750,838,843.7500000000,,, +52.3828125000,838,843.7500000000,,, +52.3847656250,838,843.7500000000,,, +52.3867187500,838,843.7500000000,,, +52.3886718750,838,843.7500000000,,, +52.3906250000,838,843.7500000000,,, +52.3925781250,838,843.7500000000,,, +52.3945312500,838,843.7500000000,,, +52.3964843750,838,843.7500000000,,, +52.3984375000,838,843.7500000000,,, +52.4003906250,838,843.7500000000,,, +52.4023437500,838,843.7500000000,,, +52.4042968750,838,843.7500000000,,, +52.4062500000,838,843.7500000000,,, +52.4082031250,838,843.7500000000,,, +52.4101562500,838,843.7500000000,,, +52.4121093750,838,843.7500000000,,, +52.4140625000,838,843.7500000000,,, +52.4160156250,838,843.7500000000,,, +52.4179687500,838,843.7500000000,,, +52.4199218750,838,843.7500000000,,, +52.4218750000,838,843.7500000000,,, +52.4238281250,838,843.7500000000,,, +52.4257812500,838,843.7500000000,,, +52.4277343750,838,843.7500000000,,, +52.4296875000,838,843.7500000000,,, +52.4316406250,838,843.7500000000,,, +52.4335937500,838,843.7500000000,,, +52.4355468750,838,843.7500000000,,, +52.4375000000,839,843.7500000000,,, +52.4394531250,839,843.7500000000,,, +52.4414062500,839,843.7500000000,,, +52.4433593750,839,843.7500000000,,, +52.4453125000,839,843.7500000000,,, +52.4472656250,839,843.7500000000,,, +52.4492187500,839,843.7500000000,,, +52.4511718750,839,843.7500000000,,, +52.4531250000,839,843.7500000000,,, +52.4550781250,839,843.7500000000,,, +52.4570312500,839,843.7500000000,,, +52.4589843750,839,843.7500000000,,, +52.4609375000,839,843.7500000000,,, +52.4628906250,839,843.7500000000,,, +52.4648437500,839,843.7500000000,,, +52.4667968750,839,843.7500000000,,, +52.4687500000,839,843.7500000000,,, +52.4707031250,839,843.7500000000,,, +52.4726562500,839,843.7500000000,,, +52.4746093750,839,843.7500000000,,, +52.4765625000,839,843.7500000000,,, +52.4785156250,839,843.7500000000,,, +52.4804687500,839,843.7500000000,,, +52.4824218750,839,843.7500000000,,, +52.4843750000,839,843.7500000000,,, +52.4863281250,839,843.7500000000,,, +52.4882812500,839,843.7500000000,,, +52.4902343750,839,843.7500000000,,, +52.4921875000,839,843.7500000000,,, +52.4941406250,839,843.7500000000,,, +52.4960937500,839,843.7500000000,,, +52.4980468750,839,843.7500000000,,, +52.5000000000,840,843.7500000000,,, +52.5019531250,840,843.7500000000,,, +52.5039062500,840,843.7500000000,,, +52.5058593750,840,843.7500000000,,, +52.5078125000,840,843.7500000000,,, +52.5097656250,840,843.7500000000,,, +52.5117187500,840,843.7500000000,,, +52.5136718750,840,843.7500000000,,, +52.5156250000,840,843.7500000000,,, +52.5175781250,840,843.7500000000,,, +52.5195312500,840,843.7500000000,,, +52.5214843750,840,843.7500000000,,, +52.5234375000,840,843.7500000000,,, +52.5253906250,840,843.7500000000,,, +52.5273437500,840,843.7500000000,,, +52.5292968750,840,843.7500000000,,, +52.5312500000,840,843.7500000000,,, +52.5332031250,840,843.7500000000,,, +52.5351562500,840,843.7500000000,,, +52.5371093750,840,843.7500000000,,, +52.5390625000,840,843.7500000000,,, +52.5410156250,840,843.7500000000,,, +52.5429687500,840,843.7500000000,,, +52.5449218750,840,843.7500000000,,, +52.5468750000,840,843.7500000000,,, +52.5488281250,840,843.7500000000,,, +52.5507812500,840,843.7500000000,,, +52.5527343750,840,843.7500000000,,, +52.5546875000,840,843.7500000000,,, +52.5566406250,840,843.7500000000,,, +52.5585937500,840,843.7500000000,,, +52.5605468750,840,843.7500000000,,, +52.5625000000,841,843.7500000000,,, +52.5644531250,841,843.7500000000,,, +52.5664062500,841,843.7500000000,,, +52.5683593750,841,843.7500000000,,, +52.5703125000,841,843.7500000000,,, +52.5722656250,841,843.7500000000,,, +52.5742187500,841,843.7500000000,,, +52.5761718750,841,843.7500000000,,, +52.5781250000,841,843.7500000000,,, +52.5800781250,841,843.7500000000,,, +52.5820312500,841,843.7500000000,,, +52.5839843750,841,843.7500000000,,, +52.5859375000,841,843.7500000000,,, +52.5878906250,841,843.7500000000,,, +52.5898437500,841,843.7500000000,,, +52.5917968750,841,843.7500000000,,, +52.5937500000,841,843.7500000000,,, +52.5957031250,841,843.7500000000,,, +52.5976562500,841,843.7500000000,,, +52.5996093750,841,843.7500000000,,, +52.6015625000,841,843.7500000000,,, +52.6035156250,841,843.7500000000,,, +52.6054687500,841,843.7500000000,,, +52.6074218750,841,843.7500000000,,, +52.6093750000,841,843.7500000000,,, +52.6113281250,841,843.7500000000,,, +52.6132812500,841,843.7500000000,,, +52.6152343750,841,843.7500000000,,, +52.6171875000,841,843.7500000000,,, +52.6191406250,841,843.7500000000,,, +52.6210937500,841,843.7500000000,,, +52.6230468750,841,843.7500000000,,, +52.6250000000,842,843.7500000000,,, +52.6269531250,842,843.7500000000,,, +52.6289062500,842,843.7500000000,,, +52.6308593750,842,843.7500000000,,, +52.6328125000,842,843.7500000000,,, +52.6347656250,842,843.7500000000,,, +52.6367187500,842,843.7500000000,,, +52.6386718750,842,843.7500000000,,, +52.6406250000,842,843.7500000000,,, +52.6425781250,842,843.7500000000,,, +52.6445312500,842,843.7500000000,,, +52.6464843750,842,843.7500000000,,, +52.6484375000,842,843.7500000000,,, +52.6503906250,842,843.7500000000,,, +52.6523437500,842,843.7500000000,,, +52.6542968750,842,843.7500000000,,, +52.6562500000,842,843.7500000000,,, +52.6582031250,842,843.7500000000,,, +52.6601562500,842,843.7500000000,,, +52.6621093750,842,843.7500000000,,, +52.6640625000,842,843.7500000000,,, +52.6660156250,842,843.7500000000,,, +52.6679687500,842,843.7500000000,,, +52.6699218750,842,843.7500000000,,, +52.6718750000,842,843.7500000000,,, +52.6738281250,842,843.7500000000,,, +52.6757812500,842,843.7500000000,,, +52.6777343750,842,843.7500000000,,, +52.6796875000,842,843.7500000000,,, +52.6816406250,842,843.7500000000,,, +52.6835937500,842,843.7500000000,,, +52.6855468750,842,843.7500000000,,, +52.6875000000,843,843.7500000000,,, +52.6894531250,843,843.7500000000,,, +52.6914062500,843,843.7500000000,,, +52.6933593750,843,843.7500000000,,, +52.6953125000,843,843.7500000000,,, +52.6972656250,843,843.7500000000,,, +52.6992187500,843,843.7500000000,,, +52.7011718750,843,843.7500000000,,, +52.7031250000,843,843.7500000000,,, +52.7050781250,843,843.7500000000,,, +52.7070312500,843,843.7500000000,,, +52.7089843750,843,843.7500000000,,, +52.7109375000,843,843.7500000000,,, +52.7128906250,843,843.7500000000,,, +52.7148437500,843,843.7500000000,,, +52.7167968750,843,843.7500000000,,, +52.7187500000,843,843.7500000000,,, +52.7207031250,843,843.7500000000,,, +52.7226562500,843,843.7500000000,,, +52.7246093750,843,843.7500000000,,, +52.7265625000,843,843.7500000000,,, +52.7285156250,843,843.7500000000,,, +52.7304687500,843,843.7500000000,,, +52.7324218750,843,843.7500000000,,, +52.7343750000,843,843.7500000000,,, +52.7363281250,843,843.7500000000,,, +52.7382812500,843,843.7500000000,,, +52.7402343750,843,843.7500000000,,, +52.7421875000,843,843.7500000000,,, +52.7441406250,843,843.7500000000,,, +52.7460937500,843,843.7500000000,,, +52.7480468750,843,843.7500000000,,, +52.7500000000,844,863.2812500000,,, +52.7519531250,844,863.2812500000,,, +52.7539062500,844,863.2812500000,,, +52.7558593750,844,863.2812500000,,, +52.7578125000,844,863.2812500000,,, +52.7597656250,844,863.2812500000,,, +52.7617187500,844,863.2812500000,,, +52.7636718750,844,863.2812500000,,, +52.7656250000,844,863.2812500000,,, +52.7675781250,844,863.2812500000,,, +52.7695312500,844,863.2812500000,,, +52.7714843750,844,863.2812500000,,, +52.7734375000,844,863.2812500000,,, +52.7753906250,844,863.2812500000,,, +52.7773437500,844,863.2812500000,,, +52.7792968750,844,863.2812500000,,, +52.7812500000,844,863.2812500000,,, +52.7832031250,844,863.2812500000,,, +52.7851562500,844,863.2812500000,,, +52.7871093750,844,863.2812500000,,, +52.7890625000,844,863.2812500000,,, +52.7910156250,844,863.2812500000,,, +52.7929687500,844,863.2812500000,,, +52.7949218750,844,863.2812500000,,, +52.7968750000,844,863.2812500000,,, +52.7988281250,844,863.2812500000,,, +52.8007812500,844,863.2812500000,,, +52.8027343750,844,863.2812500000,,, +52.8046875000,844,863.2812500000,,, +52.8066406250,844,863.2812500000,,, +52.8085937500,844,863.2812500000,,, +52.8105468750,844,863.2812500000,,, +52.8125000000,845,863.2812500000,,, +52.8144531250,845,863.2812500000,,, +52.8164062500,845,863.2812500000,,, +52.8183593750,845,863.2812500000,,, +52.8203125000,845,863.2812500000,,, +52.8222656250,845,863.2812500000,,, +52.8242187500,845,863.2812500000,,, +52.8261718750,845,863.2812500000,,, +52.8281250000,845,863.2812500000,,, +52.8300781250,845,863.2812500000,,, +52.8320312500,845,863.2812500000,,, +52.8339843750,845,863.2812500000,,, +52.8359375000,845,863.2812500000,,, +52.8378906250,845,863.2812500000,,, +52.8398437500,845,863.2812500000,,, +52.8417968750,845,863.2812500000,,, +52.8437500000,845,863.2812500000,,, +52.8457031250,845,863.2812500000,,, +52.8476562500,845,863.2812500000,,, +52.8496093750,845,863.2812500000,,, +52.8515625000,845,863.2812500000,,, +52.8535156250,845,863.2812500000,,, +52.8554687500,845,863.2812500000,,, +52.8574218750,845,863.2812500000,,, +52.8593750000,845,863.2812500000,,, +52.8613281250,845,863.2812500000,,, +52.8632812500,845,863.2812500000,,, +52.8652343750,845,863.2812500000,,, +52.8671875000,845,863.2812500000,,, +52.8691406250,845,863.2812500000,,, +52.8710937500,845,863.2812500000,,, +52.8730468750,845,863.2812500000,,, +52.8750000000,846,863.2812500000,,, +52.8769531250,846,863.2812500000,,, +52.8789062500,846,863.2812500000,,, +52.8808593750,846,863.2812500000,,, +52.8828125000,846,863.2812500000,,, +52.8847656250,846,863.2812500000,,, +52.8867187500,846,863.2812500000,,, +52.8886718750,846,863.2812500000,,, +52.8906250000,846,863.2812500000,,, +52.8925781250,846,863.2812500000,,, +52.8945312500,846,863.2812500000,,, +52.8964843750,846,863.2812500000,,, +52.8984375000,846,863.2812500000,,, +52.9003906250,846,863.2812500000,,, +52.9023437500,846,863.2812500000,,, +52.9042968750,846,863.2812500000,,, +52.9062500000,846,863.2812500000,,, +52.9082031250,846,863.2812500000,,, +52.9101562500,846,863.2812500000,,, +52.9121093750,846,863.2812500000,,, +52.9140625000,846,863.2812500000,,, +52.9160156250,846,863.2812500000,,, +52.9179687500,846,863.2812500000,,, +52.9199218750,846,863.2812500000,,, +52.9218750000,846,863.2812500000,,, +52.9238281250,846,863.2812500000,,, +52.9257812500,846,863.2812500000,,, +52.9277343750,846,863.2812500000,,, +52.9296875000,846,863.2812500000,,, +52.9316406250,846,863.2812500000,,, +52.9335937500,846,863.2812500000,,, +52.9355468750,846,863.2812500000,,, +52.9375000000,847,863.2812500000,,, +52.9394531250,847,863.2812500000,,, +52.9414062500,847,863.2812500000,,, +52.9433593750,847,863.2812500000,,, +52.9453125000,847,863.2812500000,,, +52.9472656250,847,863.2812500000,,, +52.9492187500,847,863.2812500000,,, +52.9511718750,847,863.2812500000,,, +52.9531250000,847,863.2812500000,,, +52.9550781250,847,863.2812500000,,, +52.9570312500,847,863.2812500000,,, +52.9589843750,847,863.2812500000,,, +52.9609375000,847,863.2812500000,,, +52.9628906250,847,863.2812500000,,, +52.9648437500,847,863.2812500000,,, +52.9667968750,847,863.2812500000,,, +52.9687500000,847,863.2812500000,,, +52.9707031250,847,863.2812500000,,, +52.9726562500,847,863.2812500000,,, +52.9746093750,847,863.2812500000,,, +52.9765625000,847,863.2812500000,,, +52.9785156250,847,863.2812500000,,, +52.9804687500,847,863.2812500000,,, +52.9824218750,847,863.2812500000,,, +52.9843750000,847,863.2812500000,,, +52.9863281250,847,863.2812500000,,, +52.9882812500,847,863.2812500000,,, +52.9902343750,847,863.2812500000,,, +52.9921875000,847,863.2812500000,,, +52.9941406250,847,863.2812500000,,, +52.9960937500,847,863.2812500000,,, +52.9980468750,847,863.2812500000,,, +53.0000000000,848,863.2812500000,,, +53.0019531250,848,863.2812500000,,, +53.0039062500,848,863.2812500000,,, +53.0058593750,848,863.2812500000,,, +53.0078125000,848,863.2812500000,,, +53.0097656250,848,863.2812500000,,, +53.0117187500,848,863.2812500000,,, +53.0136718750,848,863.2812500000,,, +53.0156250000,848,863.2812500000,,, +53.0175781250,848,863.2812500000,,, +53.0195312500,848,863.2812500000,,, +53.0214843750,848,863.2812500000,,, +53.0234375000,848,863.2812500000,,, +53.0253906250,848,863.2812500000,,, +53.0273437500,848,863.2812500000,,, +53.0292968750,848,863.2812500000,,, +53.0312500000,848,863.2812500000,,, +53.0332031250,848,863.2812500000,,, +53.0351562500,848,863.2812500000,,, +53.0371093750,848,863.2812500000,,, +53.0390625000,848,863.2812500000,,, +53.0410156250,848,863.2812500000,,, +53.0429687500,848,863.2812500000,,, +53.0449218750,848,863.2812500000,,, +53.0468750000,848,863.2812500000,,, +53.0488281250,848,863.2812500000,,, +53.0507812500,848,863.2812500000,,, +53.0527343750,848,863.2812500000,,, +53.0546875000,848,863.2812500000,,, +53.0566406250,848,863.2812500000,,, +53.0585937500,848,863.2812500000,,, +53.0605468750,848,863.2812500000,,, +53.0625000000,849,863.2812500000,,, +53.0644531250,849,863.2812500000,,, +53.0664062500,849,863.2812500000,,, +53.0683593750,849,863.2812500000,,, +53.0703125000,849,863.2812500000,,, +53.0722656250,849,863.2812500000,,, +53.0742187500,849,863.2812500000,,, +53.0761718750,849,863.2812500000,,, +53.0781250000,849,863.2812500000,,, +53.0800781250,849,863.2812500000,,, +53.0820312500,849,863.2812500000,,, +53.0839843750,849,863.2812500000,,, +53.0859375000,849,863.2812500000,,, +53.0878906250,849,863.2812500000,,, +53.0898437500,849,863.2812500000,,, +53.0917968750,849,863.2812500000,,, +53.0937500000,849,863.2812500000,,, +53.0957031250,849,863.2812500000,,, +53.0976562500,849,863.2812500000,,, +53.0996093750,849,863.2812500000,,, +53.1015625000,849,863.2812500000,,, +53.1035156250,849,863.2812500000,,, +53.1054687500,849,863.2812500000,,, +53.1074218750,849,863.2812500000,,, +53.1093750000,849,863.2812500000,,, +53.1113281250,849,863.2812500000,,, +53.1132812500,849,863.2812500000,,, +53.1152343750,849,863.2812500000,,, +53.1171875000,849,863.2812500000,,, +53.1191406250,849,863.2812500000,,, +53.1210937500,849,863.2812500000,,, +53.1230468750,849,863.2812500000,,, +53.1250000000,850,863.2812500000,,, +53.1269531250,850,863.2812500000,,, +53.1289062500,850,863.2812500000,,, +53.1308593750,850,863.2812500000,,, +53.1328125000,850,863.2812500000,,, +53.1347656250,850,863.2812500000,,, +53.1367187500,850,863.2812500000,,, +53.1386718750,850,863.2812500000,,, +53.1406250000,850,863.2812500000,,, +53.1425781250,850,863.2812500000,,, +53.1445312500,850,863.2812500000,,, +53.1464843750,850,863.2812500000,,, +53.1484375000,850,863.2812500000,,, +53.1503906250,850,863.2812500000,,, +53.1523437500,850,863.2812500000,,, +53.1542968750,850,863.2812500000,,, +53.1562500000,850,863.2812500000,,, +53.1582031250,850,863.2812500000,,, +53.1601562500,850,863.2812500000,,, +53.1621093750,850,863.2812500000,,, +53.1640625000,850,863.2812500000,,, +53.1660156250,850,863.2812500000,,, +53.1679687500,850,863.2812500000,,, +53.1699218750,850,863.2812500000,,, +53.1718750000,850,863.2812500000,,, +53.1738281250,850,863.2812500000,,, +53.1757812500,850,863.2812500000,,, +53.1777343750,850,863.2812500000,,, +53.1796875000,850,863.2812500000,,, +53.1816406250,850,863.2812500000,,, +53.1835937500,850,863.2812500000,,, +53.1855468750,850,863.2812500000,,, +53.1875000000,851,863.2812500000,,, +53.1894531250,851,863.2812500000,,, +53.1914062500,851,863.2812500000,,, +53.1933593750,851,863.2812500000,,, +53.1953125000,851,863.2812500000,,, +53.1972656250,851,863.2812500000,,, +53.1992187500,851,863.2812500000,,, +53.2011718750,851,863.2812500000,,, +53.2031250000,851,863.2812500000,,, +53.2050781250,851,863.2812500000,,, +53.2070312500,851,863.2812500000,,, +53.2089843750,851,863.2812500000,,, +53.2109375000,851,863.2812500000,,, +53.2128906250,851,863.2812500000,,, +53.2148437500,851,863.2812500000,,, +53.2167968750,851,863.2812500000,,, +53.2187500000,851,863.2812500000,,, +53.2207031250,851,863.2812500000,,, +53.2226562500,851,863.2812500000,,, +53.2246093750,851,863.2812500000,,, +53.2265625000,851,863.2812500000,,, +53.2285156250,851,863.2812500000,,, +53.2304687500,851,863.2812500000,,, +53.2324218750,851,863.2812500000,,, +53.2343750000,851,863.2812500000,,, +53.2363281250,851,863.2812500000,,, +53.2382812500,851,863.2812500000,,, +53.2402343750,851,863.2812500000,,, +53.2421875000,851,863.2812500000,,, +53.2441406250,851,863.2812500000,,, +53.2460937500,851,863.2812500000,,, +53.2480468750,851,863.2812500000,,, +53.2500000000,852,863.2812500000,,, +53.2519531250,852,863.2812500000,,, +53.2539062500,852,863.2812500000,,, +53.2558593750,852,863.2812500000,,, +53.2578125000,852,863.2812500000,,, +53.2597656250,852,863.2812500000,,, +53.2617187500,852,863.2812500000,,, +53.2636718750,852,863.2812500000,,, +53.2656250000,852,863.2812500000,,, +53.2675781250,852,863.2812500000,,, +53.2695312500,852,863.2812500000,,, +53.2714843750,852,863.2812500000,,, +53.2734375000,852,863.2812500000,,, +53.2753906250,852,863.2812500000,,, +53.2773437500,852,863.2812500000,,, +53.2792968750,852,863.2812500000,,, +53.2812500000,852,863.2812500000,,, +53.2832031250,852,863.2812500000,,, +53.2851562500,852,863.2812500000,,, +53.2871093750,852,863.2812500000,,, +53.2890625000,852,863.2812500000,,, +53.2910156250,852,863.2812500000,,, +53.2929687500,852,863.2812500000,,, +53.2949218750,852,863.2812500000,,, +53.2968750000,852,863.2812500000,,, +53.2988281250,852,863.2812500000,,, +53.3007812500,852,863.2812500000,,, +53.3027343750,852,863.2812500000,,, +53.3046875000,852,863.2812500000,,, +53.3066406250,852,863.2812500000,,, +53.3085937500,852,863.2812500000,,, +53.3105468750,852,863.2812500000,,, +53.3125000000,853,863.2812500000,,, +53.3144531250,853,863.2812500000,,, +53.3164062500,853,863.2812500000,,, +53.3183593750,853,863.2812500000,,, +53.3203125000,853,863.2812500000,,, +53.3222656250,853,863.2812500000,,, +53.3242187500,853,863.2812500000,,, +53.3261718750,853,863.2812500000,,, +53.3281250000,853,863.2812500000,,, +53.3300781250,853,863.2812500000,,, +53.3320312500,853,863.2812500000,,, +53.3339843750,853,863.2812500000,,, +53.3359375000,853,863.2812500000,,, +53.3378906250,853,863.2812500000,,, +53.3398437500,853,863.2812500000,,, +53.3417968750,853,863.2812500000,,, +53.3437500000,853,863.2812500000,,, +53.3457031250,853,863.2812500000,,, +53.3476562500,853,863.2812500000,,, +53.3496093750,853,863.2812500000,,, +53.3515625000,853,863.2812500000,,, +53.3535156250,853,863.2812500000,,, +53.3554687500,853,863.2812500000,,, +53.3574218750,853,863.2812500000,,, +53.3593750000,853,863.2812500000,,, +53.3613281250,853,863.2812500000,,, +53.3632812500,853,863.2812500000,,, +53.3652343750,853,863.2812500000,,, +53.3671875000,853,863.2812500000,,, +53.3691406250,853,863.2812500000,,, +53.3710937500,853,863.2812500000,,, +53.3730468750,853,863.2812500000,,, +53.3750000000,854,863.2812500000,,, +53.3769531250,854,863.2812500000,,, +53.3789062500,854,863.2812500000,,, +53.3808593750,854,863.2812500000,,, +53.3828125000,854,863.2812500000,,, +53.3847656250,854,863.2812500000,,, +53.3867187500,854,863.2812500000,,, +53.3886718750,854,863.2812500000,,, +53.3906250000,854,863.2812500000,,, +53.3925781250,854,863.2812500000,,, +53.3945312500,854,863.2812500000,,, +53.3964843750,854,863.2812500000,,, +53.3984375000,854,863.2812500000,,, +53.4003906250,854,863.2812500000,,, +53.4023437500,854,863.2812500000,,, +53.4042968750,854,863.2812500000,,, +53.4062500000,854,863.2812500000,,, +53.4082031250,854,863.2812500000,,, +53.4101562500,854,863.2812500000,,, +53.4121093750,854,863.2812500000,,, +53.4140625000,854,863.2812500000,,, +53.4160156250,854,863.2812500000,,, +53.4179687500,854,863.2812500000,,, +53.4199218750,854,863.2812500000,,, +53.4218750000,854,863.2812500000,,, +53.4238281250,854,863.2812500000,,, +53.4257812500,854,863.2812500000,,, +53.4277343750,854,863.2812500000,,, +53.4296875000,854,863.2812500000,,, +53.4316406250,854,863.2812500000,,, +53.4335937500,854,863.2812500000,,, +53.4355468750,854,863.2812500000,,, +53.4375000000,855,863.2812500000,,, +53.4394531250,855,863.2812500000,,, +53.4414062500,855,863.2812500000,,, +53.4433593750,855,863.2812500000,,, +53.4453125000,855,863.2812500000,,, +53.4472656250,855,863.2812500000,,, +53.4492187500,855,863.2812500000,,, +53.4511718750,855,863.2812500000,,, +53.4531250000,855,863.2812500000,,, +53.4550781250,855,863.2812500000,,, +53.4570312500,855,863.2812500000,,, +53.4589843750,855,863.2812500000,,, +53.4609375000,855,863.2812500000,,, +53.4628906250,855,863.2812500000,,, +53.4648437500,855,863.2812500000,,, +53.4667968750,855,863.2812500000,,, +53.4687500000,855,863.2812500000,,, +53.4707031250,855,863.2812500000,,, +53.4726562500,855,863.2812500000,,, +53.4746093750,855,863.2812500000,,, +53.4765625000,855,863.2812500000,,, +53.4785156250,855,863.2812500000,,, +53.4804687500,855,863.2812500000,,, +53.4824218750,855,863.2812500000,,, +53.4843750000,855,863.2812500000,,, +53.4863281250,855,863.2812500000,,, +53.4882812500,855,863.2812500000,,, +53.4902343750,855,863.2812500000,,, +53.4921875000,855,863.2812500000,,, +53.4941406250,855,863.2812500000,,, +53.4960937500,855,863.2812500000,,, +53.4980468750,855,863.2812500000,,, +53.5000000000,856,863.2812500000,,, +53.5019531250,856,863.2812500000,,, +53.5039062500,856,863.2812500000,,, +53.5058593750,856,863.2812500000,,, +53.5078125000,856,863.2812500000,,, +53.5097656250,856,863.2812500000,,, +53.5117187500,856,863.2812500000,,, +53.5136718750,856,863.2812500000,,, +53.5156250000,856,863.2812500000,,, +53.5175781250,856,863.2812500000,,, +53.5195312500,856,863.2812500000,,, +53.5214843750,856,863.2812500000,,, +53.5234375000,856,863.2812500000,,, +53.5253906250,856,863.2812500000,,, +53.5273437500,856,863.2812500000,,, +53.5292968750,856,863.2812500000,,, +53.5312500000,856,863.2812500000,,, +53.5332031250,856,863.2812500000,,, +53.5351562500,856,863.2812500000,,, +53.5371093750,856,863.2812500000,,, +53.5390625000,856,863.2812500000,,, +53.5410156250,856,863.2812500000,,, +53.5429687500,856,863.2812500000,,, +53.5449218750,856,863.2812500000,,, +53.5468750000,856,863.2812500000,,, +53.5488281250,856,863.2812500000,,, +53.5507812500,856,863.2812500000,,, +53.5527343750,856,863.2812500000,,, +53.5546875000,856,863.2812500000,,, +53.5566406250,856,863.2812500000,,, +53.5585937500,856,863.2812500000,,, +53.5605468750,856,863.2812500000,,, +53.5625000000,857,863.2812500000,,, +53.5644531250,857,863.2812500000,,, +53.5664062500,857,863.2812500000,,, +53.5683593750,857,863.2812500000,,, +53.5703125000,857,863.2812500000,,, +53.5722656250,857,863.2812500000,,, +53.5742187500,857,863.2812500000,,, +53.5761718750,857,863.2812500000,,, +53.5781250000,857,863.2812500000,,, +53.5800781250,857,863.2812500000,,, +53.5820312500,857,863.2812500000,,, +53.5839843750,857,863.2812500000,,, +53.5859375000,857,863.2812500000,,, +53.5878906250,857,863.2812500000,,, +53.5898437500,857,863.2812500000,,, +53.5917968750,857,863.2812500000,,, +53.5937500000,857,863.2812500000,,, +53.5957031250,857,863.2812500000,,, +53.5976562500,857,863.2812500000,,, +53.5996093750,857,863.2812500000,,, +53.6015625000,857,863.2812500000,,, +53.6035156250,857,863.2812500000,,, +53.6054687500,857,863.2812500000,,, +53.6074218750,857,863.2812500000,,, +53.6093750000,857,863.2812500000,,, +53.6113281250,857,863.2812500000,,, +53.6132812500,857,863.2812500000,,, +53.6152343750,857,863.2812500000,,, +53.6171875000,857,863.2812500000,,, +53.6191406250,857,863.2812500000,,, +53.6210937500,857,863.2812500000,,, +53.6230468750,857,863.2812500000,,, +53.6250000000,858,863.2812500000,,, +53.6269531250,858,863.2812500000,,, +53.6289062500,858,863.2812500000,,, +53.6308593750,858,863.2812500000,,, +53.6328125000,858,863.2812500000,,, +53.6347656250,858,863.2812500000,,, +53.6367187500,858,863.2812500000,,, +53.6386718750,858,863.2812500000,,, +53.6406250000,858,863.2812500000,,, +53.6425781250,858,863.2812500000,,, +53.6445312500,858,863.2812500000,,, +53.6464843750,858,863.2812500000,,, +53.6484375000,858,863.2812500000,,, +53.6503906250,858,863.2812500000,,, +53.6523437500,858,863.2812500000,,, +53.6542968750,858,863.2812500000,,, +53.6562500000,858,863.2812500000,,, +53.6582031250,858,863.2812500000,,, +53.6601562500,858,863.2812500000,,, +53.6621093750,858,863.2812500000,,, +53.6640625000,858,863.2812500000,,, +53.6660156250,858,863.2812500000,,, +53.6679687500,858,863.2812500000,,, +53.6699218750,858,863.2812500000,,, +53.6718750000,858,863.2812500000,,, +53.6738281250,858,863.2812500000,,, +53.6757812500,858,863.2812500000,,, +53.6777343750,858,863.2812500000,,, +53.6796875000,858,863.2812500000,,, +53.6816406250,858,863.2812500000,,, +53.6835937500,858,863.2812500000,,, +53.6855468750,858,863.2812500000,,, +53.6875000000,859,863.2812500000,,, +53.6894531250,859,863.2812500000,,, +53.6914062500,859,863.2812500000,,, +53.6933593750,859,863.2812500000,,, +53.6953125000,859,863.2812500000,,, +53.6972656250,859,863.2812500000,,, +53.6992187500,859,863.2812500000,,, +53.7011718750,859,863.2812500000,,, +53.7031250000,859,863.2812500000,,, +53.7050781250,859,863.2812500000,,, +53.7070312500,859,863.2812500000,,, +53.7089843750,859,863.2812500000,,, +53.7109375000,859,863.2812500000,,, +53.7128906250,859,863.2812500000,,, +53.7148437500,859,863.2812500000,,, +53.7167968750,859,863.2812500000,,, +53.7187500000,859,863.2812500000,,, +53.7207031250,859,863.2812500000,,, +53.7226562500,859,863.2812500000,,, +53.7246093750,859,863.2812500000,,, +53.7265625000,859,863.2812500000,,, +53.7285156250,859,863.2812500000,,, +53.7304687500,859,863.2812500000,,, +53.7324218750,859,863.2812500000,,, +53.7343750000,859,863.2812500000,,, +53.7363281250,859,863.2812500000,,, +53.7382812500,859,863.2812500000,,, +53.7402343750,859,863.2812500000,,, +53.7421875000,859,863.2812500000,,, +53.7441406250,859,863.2812500000,,, +53.7460937500,859,863.2812500000,,, +53.7480468750,859,863.2812500000,,, +53.7500000000,860,863.2812500000,,, +53.7519531250,860,863.2812500000,,, +53.7539062500,860,863.2812500000,,, +53.7558593750,860,863.2812500000,,, +53.7578125000,860,863.2812500000,,, +53.7597656250,860,863.2812500000,,, +53.7617187500,860,863.2812500000,,, +53.7636718750,860,863.2812500000,,, +53.7656250000,860,863.2812500000,,, +53.7675781250,860,863.2812500000,,, +53.7695312500,860,863.2812500000,,, +53.7714843750,860,863.2812500000,,, +53.7734375000,860,863.2812500000,,, +53.7753906250,860,863.2812500000,,, +53.7773437500,860,863.2812500000,,, +53.7792968750,860,863.2812500000,,, +53.7812500000,860,863.2812500000,,, +53.7832031250,860,863.2812500000,,, +53.7851562500,860,863.2812500000,,, +53.7871093750,860,863.2812500000,,, +53.7890625000,860,863.2812500000,,, +53.7910156250,860,863.2812500000,,, +53.7929687500,860,863.2812500000,,, +53.7949218750,860,863.2812500000,,, +53.7968750000,860,863.2812500000,,, +53.7988281250,860,863.2812500000,,, +53.8007812500,860,863.2812500000,,, +53.8027343750,860,863.2812500000,,, +53.8046875000,860,863.2812500000,,, +53.8066406250,860,863.2812500000,,, +53.8085937500,860,863.2812500000,,, +53.8105468750,860,863.2812500000,,, +53.8125000000,861,947.2656250000,,, +53.8144531250,861,947.2656250000,,, +53.8164062500,861,947.2656250000,,, +53.8183593750,861,947.2656250000,,, +53.8203125000,861,947.2656250000,,, +53.8222656250,861,947.2656250000,,, +53.8242187500,861,947.2656250000,,, +53.8261718750,861,947.2656250000,,, +53.8281250000,861,947.2656250000,,, +53.8300781250,861,947.2656250000,,, +53.8320312500,861,947.2656250000,,, +53.8339843750,861,947.2656250000,,, +53.8359375000,861,947.2656250000,,, +53.8378906250,861,947.2656250000,,, +53.8398437500,861,947.2656250000,,, +53.8417968750,861,947.2656250000,,, +53.8437500000,861,947.2656250000,,, +53.8457031250,861,947.2656250000,,, +53.8476562500,861,947.2656250000,,, +53.8496093750,861,947.2656250000,,, +53.8515625000,861,947.2656250000,,, +53.8535156250,861,947.2656250000,,, +53.8554687500,861,947.2656250000,,, +53.8574218750,861,947.2656250000,,, +53.8593750000,861,947.2656250000,,, +53.8613281250,861,947.2656250000,,, +53.8632812500,861,947.2656250000,,, +53.8652343750,861,947.2656250000,,, +53.8671875000,861,947.2656250000,,, +53.8691406250,861,947.2656250000,,, +53.8710937500,861,947.2656250000,,, +53.8730468750,861,947.2656250000,,, +53.8750000000,862,947.2656250000,,, +53.8769531250,862,947.2656250000,,, +53.8789062500,862,947.2656250000,,, +53.8808593750,862,947.2656250000,,, +53.8828125000,862,947.2656250000,,, +53.8847656250,862,947.2656250000,,, +53.8867187500,862,947.2656250000,,, +53.8886718750,862,947.2656250000,,, +53.8906250000,862,947.2656250000,,, +53.8925781250,862,947.2656250000,,, +53.8945312500,862,947.2656250000,,, +53.8964843750,862,947.2656250000,,, +53.8984375000,862,947.2656250000,,, +53.9003906250,862,947.2656250000,,, +53.9023437500,862,947.2656250000,,, +53.9042968750,862,947.2656250000,,, +53.9062500000,862,947.2656250000,,, +53.9082031250,862,947.2656250000,,, +53.9101562500,862,947.2656250000,,, +53.9121093750,862,947.2656250000,,, +53.9140625000,862,947.2656250000,,, +53.9160156250,862,947.2656250000,,, +53.9179687500,862,947.2656250000,,, +53.9199218750,862,947.2656250000,,, +53.9218750000,862,947.2656250000,,, +53.9238281250,862,947.2656250000,,, +53.9257812500,862,947.2656250000,,, +53.9277343750,862,947.2656250000,,, +53.9296875000,862,947.2656250000,,, +53.9316406250,862,947.2656250000,,, +53.9335937500,862,947.2656250000,,, +53.9355468750,862,947.2656250000,,, +53.9375000000,863,947.2656250000,,, +53.9394531250,863,947.2656250000,,, +53.9414062500,863,947.2656250000,,, +53.9433593750,863,947.2656250000,,, +53.9453125000,863,947.2656250000,,, +53.9472656250,863,947.2656250000,,, +53.9492187500,863,947.2656250000,,, +53.9511718750,863,947.2656250000,,, +53.9531250000,863,947.2656250000,,, +53.9550781250,863,947.2656250000,,, +53.9570312500,863,947.2656250000,,, +53.9589843750,863,947.2656250000,,, +53.9609375000,863,947.2656250000,,, +53.9628906250,863,947.2656250000,,, +53.9648437500,863,947.2656250000,,, +53.9667968750,863,947.2656250000,,, +53.9687500000,863,947.2656250000,,, +53.9707031250,863,947.2656250000,,, +53.9726562500,863,947.2656250000,,, +53.9746093750,863,947.2656250000,,, +53.9765625000,863,947.2656250000,,, +53.9785156250,863,947.2656250000,,, +53.9804687500,863,947.2656250000,,, +53.9824218750,863,947.2656250000,,, +53.9843750000,863,947.2656250000,,, +53.9863281250,863,947.2656250000,,, +53.9882812500,863,947.2656250000,,, +53.9902343750,863,947.2656250000,,, +53.9921875000,863,947.2656250000,,, +53.9941406250,863,947.2656250000,,, +53.9960937500,863,947.2656250000,,, +53.9980468750,863,947.2656250000,,, +54.0000000000,864,947.2656250000,,, +54.0019531250,864,947.2656250000,,, +54.0039062500,864,947.2656250000,,, +54.0058593750,864,947.2656250000,,, +54.0078125000,864,947.2656250000,,, +54.0097656250,864,947.2656250000,,, +54.0117187500,864,947.2656250000,,, +54.0136718750,864,947.2656250000,,, +54.0156250000,864,947.2656250000,,, +54.0175781250,864,947.2656250000,,, +54.0195312500,864,947.2656250000,,, +54.0214843750,864,947.2656250000,,, +54.0234375000,864,947.2656250000,,, +54.0253906250,864,947.2656250000,,, +54.0273437500,864,947.2656250000,,, +54.0292968750,864,947.2656250000,,, +54.0312500000,864,947.2656250000,,, +54.0332031250,864,947.2656250000,,, +54.0351562500,864,947.2656250000,,, +54.0371093750,864,947.2656250000,,, +54.0390625000,864,947.2656250000,,, +54.0410156250,864,947.2656250000,,, +54.0429687500,864,947.2656250000,,, +54.0449218750,864,947.2656250000,,, +54.0468750000,864,947.2656250000,,, +54.0488281250,864,947.2656250000,,, +54.0507812500,864,947.2656250000,,, +54.0527343750,864,947.2656250000,,, +54.0546875000,864,947.2656250000,,, +54.0566406250,864,947.2656250000,,, +54.0585937500,864,947.2656250000,,, +54.0605468750,864,947.2656250000,,, +54.0625000000,865,947.2656250000,,, +54.0644531250,865,947.2656250000,,, +54.0664062500,865,947.2656250000,,, +54.0683593750,865,947.2656250000,,, +54.0703125000,865,947.2656250000,,, +54.0722656250,865,947.2656250000,,, +54.0742187500,865,947.2656250000,,, +54.0761718750,865,947.2656250000,,, +54.0781250000,865,947.2656250000,,, +54.0800781250,865,947.2656250000,,, +54.0820312500,865,947.2656250000,,, +54.0839843750,865,947.2656250000,,, +54.0859375000,865,947.2656250000,,, +54.0878906250,865,947.2656250000,,, +54.0898437500,865,947.2656250000,,, +54.0917968750,865,947.2656250000,,, +54.0937500000,865,947.2656250000,,, +54.0957031250,865,947.2656250000,,, +54.0976562500,865,947.2656250000,,, +54.0996093750,865,947.2656250000,,, +54.1015625000,865,947.2656250000,,, +54.1035156250,865,947.2656250000,,, +54.1054687500,865,947.2656250000,,, +54.1074218750,865,947.2656250000,,, +54.1093750000,865,947.2656250000,,, +54.1113281250,865,947.2656250000,,, +54.1132812500,865,947.2656250000,,, +54.1152343750,865,947.2656250000,,, +54.1171875000,865,947.2656250000,,, +54.1191406250,865,947.2656250000,,, +54.1210937500,865,947.2656250000,,, +54.1230468750,865,947.2656250000,,, +54.1250000000,866,947.2656250000,,, +54.1269531250,866,947.2656250000,,, +54.1289062500,866,947.2656250000,,, +54.1308593750,866,947.2656250000,,, +54.1328125000,866,947.2656250000,,, +54.1347656250,866,947.2656250000,,, +54.1367187500,866,947.2656250000,,, +54.1386718750,866,947.2656250000,,, +54.1406250000,866,947.2656250000,,, +54.1425781250,866,947.2656250000,,, +54.1445312500,866,947.2656250000,,, +54.1464843750,866,947.2656250000,,, +54.1484375000,866,947.2656250000,,, +54.1503906250,866,947.2656250000,,, +54.1523437500,866,947.2656250000,,, +54.1542968750,866,947.2656250000,,, +54.1562500000,866,947.2656250000,,, +54.1582031250,866,947.2656250000,,, +54.1601562500,866,947.2656250000,,, +54.1621093750,866,947.2656250000,,, +54.1640625000,866,947.2656250000,,, +54.1660156250,866,947.2656250000,,, +54.1679687500,866,947.2656250000,,, +54.1699218750,866,947.2656250000,,, +54.1718750000,866,947.2656250000,,, +54.1738281250,866,947.2656250000,,, +54.1757812500,866,947.2656250000,,, +54.1777343750,866,947.2656250000,,, +54.1796875000,866,947.2656250000,,, +54.1816406250,866,947.2656250000,,, +54.1835937500,866,947.2656250000,,, +54.1855468750,866,947.2656250000,,, +54.1875000000,867,947.2656250000,,, +54.1894531250,867,947.2656250000,,, +54.1914062500,867,947.2656250000,,, +54.1933593750,867,947.2656250000,,, +54.1953125000,867,947.2656250000,,, +54.1972656250,867,947.2656250000,,, +54.1992187500,867,947.2656250000,,, +54.2011718750,867,947.2656250000,,, +54.2031250000,867,947.2656250000,,, +54.2050781250,867,947.2656250000,,, +54.2070312500,867,947.2656250000,,, +54.2089843750,867,947.2656250000,,, +54.2109375000,867,947.2656250000,,, +54.2128906250,867,947.2656250000,,, +54.2148437500,867,947.2656250000,,, +54.2167968750,867,947.2656250000,,, +54.2187500000,867,947.2656250000,,, +54.2207031250,867,947.2656250000,,, +54.2226562500,867,947.2656250000,,, +54.2246093750,867,947.2656250000,,, +54.2265625000,867,947.2656250000,,, +54.2285156250,867,947.2656250000,,, +54.2304687500,867,947.2656250000,,, +54.2324218750,867,947.2656250000,,, +54.2343750000,867,947.2656250000,,, +54.2363281250,867,947.2656250000,,, +54.2382812500,867,947.2656250000,,, +54.2402343750,867,947.2656250000,,, +54.2421875000,867,947.2656250000,,, +54.2441406250,867,947.2656250000,,, +54.2460937500,867,947.2656250000,,, +54.2480468750,867,947.2656250000,,, +54.2500000000,868,947.2656250000,,, +54.2519531250,868,947.2656250000,,, +54.2539062500,868,947.2656250000,,, +54.2558593750,868,947.2656250000,,, +54.2578125000,868,947.2656250000,,, +54.2597656250,868,947.2656250000,,, +54.2617187500,868,947.2656250000,,, +54.2636718750,868,947.2656250000,,, +54.2656250000,868,947.2656250000,,, +54.2675781250,868,947.2656250000,,, +54.2695312500,868,947.2656250000,,, +54.2714843750,868,947.2656250000,,, +54.2734375000,868,947.2656250000,,, +54.2753906250,868,947.2656250000,,, +54.2773437500,868,947.2656250000,,, +54.2792968750,868,947.2656250000,,, +54.2812500000,868,947.2656250000,,, +54.2832031250,868,947.2656250000,,, +54.2851562500,868,947.2656250000,,, +54.2871093750,868,947.2656250000,,, +54.2890625000,868,947.2656250000,,, +54.2910156250,868,947.2656250000,,, +54.2929687500,868,947.2656250000,,, +54.2949218750,868,947.2656250000,,, +54.2968750000,868,947.2656250000,,, +54.2988281250,868,947.2656250000,,, +54.3007812500,868,947.2656250000,,, +54.3027343750,868,947.2656250000,,, +54.3046875000,868,947.2656250000,,, +54.3066406250,868,947.2656250000,,, +54.3085937500,868,947.2656250000,,, +54.3105468750,868,947.2656250000,,, +54.3125000000,869,947.2656250000,,, +54.3144531250,869,947.2656250000,,, +54.3164062500,869,947.2656250000,,, +54.3183593750,869,947.2656250000,,, +54.3203125000,869,947.2656250000,,, +54.3222656250,869,947.2656250000,,, +54.3242187500,869,947.2656250000,,, +54.3261718750,869,947.2656250000,,, +54.3281250000,869,947.2656250000,,, +54.3300781250,869,947.2656250000,,, +54.3320312500,869,947.2656250000,,, +54.3339843750,869,947.2656250000,,, +54.3359375000,869,947.2656250000,,, +54.3378906250,869,947.2656250000,,, +54.3398437500,869,947.2656250000,,, +54.3417968750,869,947.2656250000,,, +54.3437500000,869,947.2656250000,,, +54.3457031250,869,947.2656250000,,, +54.3476562500,869,947.2656250000,,, +54.3496093750,869,947.2656250000,,, +54.3515625000,869,947.2656250000,,, +54.3535156250,869,947.2656250000,,, +54.3554687500,869,947.2656250000,,, +54.3574218750,869,947.2656250000,,, +54.3593750000,869,947.2656250000,,, +54.3613281250,869,947.2656250000,,, +54.3632812500,869,947.2656250000,,, +54.3652343750,869,947.2656250000,,, +54.3671875000,869,947.2656250000,,, +54.3691406250,869,947.2656250000,,, +54.3710937500,869,947.2656250000,,, +54.3730468750,869,947.2656250000,,, +54.3750000000,870,947.2656250000,,, +54.3769531250,870,947.2656250000,,, +54.3789062500,870,947.2656250000,,, +54.3808593750,870,947.2656250000,,, +54.3828125000,870,947.2656250000,,, +54.3847656250,870,947.2656250000,,, +54.3867187500,870,947.2656250000,,, +54.3886718750,870,947.2656250000,,, +54.3906250000,870,947.2656250000,,, +54.3925781250,870,947.2656250000,,, +54.3945312500,870,947.2656250000,,, +54.3964843750,870,947.2656250000,,, +54.3984375000,870,947.2656250000,,, +54.4003906250,870,947.2656250000,,, +54.4023437500,870,947.2656250000,,, +54.4042968750,870,947.2656250000,,, +54.4062500000,870,947.2656250000,,, +54.4082031250,870,947.2656250000,,, +54.4101562500,870,947.2656250000,,, +54.4121093750,870,947.2656250000,,, +54.4140625000,870,947.2656250000,,, +54.4160156250,870,947.2656250000,,, +54.4179687500,870,947.2656250000,,, +54.4199218750,870,947.2656250000,,, +54.4218750000,870,947.2656250000,,, +54.4238281250,870,947.2656250000,,, +54.4257812500,870,947.2656250000,,, +54.4277343750,870,947.2656250000,,, +54.4296875000,870,947.2656250000,,, +54.4316406250,870,947.2656250000,,, +54.4335937500,870,947.2656250000,,, +54.4355468750,870,947.2656250000,,, +54.4375000000,871,947.2656250000,,, +54.4394531250,871,947.2656250000,,, +54.4414062500,871,947.2656250000,,, +54.4433593750,871,947.2656250000,,, +54.4453125000,871,947.2656250000,,, +54.4472656250,871,947.2656250000,,, +54.4492187500,871,947.2656250000,,, +54.4511718750,871,947.2656250000,,, +54.4531250000,871,947.2656250000,,, +54.4550781250,871,947.2656250000,,, +54.4570312500,871,947.2656250000,,, +54.4589843750,871,947.2656250000,,, +54.4609375000,871,947.2656250000,,, +54.4628906250,871,947.2656250000,,, +54.4648437500,871,947.2656250000,,, +54.4667968750,871,947.2656250000,,, +54.4687500000,871,947.2656250000,,, +54.4707031250,871,947.2656250000,,, +54.4726562500,871,947.2656250000,,, +54.4746093750,871,947.2656250000,,, +54.4765625000,871,947.2656250000,,, +54.4785156250,871,947.2656250000,,, +54.4804687500,871,947.2656250000,,, +54.4824218750,871,947.2656250000,,, +54.4843750000,871,947.2656250000,,, +54.4863281250,871,947.2656250000,,, +54.4882812500,871,947.2656250000,,, +54.4902343750,871,947.2656250000,,, +54.4921875000,871,947.2656250000,,, +54.4941406250,871,947.2656250000,,, +54.4960937500,871,947.2656250000,,, +54.4980468750,871,947.2656250000,,, +54.5000000000,872,947.2656250000,,, +54.5019531250,872,947.2656250000,,, +54.5039062500,872,947.2656250000,,, +54.5058593750,872,947.2656250000,,, +54.5078125000,872,947.2656250000,,, +54.5097656250,872,947.2656250000,,, +54.5117187500,872,947.2656250000,,, +54.5136718750,872,947.2656250000,,, +54.5156250000,872,947.2656250000,,, +54.5175781250,872,947.2656250000,,, +54.5195312500,872,947.2656250000,,, +54.5214843750,872,947.2656250000,,, +54.5234375000,872,947.2656250000,,, +54.5253906250,872,947.2656250000,,, +54.5273437500,872,947.2656250000,,, +54.5292968750,872,947.2656250000,,, +54.5312500000,872,947.2656250000,,, +54.5332031250,872,947.2656250000,,, +54.5351562500,872,947.2656250000,,, +54.5371093750,872,947.2656250000,,, +54.5390625000,872,947.2656250000,,, +54.5410156250,872,947.2656250000,,, +54.5429687500,872,947.2656250000,,, +54.5449218750,872,947.2656250000,,, +54.5468750000,872,947.2656250000,,, +54.5488281250,872,947.2656250000,,, +54.5507812500,872,947.2656250000,,, +54.5527343750,872,947.2656250000,,, +54.5546875000,872,947.2656250000,,, +54.5566406250,872,947.2656250000,,, +54.5585937500,872,947.2656250000,,, +54.5605468750,872,947.2656250000,,, +54.5625000000,873,947.2656250000,,, +54.5644531250,873,947.2656250000,,, +54.5664062500,873,947.2656250000,,, +54.5683593750,873,947.2656250000,,, +54.5703125000,873,947.2656250000,,, +54.5722656250,873,947.2656250000,,, +54.5742187500,873,947.2656250000,,, +54.5761718750,873,947.2656250000,,, +54.5781250000,873,947.2656250000,,, +54.5800781250,873,947.2656250000,,, +54.5820312500,873,947.2656250000,,, +54.5839843750,873,947.2656250000,,, +54.5859375000,873,947.2656250000,,, +54.5878906250,873,947.2656250000,,, +54.5898437500,873,947.2656250000,,, +54.5917968750,873,947.2656250000,,, +54.5937500000,873,947.2656250000,,, +54.5957031250,873,947.2656250000,,, +54.5976562500,873,947.2656250000,,, +54.5996093750,873,947.2656250000,,, +54.6015625000,873,947.2656250000,,, +54.6035156250,873,947.2656250000,,, +54.6054687500,873,947.2656250000,,, +54.6074218750,873,947.2656250000,,, +54.6093750000,873,947.2656250000,,, +54.6113281250,873,947.2656250000,,, +54.6132812500,873,947.2656250000,,, +54.6152343750,873,947.2656250000,,, +54.6171875000,873,947.2656250000,,, +54.6191406250,873,947.2656250000,,, +54.6210937500,873,947.2656250000,,, +54.6230468750,873,947.2656250000,,, +54.6250000000,874,947.2656250000,,, +54.6269531250,874,947.2656250000,,, +54.6289062500,874,947.2656250000,,, +54.6308593750,874,947.2656250000,,, +54.6328125000,874,947.2656250000,,, +54.6347656250,874,947.2656250000,,, +54.6367187500,874,947.2656250000,,, +54.6386718750,874,947.2656250000,,, +54.6406250000,874,947.2656250000,,, +54.6425781250,874,947.2656250000,,, +54.6445312500,874,947.2656250000,,, +54.6464843750,874,947.2656250000,,, +54.6484375000,874,947.2656250000,,, +54.6503906250,874,947.2656250000,,, +54.6523437500,874,947.2656250000,,, +54.6542968750,874,947.2656250000,,, +54.6562500000,874,947.2656250000,,, +54.6582031250,874,947.2656250000,,, +54.6601562500,874,947.2656250000,,, +54.6621093750,874,947.2656250000,,, +54.6640625000,874,947.2656250000,,, +54.6660156250,874,947.2656250000,,, +54.6679687500,874,947.2656250000,,, +54.6699218750,874,947.2656250000,,, +54.6718750000,874,947.2656250000,,, +54.6738281250,874,947.2656250000,,, +54.6757812500,874,947.2656250000,,, +54.6777343750,874,947.2656250000,,, +54.6796875000,874,947.2656250000,,, +54.6816406250,874,947.2656250000,,, +54.6835937500,874,947.2656250000,,, +54.6855468750,874,947.2656250000,,, +54.6875000000,875,947.2656250000,,, +54.6894531250,875,947.2656250000,,, +54.6914062500,875,947.2656250000,,, +54.6933593750,875,947.2656250000,,, +54.6953125000,875,947.2656250000,,, +54.6972656250,875,947.2656250000,,, +54.6992187500,875,947.2656250000,,, +54.7011718750,875,947.2656250000,,, +54.7031250000,875,947.2656250000,,, +54.7050781250,875,947.2656250000,,, +54.7070312500,875,947.2656250000,,, +54.7089843750,875,947.2656250000,,, +54.7109375000,875,947.2656250000,,, +54.7128906250,875,947.2656250000,,, +54.7148437500,875,947.2656250000,,, +54.7167968750,875,947.2656250000,,, +54.7187500000,875,947.2656250000,,, +54.7207031250,875,947.2656250000,,, +54.7226562500,875,947.2656250000,,, +54.7246093750,875,947.2656250000,,, +54.7265625000,875,947.2656250000,,, +54.7285156250,875,947.2656250000,,, +54.7304687500,875,947.2656250000,,, +54.7324218750,875,947.2656250000,,, +54.7343750000,875,947.2656250000,,, +54.7363281250,875,947.2656250000,,, +54.7382812500,875,947.2656250000,,, +54.7402343750,875,947.2656250000,,, +54.7421875000,875,947.2656250000,,, +54.7441406250,875,947.2656250000,,, +54.7460937500,875,947.2656250000,,, +54.7480468750,875,947.2656250000,,, +54.7500000000,876,947.2656250000,,, +54.7519531250,876,947.2656250000,,, +54.7539062500,876,947.2656250000,,, +54.7558593750,876,947.2656250000,,, +54.7578125000,876,947.2656250000,,, +54.7597656250,876,947.2656250000,,, +54.7617187500,876,947.2656250000,,, +54.7636718750,876,947.2656250000,,, +54.7656250000,876,947.2656250000,,, +54.7675781250,876,947.2656250000,,, +54.7695312500,876,947.2656250000,,, +54.7714843750,876,947.2656250000,,, +54.7734375000,876,947.2656250000,,, +54.7753906250,876,947.2656250000,,, +54.7773437500,876,947.2656250000,,, +54.7792968750,876,947.2656250000,,, +54.7812500000,876,947.2656250000,,, +54.7832031250,876,947.2656250000,,, +54.7851562500,876,947.2656250000,,, +54.7871093750,876,947.2656250000,,, +54.7890625000,876,947.2656250000,,, +54.7910156250,876,947.2656250000,,, +54.7929687500,876,947.2656250000,,, +54.7949218750,876,947.2656250000,,, +54.7968750000,876,947.2656250000,,, +54.7988281250,876,947.2656250000,,, +54.8007812500,876,947.2656250000,,, +54.8027343750,876,947.2656250000,,, +54.8046875000,876,947.2656250000,,, +54.8066406250,876,947.2656250000,,, +54.8085937500,876,947.2656250000,,, +54.8105468750,876,947.2656250000,,, +54.8125000000,877,1035.1562500000,,, +54.8144531250,877,1035.1562500000,,, +54.8164062500,877,1035.1562500000,,, +54.8183593750,877,1035.1562500000,,, +54.8203125000,877,1035.1562500000,,, +54.8222656250,877,1035.1562500000,,, +54.8242187500,877,1035.1562500000,,, +54.8261718750,877,1035.1562500000,,, +54.8281250000,877,1035.1562500000,,, +54.8300781250,877,1035.1562500000,,, +54.8320312500,877,1035.1562500000,,, +54.8339843750,877,1035.1562500000,,, +54.8359375000,877,1035.1562500000,,, +54.8378906250,877,1035.1562500000,,, +54.8398437500,877,1035.1562500000,,, +54.8417968750,877,1035.1562500000,,, +54.8437500000,877,1035.1562500000,,, +54.8457031250,877,1035.1562500000,,, +54.8476562500,877,1035.1562500000,,, +54.8496093750,877,1035.1562500000,,, +54.8515625000,877,1035.1562500000,,, +54.8535156250,877,1035.1562500000,,, +54.8554687500,877,1035.1562500000,,, +54.8574218750,877,1035.1562500000,,, +54.8593750000,877,1035.1562500000,,, +54.8613281250,877,1035.1562500000,,, +54.8632812500,877,1035.1562500000,,, +54.8652343750,877,1035.1562500000,,, +54.8671875000,877,1035.1562500000,,, +54.8691406250,877,1035.1562500000,,, +54.8710937500,877,1035.1562500000,,, +54.8730468750,877,1035.1562500000,,, +54.8750000000,878,1035.1562500000,,, +54.8769531250,878,1035.1562500000,,, +54.8789062500,878,1035.1562500000,,, +54.8808593750,878,1035.1562500000,,, +54.8828125000,878,1035.1562500000,,, +54.8847656250,878,1035.1562500000,,, +54.8867187500,878,1035.1562500000,,, +54.8886718750,878,1035.1562500000,,, +54.8906250000,878,1035.1562500000,,, +54.8925781250,878,1035.1562500000,,, +54.8945312500,878,1035.1562500000,,, +54.8964843750,878,1035.1562500000,,, +54.8984375000,878,1035.1562500000,,, +54.9003906250,878,1035.1562500000,,, +54.9023437500,878,1035.1562500000,,, +54.9042968750,878,1035.1562500000,,, +54.9062500000,878,1035.1562500000,,, +54.9082031250,878,1035.1562500000,,, +54.9101562500,878,1035.1562500000,,, +54.9121093750,878,1035.1562500000,,, +54.9140625000,878,1035.1562500000,,, +54.9160156250,878,1035.1562500000,,, +54.9179687500,878,1035.1562500000,,, +54.9199218750,878,1035.1562500000,,, +54.9218750000,878,1035.1562500000,,, +54.9238281250,878,1035.1562500000,,, +54.9257812500,878,1035.1562500000,,, +54.9277343750,878,1035.1562500000,,, +54.9296875000,878,1035.1562500000,,, +54.9316406250,878,1035.1562500000,,, +54.9335937500,878,1035.1562500000,,, +54.9355468750,878,1035.1562500000,,, +54.9375000000,879,1035.1562500000,,, +54.9394531250,879,1035.1562500000,,, +54.9414062500,879,1035.1562500000,,, +54.9433593750,879,1035.1562500000,,, +54.9453125000,879,1035.1562500000,,, +54.9472656250,879,1035.1562500000,,, +54.9492187500,879,1035.1562500000,,, +54.9511718750,879,1035.1562500000,,, +54.9531250000,879,1035.1562500000,,, +54.9550781250,879,1035.1562500000,,, +54.9570312500,879,1035.1562500000,,, +54.9589843750,879,1035.1562500000,,, +54.9609375000,879,1035.1562500000,,, +54.9628906250,879,1035.1562500000,,, +54.9648437500,879,1035.1562500000,,, +54.9667968750,879,1035.1562500000,,, +54.9687500000,879,1035.1562500000,,, +54.9707031250,879,1035.1562500000,,, +54.9726562500,879,1035.1562500000,,, +54.9746093750,879,1035.1562500000,,, +54.9765625000,879,1035.1562500000,,, +54.9785156250,879,1035.1562500000,,, +54.9804687500,879,1035.1562500000,,, +54.9824218750,879,1035.1562500000,,, +54.9843750000,879,1035.1562500000,,, +54.9863281250,879,1035.1562500000,,, +54.9882812500,879,1035.1562500000,,, +54.9902343750,879,1035.1562500000,,, +54.9921875000,879,1035.1562500000,,, +54.9941406250,879,1035.1562500000,,, +54.9960937500,879,1035.1562500000,,, +54.9980468750,879,1035.1562500000,,, +55.0000000000,880,1035.1562500000,,, +55.0019531250,880,1035.1562500000,,, +55.0039062500,880,1035.1562500000,,, +55.0058593750,880,1035.1562500000,,, +55.0078125000,880,1035.1562500000,,, +55.0097656250,880,1035.1562500000,,, +55.0117187500,880,1035.1562500000,,, +55.0136718750,880,1035.1562500000,,, +55.0156250000,880,1035.1562500000,,, +55.0175781250,880,1035.1562500000,,, +55.0195312500,880,1035.1562500000,,, +55.0214843750,880,1035.1562500000,,, +55.0234375000,880,1035.1562500000,,, +55.0253906250,880,1035.1562500000,,, +55.0273437500,880,1035.1562500000,,, +55.0292968750,880,1035.1562500000,,, +55.0312500000,880,1035.1562500000,,, +55.0332031250,880,1035.1562500000,,, +55.0351562500,880,1035.1562500000,,, +55.0371093750,880,1035.1562500000,,, +55.0390625000,880,1035.1562500000,,, +55.0410156250,880,1035.1562500000,,, +55.0429687500,880,1035.1562500000,,, +55.0449218750,880,1035.1562500000,,, +55.0468750000,880,1035.1562500000,,, +55.0488281250,880,1035.1562500000,,, +55.0507812500,880,1035.1562500000,,, +55.0527343750,880,1035.1562500000,,, +55.0546875000,880,1035.1562500000,,, +55.0566406250,880,1035.1562500000,,, +55.0585937500,880,1035.1562500000,,, +55.0605468750,880,1035.1562500000,,, +55.0625000000,881,1035.1562500000,,, +55.0644531250,881,1035.1562500000,,, +55.0664062500,881,1035.1562500000,,, +55.0683593750,881,1035.1562500000,,, +55.0703125000,881,1035.1562500000,,, +55.0722656250,881,1035.1562500000,,, +55.0742187500,881,1035.1562500000,,, +55.0761718750,881,1035.1562500000,,, +55.0781250000,881,1035.1562500000,,, +55.0800781250,881,1035.1562500000,,, +55.0820312500,881,1035.1562500000,,, +55.0839843750,881,1035.1562500000,,, +55.0859375000,881,1035.1562500000,,, +55.0878906250,881,1035.1562500000,,, +55.0898437500,881,1035.1562500000,,, +55.0917968750,881,1035.1562500000,,, +55.0937500000,881,1035.1562500000,,, +55.0957031250,881,1035.1562500000,,, +55.0976562500,881,1035.1562500000,,, +55.0996093750,881,1035.1562500000,,, +55.1015625000,881,1035.1562500000,,, +55.1035156250,881,1035.1562500000,,, +55.1054687500,881,1035.1562500000,,, +55.1074218750,881,1035.1562500000,,, +55.1093750000,881,1035.1562500000,,, +55.1113281250,881,1035.1562500000,,, +55.1132812500,881,1035.1562500000,,, +55.1152343750,881,1035.1562500000,,, +55.1171875000,881,1035.1562500000,,, +55.1191406250,881,1035.1562500000,,, +55.1210937500,881,1035.1562500000,,, +55.1230468750,881,1035.1562500000,,, +55.1250000000,882,1035.1562500000,,, +55.1269531250,882,1035.1562500000,,, +55.1289062500,882,1035.1562500000,,, +55.1308593750,882,1035.1562500000,,, +55.1328125000,882,1035.1562500000,,, +55.1347656250,882,1035.1562500000,,, +55.1367187500,882,1035.1562500000,,, +55.1386718750,882,1035.1562500000,,, +55.1406250000,882,1035.1562500000,,, +55.1425781250,882,1035.1562500000,,, +55.1445312500,882,1035.1562500000,,, +55.1464843750,882,1035.1562500000,,, +55.1484375000,882,1035.1562500000,,, +55.1503906250,882,1035.1562500000,,, +55.1523437500,882,1035.1562500000,,, +55.1542968750,882,1035.1562500000,,, +55.1562500000,882,1035.1562500000,,, +55.1582031250,882,1035.1562500000,,, +55.1601562500,882,1035.1562500000,,, +55.1621093750,882,1035.1562500000,,, +55.1640625000,882,1035.1562500000,,, +55.1660156250,882,1035.1562500000,,, +55.1679687500,882,1035.1562500000,,, +55.1699218750,882,1035.1562500000,,, +55.1718750000,882,1035.1562500000,,, +55.1738281250,882,1035.1562500000,,, +55.1757812500,882,1035.1562500000,,, +55.1777343750,882,1035.1562500000,,, +55.1796875000,882,1035.1562500000,,, +55.1816406250,882,1035.1562500000,,, +55.1835937500,882,1035.1562500000,,, +55.1855468750,882,1035.1562500000,,, +55.1875000000,883,1035.1562500000,,, +55.1894531250,883,1035.1562500000,,, +55.1914062500,883,1035.1562500000,,, +55.1933593750,883,1035.1562500000,,, +55.1953125000,883,1035.1562500000,,, +55.1972656250,883,1035.1562500000,,, +55.1992187500,883,1035.1562500000,,, +55.2011718750,883,1035.1562500000,,, +55.2031250000,883,1035.1562500000,,, +55.2050781250,883,1035.1562500000,,, +55.2070312500,883,1035.1562500000,,, +55.2089843750,883,1035.1562500000,,, +55.2109375000,883,1035.1562500000,,, +55.2128906250,883,1035.1562500000,,, +55.2148437500,883,1035.1562500000,,, +55.2167968750,883,1035.1562500000,,, +55.2187500000,883,1035.1562500000,,, +55.2207031250,883,1035.1562500000,,, +55.2226562500,883,1035.1562500000,,, +55.2246093750,883,1035.1562500000,,, +55.2265625000,883,1035.1562500000,,, +55.2285156250,883,1035.1562500000,,, +55.2304687500,883,1035.1562500000,,, +55.2324218750,883,1035.1562500000,,, +55.2343750000,883,1035.1562500000,,, +55.2363281250,883,1035.1562500000,,, +55.2382812500,883,1035.1562500000,,, +55.2402343750,883,1035.1562500000,,, +55.2421875000,883,1035.1562500000,,, +55.2441406250,883,1035.1562500000,,, +55.2460937500,883,1035.1562500000,,, +55.2480468750,883,1035.1562500000,,, +55.2500000000,884,1035.1562500000,,, +55.2519531250,884,1035.1562500000,,, +55.2539062500,884,1035.1562500000,,, +55.2558593750,884,1035.1562500000,,, +55.2578125000,884,1035.1562500000,,, +55.2597656250,884,1035.1562500000,,, +55.2617187500,884,1035.1562500000,,, +55.2636718750,884,1035.1562500000,,, +55.2656250000,884,1035.1562500000,,, +55.2675781250,884,1035.1562500000,,, +55.2695312500,884,1035.1562500000,,, +55.2714843750,884,1035.1562500000,,, +55.2734375000,884,1035.1562500000,,, +55.2753906250,884,1035.1562500000,,, +55.2773437500,884,1035.1562500000,,, +55.2792968750,884,1035.1562500000,,, +55.2812500000,884,1035.1562500000,,, +55.2832031250,884,1035.1562500000,,, +55.2851562500,884,1035.1562500000,,, +55.2871093750,884,1035.1562500000,,, +55.2890625000,884,1035.1562500000,,, +55.2910156250,884,1035.1562500000,,, +55.2929687500,884,1035.1562500000,,, +55.2949218750,884,1035.1562500000,,, +55.2968750000,884,1035.1562500000,,, +55.2988281250,884,1035.1562500000,,, +55.3007812500,884,1035.1562500000,,, +55.3027343750,884,1035.1562500000,,, +55.3046875000,884,1035.1562500000,,, +55.3066406250,884,1035.1562500000,,, +55.3085937500,884,1035.1562500000,,, +55.3105468750,884,1035.1562500000,,, +55.3125000000,885,1035.1562500000,,, +55.3144531250,885,1035.1562500000,,, +55.3164062500,885,1035.1562500000,,, +55.3183593750,885,1035.1562500000,,, +55.3203125000,885,1035.1562500000,,, +55.3222656250,885,1035.1562500000,,, +55.3242187500,885,1035.1562500000,,, +55.3261718750,885,1035.1562500000,,, +55.3281250000,885,1035.1562500000,,, +55.3300781250,885,1035.1562500000,,, +55.3320312500,885,1035.1562500000,,, +55.3339843750,885,1035.1562500000,,, +55.3359375000,885,1035.1562500000,,, +55.3378906250,885,1035.1562500000,,, +55.3398437500,885,1035.1562500000,,, +55.3417968750,885,1035.1562500000,,, +55.3437500000,885,1035.1562500000,,, +55.3457031250,885,1035.1562500000,,, +55.3476562500,885,1035.1562500000,,, +55.3496093750,885,1035.1562500000,,, +55.3515625000,885,1035.1562500000,,, +55.3535156250,885,1035.1562500000,,, +55.3554687500,885,1035.1562500000,,, +55.3574218750,885,1035.1562500000,,, +55.3593750000,885,1035.1562500000,,, +55.3613281250,885,1035.1562500000,,, +55.3632812500,885,1035.1562500000,,, +55.3652343750,885,1035.1562500000,,, +55.3671875000,885,1035.1562500000,,, +55.3691406250,885,1035.1562500000,,, +55.3710937500,885,1035.1562500000,,, +55.3730468750,885,1035.1562500000,,, +55.3750000000,886,1035.1562500000,,, +55.3769531250,886,1035.1562500000,,, +55.3789062500,886,1035.1562500000,,, +55.3808593750,886,1035.1562500000,,, +55.3828125000,886,1035.1562500000,,, +55.3847656250,886,1035.1562500000,,, +55.3867187500,886,1035.1562500000,,, +55.3886718750,886,1035.1562500000,,, +55.3906250000,886,1035.1562500000,,, +55.3925781250,886,1035.1562500000,,, +55.3945312500,886,1035.1562500000,,, +55.3964843750,886,1035.1562500000,,, +55.3984375000,886,1035.1562500000,,, +55.4003906250,886,1035.1562500000,,, +55.4023437500,886,1035.1562500000,,, +55.4042968750,886,1035.1562500000,,, +55.4062500000,886,1035.1562500000,,, +55.4082031250,886,1035.1562500000,,, +55.4101562500,886,1035.1562500000,,, +55.4121093750,886,1035.1562500000,,, +55.4140625000,886,1035.1562500000,,, +55.4160156250,886,1035.1562500000,,, +55.4179687500,886,1035.1562500000,,, +55.4199218750,886,1035.1562500000,,, +55.4218750000,886,1035.1562500000,,, +55.4238281250,886,1035.1562500000,,, +55.4257812500,886,1035.1562500000,,, +55.4277343750,886,1035.1562500000,,, +55.4296875000,886,1035.1562500000,,, +55.4316406250,886,1035.1562500000,,, +55.4335937500,886,1035.1562500000,,, +55.4355468750,886,1035.1562500000,,, +55.4375000000,887,1035.1562500000,,, +55.4394531250,887,1035.1562500000,,, +55.4414062500,887,1035.1562500000,,, +55.4433593750,887,1035.1562500000,,, +55.4453125000,887,1035.1562500000,,, +55.4472656250,887,1035.1562500000,,, +55.4492187500,887,1035.1562500000,,, +55.4511718750,887,1035.1562500000,,, +55.4531250000,887,1035.1562500000,,, +55.4550781250,887,1035.1562500000,,, +55.4570312500,887,1035.1562500000,,, +55.4589843750,887,1035.1562500000,,, +55.4609375000,887,1035.1562500000,,, +55.4628906250,887,1035.1562500000,,, +55.4648437500,887,1035.1562500000,,, +55.4667968750,887,1035.1562500000,,, +55.4687500000,887,1035.1562500000,,, +55.4707031250,887,1035.1562500000,,, +55.4726562500,887,1035.1562500000,,, +55.4746093750,887,1035.1562500000,,, +55.4765625000,887,1035.1562500000,,, +55.4785156250,887,1035.1562500000,,, +55.4804687500,887,1035.1562500000,,, +55.4824218750,887,1035.1562500000,,, +55.4843750000,887,1035.1562500000,,, +55.4863281250,887,1035.1562500000,,, +55.4882812500,887,1035.1562500000,,, +55.4902343750,887,1035.1562500000,,, +55.4921875000,887,1035.1562500000,,, +55.4941406250,887,1035.1562500000,,, +55.4960937500,887,1035.1562500000,,, +55.4980468750,887,1035.1562500000,,, +55.5000000000,888,1035.1562500000,,, +55.5019531250,888,1035.1562500000,,, +55.5039062500,888,1035.1562500000,,, +55.5058593750,888,1035.1562500000,,, +55.5078125000,888,1035.1562500000,,, +55.5097656250,888,1035.1562500000,,, +55.5117187500,888,1035.1562500000,,, +55.5136718750,888,1035.1562500000,,, +55.5156250000,888,1035.1562500000,,, +55.5175781250,888,1035.1562500000,,, +55.5195312500,888,1035.1562500000,,, +55.5214843750,888,1035.1562500000,,, +55.5234375000,888,1035.1562500000,,, +55.5253906250,888,1035.1562500000,,, +55.5273437500,888,1035.1562500000,,, +55.5292968750,888,1035.1562500000,,, +55.5312500000,888,1035.1562500000,,, +55.5332031250,888,1035.1562500000,,, +55.5351562500,888,1035.1562500000,,, +55.5371093750,888,1035.1562500000,,, +55.5390625000,888,1035.1562500000,,, +55.5410156250,888,1035.1562500000,,, +55.5429687500,888,1035.1562500000,,, +55.5449218750,888,1035.1562500000,,, +55.5468750000,888,1035.1562500000,,, +55.5488281250,888,1035.1562500000,,, +55.5507812500,888,1035.1562500000,,, +55.5527343750,888,1035.1562500000,,, +55.5546875000,888,1035.1562500000,,, +55.5566406250,888,1035.1562500000,,, +55.5585937500,888,1035.1562500000,,, +55.5605468750,888,1035.1562500000,,, +55.5625000000,889,1035.1562500000,,, +55.5644531250,889,1035.1562500000,,, +55.5664062500,889,1035.1562500000,,, +55.5683593750,889,1035.1562500000,,, +55.5703125000,889,1035.1562500000,,, +55.5722656250,889,1035.1562500000,,, +55.5742187500,889,1035.1562500000,,, +55.5761718750,889,1035.1562500000,,, +55.5781250000,889,1035.1562500000,,, +55.5800781250,889,1035.1562500000,,, +55.5820312500,889,1035.1562500000,,, +55.5839843750,889,1035.1562500000,,, +55.5859375000,889,1035.1562500000,,, +55.5878906250,889,1035.1562500000,,, +55.5898437500,889,1035.1562500000,,, +55.5917968750,889,1035.1562500000,,, +55.5937500000,889,1035.1562500000,,, +55.5957031250,889,1035.1562500000,,, +55.5976562500,889,1035.1562500000,,, +55.5996093750,889,1035.1562500000,,, +55.6015625000,889,1035.1562500000,,, +55.6035156250,889,1035.1562500000,,, +55.6054687500,889,1035.1562500000,,, +55.6074218750,889,1035.1562500000,,, +55.6093750000,889,1035.1562500000,,, +55.6113281250,889,1035.1562500000,,, +55.6132812500,889,1035.1562500000,,, +55.6152343750,889,1035.1562500000,,, +55.6171875000,889,1035.1562500000,,, +55.6191406250,889,1035.1562500000,,, +55.6210937500,889,1035.1562500000,,, +55.6230468750,889,1035.1562500000,,, +55.6250000000,890,1035.1562500000,,, +55.6269531250,890,1035.1562500000,,, +55.6289062500,890,1035.1562500000,,, +55.6308593750,890,1035.1562500000,,, +55.6328125000,890,1035.1562500000,,, +55.6347656250,890,1035.1562500000,,, +55.6367187500,890,1035.1562500000,,, +55.6386718750,890,1035.1562500000,,, +55.6406250000,890,1035.1562500000,,, +55.6425781250,890,1035.1562500000,,, +55.6445312500,890,1035.1562500000,,, +55.6464843750,890,1035.1562500000,,, +55.6484375000,890,1035.1562500000,,, +55.6503906250,890,1035.1562500000,,, +55.6523437500,890,1035.1562500000,,, +55.6542968750,890,1035.1562500000,,, +55.6562500000,890,1035.1562500000,,, +55.6582031250,890,1035.1562500000,,, +55.6601562500,890,1035.1562500000,,, +55.6621093750,890,1035.1562500000,,, +55.6640625000,890,1035.1562500000,,, +55.6660156250,890,1035.1562500000,,, +55.6679687500,890,1035.1562500000,,, +55.6699218750,890,1035.1562500000,,, +55.6718750000,890,1035.1562500000,,, +55.6738281250,890,1035.1562500000,,, +55.6757812500,890,1035.1562500000,,, +55.6777343750,890,1035.1562500000,,, +55.6796875000,890,1035.1562500000,,, +55.6816406250,890,1035.1562500000,,, +55.6835937500,890,1035.1562500000,,, +55.6855468750,890,1035.1562500000,,, +55.6875000000,891,1035.1562500000,,, +55.6894531250,891,1035.1562500000,,, +55.6914062500,891,1035.1562500000,,, +55.6933593750,891,1035.1562500000,,, +55.6953125000,891,1035.1562500000,,, +55.6972656250,891,1035.1562500000,,, +55.6992187500,891,1035.1562500000,,, +55.7011718750,891,1035.1562500000,,, +55.7031250000,891,1035.1562500000,,, +55.7050781250,891,1035.1562500000,,, +55.7070312500,891,1035.1562500000,,, +55.7089843750,891,1035.1562500000,,, +55.7109375000,891,1035.1562500000,,, +55.7128906250,891,1035.1562500000,,, +55.7148437500,891,1035.1562500000,,, +55.7167968750,891,1035.1562500000,,, +55.7187500000,891,1035.1562500000,,, +55.7207031250,891,1035.1562500000,,, +55.7226562500,891,1035.1562500000,,, +55.7246093750,891,1035.1562500000,,, +55.7265625000,891,1035.1562500000,,, +55.7285156250,891,1035.1562500000,,, +55.7304687500,891,1035.1562500000,,, +55.7324218750,891,1035.1562500000,,, +55.7343750000,891,1035.1562500000,,, +55.7363281250,891,1035.1562500000,,, +55.7382812500,891,1035.1562500000,,, +55.7402343750,891,1035.1562500000,,, +55.7421875000,891,1035.1562500000,,, +55.7441406250,891,1035.1562500000,,, +55.7460937500,891,1035.1562500000,,, +55.7480468750,891,1035.1562500000,,, +55.7500000000,892,1001.9531250000,,, +55.7519531250,892,1001.9531250000,,, +55.7539062500,892,1001.9531250000,,, +55.7558593750,892,1001.9531250000,,, +55.7578125000,892,1001.9531250000,,, +55.7597656250,892,1001.9531250000,,, +55.7617187500,892,1001.9531250000,,, +55.7636718750,892,1001.9531250000,,, +55.7656250000,892,1001.9531250000,,, +55.7675781250,892,1001.9531250000,,, +55.7695312500,892,1001.9531250000,,, +55.7714843750,892,1001.9531250000,,, +55.7734375000,892,1001.9531250000,,, +55.7753906250,892,1001.9531250000,,, +55.7773437500,892,1001.9531250000,,, +55.7792968750,892,1001.9531250000,,, +55.7812500000,892,1001.9531250000,,, +55.7832031250,892,1001.9531250000,,, +55.7851562500,892,1001.9531250000,,, +55.7871093750,892,1001.9531250000,,, +55.7890625000,892,1001.9531250000,,, +55.7910156250,892,1001.9531250000,,, +55.7929687500,892,1001.9531250000,,, +55.7949218750,892,1001.9531250000,,, +55.7968750000,892,1001.9531250000,,, +55.7988281250,892,1001.9531250000,,, +55.8007812500,892,1001.9531250000,,, +55.8027343750,892,1001.9531250000,,, +55.8046875000,892,1001.9531250000,,, +55.8066406250,892,1001.9531250000,,, +55.8085937500,892,1001.9531250000,,, +55.8105468750,892,1001.9531250000,,, +55.8125000000,893,1001.9531250000,,, +55.8144531250,893,1001.9531250000,,, +55.8164062500,893,1001.9531250000,,, +55.8183593750,893,1001.9531250000,,, +55.8203125000,893,1001.9531250000,,, +55.8222656250,893,1001.9531250000,,, +55.8242187500,893,1001.9531250000,,, +55.8261718750,893,1001.9531250000,,, +55.8281250000,893,1001.9531250000,,, +55.8300781250,893,1001.9531250000,,, +55.8320312500,893,1001.9531250000,,, +55.8339843750,893,1001.9531250000,,, +55.8359375000,893,1001.9531250000,,, +55.8378906250,893,1001.9531250000,,, +55.8398437500,893,1001.9531250000,,, +55.8417968750,893,1001.9531250000,,, +55.8437500000,893,1001.9531250000,,, +55.8457031250,893,1001.9531250000,,, +55.8476562500,893,1001.9531250000,,, +55.8496093750,893,1001.9531250000,,, +55.8515625000,893,1001.9531250000,,, +55.8535156250,893,1001.9531250000,,, +55.8554687500,893,1001.9531250000,,, +55.8574218750,893,1001.9531250000,,, +55.8593750000,893,1001.9531250000,,, +55.8613281250,893,1001.9531250000,,, +55.8632812500,893,1001.9531250000,,, +55.8652343750,893,1001.9531250000,,, +55.8671875000,893,1001.9531250000,,, +55.8691406250,893,1001.9531250000,,, +55.8710937500,893,1001.9531250000,,, +55.8730468750,893,1001.9531250000,,, +55.8750000000,894,1001.9531250000,,, +55.8769531250,894,1001.9531250000,,, +55.8789062500,894,1001.9531250000,,, +55.8808593750,894,1001.9531250000,,, +55.8828125000,894,1001.9531250000,,, +55.8847656250,894,1001.9531250000,,, +55.8867187500,894,1001.9531250000,,, +55.8886718750,894,1001.9531250000,,, +55.8906250000,894,1001.9531250000,,, +55.8925781250,894,1001.9531250000,,, +55.8945312500,894,1001.9531250000,,, +55.8964843750,894,1001.9531250000,,, +55.8984375000,894,1001.9531250000,,, +55.9003906250,894,1001.9531250000,,, +55.9023437500,894,1001.9531250000,,, +55.9042968750,894,1001.9531250000,,, +55.9062500000,894,1001.9531250000,,, +55.9082031250,894,1001.9531250000,,, +55.9101562500,894,1001.9531250000,,, +55.9121093750,894,1001.9531250000,,, +55.9140625000,894,1001.9531250000,,, +55.9160156250,894,1001.9531250000,,, +55.9179687500,894,1001.9531250000,,, +55.9199218750,894,1001.9531250000,,, +55.9218750000,894,1001.9531250000,,, +55.9238281250,894,1001.9531250000,,, +55.9257812500,894,1001.9531250000,,, +55.9277343750,894,1001.9531250000,,, +55.9296875000,894,1001.9531250000,,, +55.9316406250,894,1001.9531250000,,, +55.9335937500,894,1001.9531250000,,, +55.9355468750,894,1001.9531250000,,, +55.9375000000,895,1001.9531250000,,, +55.9394531250,895,1001.9531250000,,, +55.9414062500,895,1001.9531250000,,, +55.9433593750,895,1001.9531250000,,, +55.9453125000,895,1001.9531250000,,, +55.9472656250,895,1001.9531250000,,, +55.9492187500,895,1001.9531250000,,, +55.9511718750,895,1001.9531250000,,, +55.9531250000,895,1001.9531250000,,, +55.9550781250,895,1001.9531250000,,, +55.9570312500,895,1001.9531250000,,, +55.9589843750,895,1001.9531250000,,, +55.9609375000,895,1001.9531250000,,, +55.9628906250,895,1001.9531250000,,, +55.9648437500,895,1001.9531250000,,, +55.9667968750,895,1001.9531250000,,, +55.9687500000,895,1001.9531250000,,, +55.9707031250,895,1001.9531250000,,, +55.9726562500,895,1001.9531250000,,, +55.9746093750,895,1001.9531250000,,, +55.9765625000,895,1001.9531250000,,, +55.9785156250,895,1001.9531250000,,, +55.9804687500,895,1001.9531250000,,, +55.9824218750,895,1001.9531250000,,, +55.9843750000,895,1001.9531250000,,, +55.9863281250,895,1001.9531250000,,, +55.9882812500,895,1001.9531250000,,, +55.9902343750,895,1001.9531250000,,, +55.9921875000,895,1001.9531250000,,, +55.9941406250,895,1001.9531250000,,, +55.9960937500,895,1001.9531250000,,, +55.9980468750,895,1001.9531250000,,, +56.0000000000,896,1001.9531250000,,, +56.0019531250,896,1001.9531250000,,, +56.0039062500,896,1001.9531250000,,, +56.0058593750,896,1001.9531250000,,, +56.0078125000,896,1001.9531250000,,, +56.0097656250,896,1001.9531250000,,, +56.0117187500,896,1001.9531250000,,, +56.0136718750,896,1001.9531250000,,, +56.0156250000,896,1001.9531250000,,, +56.0175781250,896,1001.9531250000,,, +56.0195312500,896,1001.9531250000,,, +56.0214843750,896,1001.9531250000,,, +56.0234375000,896,1001.9531250000,,, +56.0253906250,896,1001.9531250000,,, +56.0273437500,896,1001.9531250000,,, +56.0292968750,896,1001.9531250000,,, +56.0312500000,896,1001.9531250000,,, +56.0332031250,896,1001.9531250000,,, +56.0351562500,896,1001.9531250000,,, +56.0371093750,896,1001.9531250000,,, +56.0390625000,896,1001.9531250000,,, +56.0410156250,896,1001.9531250000,,, +56.0429687500,896,1001.9531250000,,, +56.0449218750,896,1001.9531250000,,, +56.0468750000,896,1001.9531250000,,, +56.0488281250,896,1001.9531250000,,, +56.0507812500,896,1001.9531250000,,, +56.0527343750,896,1001.9531250000,,, +56.0546875000,896,1001.9531250000,,, +56.0566406250,896,1001.9531250000,,, +56.0585937500,896,1001.9531250000,,, +56.0605468750,896,1001.9531250000,,, +56.0625000000,897,1001.9531250000,,, +56.0644531250,897,1001.9531250000,,, +56.0664062500,897,1001.9531250000,,, +56.0683593750,897,1001.9531250000,,, +56.0703125000,897,1001.9531250000,,, +56.0722656250,897,1001.9531250000,,, +56.0742187500,897,1001.9531250000,,, +56.0761718750,897,1001.9531250000,,, +56.0781250000,897,1001.9531250000,,, +56.0800781250,897,1001.9531250000,,, +56.0820312500,897,1001.9531250000,,, +56.0839843750,897,1001.9531250000,,, +56.0859375000,897,1001.9531250000,,, +56.0878906250,897,1001.9531250000,,, +56.0898437500,897,1001.9531250000,,, +56.0917968750,897,1001.9531250000,,, +56.0937500000,897,1001.9531250000,,, +56.0957031250,897,1001.9531250000,,, +56.0976562500,897,1001.9531250000,,, +56.0996093750,897,1001.9531250000,,, +56.1015625000,897,1001.9531250000,,, +56.1035156250,897,1001.9531250000,,, +56.1054687500,897,1001.9531250000,,, +56.1074218750,897,1001.9531250000,,, +56.1093750000,897,1001.9531250000,,, +56.1113281250,897,1001.9531250000,,, +56.1132812500,897,1001.9531250000,,, +56.1152343750,897,1001.9531250000,,, +56.1171875000,897,1001.9531250000,,, +56.1191406250,897,1001.9531250000,,, +56.1210937500,897,1001.9531250000,,, +56.1230468750,897,1001.9531250000,,, +56.1250000000,898,1001.9531250000,,, +56.1269531250,898,1001.9531250000,,, +56.1289062500,898,1001.9531250000,,, +56.1308593750,898,1001.9531250000,,, +56.1328125000,898,1001.9531250000,,, +56.1347656250,898,1001.9531250000,,, +56.1367187500,898,1001.9531250000,,, +56.1386718750,898,1001.9531250000,,, +56.1406250000,898,1001.9531250000,,, +56.1425781250,898,1001.9531250000,,, +56.1445312500,898,1001.9531250000,,, +56.1464843750,898,1001.9531250000,,, +56.1484375000,898,1001.9531250000,,, +56.1503906250,898,1001.9531250000,,, +56.1523437500,898,1001.9531250000,,, +56.1542968750,898,1001.9531250000,,, +56.1562500000,898,1001.9531250000,,, +56.1582031250,898,1001.9531250000,,, +56.1601562500,898,1001.9531250000,,, +56.1621093750,898,1001.9531250000,,, +56.1640625000,898,1001.9531250000,,, +56.1660156250,898,1001.9531250000,,, +56.1679687500,898,1001.9531250000,,, +56.1699218750,898,1001.9531250000,,, +56.1718750000,898,1001.9531250000,,, +56.1738281250,898,1001.9531250000,,, +56.1757812500,898,1001.9531250000,,, +56.1777343750,898,1001.9531250000,,, +56.1796875000,898,1001.9531250000,,, +56.1816406250,898,1001.9531250000,,, +56.1835937500,898,1001.9531250000,,, +56.1855468750,898,1001.9531250000,,, +56.1875000000,899,1001.9531250000,,, +56.1894531250,899,1001.9531250000,,, +56.1914062500,899,1001.9531250000,,, +56.1933593750,899,1001.9531250000,,, +56.1953125000,899,1001.9531250000,,, +56.1972656250,899,1001.9531250000,,, +56.1992187500,899,1001.9531250000,,, +56.2011718750,899,1001.9531250000,,, +56.2031250000,899,1001.9531250000,,, +56.2050781250,899,1001.9531250000,,, +56.2070312500,899,1001.9531250000,,, +56.2089843750,899,1001.9531250000,,, +56.2109375000,899,1001.9531250000,,, +56.2128906250,899,1001.9531250000,,, +56.2148437500,899,1001.9531250000,,, +56.2167968750,899,1001.9531250000,,, +56.2187500000,899,1001.9531250000,,, +56.2207031250,899,1001.9531250000,,, +56.2226562500,899,1001.9531250000,,, +56.2246093750,899,1001.9531250000,,, +56.2265625000,899,1001.9531250000,,, +56.2285156250,899,1001.9531250000,,, +56.2304687500,899,1001.9531250000,,, +56.2324218750,899,1001.9531250000,,, +56.2343750000,899,1001.9531250000,,, +56.2363281250,899,1001.9531250000,,, +56.2382812500,899,1001.9531250000,,, +56.2402343750,899,1001.9531250000,,, +56.2421875000,899,1001.9531250000,,, +56.2441406250,899,1001.9531250000,,, +56.2460937500,899,1001.9531250000,,, +56.2480468750,899,1001.9531250000,,, +56.2500000000,900,1001.9531250000,,, +56.2519531250,900,1001.9531250000,,, +56.2539062500,900,1001.9531250000,,, +56.2558593750,900,1001.9531250000,,, +56.2578125000,900,1001.9531250000,,, +56.2597656250,900,1001.9531250000,,, +56.2617187500,900,1001.9531250000,,, +56.2636718750,900,1001.9531250000,,, +56.2656250000,900,1001.9531250000,,, +56.2675781250,900,1001.9531250000,,, +56.2695312500,900,1001.9531250000,,, +56.2714843750,900,1001.9531250000,,, +56.2734375000,900,1001.9531250000,,, +56.2753906250,900,1001.9531250000,,, +56.2773437500,900,1001.9531250000,,, +56.2792968750,900,1001.9531250000,,, +56.2812500000,900,1001.9531250000,,, +56.2832031250,900,1001.9531250000,,, +56.2851562500,900,1001.9531250000,,, +56.2871093750,900,1001.9531250000,,, +56.2890625000,900,1001.9531250000,,, +56.2910156250,900,1001.9531250000,,, +56.2929687500,900,1001.9531250000,,, +56.2949218750,900,1001.9531250000,,, +56.2968750000,900,1001.9531250000,,, +56.2988281250,900,1001.9531250000,,, +56.3007812500,900,1001.9531250000,,, +56.3027343750,900,1001.9531250000,,, +56.3046875000,900,1001.9531250000,,, +56.3066406250,900,1001.9531250000,,, +56.3085937500,900,1001.9531250000,,, +56.3105468750,900,1001.9531250000,,, +56.3125000000,901,1001.9531250000,,, +56.3144531250,901,1001.9531250000,,, +56.3164062500,901,1001.9531250000,,, +56.3183593750,901,1001.9531250000,,, +56.3203125000,901,1001.9531250000,,, +56.3222656250,901,1001.9531250000,,, +56.3242187500,901,1001.9531250000,,, +56.3261718750,901,1001.9531250000,,, +56.3281250000,901,1001.9531250000,,, +56.3300781250,901,1001.9531250000,,, +56.3320312500,901,1001.9531250000,,, +56.3339843750,901,1001.9531250000,,, +56.3359375000,901,1001.9531250000,,, +56.3378906250,901,1001.9531250000,,, +56.3398437500,901,1001.9531250000,,, +56.3417968750,901,1001.9531250000,,, +56.3437500000,901,1001.9531250000,,, +56.3457031250,901,1001.9531250000,,, +56.3476562500,901,1001.9531250000,,, +56.3496093750,901,1001.9531250000,,, +56.3515625000,901,1001.9531250000,,, +56.3535156250,901,1001.9531250000,,, +56.3554687500,901,1001.9531250000,,, +56.3574218750,901,1001.9531250000,,, +56.3593750000,901,1001.9531250000,,, +56.3613281250,901,1001.9531250000,,, +56.3632812500,901,1001.9531250000,,, +56.3652343750,901,1001.9531250000,,, +56.3671875000,901,1001.9531250000,,, +56.3691406250,901,1001.9531250000,,, +56.3710937500,901,1001.9531250000,,, +56.3730468750,901,1001.9531250000,,, +56.3750000000,902,1001.9531250000,,, +56.3769531250,902,1001.9531250000,,, +56.3789062500,902,1001.9531250000,,, +56.3808593750,902,1001.9531250000,,, +56.3828125000,902,1001.9531250000,,, +56.3847656250,902,1001.9531250000,,, +56.3867187500,902,1001.9531250000,,, +56.3886718750,902,1001.9531250000,,, +56.3906250000,902,1001.9531250000,,, +56.3925781250,902,1001.9531250000,,, +56.3945312500,902,1001.9531250000,,, +56.3964843750,902,1001.9531250000,,, +56.3984375000,902,1001.9531250000,,, +56.4003906250,902,1001.9531250000,,, +56.4023437500,902,1001.9531250000,,, +56.4042968750,902,1001.9531250000,,, +56.4062500000,902,1001.9531250000,,, +56.4082031250,902,1001.9531250000,,, +56.4101562500,902,1001.9531250000,,, +56.4121093750,902,1001.9531250000,,, +56.4140625000,902,1001.9531250000,,, +56.4160156250,902,1001.9531250000,,, +56.4179687500,902,1001.9531250000,,, +56.4199218750,902,1001.9531250000,,, +56.4218750000,902,1001.9531250000,,, +56.4238281250,902,1001.9531250000,,, +56.4257812500,902,1001.9531250000,,, +56.4277343750,902,1001.9531250000,,, +56.4296875000,902,1001.9531250000,,, +56.4316406250,902,1001.9531250000,,, +56.4335937500,902,1001.9531250000,,, +56.4355468750,902,1001.9531250000,,, +56.4375000000,903,1001.9531250000,,, +56.4394531250,903,1001.9531250000,,, +56.4414062500,903,1001.9531250000,,, +56.4433593750,903,1001.9531250000,,, +56.4453125000,903,1001.9531250000,,, +56.4472656250,903,1001.9531250000,,, +56.4492187500,903,1001.9531250000,,, +56.4511718750,903,1001.9531250000,,, +56.4531250000,903,1001.9531250000,,, +56.4550781250,903,1001.9531250000,,, +56.4570312500,903,1001.9531250000,,, +56.4589843750,903,1001.9531250000,,, +56.4609375000,903,1001.9531250000,,, +56.4628906250,903,1001.9531250000,,, +56.4648437500,903,1001.9531250000,,, +56.4667968750,903,1001.9531250000,,, +56.4687500000,903,1001.9531250000,,, +56.4707031250,903,1001.9531250000,,, +56.4726562500,903,1001.9531250000,,, +56.4746093750,903,1001.9531250000,,, +56.4765625000,903,1001.9531250000,,, +56.4785156250,903,1001.9531250000,,, +56.4804687500,903,1001.9531250000,,, +56.4824218750,903,1001.9531250000,,, +56.4843750000,903,1001.9531250000,,, +56.4863281250,903,1001.9531250000,,, +56.4882812500,903,1001.9531250000,,, +56.4902343750,903,1001.9531250000,,, +56.4921875000,903,1001.9531250000,,, +56.4941406250,903,1001.9531250000,,, +56.4960937500,903,1001.9531250000,,, +56.4980468750,903,1001.9531250000,,, +56.5000000000,904,1001.9531250000,,, +56.5019531250,904,1001.9531250000,,, +56.5039062500,904,1001.9531250000,,, +56.5058593750,904,1001.9531250000,,, +56.5078125000,904,1001.9531250000,,, +56.5097656250,904,1001.9531250000,,, +56.5117187500,904,1001.9531250000,,, +56.5136718750,904,1001.9531250000,,, +56.5156250000,904,1001.9531250000,,, +56.5175781250,904,1001.9531250000,,, +56.5195312500,904,1001.9531250000,,, +56.5214843750,904,1001.9531250000,,, +56.5234375000,904,1001.9531250000,,, +56.5253906250,904,1001.9531250000,,, +56.5273437500,904,1001.9531250000,,, +56.5292968750,904,1001.9531250000,,, +56.5312500000,904,1001.9531250000,,, +56.5332031250,904,1001.9531250000,,, +56.5351562500,904,1001.9531250000,,, +56.5371093750,904,1001.9531250000,,, +56.5390625000,904,1001.9531250000,,, +56.5410156250,904,1001.9531250000,,, +56.5429687500,904,1001.9531250000,,, +56.5449218750,904,1001.9531250000,,, +56.5468750000,904,1001.9531250000,,, +56.5488281250,904,1001.9531250000,,, +56.5507812500,904,1001.9531250000,,, +56.5527343750,904,1001.9531250000,,, +56.5546875000,904,1001.9531250000,,, +56.5566406250,904,1001.9531250000,,, +56.5585937500,904,1001.9531250000,,, +56.5605468750,904,1001.9531250000,,, +56.5625000000,905,923.8281250000,,, +56.5644531250,905,923.8281250000,,, +56.5664062500,905,923.8281250000,,, +56.5683593750,905,923.8281250000,,, +56.5703125000,905,923.8281250000,,, +56.5722656250,905,923.8281250000,,, +56.5742187500,905,923.8281250000,,, +56.5761718750,905,923.8281250000,,, +56.5781250000,905,923.8281250000,,, +56.5800781250,905,923.8281250000,,, +56.5820312500,905,923.8281250000,,, +56.5839843750,905,923.8281250000,,, +56.5859375000,905,923.8281250000,,, +56.5878906250,905,923.8281250000,,, +56.5898437500,905,923.8281250000,,, +56.5917968750,905,923.8281250000,,, +56.5937500000,905,923.8281250000,,, +56.5957031250,905,923.8281250000,,, +56.5976562500,905,923.8281250000,,, +56.5996093750,905,923.8281250000,,, +56.6015625000,905,923.8281250000,,, +56.6035156250,905,923.8281250000,,, +56.6054687500,905,923.8281250000,,, +56.6074218750,905,923.8281250000,,, +56.6093750000,905,923.8281250000,,, +56.6113281250,905,923.8281250000,,, +56.6132812500,905,923.8281250000,,, +56.6152343750,905,923.8281250000,,, +56.6171875000,905,923.8281250000,,, +56.6191406250,905,923.8281250000,,, +56.6210937500,905,923.8281250000,,, +56.6230468750,905,923.8281250000,,, +56.6250000000,906,923.8281250000,,, +56.6269531250,906,923.8281250000,,, +56.6289062500,906,923.8281250000,,, +56.6308593750,906,923.8281250000,,, +56.6328125000,906,923.8281250000,,, +56.6347656250,906,923.8281250000,,, +56.6367187500,906,923.8281250000,,, +56.6386718750,906,923.8281250000,,, +56.6406250000,906,923.8281250000,,, +56.6425781250,906,923.8281250000,,, +56.6445312500,906,923.8281250000,,, +56.6464843750,906,923.8281250000,,, +56.6484375000,906,923.8281250000,,, +56.6503906250,906,923.8281250000,,, +56.6523437500,906,923.8281250000,,, +56.6542968750,906,923.8281250000,,, +56.6562500000,906,923.8281250000,,, +56.6582031250,906,923.8281250000,,, +56.6601562500,906,923.8281250000,,, +56.6621093750,906,923.8281250000,,, +56.6640625000,906,923.8281250000,,, +56.6660156250,906,923.8281250000,,, +56.6679687500,906,923.8281250000,,, +56.6699218750,906,923.8281250000,,, +56.6718750000,906,923.8281250000,,, +56.6738281250,906,923.8281250000,,, +56.6757812500,906,923.8281250000,,, +56.6777343750,906,923.8281250000,,, +56.6796875000,906,923.8281250000,,, +56.6816406250,906,923.8281250000,,, +56.6835937500,906,923.8281250000,,, +56.6855468750,906,923.8281250000,,, +56.6875000000,907,923.8281250000,,, +56.6894531250,907,923.8281250000,,, +56.6914062500,907,923.8281250000,,, +56.6933593750,907,923.8281250000,,, +56.6953125000,907,923.8281250000,,, +56.6972656250,907,923.8281250000,,, +56.6992187500,907,923.8281250000,,, +56.7011718750,907,923.8281250000,,, +56.7031250000,907,923.8281250000,,, +56.7050781250,907,923.8281250000,,, +56.7070312500,907,923.8281250000,,, +56.7089843750,907,923.8281250000,,, +56.7109375000,907,923.8281250000,,, +56.7128906250,907,923.8281250000,,, +56.7148437500,907,923.8281250000,,, +56.7167968750,907,923.8281250000,,, +56.7187500000,907,923.8281250000,,, +56.7207031250,907,923.8281250000,,, +56.7226562500,907,923.8281250000,,, +56.7246093750,907,923.8281250000,,, +56.7265625000,907,923.8281250000,,, +56.7285156250,907,923.8281250000,,, +56.7304687500,907,923.8281250000,,, +56.7324218750,907,923.8281250000,,, +56.7343750000,907,923.8281250000,,, +56.7363281250,907,923.8281250000,,, +56.7382812500,907,923.8281250000,,, +56.7402343750,907,923.8281250000,,, +56.7421875000,907,923.8281250000,,, +56.7441406250,907,923.8281250000,,, +56.7460937500,907,923.8281250000,,, +56.7480468750,907,923.8281250000,,, +56.7500000000,908,923.8281250000,,, +56.7519531250,908,923.8281250000,,, +56.7539062500,908,923.8281250000,,, +56.7558593750,908,923.8281250000,,, +56.7578125000,908,923.8281250000,,, +56.7597656250,908,923.8281250000,,, +56.7617187500,908,923.8281250000,,, +56.7636718750,908,923.8281250000,,, +56.7656250000,908,923.8281250000,,, +56.7675781250,908,923.8281250000,,, +56.7695312500,908,923.8281250000,,, +56.7714843750,908,923.8281250000,,, +56.7734375000,908,923.8281250000,,, +56.7753906250,908,923.8281250000,,, +56.7773437500,908,923.8281250000,,, +56.7792968750,908,923.8281250000,,, +56.7812500000,908,923.8281250000,,, +56.7832031250,908,923.8281250000,,, +56.7851562500,908,923.8281250000,,, +56.7871093750,908,923.8281250000,,, +56.7890625000,908,923.8281250000,,, +56.7910156250,908,923.8281250000,,, +56.7929687500,908,923.8281250000,,, +56.7949218750,908,923.8281250000,,, +56.7968750000,908,923.8281250000,,, +56.7988281250,908,923.8281250000,,, +56.8007812500,908,923.8281250000,,, +56.8027343750,908,923.8281250000,,, +56.8046875000,908,923.8281250000,,, +56.8066406250,908,923.8281250000,,, +56.8085937500,908,923.8281250000,,, +56.8105468750,908,923.8281250000,,, +56.8125000000,909,923.8281250000,,, +56.8144531250,909,923.8281250000,,, +56.8164062500,909,923.8281250000,,, +56.8183593750,909,923.8281250000,,, +56.8203125000,909,923.8281250000,,, +56.8222656250,909,923.8281250000,,, +56.8242187500,909,923.8281250000,,, +56.8261718750,909,923.8281250000,,, +56.8281250000,909,923.8281250000,,, +56.8300781250,909,923.8281250000,,, +56.8320312500,909,923.8281250000,,, +56.8339843750,909,923.8281250000,,, +56.8359375000,909,923.8281250000,,, +56.8378906250,909,923.8281250000,,, +56.8398437500,909,923.8281250000,,, +56.8417968750,909,923.8281250000,,, +56.8437500000,909,923.8281250000,,, +56.8457031250,909,923.8281250000,,, +56.8476562500,909,923.8281250000,,, +56.8496093750,909,923.8281250000,,, +56.8515625000,909,923.8281250000,,, +56.8535156250,909,923.8281250000,,, +56.8554687500,909,923.8281250000,,, +56.8574218750,909,923.8281250000,,, +56.8593750000,909,923.8281250000,,, +56.8613281250,909,923.8281250000,,, +56.8632812500,909,923.8281250000,,, +56.8652343750,909,923.8281250000,,, +56.8671875000,909,923.8281250000,,, +56.8691406250,909,923.8281250000,,, +56.8710937500,909,923.8281250000,,, +56.8730468750,909,923.8281250000,,, +56.8750000000,910,923.8281250000,,, +56.8769531250,910,923.8281250000,,, +56.8789062500,910,923.8281250000,,, +56.8808593750,910,923.8281250000,,, +56.8828125000,910,923.8281250000,,, +56.8847656250,910,923.8281250000,,, +56.8867187500,910,923.8281250000,,, +56.8886718750,910,923.8281250000,,, +56.8906250000,910,923.8281250000,,, +56.8925781250,910,923.8281250000,,, +56.8945312500,910,923.8281250000,,, +56.8964843750,910,923.8281250000,,, +56.8984375000,910,923.8281250000,,, +56.9003906250,910,923.8281250000,,, +56.9023437500,910,923.8281250000,,, +56.9042968750,910,923.8281250000,,, +56.9062500000,910,923.8281250000,,, +56.9082031250,910,923.8281250000,,, +56.9101562500,910,923.8281250000,,, +56.9121093750,910,923.8281250000,,, +56.9140625000,910,923.8281250000,,, +56.9160156250,910,923.8281250000,,, +56.9179687500,910,923.8281250000,,, +56.9199218750,910,923.8281250000,,, +56.9218750000,910,923.8281250000,,, +56.9238281250,910,923.8281250000,,, +56.9257812500,910,923.8281250000,,, +56.9277343750,910,923.8281250000,,, +56.9296875000,910,923.8281250000,,, +56.9316406250,910,923.8281250000,,, +56.9335937500,910,923.8281250000,,, +56.9355468750,910,923.8281250000,,, +56.9375000000,911,923.8281250000,,, +56.9394531250,911,923.8281250000,,, +56.9414062500,911,923.8281250000,,, +56.9433593750,911,923.8281250000,,, +56.9453125000,911,923.8281250000,,, +56.9472656250,911,923.8281250000,,, +56.9492187500,911,923.8281250000,,, +56.9511718750,911,923.8281250000,,, +56.9531250000,911,923.8281250000,,, +56.9550781250,911,923.8281250000,,, +56.9570312500,911,923.8281250000,,, +56.9589843750,911,923.8281250000,,, +56.9609375000,911,923.8281250000,,, +56.9628906250,911,923.8281250000,,, +56.9648437500,911,923.8281250000,,, +56.9667968750,911,923.8281250000,,, +56.9687500000,911,923.8281250000,,, +56.9707031250,911,923.8281250000,,, +56.9726562500,911,923.8281250000,,, +56.9746093750,911,923.8281250000,,, +56.9765625000,911,923.8281250000,,, +56.9785156250,911,923.8281250000,,, +56.9804687500,911,923.8281250000,,, +56.9824218750,911,923.8281250000,,, +56.9843750000,911,923.8281250000,,, +56.9863281250,911,923.8281250000,,, +56.9882812500,911,923.8281250000,,, +56.9902343750,911,923.8281250000,,, +56.9921875000,911,923.8281250000,,, +56.9941406250,911,923.8281250000,,, +56.9960937500,911,923.8281250000,,, +56.9980468750,911,923.8281250000,,, +57.0000000000,912,923.8281250000,,, +57.0019531250,912,923.8281250000,,, +57.0039062500,912,923.8281250000,,, +57.0058593750,912,923.8281250000,,, +57.0078125000,912,923.8281250000,,, +57.0097656250,912,923.8281250000,,, +57.0117187500,912,923.8281250000,,, +57.0136718750,912,923.8281250000,,, +57.0156250000,912,923.8281250000,,, +57.0175781250,912,923.8281250000,,, +57.0195312500,912,923.8281250000,,, +57.0214843750,912,923.8281250000,,, +57.0234375000,912,923.8281250000,,, +57.0253906250,912,923.8281250000,,, +57.0273437500,912,923.8281250000,,, +57.0292968750,912,923.8281250000,,, +57.0312500000,912,923.8281250000,,, +57.0332031250,912,923.8281250000,,, +57.0351562500,912,923.8281250000,,, +57.0371093750,912,923.8281250000,,, +57.0390625000,912,923.8281250000,,, +57.0410156250,912,923.8281250000,,, +57.0429687500,912,923.8281250000,,, +57.0449218750,912,923.8281250000,,, +57.0468750000,912,923.8281250000,,, +57.0488281250,912,923.8281250000,,, +57.0507812500,912,923.8281250000,,, +57.0527343750,912,923.8281250000,,, +57.0546875000,912,923.8281250000,,, +57.0566406250,912,923.8281250000,,, +57.0585937500,912,923.8281250000,,, +57.0605468750,912,923.8281250000,,, +57.0625000000,913,923.8281250000,,, +57.0644531250,913,923.8281250000,,, +57.0664062500,913,923.8281250000,,, +57.0683593750,913,923.8281250000,,, +57.0703125000,913,923.8281250000,,, +57.0722656250,913,923.8281250000,,, +57.0742187500,913,923.8281250000,,, +57.0761718750,913,923.8281250000,,, +57.0781250000,913,923.8281250000,,, +57.0800781250,913,923.8281250000,,, +57.0820312500,913,923.8281250000,,, +57.0839843750,913,923.8281250000,,, +57.0859375000,913,923.8281250000,,, +57.0878906250,913,923.8281250000,,, +57.0898437500,913,923.8281250000,,, +57.0917968750,913,923.8281250000,,, +57.0937500000,913,923.8281250000,,, +57.0957031250,913,923.8281250000,,, +57.0976562500,913,923.8281250000,,, +57.0996093750,913,923.8281250000,,, +57.1015625000,913,923.8281250000,,, +57.1035156250,913,923.8281250000,,, +57.1054687500,913,923.8281250000,,, +57.1074218750,913,923.8281250000,,, +57.1093750000,913,923.8281250000,,, +57.1113281250,913,923.8281250000,,, +57.1132812500,913,923.8281250000,,, +57.1152343750,913,923.8281250000,,, +57.1171875000,913,923.8281250000,,, +57.1191406250,913,923.8281250000,,, +57.1210937500,913,923.8281250000,,, +57.1230468750,913,923.8281250000,,, +57.1250000000,914,923.8281250000,,, +57.1269531250,914,923.8281250000,,, +57.1289062500,914,923.8281250000,,, +57.1308593750,914,923.8281250000,,, +57.1328125000,914,923.8281250000,,, +57.1347656250,914,923.8281250000,,, +57.1367187500,914,923.8281250000,,, +57.1386718750,914,923.8281250000,,, +57.1406250000,914,923.8281250000,,, +57.1425781250,914,923.8281250000,,, +57.1445312500,914,923.8281250000,,, +57.1464843750,914,923.8281250000,,, +57.1484375000,914,923.8281250000,,, +57.1503906250,914,923.8281250000,,, +57.1523437500,914,923.8281250000,,, +57.1542968750,914,923.8281250000,,, +57.1562500000,914,923.8281250000,,, +57.1582031250,914,923.8281250000,,, +57.1601562500,914,923.8281250000,,, +57.1621093750,914,923.8281250000,,, +57.1640625000,914,923.8281250000,,, +57.1660156250,914,923.8281250000,,, +57.1679687500,914,923.8281250000,,, +57.1699218750,914,923.8281250000,,, +57.1718750000,914,923.8281250000,,, +57.1738281250,914,923.8281250000,,, +57.1757812500,914,923.8281250000,,, +57.1777343750,914,923.8281250000,,, +57.1796875000,914,923.8281250000,,, +57.1816406250,914,923.8281250000,,, +57.1835937500,914,923.8281250000,,, +57.1855468750,914,923.8281250000,,, +57.1875000000,915,923.8281250000,,, +57.1894531250,915,923.8281250000,,, +57.1914062500,915,923.8281250000,,, +57.1933593750,915,923.8281250000,,, +57.1953125000,915,923.8281250000,,, +57.1972656250,915,923.8281250000,,, +57.1992187500,915,923.8281250000,,, +57.2011718750,915,923.8281250000,,, +57.2031250000,915,923.8281250000,,, +57.2050781250,915,923.8281250000,,, +57.2070312500,915,923.8281250000,,, +57.2089843750,915,923.8281250000,,, +57.2109375000,915,923.8281250000,,, +57.2128906250,915,923.8281250000,,, +57.2148437500,915,923.8281250000,,, +57.2167968750,915,923.8281250000,,, +57.2187500000,915,923.8281250000,,, +57.2207031250,915,923.8281250000,,, +57.2226562500,915,923.8281250000,,, +57.2246093750,915,923.8281250000,,, +57.2265625000,915,923.8281250000,,, +57.2285156250,915,923.8281250000,,, +57.2304687500,915,923.8281250000,,, +57.2324218750,915,923.8281250000,,, +57.2343750000,915,923.8281250000,,, +57.2363281250,915,923.8281250000,,, +57.2382812500,915,923.8281250000,,, +57.2402343750,915,923.8281250000,,, +57.2421875000,915,923.8281250000,,, +57.2441406250,915,923.8281250000,,, +57.2460937500,915,923.8281250000,,, +57.2480468750,915,923.8281250000,,, +57.2500000000,916,923.8281250000,,, +57.2519531250,916,923.8281250000,,, +57.2539062500,916,923.8281250000,,, +57.2558593750,916,923.8281250000,,, +57.2578125000,916,923.8281250000,,, +57.2597656250,916,923.8281250000,,, +57.2617187500,916,923.8281250000,,, +57.2636718750,916,923.8281250000,,, +57.2656250000,916,923.8281250000,,, +57.2675781250,916,923.8281250000,,, +57.2695312500,916,923.8281250000,,, +57.2714843750,916,923.8281250000,,, +57.2734375000,916,923.8281250000,,, +57.2753906250,916,923.8281250000,,, +57.2773437500,916,923.8281250000,,, +57.2792968750,916,923.8281250000,,, +57.2812500000,916,923.8281250000,,, +57.2832031250,916,923.8281250000,,, +57.2851562500,916,923.8281250000,,, +57.2871093750,916,923.8281250000,,, +57.2890625000,916,923.8281250000,,, +57.2910156250,916,923.8281250000,,, +57.2929687500,916,923.8281250000,,, +57.2949218750,916,923.8281250000,,, +57.2968750000,916,923.8281250000,,, +57.2988281250,916,923.8281250000,,, +57.3007812500,916,923.8281250000,,, +57.3027343750,916,923.8281250000,,, +57.3046875000,916,923.8281250000,,, +57.3066406250,916,923.8281250000,,, +57.3085937500,916,923.8281250000,,, +57.3105468750,916,923.8281250000,,, +57.3125000000,917,923.8281250000,,, +57.3144531250,917,923.8281250000,,, +57.3164062500,917,923.8281250000,,, +57.3183593750,917,923.8281250000,,, +57.3203125000,917,923.8281250000,,, +57.3222656250,917,923.8281250000,,, +57.3242187500,917,923.8281250000,,, +57.3261718750,917,923.8281250000,,, +57.3281250000,917,923.8281250000,,, +57.3300781250,917,923.8281250000,,, +57.3320312500,917,923.8281250000,,, +57.3339843750,917,923.8281250000,,, +57.3359375000,917,923.8281250000,,, +57.3378906250,917,923.8281250000,,, +57.3398437500,917,923.8281250000,,, +57.3417968750,917,923.8281250000,,, +57.3437500000,917,923.8281250000,,, +57.3457031250,917,923.8281250000,,, +57.3476562500,917,923.8281250000,,, +57.3496093750,917,923.8281250000,,, +57.3515625000,917,923.8281250000,,, +57.3535156250,917,923.8281250000,,, +57.3554687500,917,923.8281250000,,, +57.3574218750,917,923.8281250000,,, +57.3593750000,917,923.8281250000,,, +57.3613281250,917,923.8281250000,,, +57.3632812500,917,923.8281250000,,, +57.3652343750,917,923.8281250000,,, +57.3671875000,917,923.8281250000,,, +57.3691406250,917,923.8281250000,,, +57.3710937500,917,923.8281250000,,, +57.3730468750,917,923.8281250000,,, +57.3750000000,918,833.9843750000,,, +57.3769531250,918,833.9843750000,,, +57.3789062500,918,833.9843750000,,, +57.3808593750,918,833.9843750000,,, +57.3828125000,918,833.9843750000,,, +57.3847656250,918,833.9843750000,,, +57.3867187500,918,833.9843750000,,, +57.3886718750,918,833.9843750000,,, +57.3906250000,918,833.9843750000,,, +57.3925781250,918,833.9843750000,,, +57.3945312500,918,833.9843750000,,, +57.3964843750,918,833.9843750000,,, +57.3984375000,918,833.9843750000,,, +57.4003906250,918,833.9843750000,,, +57.4023437500,918,833.9843750000,,, +57.4042968750,918,833.9843750000,,, +57.4062500000,918,833.9843750000,,, +57.4082031250,918,833.9843750000,,, +57.4101562500,918,833.9843750000,,, +57.4121093750,918,833.9843750000,,, +57.4140625000,918,833.9843750000,,, +57.4160156250,918,833.9843750000,,, +57.4179687500,918,833.9843750000,,, +57.4199218750,918,833.9843750000,,, +57.4218750000,918,833.9843750000,,, +57.4238281250,918,833.9843750000,,, +57.4257812500,918,833.9843750000,,, +57.4277343750,918,833.9843750000,,, +57.4296875000,918,833.9843750000,,, +57.4316406250,918,833.9843750000,,, +57.4335937500,918,833.9843750000,,, +57.4355468750,918,833.9843750000,,, +57.4375000000,919,833.9843750000,,, +57.4394531250,919,833.9843750000,,, +57.4414062500,919,833.9843750000,,, +57.4433593750,919,833.9843750000,,, +57.4453125000,919,833.9843750000,,, +57.4472656250,919,833.9843750000,,, +57.4492187500,919,833.9843750000,,, +57.4511718750,919,833.9843750000,,, +57.4531250000,919,833.9843750000,,, +57.4550781250,919,833.9843750000,,, +57.4570312500,919,833.9843750000,,, +57.4589843750,919,833.9843750000,,, +57.4609375000,919,833.9843750000,,, +57.4628906250,919,833.9843750000,,, +57.4648437500,919,833.9843750000,,, +57.4667968750,919,833.9843750000,,, +57.4687500000,919,833.9843750000,,, +57.4707031250,919,833.9843750000,,, +57.4726562500,919,833.9843750000,,, +57.4746093750,919,833.9843750000,,, +57.4765625000,919,833.9843750000,,, +57.4785156250,919,833.9843750000,,, +57.4804687500,919,833.9843750000,,, +57.4824218750,919,833.9843750000,,, +57.4843750000,919,833.9843750000,,, +57.4863281250,919,833.9843750000,,, +57.4882812500,919,833.9843750000,,, +57.4902343750,919,833.9843750000,,, +57.4921875000,919,833.9843750000,,, +57.4941406250,919,833.9843750000,,, +57.4960937500,919,833.9843750000,,, +57.4980468750,919,833.9843750000,,, +57.5000000000,920,833.9843750000,,, +57.5019531250,920,833.9843750000,,, +57.5039062500,920,833.9843750000,,, +57.5058593750,920,833.9843750000,,, +57.5078125000,920,833.9843750000,,, +57.5097656250,920,833.9843750000,,, +57.5117187500,920,833.9843750000,,, +57.5136718750,920,833.9843750000,,, +57.5156250000,920,833.9843750000,,, +57.5175781250,920,833.9843750000,,, +57.5195312500,920,833.9843750000,,, +57.5214843750,920,833.9843750000,,, +57.5234375000,920,833.9843750000,,, +57.5253906250,920,833.9843750000,,, +57.5273437500,920,833.9843750000,,, +57.5292968750,920,833.9843750000,,, +57.5312500000,920,833.9843750000,,, +57.5332031250,920,833.9843750000,,, +57.5351562500,920,833.9843750000,,, +57.5371093750,920,833.9843750000,,, +57.5390625000,920,833.9843750000,,, +57.5410156250,920,833.9843750000,,, +57.5429687500,920,833.9843750000,,, +57.5449218750,920,833.9843750000,,, +57.5468750000,920,833.9843750000,,, +57.5488281250,920,833.9843750000,,, +57.5507812500,920,833.9843750000,,, +57.5527343750,920,833.9843750000,,, +57.5546875000,920,833.9843750000,,, +57.5566406250,920,833.9843750000,,, +57.5585937500,920,833.9843750000,,, +57.5605468750,920,833.9843750000,,, +57.5625000000,921,833.9843750000,,, +57.5644531250,921,833.9843750000,,, +57.5664062500,921,833.9843750000,,, +57.5683593750,921,833.9843750000,,, +57.5703125000,921,833.9843750000,,, +57.5722656250,921,833.9843750000,,, +57.5742187500,921,833.9843750000,,, +57.5761718750,921,833.9843750000,,, +57.5781250000,921,833.9843750000,,, +57.5800781250,921,833.9843750000,,, +57.5820312500,921,833.9843750000,,, +57.5839843750,921,833.9843750000,,, +57.5859375000,921,833.9843750000,,, +57.5878906250,921,833.9843750000,,, +57.5898437500,921,833.9843750000,,, +57.5917968750,921,833.9843750000,,, +57.5937500000,921,833.9843750000,,, +57.5957031250,921,833.9843750000,,, +57.5976562500,921,833.9843750000,,, +57.5996093750,921,833.9843750000,,, +57.6015625000,921,833.9843750000,,, +57.6035156250,921,833.9843750000,,, +57.6054687500,921,833.9843750000,,, +57.6074218750,921,833.9843750000,,, +57.6093750000,921,833.9843750000,,, +57.6113281250,921,833.9843750000,,, +57.6132812500,921,833.9843750000,,, +57.6152343750,921,833.9843750000,,, +57.6171875000,921,833.9843750000,,, +57.6191406250,921,833.9843750000,,, +57.6210937500,921,833.9843750000,,, +57.6230468750,921,833.9843750000,,, +57.6250000000,922,833.9843750000,,, +57.6269531250,922,833.9843750000,,, +57.6289062500,922,833.9843750000,,, +57.6308593750,922,833.9843750000,,, +57.6328125000,922,833.9843750000,,, +57.6347656250,922,833.9843750000,,, +57.6367187500,922,833.9843750000,,, +57.6386718750,922,833.9843750000,,, +57.6406250000,922,833.9843750000,,, +57.6425781250,922,833.9843750000,,, +57.6445312500,922,833.9843750000,,, +57.6464843750,922,833.9843750000,,, +57.6484375000,922,833.9843750000,,, +57.6503906250,922,833.9843750000,,, +57.6523437500,922,833.9843750000,,, +57.6542968750,922,833.9843750000,,, +57.6562500000,922,833.9843750000,,, +57.6582031250,922,833.9843750000,,, +57.6601562500,922,833.9843750000,,, +57.6621093750,922,833.9843750000,,, +57.6640625000,922,833.9843750000,,, +57.6660156250,922,833.9843750000,,, +57.6679687500,922,833.9843750000,,, +57.6699218750,922,833.9843750000,,, +57.6718750000,922,833.9843750000,,, +57.6738281250,922,833.9843750000,,, +57.6757812500,922,833.9843750000,,, +57.6777343750,922,833.9843750000,,, +57.6796875000,922,833.9843750000,,, +57.6816406250,922,833.9843750000,,, +57.6835937500,922,833.9843750000,,, +57.6855468750,922,833.9843750000,,, +57.6875000000,923,833.9843750000,,, +57.6894531250,923,833.9843750000,,, +57.6914062500,923,833.9843750000,,, +57.6933593750,923,833.9843750000,,, +57.6953125000,923,833.9843750000,,, +57.6972656250,923,833.9843750000,,, +57.6992187500,923,833.9843750000,,, +57.7011718750,923,833.9843750000,,, +57.7031250000,923,833.9843750000,,, +57.7050781250,923,833.9843750000,,, +57.7070312500,923,833.9843750000,,, +57.7089843750,923,833.9843750000,,, +57.7109375000,923,833.9843750000,,, +57.7128906250,923,833.9843750000,,, +57.7148437500,923,833.9843750000,,, +57.7167968750,923,833.9843750000,,, +57.7187500000,923,833.9843750000,,, +57.7207031250,923,833.9843750000,,, +57.7226562500,923,833.9843750000,,, +57.7246093750,923,833.9843750000,,, +57.7265625000,923,833.9843750000,,, +57.7285156250,923,833.9843750000,,, +57.7304687500,923,833.9843750000,,, +57.7324218750,923,833.9843750000,,, +57.7343750000,923,833.9843750000,,, +57.7363281250,923,833.9843750000,,, +57.7382812500,923,833.9843750000,,, +57.7402343750,923,833.9843750000,,, +57.7421875000,923,833.9843750000,,, +57.7441406250,923,833.9843750000,,, +57.7460937500,923,833.9843750000,,, +57.7480468750,923,833.9843750000,,, +57.7500000000,924,833.9843750000,,, +57.7519531250,924,833.9843750000,,, +57.7539062500,924,833.9843750000,,, +57.7558593750,924,833.9843750000,,, +57.7578125000,924,833.9843750000,,, +57.7597656250,924,833.9843750000,,, +57.7617187500,924,833.9843750000,,, +57.7636718750,924,833.9843750000,,, +57.7656250000,924,833.9843750000,,, +57.7675781250,924,833.9843750000,,, +57.7695312500,924,833.9843750000,,, +57.7714843750,924,833.9843750000,,, +57.7734375000,924,833.9843750000,,, +57.7753906250,924,833.9843750000,,, +57.7773437500,924,833.9843750000,,, +57.7792968750,924,833.9843750000,,, +57.7812500000,924,833.9843750000,,, +57.7832031250,924,833.9843750000,,, +57.7851562500,924,833.9843750000,,, +57.7871093750,924,833.9843750000,,, +57.7890625000,924,833.9843750000,,, +57.7910156250,924,833.9843750000,,, +57.7929687500,924,833.9843750000,,, +57.7949218750,924,833.9843750000,,, +57.7968750000,924,833.9843750000,,, +57.7988281250,924,833.9843750000,,, +57.8007812500,924,833.9843750000,,, +57.8027343750,924,833.9843750000,,, +57.8046875000,924,833.9843750000,,, +57.8066406250,924,833.9843750000,,, +57.8085937500,924,833.9843750000,,, +57.8105468750,924,833.9843750000,,, +57.8125000000,925,833.9843750000,,, +57.8144531250,925,833.9843750000,,, +57.8164062500,925,833.9843750000,,, +57.8183593750,925,833.9843750000,,, +57.8203125000,925,833.9843750000,,, +57.8222656250,925,833.9843750000,,, +57.8242187500,925,833.9843750000,,, +57.8261718750,925,833.9843750000,,, +57.8281250000,925,833.9843750000,,, +57.8300781250,925,833.9843750000,,, +57.8320312500,925,833.9843750000,,, +57.8339843750,925,833.9843750000,,, +57.8359375000,925,833.9843750000,,, +57.8378906250,925,833.9843750000,,, +57.8398437500,925,833.9843750000,,, +57.8417968750,925,833.9843750000,,, +57.8437500000,925,833.9843750000,,, +57.8457031250,925,833.9843750000,,, +57.8476562500,925,833.9843750000,,, +57.8496093750,925,833.9843750000,,, +57.8515625000,925,833.9843750000,,, +57.8535156250,925,833.9843750000,,, +57.8554687500,925,833.9843750000,,, +57.8574218750,925,833.9843750000,,, +57.8593750000,925,833.9843750000,,, +57.8613281250,925,833.9843750000,,, +57.8632812500,925,833.9843750000,,, +57.8652343750,925,833.9843750000,,, +57.8671875000,925,833.9843750000,,, +57.8691406250,925,833.9843750000,,, +57.8710937500,925,833.9843750000,,, +57.8730468750,925,833.9843750000,,, +57.8750000000,926,833.9843750000,,, +57.8769531250,926,833.9843750000,,, +57.8789062500,926,833.9843750000,,, +57.8808593750,926,833.9843750000,,, +57.8828125000,926,833.9843750000,,, +57.8847656250,926,833.9843750000,,, +57.8867187500,926,833.9843750000,,, +57.8886718750,926,833.9843750000,,, +57.8906250000,926,833.9843750000,,, +57.8925781250,926,833.9843750000,,, +57.8945312500,926,833.9843750000,,, +57.8964843750,926,833.9843750000,,, +57.8984375000,926,833.9843750000,,, +57.9003906250,926,833.9843750000,,, +57.9023437500,926,833.9843750000,,, +57.9042968750,926,833.9843750000,,, +57.9062500000,926,833.9843750000,,, +57.9082031250,926,833.9843750000,,, +57.9101562500,926,833.9843750000,,, +57.9121093750,926,833.9843750000,,, +57.9140625000,926,833.9843750000,,, +57.9160156250,926,833.9843750000,,, +57.9179687500,926,833.9843750000,,, +57.9199218750,926,833.9843750000,,, +57.9218750000,926,833.9843750000,,, +57.9238281250,926,833.9843750000,,, +57.9257812500,926,833.9843750000,,, +57.9277343750,926,833.9843750000,,, +57.9296875000,926,833.9843750000,,, +57.9316406250,926,833.9843750000,,, +57.9335937500,926,833.9843750000,,, +57.9355468750,926,833.9843750000,,, +57.9375000000,927,833.9843750000,,, +57.9394531250,927,833.9843750000,,, +57.9414062500,927,833.9843750000,,, +57.9433593750,927,833.9843750000,,, +57.9453125000,927,833.9843750000,,, +57.9472656250,927,833.9843750000,,, +57.9492187500,927,833.9843750000,,, +57.9511718750,927,833.9843750000,,, +57.9531250000,927,833.9843750000,,, +57.9550781250,927,833.9843750000,,, +57.9570312500,927,833.9843750000,,, +57.9589843750,927,833.9843750000,,, +57.9609375000,927,833.9843750000,,, +57.9628906250,927,833.9843750000,,, +57.9648437500,927,833.9843750000,,, +57.9667968750,927,833.9843750000,,, +57.9687500000,927,833.9843750000,,, +57.9707031250,927,833.9843750000,,, +57.9726562500,927,833.9843750000,,, +57.9746093750,927,833.9843750000,,, +57.9765625000,927,833.9843750000,,, +57.9785156250,927,833.9843750000,,, +57.9804687500,927,833.9843750000,,, +57.9824218750,927,833.9843750000,,, +57.9843750000,927,833.9843750000,,, +57.9863281250,927,833.9843750000,,, +57.9882812500,927,833.9843750000,,, +57.9902343750,927,833.9843750000,,, +57.9921875000,927,833.9843750000,,, +57.9941406250,927,833.9843750000,,, +57.9960937500,927,833.9843750000,,, +57.9980468750,927,833.9843750000,,, +58.0000000000,928,833.9843750000,,, +58.0019531250,928,833.9843750000,,, +58.0039062500,928,833.9843750000,,, +58.0058593750,928,833.9843750000,,, +58.0078125000,928,833.9843750000,,, +58.0097656250,928,833.9843750000,,, +58.0117187500,928,833.9843750000,,, +58.0136718750,928,833.9843750000,,, +58.0156250000,928,833.9843750000,,, +58.0175781250,928,833.9843750000,,, +58.0195312500,928,833.9843750000,,, +58.0214843750,928,833.9843750000,,, +58.0234375000,928,833.9843750000,,, +58.0253906250,928,833.9843750000,,, +58.0273437500,928,833.9843750000,,, +58.0292968750,928,833.9843750000,,, +58.0312500000,928,833.9843750000,,, +58.0332031250,928,833.9843750000,,, +58.0351562500,928,833.9843750000,,, +58.0371093750,928,833.9843750000,,, +58.0390625000,928,833.9843750000,,, +58.0410156250,928,833.9843750000,,, +58.0429687500,928,833.9843750000,,, +58.0449218750,928,833.9843750000,,, +58.0468750000,928,833.9843750000,,, +58.0488281250,928,833.9843750000,,, +58.0507812500,928,833.9843750000,,, +58.0527343750,928,833.9843750000,,, +58.0546875000,928,833.9843750000,,, +58.0566406250,928,833.9843750000,,, +58.0585937500,928,833.9843750000,,, +58.0605468750,928,833.9843750000,,, +58.0625000000,929,833.9843750000,,, +58.0644531250,929,833.9843750000,,, +58.0664062500,929,833.9843750000,,, +58.0683593750,929,833.9843750000,,, +58.0703125000,929,833.9843750000,,, +58.0722656250,929,833.9843750000,,, +58.0742187500,929,833.9843750000,,, +58.0761718750,929,833.9843750000,,, +58.0781250000,929,833.9843750000,,, +58.0800781250,929,833.9843750000,,, +58.0820312500,929,833.9843750000,,, +58.0839843750,929,833.9843750000,,, +58.0859375000,929,833.9843750000,,, +58.0878906250,929,833.9843750000,,, +58.0898437500,929,833.9843750000,,, +58.0917968750,929,833.9843750000,,, +58.0937500000,929,833.9843750000,,, +58.0957031250,929,833.9843750000,,, +58.0976562500,929,833.9843750000,,, +58.0996093750,929,833.9843750000,,, +58.1015625000,929,833.9843750000,,, +58.1035156250,929,833.9843750000,,, +58.1054687500,929,833.9843750000,,, +58.1074218750,929,833.9843750000,,, +58.1093750000,929,833.9843750000,,, +58.1113281250,929,833.9843750000,,, +58.1132812500,929,833.9843750000,,, +58.1152343750,929,833.9843750000,,, +58.1171875000,929,833.9843750000,,, +58.1191406250,929,833.9843750000,,, +58.1210937500,929,833.9843750000,,, +58.1230468750,929,833.9843750000,,, +58.1250000000,930,833.9843750000,,, +58.1269531250,930,833.9843750000,,, +58.1289062500,930,833.9843750000,,, +58.1308593750,930,833.9843750000,,, +58.1328125000,930,833.9843750000,,, +58.1347656250,930,833.9843750000,,, +58.1367187500,930,833.9843750000,,, +58.1386718750,930,833.9843750000,,, +58.1406250000,930,833.9843750000,,, +58.1425781250,930,833.9843750000,,, +58.1445312500,930,833.9843750000,,, +58.1464843750,930,833.9843750000,,, +58.1484375000,930,833.9843750000,,, +58.1503906250,930,833.9843750000,,, +58.1523437500,930,833.9843750000,,, +58.1542968750,930,833.9843750000,,, +58.1562500000,930,833.9843750000,,, +58.1582031250,930,833.9843750000,,, +58.1601562500,930,833.9843750000,,, +58.1621093750,930,833.9843750000,,, +58.1640625000,930,833.9843750000,,, +58.1660156250,930,833.9843750000,,, +58.1679687500,930,833.9843750000,,, +58.1699218750,930,833.9843750000,,, +58.1718750000,930,833.9843750000,,, +58.1738281250,930,833.9843750000,,, +58.1757812500,930,833.9843750000,,, +58.1777343750,930,833.9843750000,,, +58.1796875000,930,833.9843750000,,, +58.1816406250,930,833.9843750000,,, +58.1835937500,930,833.9843750000,,, +58.1855468750,930,833.9843750000,,, +58.1875000000,931,833.9843750000,,, +58.1894531250,931,833.9843750000,,, +58.1914062500,931,833.9843750000,,, +58.1933593750,931,833.9843750000,,, +58.1953125000,931,833.9843750000,,, +58.1972656250,931,833.9843750000,,, +58.1992187500,931,833.9843750000,,, +58.2011718750,931,833.9843750000,,, +58.2031250000,931,833.9843750000,,, +58.2050781250,931,833.9843750000,,, +58.2070312500,931,833.9843750000,,, +58.2089843750,931,833.9843750000,,, +58.2109375000,931,833.9843750000,,, +58.2128906250,931,833.9843750000,,, +58.2148437500,931,833.9843750000,,, +58.2167968750,931,833.9843750000,,, +58.2187500000,931,833.9843750000,,, +58.2207031250,931,833.9843750000,,, +58.2226562500,931,833.9843750000,,, +58.2246093750,931,833.9843750000,,, +58.2265625000,931,833.9843750000,,, +58.2285156250,931,833.9843750000,,, +58.2304687500,931,833.9843750000,,, +58.2324218750,931,833.9843750000,,, +58.2343750000,931,833.9843750000,,, +58.2363281250,931,833.9843750000,,, +58.2382812500,931,833.9843750000,,, +58.2402343750,931,833.9843750000,,, +58.2421875000,931,833.9843750000,,, +58.2441406250,931,833.9843750000,,, +58.2460937500,931,833.9843750000,,, +58.2480468750,931,833.9843750000,,, +58.2500000000,932,835.9375000000,,, +58.2519531250,932,835.9375000000,,, +58.2539062500,932,835.9375000000,,, +58.2558593750,932,835.9375000000,,, +58.2578125000,932,835.9375000000,,, +58.2597656250,932,835.9375000000,,, +58.2617187500,932,835.9375000000,,, +58.2636718750,932,835.9375000000,,, +58.2656250000,932,835.9375000000,,, +58.2675781250,932,835.9375000000,,, +58.2695312500,932,835.9375000000,,, +58.2714843750,932,835.9375000000,,, +58.2734375000,932,835.9375000000,,, +58.2753906250,932,835.9375000000,,, +58.2773437500,932,835.9375000000,,, +58.2792968750,932,835.9375000000,,, +58.2812500000,932,835.9375000000,,, +58.2832031250,932,835.9375000000,,, +58.2851562500,932,835.9375000000,,, +58.2871093750,932,835.9375000000,,, +58.2890625000,932,835.9375000000,,, +58.2910156250,932,835.9375000000,,, +58.2929687500,932,835.9375000000,,, +58.2949218750,932,835.9375000000,,, +58.2968750000,932,835.9375000000,,, +58.2988281250,932,835.9375000000,,, +58.3007812500,932,835.9375000000,,, +58.3027343750,932,835.9375000000,,, +58.3046875000,932,835.9375000000,,, +58.3066406250,932,835.9375000000,,, +58.3085937500,932,835.9375000000,,, +58.3105468750,932,835.9375000000,,, +58.3125000000,933,835.9375000000,,, +58.3144531250,933,835.9375000000,,, +58.3164062500,933,835.9375000000,,, +58.3183593750,933,835.9375000000,,, +58.3203125000,933,835.9375000000,,, +58.3222656250,933,835.9375000000,,, +58.3242187500,933,835.9375000000,,, +58.3261718750,933,835.9375000000,,, +58.3281250000,933,835.9375000000,,, +58.3300781250,933,835.9375000000,,, +58.3320312500,933,835.9375000000,,, +58.3339843750,933,835.9375000000,,, +58.3359375000,933,835.9375000000,,, +58.3378906250,933,835.9375000000,,, +58.3398437500,933,835.9375000000,,, +58.3417968750,933,835.9375000000,,, +58.3437500000,933,835.9375000000,,, +58.3457031250,933,835.9375000000,,, +58.3476562500,933,835.9375000000,,, +58.3496093750,933,835.9375000000,,, +58.3515625000,933,835.9375000000,,, +58.3535156250,933,835.9375000000,,, +58.3554687500,933,835.9375000000,,, +58.3574218750,933,835.9375000000,,, +58.3593750000,933,835.9375000000,,, +58.3613281250,933,835.9375000000,,, +58.3632812500,933,835.9375000000,,, +58.3652343750,933,835.9375000000,,, +58.3671875000,933,835.9375000000,,, +58.3691406250,933,835.9375000000,,, +58.3710937500,933,835.9375000000,,, +58.3730468750,933,835.9375000000,,, +58.3750000000,934,835.9375000000,,, +58.3769531250,934,835.9375000000,,, +58.3789062500,934,835.9375000000,,, +58.3808593750,934,835.9375000000,,, +58.3828125000,934,835.9375000000,,, +58.3847656250,934,835.9375000000,,, +58.3867187500,934,835.9375000000,,, +58.3886718750,934,835.9375000000,,, +58.3906250000,934,835.9375000000,,, +58.3925781250,934,835.9375000000,,, +58.3945312500,934,835.9375000000,,, +58.3964843750,934,835.9375000000,,, +58.3984375000,934,835.9375000000,,, +58.4003906250,934,835.9375000000,,, +58.4023437500,934,835.9375000000,,, +58.4042968750,934,835.9375000000,,, +58.4062500000,934,835.9375000000,,, +58.4082031250,934,835.9375000000,,, +58.4101562500,934,835.9375000000,,, +58.4121093750,934,835.9375000000,,, +58.4140625000,934,835.9375000000,,, +58.4160156250,934,835.9375000000,,, +58.4179687500,934,835.9375000000,,, +58.4199218750,934,835.9375000000,,, +58.4218750000,934,835.9375000000,,, +58.4238281250,934,835.9375000000,,, +58.4257812500,934,835.9375000000,,, +58.4277343750,934,835.9375000000,,, +58.4296875000,934,835.9375000000,,, +58.4316406250,934,835.9375000000,,, +58.4335937500,934,835.9375000000,,, +58.4355468750,934,835.9375000000,,, +58.4375000000,935,835.9375000000,,, +58.4394531250,935,835.9375000000,,, +58.4414062500,935,835.9375000000,,, +58.4433593750,935,835.9375000000,,, +58.4453125000,935,835.9375000000,,, +58.4472656250,935,835.9375000000,,, +58.4492187500,935,835.9375000000,,, +58.4511718750,935,835.9375000000,,, +58.4531250000,935,835.9375000000,,, +58.4550781250,935,835.9375000000,,, +58.4570312500,935,835.9375000000,,, +58.4589843750,935,835.9375000000,,, +58.4609375000,935,835.9375000000,,, +58.4628906250,935,835.9375000000,,, +58.4648437500,935,835.9375000000,,, +58.4667968750,935,835.9375000000,,, +58.4687500000,935,835.9375000000,,, +58.4707031250,935,835.9375000000,,, +58.4726562500,935,835.9375000000,,, +58.4746093750,935,835.9375000000,,, +58.4765625000,935,835.9375000000,,, +58.4785156250,935,835.9375000000,,, +58.4804687500,935,835.9375000000,,, +58.4824218750,935,835.9375000000,,, +58.4843750000,935,835.9375000000,,, +58.4863281250,935,835.9375000000,,, +58.4882812500,935,835.9375000000,,, +58.4902343750,935,835.9375000000,,, +58.4921875000,935,835.9375000000,,, +58.4941406250,935,835.9375000000,,, +58.4960937500,935,835.9375000000,,, +58.4980468750,935,835.9375000000,,, +58.5000000000,936,835.9375000000,,, +58.5019531250,936,835.9375000000,,, +58.5039062500,936,835.9375000000,,, +58.5058593750,936,835.9375000000,,, +58.5078125000,936,835.9375000000,,, +58.5097656250,936,835.9375000000,,, +58.5117187500,936,835.9375000000,,, +58.5136718750,936,835.9375000000,,, +58.5156250000,936,835.9375000000,,, +58.5175781250,936,835.9375000000,,, +58.5195312500,936,835.9375000000,,, +58.5214843750,936,835.9375000000,,, +58.5234375000,936,835.9375000000,,, +58.5253906250,936,835.9375000000,,, +58.5273437500,936,835.9375000000,,, +58.5292968750,936,835.9375000000,,, +58.5312500000,936,835.9375000000,,, +58.5332031250,936,835.9375000000,,, +58.5351562500,936,835.9375000000,,, +58.5371093750,936,835.9375000000,,, +58.5390625000,936,835.9375000000,,, +58.5410156250,936,835.9375000000,,, +58.5429687500,936,835.9375000000,,, +58.5449218750,936,835.9375000000,,, +58.5468750000,936,835.9375000000,,, +58.5488281250,936,835.9375000000,,, +58.5507812500,936,835.9375000000,,, +58.5527343750,936,835.9375000000,,, +58.5546875000,936,835.9375000000,,, +58.5566406250,936,835.9375000000,,, +58.5585937500,936,835.9375000000,,, +58.5605468750,936,835.9375000000,,, +58.5625000000,937,835.9375000000,,, +58.5644531250,937,835.9375000000,,, +58.5664062500,937,835.9375000000,,, +58.5683593750,937,835.9375000000,,, +58.5703125000,937,835.9375000000,,, +58.5722656250,937,835.9375000000,,, +58.5742187500,937,835.9375000000,,, +58.5761718750,937,835.9375000000,,, +58.5781250000,937,835.9375000000,,, +58.5800781250,937,835.9375000000,,, +58.5820312500,937,835.9375000000,,, +58.5839843750,937,835.9375000000,,, +58.5859375000,937,835.9375000000,,, +58.5878906250,937,835.9375000000,,, +58.5898437500,937,835.9375000000,,, +58.5917968750,937,835.9375000000,,, +58.5937500000,937,835.9375000000,,, +58.5957031250,937,835.9375000000,,, +58.5976562500,937,835.9375000000,,, +58.5996093750,937,835.9375000000,,, +58.6015625000,937,835.9375000000,,, +58.6035156250,937,835.9375000000,,, +58.6054687500,937,835.9375000000,,, +58.6074218750,937,835.9375000000,,, +58.6093750000,937,835.9375000000,,, +58.6113281250,937,835.9375000000,,, +58.6132812500,937,835.9375000000,,, +58.6152343750,937,835.9375000000,,, +58.6171875000,937,835.9375000000,,, +58.6191406250,937,835.9375000000,,, +58.6210937500,937,835.9375000000,,, +58.6230468750,937,835.9375000000,,, +58.6250000000,938,835.9375000000,,, +58.6269531250,938,835.9375000000,,, +58.6289062500,938,835.9375000000,,, +58.6308593750,938,835.9375000000,,, +58.6328125000,938,835.9375000000,,, +58.6347656250,938,835.9375000000,,, +58.6367187500,938,835.9375000000,,, +58.6386718750,938,835.9375000000,,, +58.6406250000,938,835.9375000000,,, +58.6425781250,938,835.9375000000,,, +58.6445312500,938,835.9375000000,,, +58.6464843750,938,835.9375000000,,, +58.6484375000,938,835.9375000000,,, +58.6503906250,938,835.9375000000,,, +58.6523437500,938,835.9375000000,,, +58.6542968750,938,835.9375000000,,, +58.6562500000,938,835.9375000000,,, +58.6582031250,938,835.9375000000,,, +58.6601562500,938,835.9375000000,,, +58.6621093750,938,835.9375000000,,, +58.6640625000,938,835.9375000000,,, +58.6660156250,938,835.9375000000,,, +58.6679687500,938,835.9375000000,,, +58.6699218750,938,835.9375000000,,, +58.6718750000,938,835.9375000000,,, +58.6738281250,938,835.9375000000,,, +58.6757812500,938,835.9375000000,,, +58.6777343750,938,835.9375000000,,, +58.6796875000,938,835.9375000000,,, +58.6816406250,938,835.9375000000,,, +58.6835937500,938,835.9375000000,,, +58.6855468750,938,835.9375000000,,, +58.6875000000,939,835.9375000000,,, +58.6894531250,939,835.9375000000,,, +58.6914062500,939,835.9375000000,,, +58.6933593750,939,835.9375000000,,, +58.6953125000,939,835.9375000000,,, +58.6972656250,939,835.9375000000,,, +58.6992187500,939,835.9375000000,,, +58.7011718750,939,835.9375000000,,, +58.7031250000,939,835.9375000000,,, +58.7050781250,939,835.9375000000,,, +58.7070312500,939,835.9375000000,,, +58.7089843750,939,835.9375000000,,, +58.7109375000,939,835.9375000000,,, +58.7128906250,939,835.9375000000,,, +58.7148437500,939,835.9375000000,,, +58.7167968750,939,835.9375000000,,, +58.7187500000,939,835.9375000000,,, +58.7207031250,939,835.9375000000,,, +58.7226562500,939,835.9375000000,,, +58.7246093750,939,835.9375000000,,, +58.7265625000,939,835.9375000000,,, +58.7285156250,939,835.9375000000,,, +58.7304687500,939,835.9375000000,,, +58.7324218750,939,835.9375000000,,, +58.7343750000,939,835.9375000000,,, +58.7363281250,939,835.9375000000,,, +58.7382812500,939,835.9375000000,,, +58.7402343750,939,835.9375000000,,, +58.7421875000,939,835.9375000000,,, +58.7441406250,939,835.9375000000,,, +58.7460937500,939,835.9375000000,,, +58.7480468750,939,835.9375000000,,, +58.7500000000,940,835.9375000000,,, +58.7519531250,940,835.9375000000,,, +58.7539062500,940,835.9375000000,,, +58.7558593750,940,835.9375000000,,, +58.7578125000,940,835.9375000000,,, +58.7597656250,940,835.9375000000,,, +58.7617187500,940,835.9375000000,,, +58.7636718750,940,835.9375000000,,, +58.7656250000,940,835.9375000000,,, +58.7675781250,940,835.9375000000,,, +58.7695312500,940,835.9375000000,,, +58.7714843750,940,835.9375000000,,, +58.7734375000,940,835.9375000000,,, +58.7753906250,940,835.9375000000,,, +58.7773437500,940,835.9375000000,,, +58.7792968750,940,835.9375000000,,, +58.7812500000,940,835.9375000000,,, +58.7832031250,940,835.9375000000,,, +58.7851562500,940,835.9375000000,,, +58.7871093750,940,835.9375000000,,, +58.7890625000,940,835.9375000000,,, +58.7910156250,940,835.9375000000,,, +58.7929687500,940,835.9375000000,,, +58.7949218750,940,835.9375000000,,, +58.7968750000,940,835.9375000000,,, +58.7988281250,940,835.9375000000,,, +58.8007812500,940,835.9375000000,,, +58.8027343750,940,835.9375000000,,, +58.8046875000,940,835.9375000000,,, +58.8066406250,940,835.9375000000,,, +58.8085937500,940,835.9375000000,,, +58.8105468750,940,835.9375000000,,, +58.8125000000,941,835.9375000000,,, +58.8144531250,941,835.9375000000,,, +58.8164062500,941,835.9375000000,,, +58.8183593750,941,835.9375000000,,, +58.8203125000,941,835.9375000000,,, +58.8222656250,941,835.9375000000,,, +58.8242187500,941,835.9375000000,,, +58.8261718750,941,835.9375000000,,, +58.8281250000,941,835.9375000000,,, +58.8300781250,941,835.9375000000,,, +58.8320312500,941,835.9375000000,,, +58.8339843750,941,835.9375000000,,, +58.8359375000,941,835.9375000000,,, +58.8378906250,941,835.9375000000,,, +58.8398437500,941,835.9375000000,,, +58.8417968750,941,835.9375000000,,, +58.8437500000,941,835.9375000000,,, +58.8457031250,941,835.9375000000,,, +58.8476562500,941,835.9375000000,,, +58.8496093750,941,835.9375000000,,, +58.8515625000,941,835.9375000000,,, +58.8535156250,941,835.9375000000,,, +58.8554687500,941,835.9375000000,,, +58.8574218750,941,835.9375000000,,, +58.8593750000,941,835.9375000000,,, +58.8613281250,941,835.9375000000,,, +58.8632812500,941,835.9375000000,,, +58.8652343750,941,835.9375000000,,, +58.8671875000,941,835.9375000000,,, +58.8691406250,941,835.9375000000,,, +58.8710937500,941,835.9375000000,,, +58.8730468750,941,835.9375000000,,, +58.8750000000,942,835.9375000000,,, +58.8769531250,942,835.9375000000,,, +58.8789062500,942,835.9375000000,,, +58.8808593750,942,835.9375000000,,, +58.8828125000,942,835.9375000000,,, +58.8847656250,942,835.9375000000,,, +58.8867187500,942,835.9375000000,,, +58.8886718750,942,835.9375000000,,, +58.8906250000,942,835.9375000000,,, +58.8925781250,942,835.9375000000,,, +58.8945312500,942,835.9375000000,,, +58.8964843750,942,835.9375000000,,, +58.8984375000,942,835.9375000000,,, +58.9003906250,942,835.9375000000,,, +58.9023437500,942,835.9375000000,,, +58.9042968750,942,835.9375000000,,, +58.9062500000,942,835.9375000000,,, +58.9082031250,942,835.9375000000,,, +58.9101562500,942,835.9375000000,,, +58.9121093750,942,835.9375000000,,, +58.9140625000,942,835.9375000000,,, +58.9160156250,942,835.9375000000,,, +58.9179687500,942,835.9375000000,,, +58.9199218750,942,835.9375000000,,, +58.9218750000,942,835.9375000000,,, +58.9238281250,942,835.9375000000,,, +58.9257812500,942,835.9375000000,,, +58.9277343750,942,835.9375000000,,, +58.9296875000,942,835.9375000000,,, +58.9316406250,942,835.9375000000,,, +58.9335937500,942,835.9375000000,,, +58.9355468750,942,835.9375000000,,, +58.9375000000,943,835.9375000000,,, +58.9394531250,943,835.9375000000,,, +58.9414062500,943,835.9375000000,,, +58.9433593750,943,835.9375000000,,, +58.9453125000,943,835.9375000000,,, +58.9472656250,943,835.9375000000,,, +58.9492187500,943,835.9375000000,,, +58.9511718750,943,835.9375000000,,, +58.9531250000,943,835.9375000000,,, +58.9550781250,943,835.9375000000,,, +58.9570312500,943,835.9375000000,,, +58.9589843750,943,835.9375000000,,, +58.9609375000,943,835.9375000000,,, +58.9628906250,943,835.9375000000,,, +58.9648437500,943,835.9375000000,,, +58.9667968750,943,835.9375000000,,, +58.9687500000,943,835.9375000000,,, +58.9707031250,943,835.9375000000,,, +58.9726562500,943,835.9375000000,,, +58.9746093750,943,835.9375000000,,, +58.9765625000,943,835.9375000000,,, +58.9785156250,943,835.9375000000,,, +58.9804687500,943,835.9375000000,,, +58.9824218750,943,835.9375000000,,, +58.9843750000,943,835.9375000000,,, +58.9863281250,943,835.9375000000,,, +58.9882812500,943,835.9375000000,,, +58.9902343750,943,835.9375000000,,, +58.9921875000,943,835.9375000000,,, +58.9941406250,943,835.9375000000,,, +58.9960937500,943,835.9375000000,,, +58.9980468750,943,835.9375000000,,, +59.0000000000,944,835.9375000000,,, +59.0019531250,944,835.9375000000,,, +59.0039062500,944,835.9375000000,,, +59.0058593750,944,835.9375000000,,, +59.0078125000,944,835.9375000000,,, +59.0097656250,944,835.9375000000,,, +59.0117187500,944,835.9375000000,,, +59.0136718750,944,835.9375000000,,, +59.0156250000,944,835.9375000000,,, +59.0175781250,944,835.9375000000,,, +59.0195312500,944,835.9375000000,,, +59.0214843750,944,835.9375000000,,, +59.0234375000,944,835.9375000000,,, +59.0253906250,944,835.9375000000,,, +59.0273437500,944,835.9375000000,,, +59.0292968750,944,835.9375000000,,, +59.0312500000,944,835.9375000000,,, +59.0332031250,944,835.9375000000,,, +59.0351562500,944,835.9375000000,,, +59.0371093750,944,835.9375000000,,, +59.0390625000,944,835.9375000000,,, +59.0410156250,944,835.9375000000,,, +59.0429687500,944,835.9375000000,,, +59.0449218750,944,835.9375000000,,, +59.0468750000,944,835.9375000000,,, +59.0488281250,944,835.9375000000,,, +59.0507812500,944,835.9375000000,,, +59.0527343750,944,835.9375000000,,, +59.0546875000,944,835.9375000000,,, +59.0566406250,944,835.9375000000,,, +59.0585937500,944,835.9375000000,,, +59.0605468750,944,835.9375000000,,, +59.0625000000,945,835.9375000000,,, +59.0644531250,945,835.9375000000,,, +59.0664062500,945,835.9375000000,,, +59.0683593750,945,835.9375000000,,, +59.0703125000,945,835.9375000000,,, +59.0722656250,945,835.9375000000,,, +59.0742187500,945,835.9375000000,,, +59.0761718750,945,835.9375000000,,, +59.0781250000,945,835.9375000000,,, +59.0800781250,945,835.9375000000,,, +59.0820312500,945,835.9375000000,,, +59.0839843750,945,835.9375000000,,, +59.0859375000,945,835.9375000000,,, +59.0878906250,945,835.9375000000,,, +59.0898437500,945,835.9375000000,,, +59.0917968750,945,835.9375000000,,, +59.0937500000,945,835.9375000000,,, +59.0957031250,945,835.9375000000,,, +59.0976562500,945,835.9375000000,,, +59.0996093750,945,835.9375000000,,, +59.1015625000,945,835.9375000000,,, +59.1035156250,945,835.9375000000,,, +59.1054687500,945,835.9375000000,,, +59.1074218750,945,835.9375000000,,, +59.1093750000,945,835.9375000000,,, +59.1113281250,945,835.9375000000,,, +59.1132812500,945,835.9375000000,,, +59.1152343750,945,835.9375000000,,, +59.1171875000,945,835.9375000000,,, +59.1191406250,945,835.9375000000,,, +59.1210937500,945,835.9375000000,,, +59.1230468750,945,835.9375000000,,, +59.1250000000,946,861.3281250000,,, +59.1269531250,946,861.3281250000,,, +59.1289062500,946,861.3281250000,,, +59.1308593750,946,861.3281250000,,, +59.1328125000,946,861.3281250000,,, +59.1347656250,946,861.3281250000,,, +59.1367187500,946,861.3281250000,,, +59.1386718750,946,861.3281250000,,, +59.1406250000,946,861.3281250000,,, +59.1425781250,946,861.3281250000,,, +59.1445312500,946,861.3281250000,,, +59.1464843750,946,861.3281250000,,, +59.1484375000,946,861.3281250000,,, +59.1503906250,946,861.3281250000,,, +59.1523437500,946,861.3281250000,,, +59.1542968750,946,861.3281250000,,, +59.1562500000,946,861.3281250000,,, +59.1582031250,946,861.3281250000,,, +59.1601562500,946,861.3281250000,,, +59.1621093750,946,861.3281250000,,, +59.1640625000,946,861.3281250000,,, +59.1660156250,946,861.3281250000,,, +59.1679687500,946,861.3281250000,,, +59.1699218750,946,861.3281250000,,, +59.1718750000,946,861.3281250000,,, +59.1738281250,946,861.3281250000,,, +59.1757812500,946,861.3281250000,,, +59.1777343750,946,861.3281250000,,, +59.1796875000,946,861.3281250000,,, +59.1816406250,946,861.3281250000,,, +59.1835937500,946,861.3281250000,,, +59.1855468750,946,861.3281250000,,, +59.1875000000,947,861.3281250000,,, +59.1894531250,947,861.3281250000,,, +59.1914062500,947,861.3281250000,,, +59.1933593750,947,861.3281250000,,, +59.1953125000,947,861.3281250000,,, +59.1972656250,947,861.3281250000,,, +59.1992187500,947,861.3281250000,,, +59.2011718750,947,861.3281250000,,, +59.2031250000,947,861.3281250000,,, +59.2050781250,947,861.3281250000,,, +59.2070312500,947,861.3281250000,,, +59.2089843750,947,861.3281250000,,, +59.2109375000,947,861.3281250000,,, +59.2128906250,947,861.3281250000,,, +59.2148437500,947,861.3281250000,,, +59.2167968750,947,861.3281250000,,, +59.2187500000,947,861.3281250000,,, +59.2207031250,947,861.3281250000,,, +59.2226562500,947,861.3281250000,,, +59.2246093750,947,861.3281250000,,, +59.2265625000,947,861.3281250000,,, +59.2285156250,947,861.3281250000,,, +59.2304687500,947,861.3281250000,,, +59.2324218750,947,861.3281250000,,, +59.2343750000,947,861.3281250000,,, +59.2363281250,947,861.3281250000,,, +59.2382812500,947,861.3281250000,,, +59.2402343750,947,861.3281250000,,, +59.2421875000,947,861.3281250000,,, +59.2441406250,947,861.3281250000,,, +59.2460937500,947,861.3281250000,,, +59.2480468750,947,861.3281250000,,, +59.2500000000,948,861.3281250000,,, +59.2519531250,948,861.3281250000,,, +59.2539062500,948,861.3281250000,,, +59.2558593750,948,861.3281250000,,, +59.2578125000,948,861.3281250000,,, +59.2597656250,948,861.3281250000,,, +59.2617187500,948,861.3281250000,,, +59.2636718750,948,861.3281250000,,, +59.2656250000,948,861.3281250000,,, +59.2675781250,948,861.3281250000,,, +59.2695312500,948,861.3281250000,,, +59.2714843750,948,861.3281250000,,, +59.2734375000,948,861.3281250000,,, +59.2753906250,948,861.3281250000,,, +59.2773437500,948,861.3281250000,,, +59.2792968750,948,861.3281250000,,, +59.2812500000,948,861.3281250000,,, +59.2832031250,948,861.3281250000,,, +59.2851562500,948,861.3281250000,,, +59.2871093750,948,861.3281250000,,, +59.2890625000,948,861.3281250000,,, +59.2910156250,948,861.3281250000,,, +59.2929687500,948,861.3281250000,,, +59.2949218750,948,861.3281250000,,, +59.2968750000,948,861.3281250000,,, +59.2988281250,948,861.3281250000,,, +59.3007812500,948,861.3281250000,,, +59.3027343750,948,861.3281250000,,, +59.3046875000,948,861.3281250000,,, +59.3066406250,948,861.3281250000,,, +59.3085937500,948,861.3281250000,,, +59.3105468750,948,861.3281250000,,, +59.3125000000,949,861.3281250000,,, +59.3144531250,949,861.3281250000,,, +59.3164062500,949,861.3281250000,,, +59.3183593750,949,861.3281250000,,, +59.3203125000,949,861.3281250000,,, +59.3222656250,949,861.3281250000,,, +59.3242187500,949,861.3281250000,,, +59.3261718750,949,861.3281250000,,, +59.3281250000,949,861.3281250000,,, +59.3300781250,949,861.3281250000,,, +59.3320312500,949,861.3281250000,,, +59.3339843750,949,861.3281250000,,, +59.3359375000,949,861.3281250000,,, +59.3378906250,949,861.3281250000,,, +59.3398437500,949,861.3281250000,,, +59.3417968750,949,861.3281250000,,, +59.3437500000,949,861.3281250000,,, +59.3457031250,949,861.3281250000,,, +59.3476562500,949,861.3281250000,,, +59.3496093750,949,861.3281250000,,, +59.3515625000,949,861.3281250000,,, +59.3535156250,949,861.3281250000,,, +59.3554687500,949,861.3281250000,,, +59.3574218750,949,861.3281250000,,, +59.3593750000,949,861.3281250000,,, +59.3613281250,949,861.3281250000,,, +59.3632812500,949,861.3281250000,,, +59.3652343750,949,861.3281250000,,, +59.3671875000,949,861.3281250000,,, +59.3691406250,949,861.3281250000,,, +59.3710937500,949,861.3281250000,,, +59.3730468750,949,861.3281250000,,, +59.3750000000,950,861.3281250000,,, +59.3769531250,950,861.3281250000,,, +59.3789062500,950,861.3281250000,,, +59.3808593750,950,861.3281250000,,, +59.3828125000,950,861.3281250000,,, +59.3847656250,950,861.3281250000,,, +59.3867187500,950,861.3281250000,,, +59.3886718750,950,861.3281250000,,, +59.3906250000,950,861.3281250000,,, +59.3925781250,950,861.3281250000,,, +59.3945312500,950,861.3281250000,,, +59.3964843750,950,861.3281250000,,, +59.3984375000,950,861.3281250000,,, +59.4003906250,950,861.3281250000,,, +59.4023437500,950,861.3281250000,,, +59.4042968750,950,861.3281250000,,, +59.4062500000,950,861.3281250000,,, +59.4082031250,950,861.3281250000,,, +59.4101562500,950,861.3281250000,,, +59.4121093750,950,861.3281250000,,, +59.4140625000,950,861.3281250000,,, +59.4160156250,950,861.3281250000,,, +59.4179687500,950,861.3281250000,,, +59.4199218750,950,861.3281250000,,, +59.4218750000,950,861.3281250000,,, +59.4238281250,950,861.3281250000,,, +59.4257812500,950,861.3281250000,,, +59.4277343750,950,861.3281250000,,, +59.4296875000,950,861.3281250000,,, +59.4316406250,950,861.3281250000,,, +59.4335937500,950,861.3281250000,,, +59.4355468750,950,861.3281250000,,, +59.4375000000,951,861.3281250000,,, +59.4394531250,951,861.3281250000,,, +59.4414062500,951,861.3281250000,,, +59.4433593750,951,861.3281250000,,, +59.4453125000,951,861.3281250000,,, +59.4472656250,951,861.3281250000,,, +59.4492187500,951,861.3281250000,,, +59.4511718750,951,861.3281250000,,, +59.4531250000,951,861.3281250000,,, +59.4550781250,951,861.3281250000,,, +59.4570312500,951,861.3281250000,,, +59.4589843750,951,861.3281250000,,, +59.4609375000,951,861.3281250000,,, +59.4628906250,951,861.3281250000,,, +59.4648437500,951,861.3281250000,,, +59.4667968750,951,861.3281250000,,, +59.4687500000,951,861.3281250000,,, +59.4707031250,951,861.3281250000,,, +59.4726562500,951,861.3281250000,,, +59.4746093750,951,861.3281250000,,, +59.4765625000,951,861.3281250000,,, +59.4785156250,951,861.3281250000,,, +59.4804687500,951,861.3281250000,,, +59.4824218750,951,861.3281250000,,, +59.4843750000,951,861.3281250000,,, +59.4863281250,951,861.3281250000,,, +59.4882812500,951,861.3281250000,,, +59.4902343750,951,861.3281250000,,, +59.4921875000,951,861.3281250000,,, +59.4941406250,951,861.3281250000,,, +59.4960937500,951,861.3281250000,,, +59.4980468750,951,861.3281250000,,, +59.5000000000,952,861.3281250000,,, +59.5019531250,952,861.3281250000,,, +59.5039062500,952,861.3281250000,,, +59.5058593750,952,861.3281250000,,, +59.5078125000,952,861.3281250000,,, +59.5097656250,952,861.3281250000,,, +59.5117187500,952,861.3281250000,,, +59.5136718750,952,861.3281250000,,, +59.5156250000,952,861.3281250000,,, +59.5175781250,952,861.3281250000,,, +59.5195312500,952,861.3281250000,,, +59.5214843750,952,861.3281250000,,, +59.5234375000,952,861.3281250000,,, +59.5253906250,952,861.3281250000,,, +59.5273437500,952,861.3281250000,,, +59.5292968750,952,861.3281250000,,, +59.5312500000,952,861.3281250000,,, +59.5332031250,952,861.3281250000,,, +59.5351562500,952,861.3281250000,,, +59.5371093750,952,861.3281250000,,, +59.5390625000,952,861.3281250000,,, +59.5410156250,952,861.3281250000,,, +59.5429687500,952,861.3281250000,,, +59.5449218750,952,861.3281250000,,, +59.5468750000,952,861.3281250000,,, +59.5488281250,952,861.3281250000,,, +59.5507812500,952,861.3281250000,,, +59.5527343750,952,861.3281250000,,, +59.5546875000,952,861.3281250000,,, +59.5566406250,952,861.3281250000,,, +59.5585937500,952,861.3281250000,,, +59.5605468750,952,861.3281250000,,, +59.5625000000,953,861.3281250000,,, +59.5644531250,953,861.3281250000,,, +59.5664062500,953,861.3281250000,,, +59.5683593750,953,861.3281250000,,, +59.5703125000,953,861.3281250000,,, +59.5722656250,953,861.3281250000,,, +59.5742187500,953,861.3281250000,,, +59.5761718750,953,861.3281250000,,, +59.5781250000,953,861.3281250000,,, +59.5800781250,953,861.3281250000,,, +59.5820312500,953,861.3281250000,,, +59.5839843750,953,861.3281250000,,, +59.5859375000,953,861.3281250000,,, +59.5878906250,953,861.3281250000,,, +59.5898437500,953,861.3281250000,,, +59.5917968750,953,861.3281250000,,, +59.5937500000,953,861.3281250000,,, +59.5957031250,953,861.3281250000,,, +59.5976562500,953,861.3281250000,,, +59.5996093750,953,861.3281250000,,, +59.6015625000,953,861.3281250000,,, +59.6035156250,953,861.3281250000,,, +59.6054687500,953,861.3281250000,,, +59.6074218750,953,861.3281250000,,, +59.6093750000,953,861.3281250000,,, +59.6113281250,953,861.3281250000,,, +59.6132812500,953,861.3281250000,,, +59.6152343750,953,861.3281250000,,, +59.6171875000,953,861.3281250000,,, +59.6191406250,953,861.3281250000,,, +59.6210937500,953,861.3281250000,,, +59.6230468750,953,861.3281250000,,, +59.6250000000,954,861.3281250000,,, +59.6269531250,954,861.3281250000,,, +59.6289062500,954,861.3281250000,,, +59.6308593750,954,861.3281250000,,, +59.6328125000,954,861.3281250000,,, +59.6347656250,954,861.3281250000,,, +59.6367187500,954,861.3281250000,,, +59.6386718750,954,861.3281250000,,, +59.6406250000,954,861.3281250000,,, +59.6425781250,954,861.3281250000,,, +59.6445312500,954,861.3281250000,,, +59.6464843750,954,861.3281250000,,, +59.6484375000,954,861.3281250000,,, +59.6503906250,954,861.3281250000,,, +59.6523437500,954,861.3281250000,,, +59.6542968750,954,861.3281250000,,, +59.6562500000,954,861.3281250000,,, +59.6582031250,954,861.3281250000,,, +59.6601562500,954,861.3281250000,,, +59.6621093750,954,861.3281250000,,, +59.6640625000,954,861.3281250000,,, +59.6660156250,954,861.3281250000,,, +59.6679687500,954,861.3281250000,,, +59.6699218750,954,861.3281250000,,, +59.6718750000,954,861.3281250000,,, +59.6738281250,954,861.3281250000,,, +59.6757812500,954,861.3281250000,,, +59.6777343750,954,861.3281250000,,, +59.6796875000,954,861.3281250000,,, +59.6816406250,954,861.3281250000,,, +59.6835937500,954,861.3281250000,,, +59.6855468750,954,861.3281250000,,, +59.6875000000,955,861.3281250000,,, +59.6894531250,955,861.3281250000,,, +59.6914062500,955,861.3281250000,,, +59.6933593750,955,861.3281250000,,, +59.6953125000,955,861.3281250000,,, +59.6972656250,955,861.3281250000,,, +59.6992187500,955,861.3281250000,,, +59.7011718750,955,861.3281250000,,, +59.7031250000,955,861.3281250000,,, +59.7050781250,955,861.3281250000,,, +59.7070312500,955,861.3281250000,,, +59.7089843750,955,861.3281250000,,, +59.7109375000,955,861.3281250000,,, +59.7128906250,955,861.3281250000,,, +59.7148437500,955,861.3281250000,,, +59.7167968750,955,861.3281250000,,, +59.7187500000,955,861.3281250000,,, +59.7207031250,955,861.3281250000,,, +59.7226562500,955,861.3281250000,,, +59.7246093750,955,861.3281250000,,, +59.7265625000,955,861.3281250000,,, +59.7285156250,955,861.3281250000,,, +59.7304687500,955,861.3281250000,,, +59.7324218750,955,861.3281250000,,, +59.7343750000,955,861.3281250000,,, +59.7363281250,955,861.3281250000,,, +59.7382812500,955,861.3281250000,,, +59.7402343750,955,861.3281250000,,, +59.7421875000,955,861.3281250000,,, +59.7441406250,955,861.3281250000,,, +59.7460937500,955,861.3281250000,,, +59.7480468750,955,861.3281250000,,, +59.7500000000,956,861.3281250000,,, +59.7519531250,956,861.3281250000,,, +59.7539062500,956,861.3281250000,,, +59.7558593750,956,861.3281250000,,, +59.7578125000,956,861.3281250000,,, +59.7597656250,956,861.3281250000,,, +59.7617187500,956,861.3281250000,,, +59.7636718750,956,861.3281250000,,, +59.7656250000,956,861.3281250000,,, +59.7675781250,956,861.3281250000,,, +59.7695312500,956,861.3281250000,,, +59.7714843750,956,861.3281250000,,, +59.7734375000,956,861.3281250000,,, +59.7753906250,956,861.3281250000,,, +59.7773437500,956,861.3281250000,,, +59.7792968750,956,861.3281250000,,, +59.7812500000,956,861.3281250000,,, +59.7832031250,956,861.3281250000,,, +59.7851562500,956,861.3281250000,,, +59.7871093750,956,861.3281250000,,, +59.7890625000,956,861.3281250000,,, +59.7910156250,956,861.3281250000,,, +59.7929687500,956,861.3281250000,,, +59.7949218750,956,861.3281250000,,, +59.7968750000,956,861.3281250000,,, +59.7988281250,956,861.3281250000,,, +59.8007812500,956,861.3281250000,,, +59.8027343750,956,861.3281250000,,, +59.8046875000,956,861.3281250000,,, +59.8066406250,956,861.3281250000,,, +59.8085937500,956,861.3281250000,,, +59.8105468750,956,861.3281250000,,, +59.8125000000,957,861.3281250000,,, +59.8144531250,957,861.3281250000,,, +59.8164062500,957,861.3281250000,,, +59.8183593750,957,861.3281250000,,, +59.8203125000,957,861.3281250000,,, +59.8222656250,957,861.3281250000,,, +59.8242187500,957,861.3281250000,,, +59.8261718750,957,861.3281250000,,, +59.8281250000,957,861.3281250000,,, +59.8300781250,957,861.3281250000,,, +59.8320312500,957,861.3281250000,,, +59.8339843750,957,861.3281250000,,, +59.8359375000,957,861.3281250000,,, +59.8378906250,957,861.3281250000,,, +59.8398437500,957,861.3281250000,,, +59.8417968750,957,861.3281250000,,, +59.8437500000,957,861.3281250000,,, +59.8457031250,957,861.3281250000,,, +59.8476562500,957,861.3281250000,,, +59.8496093750,957,861.3281250000,,, +59.8515625000,957,861.3281250000,,, +59.8535156250,957,861.3281250000,,, +59.8554687500,957,861.3281250000,,, +59.8574218750,957,861.3281250000,,, +59.8593750000,957,861.3281250000,,, +59.8613281250,957,861.3281250000,,, +59.8632812500,957,861.3281250000,,, +59.8652343750,957,861.3281250000,,, +59.8671875000,957,861.3281250000,,, +59.8691406250,957,861.3281250000,,, +59.8710937500,957,861.3281250000,,, +59.8730468750,957,861.3281250000,,, +59.8750000000,958,861.3281250000,,, +59.8769531250,958,861.3281250000,,, +59.8789062500,958,861.3281250000,,, +59.8808593750,958,861.3281250000,,, +59.8828125000,958,861.3281250000,,, +59.8847656250,958,861.3281250000,,, +59.8867187500,958,861.3281250000,,, +59.8886718750,958,861.3281250000,,, +59.8906250000,958,861.3281250000,,, +59.8925781250,958,861.3281250000,,, +59.8945312500,958,861.3281250000,,, +59.8964843750,958,861.3281250000,,, +59.8984375000,958,861.3281250000,,, +59.9003906250,958,861.3281250000,,, +59.9023437500,958,861.3281250000,,, +59.9042968750,958,861.3281250000,,, +59.9062500000,958,861.3281250000,,, +59.9082031250,958,861.3281250000,,, +59.9101562500,958,861.3281250000,,, +59.9121093750,958,861.3281250000,,, +59.9140625000,958,861.3281250000,,, +59.9160156250,958,861.3281250000,,, +59.9179687500,958,861.3281250000,,, +59.9199218750,958,861.3281250000,,, +59.9218750000,958,861.3281250000,,, +59.9238281250,958,861.3281250000,,, +59.9257812500,958,861.3281250000,,, +59.9277343750,958,861.3281250000,,, +59.9296875000,958,861.3281250000,,, +59.9316406250,958,861.3281250000,,, +59.9335937500,958,861.3281250000,,, +59.9355468750,958,861.3281250000,,, +59.9375000000,959,861.3281250000,,, +59.9394531250,959,861.3281250000,,, +59.9414062500,959,861.3281250000,,, +59.9433593750,959,861.3281250000,,, +59.9453125000,959,861.3281250000,,, +59.9472656250,959,861.3281250000,,, +59.9492187500,959,861.3281250000,,, +59.9511718750,959,861.3281250000,,, +59.9531250000,959,861.3281250000,,, +59.9550781250,959,861.3281250000,,, +59.9570312500,959,861.3281250000,,, +59.9589843750,959,861.3281250000,,, +59.9609375000,959,861.3281250000,,, +59.9628906250,959,861.3281250000,,, +59.9648437500,959,861.3281250000,,, +59.9667968750,959,861.3281250000,,, +59.9687500000,959,861.3281250000,,, +59.9707031250,959,861.3281250000,,, +59.9726562500,959,861.3281250000,,, +59.9746093750,959,861.3281250000,,, +59.9765625000,959,861.3281250000,,, +59.9785156250,959,861.3281250000,,, +59.9804687500,959,861.3281250000,,, +59.9824218750,959,861.3281250000,,, +59.9843750000,959,861.3281250000,,, +59.9863281250,959,861.3281250000,,, +59.9882812500,959,861.3281250000,,, +59.9902343750,959,861.3281250000,,, +59.9921875000,959,861.3281250000,,, +59.9941406250,959,861.3281250000,,, +59.9960937500,959,861.3281250000,,, +59.9980468750,959,861.3281250000,,, +60.0000000000,960,863.2812500000,,, +60.0019531250,960,863.2812500000,,, +60.0039062500,960,863.2812500000,,, +60.0058593750,960,863.2812500000,,, +60.0078125000,960,863.2812500000,,, +60.0097656250,960,863.2812500000,,, +60.0117187500,960,863.2812500000,,, +60.0136718750,960,863.2812500000,,, +60.0156250000,960,863.2812500000,,, +60.0175781250,960,863.2812500000,,, +60.0195312500,960,863.2812500000,,, +60.0214843750,960,863.2812500000,,, +60.0234375000,960,863.2812500000,,, +60.0253906250,960,863.2812500000,,, +60.0273437500,960,863.2812500000,,, +60.0292968750,960,863.2812500000,,, +60.0312500000,960,863.2812500000,,, +60.0332031250,960,863.2812500000,,, +60.0351562500,960,863.2812500000,,, +60.0371093750,960,863.2812500000,,, +60.0390625000,960,863.2812500000,,, +60.0410156250,960,863.2812500000,,, +60.0429687500,960,863.2812500000,,, +60.0449218750,960,863.2812500000,,, +60.0468750000,960,863.2812500000,,, +60.0488281250,960,863.2812500000,,, +60.0507812500,960,863.2812500000,,, +60.0527343750,960,863.2812500000,,, +60.0546875000,960,863.2812500000,,, +60.0566406250,960,863.2812500000,,, +60.0585937500,960,863.2812500000,,, +60.0605468750,960,863.2812500000,,, +60.0625000000,961,863.2812500000,,, +60.0644531250,961,863.2812500000,,, +60.0664062500,961,863.2812500000,,, +60.0683593750,961,863.2812500000,,, +60.0703125000,961,863.2812500000,,, +60.0722656250,961,863.2812500000,,, +60.0742187500,961,863.2812500000,,, +60.0761718750,961,863.2812500000,,, +60.0781250000,961,863.2812500000,,, +60.0800781250,961,863.2812500000,,, +60.0820312500,961,863.2812500000,,, +60.0839843750,961,863.2812500000,,, +60.0859375000,961,863.2812500000,,, +60.0878906250,961,863.2812500000,,, +60.0898437500,961,863.2812500000,,, +60.0917968750,961,863.2812500000,,, +60.0937500000,961,863.2812500000,,, +60.0957031250,961,863.2812500000,,, +60.0976562500,961,863.2812500000,,, +60.0996093750,961,863.2812500000,,, +60.1015625000,961,863.2812500000,,, +60.1035156250,961,863.2812500000,,, +60.1054687500,961,863.2812500000,,, +60.1074218750,961,863.2812500000,,, +60.1093750000,961,863.2812500000,,, +60.1113281250,961,863.2812500000,,, +60.1132812500,961,863.2812500000,,, +60.1152343750,961,863.2812500000,,, +60.1171875000,961,863.2812500000,,, +60.1191406250,961,863.2812500000,,, +60.1210937500,961,863.2812500000,,, +60.1230468750,961,863.2812500000,,, diff --git a/plugins/processing/signal-processing/test/scenarios-tests/Pulse-Rate-Calculator-test.xml b/plugins/processing/signal-processing/test/scenarios-tests/Pulse-Rate-Calculator-test.xml new file mode 100644 index 0000000000000000000000000000000000000000..773e4c737420406d41a14bef93928a3f132e66ec --- /dev/null +++ b/plugins/processing/signal-processing/test/scenarios-tests/Pulse-Rate-Calculator-test.xml @@ -0,0 +1,375 @@ +<OpenViBE-Scenario> + <FormatVersion>2</FormatVersion> + <Creator>OpenViBE Designer</Creator> + <CreatorVersion>3.5.0</CreatorVersion> + <Settings> + <Setting> + <Identifier>(0x30f89715, 0xfebbddb4)</Identifier> + <TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier> + <Name>I-O file names</Name> + <DefaultValue>Pulse-Rate-Calculator</DefaultValue> + <Value>Pulse-Rate-Calculator</Value> + </Setting> + </Settings> + <Inputs></Inputs> + <Outputs></Outputs> + <Boxes> + <Box> + <Identifier>(0x0000011a, 0x00004c18)</Identifier> + <Name>Timeout</Name> + <AlgorithmClassIdentifier>(0x24fcd292, 0x5c8f6aa8)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x544a003e, 0x6dcba5f6)</TypeIdentifier> + <Name>Input Stream</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Output Stimulations</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Timeout delay</Name> + <DefaultValue>5</DefaultValue> + <Value>1</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Output Stimulation</Name> + <DefaultValue>OVTK_StimulationId_Label_00</DefaultValue> + <Value>OVTK_StimulationId_Label_00</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>224</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>752</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0x1eaee00e, 0xdb05d34e)</Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>2</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>1</Value> + </Attribute> + </Attributes> + </Box> + <Box> + <Identifier>(0x00001a51, 0x000015fe)</Identifier> + <Name>CSV File Writer</Name> + <AlgorithmClassIdentifier>(0x428375e8, 0x325f2db9)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier> + <Name>Input stream</Name> + </Input> + <Input> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Stimulations stream</Name> + </Input> + </Inputs> + <Settings> + <Setting> + <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> + <Name>Filename</Name> + <DefaultValue>record-[$core{date}-$core{time}].csv</DefaultValue> + <Value>${Player_ScenarioDirectory}/$var{I-O file names}-output.csv</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Precision</Name> + <DefaultValue>10</DefaultValue> + <Value>10</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Append data</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Only last matrix</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>288</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>592</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0xc33e47e0, 0x70e5f31b)</Value> + </Attribute> + <Attribute> + <Identifier>(0x527ad68d, 0x16d746a0)</Identifier> + <Value></Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>4</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>2</Value> + </Attribute> + </Attributes> + </Box> + <Box> + <Identifier>(0x000028a5, 0x00004e02)</Identifier> + <Name>Pulse Rate Calculator</Name> + <AlgorithmClassIdentifier>(0x034466a7, 0x8059bcf3)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier> + <Name>Signal</Name> + </Input> + </Inputs> + <Outputs> + <Output> + <TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier> + <Name>PRV</Name> + </Output> + <Output> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Heart beats</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Time window (s)</Name> + <DefaultValue>10</DefaultValue> + <Value>12</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x2cdb2f0b, 0x12f231ea)</TypeIdentifier> + <Name>Send stimulation when beat detected</Name> + <DefaultValue>false</DefaultValue> + <Value>false</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>224</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>592</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0x532c9ebd, 0xd32371f4)</Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>2</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>2</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>1</Value> + </Attribute> + </Attributes> + </Box> + <Box> + <Identifier>(0x00002a25, 0x00000197)</Identifier> + <Name>CSV File Reader</Name> + <AlgorithmClassIdentifier>(0x336a3d9a, 0x753f1ba4)</AlgorithmClassIdentifier> + <Outputs> + <Output> + <TypeIdentifier>(0x5ba36127, 0x195feae1)</TypeIdentifier> + <Name>Output stream</Name> + </Output> + <Output> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Output stimulation</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0x330306dd, 0x74a95f98)</TypeIdentifier> + <Name>Filename</Name> + <DefaultValue></DefaultValue> + <Value>${Player_ScenarioDirectory}/$var{I-O file names}-input.csv</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>144</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>592</Value> + </Attribute> + <Attribute> + <Identifier>(0x30a4e5c9, 0x83502953)</Identifier> + <Value></Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0xa9cdc629, 0xb153eb33)</Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>2</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>1</Value> + </Attribute> + </Attributes> + </Box> + <Box> + <Identifier>(0x000067be, 0x00004b1b)</Identifier> + <Name>Player Controller</Name> + <AlgorithmClassIdentifier>(0x5f426dce, 0x08456e13)</AlgorithmClassIdentifier> + <Inputs> + <Input> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Stimulations</Name> + </Input> + </Inputs> + <Settings> + <Setting> + <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> + <Name>Stimulation name</Name> + <DefaultValue>OVTK_StimulationId_Label_00</DefaultValue> + <Value>OVTK_StimulationId_Label_00</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0xcc14d8d6, 0xf27ecb73)</TypeIdentifier> + <Name>Action to perform</Name> + <DefaultValue>Pause</DefaultValue> + <Value>Stop</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>304</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>752</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0x568d148e, 0x650792b3)</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>2</Value> + </Attribute> + <Attribute> + <Identifier>(0xcfad85b0, 0x7c6d841c)</Identifier> + <Value>1</Value> + </Attribute> + </Attributes> + </Box> + </Boxes> + <Links> + <Link> + <Identifier>(0x00001c6c, 0x000061b7)</Identifier> + <Source> + <BoxIdentifier>(0x00002a25, 0x00000197)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000028a5, 0x00004e02)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> + <Link> + <Identifier>(0x000041d0, 0x000069c2)</Identifier> + <Source> + <BoxIdentifier>(0x0000011a, 0x00004c18)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x000067be, 0x00004b1b)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> + <Link> + <Identifier>(0x0000626d, 0x00001bcf)</Identifier> + <Source> + <BoxIdentifier>(0x000028a5, 0x00004e02)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x00001a51, 0x000015fe)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> + <Link> + <Identifier>(0x000076b8, 0x00007ced)</Identifier> + <Source> + <BoxIdentifier>(0x000028a5, 0x00004e02)</BoxIdentifier> + <BoxOutputIndex>1</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x00001a51, 0x000015fe)</BoxIdentifier> + <BoxInputIndex>1</BoxInputIndex> + </Target> + </Link> + <Link> + <Identifier>(0x3e089599, 0x25958fa1)</Identifier> + <Source> + <BoxIdentifier>(0x00002a25, 0x00000197)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x0000011a, 0x00004c18)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> + </Links> + <Comments></Comments> + <Metadata> + <Entry> + <Identifier>(0x00005e3e, 0x00005287)</Identifier> + <Type>(0x3bcce5d2, 0x43f2d968)</Type> + <Data>[{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":1,"identifier":"(0x0000440c, 0x00000b38)","name":"Default window","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":1},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x000051ff, 0x0000683c)","index":0,"name":"Default tab","parentIdentifier":"(0x0000440c, 0x00000b38)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":0,"identifier":"(0x0000677a, 0x00005ed7)","index":0,"name":"Empty","parentIdentifier":"(0x000051ff, 0x0000683c)","type":0}]</Data> + </Entry> + </Metadata> +</OpenViBE-Scenario> \ No newline at end of file diff --git a/plugins/processing/simple-visualization/CMakeLists.txt b/plugins/processing/simple-visualization/CMakeLists.txt index 9d2b43841730d186aac9ec6aaf744c22a13c0c3d..35833cf6c549e581b3dd6cb8433b6158fac3eb9a 100755 --- a/plugins/processing/simple-visualization/CMakeLists.txt +++ b/plugins/processing/simple-visualization/CMakeLists.txt @@ -15,7 +15,8 @@ target_link_libraries(${PROJECT_NAME} openvibe-toolkit openvibe-module-system openvibe-visualization-toolkit - Boost::boost) + Boost::boost + gtk2) set_target_properties(${PROJECT_NAME} PROPERTIES VERSION ${PROJECT_VERSION} @@ -26,7 +27,9 @@ set_target_properties(${PROJECT_NAME} PROPERTIES add_definitions(-DTARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines) include("FindOpenViBEModuleTCPTagging") -include("FindThirdPartyGTK") + +file(COPY share/ DESTINATION ${BUILD_DATADIR}/plugins/simple-visualization) +file(COPY box-tutorials DESTINATION ${BUILD_DATADIR}/scenarios/) # ----------------------------- # Install files diff --git a/plugins/processing/simple-visualization/src/CBottomTimeRuler.cpp b/plugins/processing/simple-visualization/src/CBottomTimeRuler.cpp index e14b10785460a5bb6d6adb56a12b2c44afe0e358..125f5dd569e9683d36378a5f48f4478bfed84921 100644 --- a/plugins/processing/simple-visualization/src/CBottomTimeRuler.cpp +++ b/plugins/processing/simple-visualization/src/CBottomTimeRuler.cpp @@ -50,7 +50,7 @@ CBottomTimeRuler::CBottomTimeRuler(CBufferDatabase& database, const int width, c : m_bottomRuler(gtk_drawing_area_new()), m_database(&database), m_height(height) { gtk_widget_set_size_request(m_bottomRuler, width, height); - g_signal_connect_after(G_OBJECT(m_bottomRuler), "expose_event", G_CALLBACK(BottomRulerExposeEventCB), this); + g_signal_connect_after(G_OBJECT(m_bottomRuler), "expose-event", G_CALLBACK(BottomRulerExposeEventCB), this); } void CBottomTimeRuler::Draw() diff --git a/plugins/processing/simple-visualization/src/CTimeRuler.cpp b/plugins/processing/simple-visualization/src/CTimeRuler.cpp index f3438ec61e1c0b2cdf11db4b855408cbe1079ae7..1ac00ba175a0e88ad9324ff85f245e13f0ca286a 100644 --- a/plugins/processing/simple-visualization/src/CTimeRuler.cpp +++ b/plugins/processing/simple-visualization/src/CTimeRuler.cpp @@ -54,7 +54,7 @@ CTimeRuler::CTimeRuler(IStreamDatabase& streamDatabase, const int width, const i : m_widget(gtk_drawing_area_new()), m_stream(streamDatabase), m_height(height) { gtk_widget_set_size_request(m_widget, width, height); - g_signal_connect_after(G_OBJECT(m_widget), "expose_event", G_CALLBACK(TimeRulerExposeEventCB), this); + g_signal_connect_after(G_OBJECT(m_widget), "expose-event", G_CALLBACK(TimeRulerExposeEventCB), this); } void CTimeRuler::Draw() diff --git a/plugins/processing/simple-visualization/src/box-algorithms/CDisplayCueImage.cpp b/plugins/processing/simple-visualization/src/box-algorithms/CDisplayCueImage.cpp index 78eb9a67ef6d933810975d467bc107a7d8bd36be..7f16ee2e5d10beefb20a26c3d27be05e5f5ecb16 100644 --- a/plugins/processing/simple-visualization/src/box-algorithms/CDisplayCueImage.cpp +++ b/plugins/processing/simple-visualization/src/box-algorithms/CDisplayCueImage.cpp @@ -99,7 +99,7 @@ bool CDisplayCueImage::initialize() gtk_builder_connect_signals(m_builderInterface, nullptr); m_drawingArea = GTK_WIDGET(gtk_builder_get_object(m_builderInterface, "DisplayCueImageDrawingArea")); - g_signal_connect(G_OBJECT(m_drawingArea), "expose_event", G_CALLBACK(DisplayCueImageRedrawCB), this); + g_signal_connect(G_OBJECT(m_drawingArea), "expose-event", G_CALLBACK(DisplayCueImageRedrawCB), this); g_signal_connect(G_OBJECT(m_drawingArea), "size-allocate", G_CALLBACK(DisplayCueImageResizeCB), this); //set widget bg color diff --git a/plugins/processing/simple-visualization/src/box-algorithms/CGrazMultiVisualization.cpp b/plugins/processing/simple-visualization/src/box-algorithms/CGrazMultiVisualization.cpp index 5add39e6ead8e2664efabd5efc531a877bea910e..bbfbd2f5ff5e5a24c5da7c1e0bb15069200d3d44 100644 --- a/plugins/processing/simple-visualization/src/box-algorithms/CGrazMultiVisualization.cpp +++ b/plugins/processing/simple-visualization/src/box-algorithms/CGrazMultiVisualization.cpp @@ -1,4 +1,4 @@ -///------------------------------------------------------------------------------------------------- +///------------------------------------------------------------------------------------------------- /// /// \file CGrazMultiVisualization.cpp /// \brief Classes implementation for the Generalized Graz Visualization box. @@ -610,7 +610,7 @@ bool CGrazMultiVisualization::initWindow() m_visualizationCtx = dynamic_cast<VisualizationToolkit::IVisualizationContext*>(this->createPluginObject(OVP_ClassId_Plugin_VisualizationCtx)); m_visualizationCtx->setWidget(*this, m_widget); g_signal_connect(G_OBJECT(m_widget), "size-allocate", G_CALLBACK(ResizeCB), this); - g_signal_connect(G_OBJECT(m_widget), "expose_event", G_CALLBACK(RedrawCB), this); + g_signal_connect(G_OBJECT(m_widget), "expose-event", G_CALLBACK(RedrawCB), this); return true; } diff --git a/plugins/processing/simple-visualization/src/box-algorithms/CGrazVisualization.cpp b/plugins/processing/simple-visualization/src/box-algorithms/CGrazVisualization.cpp index 3f52d626e7069060efffe69d19f1530a313ed901..3e3313fb1ebc6dc0dc321c9cfc72fb7ec340977d 100644 --- a/plugins/processing/simple-visualization/src/box-algorithms/CGrazVisualization.cpp +++ b/plugins/processing/simple-visualization/src/box-algorithms/CGrazVisualization.cpp @@ -209,7 +209,7 @@ bool CGrazVisualization::initialize() gtk_builder_connect_signals(m_Builder, nullptr); m_DrawingArea = GTK_WIDGET(gtk_builder_get_object(m_Builder, "GrazVisualizationDrawingArea")); - g_signal_connect(G_OBJECT(m_DrawingArea), "expose_event", G_CALLBACK(RedrawCB), this); + g_signal_connect(G_OBJECT(m_DrawingArea), "expose-event", G_CALLBACK(RedrawCB), this); g_signal_connect(G_OBJECT(m_DrawingArea), "size-allocate", G_CALLBACK(ResizeCB), this); #if 0 diff --git a/plugins/processing/simple-visualization/src/box-algorithms/SignalDisplay/CSignalChannelDisplay.cpp b/plugins/processing/simple-visualization/src/box-algorithms/SignalDisplay/CSignalChannelDisplay.cpp index e94298acff869ee2ee568e2ac759351eac13748a..79719df5904541fc9e94989d3e247b9d3d9686a5 100644 --- a/plugins/processing/simple-visualization/src/box-algorithms/SignalDisplay/CSignalChannelDisplay.cpp +++ b/plugins/processing/simple-visualization/src/box-algorithms/SignalDisplay/CSignalChannelDisplay.cpp @@ -84,7 +84,7 @@ CSignalChannelDisplay::CSignalChannelDisplay(CSignalDisplayView* displayView, co gtk_widget_add_events(GTK_WIDGET(m_DrawingArea), GDK_LEAVE_NOTIFY_MASK); gtk_widget_add_events(GTK_WIDGET(m_DrawingArea), GDK_CONFIGURE); // Size change - g_signal_connect_after(G_OBJECT(m_DrawingArea), "expose_event", G_CALLBACK(DrawingAreaExposeEventCB), this); + g_signal_connect_after(G_OBJECT(m_DrawingArea), "expose-event", G_CALLBACK(DrawingAreaExposeEventCB), this); g_signal_connect_after(G_OBJECT(m_DrawingArea), "size-allocate", G_CALLBACK(DrawingAreaResizeEventCB), this); g_signal_connect_after(G_OBJECT(m_DrawingArea), "button-press-event", G_CALLBACK(DrawingAreaClickedEventCB), this); g_signal_connect_after(G_OBJECT(m_DrawingArea), "enter-notify-event", G_CALLBACK(DrawingAreaEnterEventCB), this); diff --git a/plugins/processing/simple-visualization/src/box-algorithms/SignalDisplay/CSignalDisplayLeftRuler.cpp b/plugins/processing/simple-visualization/src/box-algorithms/SignalDisplay/CSignalDisplayLeftRuler.cpp index 47d6757a1c1bbead2234aa48bec0c0841de9a394..a5190827f63a37c924631a1868d338de6442ffa5 100644 --- a/plugins/processing/simple-visualization/src/box-algorithms/SignalDisplay/CSignalDisplayLeftRuler.cpp +++ b/plugins/processing/simple-visualization/src/box-algorithms/SignalDisplay/CSignalDisplayLeftRuler.cpp @@ -46,7 +46,7 @@ CSignalDisplayLeftRuler::CSignalDisplayLeftRuler(const int width, const int heig { gtk_widget_set_size_request(m_Ruler, width, height); - g_signal_connect_after(G_OBJECT(m_Ruler), "expose_event", G_CALLBACK(LeftRulerExposeEventCallback), this); + g_signal_connect_after(G_OBJECT(m_Ruler), "expose-event", G_CALLBACK(LeftRulerExposeEventCallback), this); //get left ruler widget's font description PangoContext* ctx = gtk_widget_get_pango_context(m_Ruler); diff --git a/plugins/processing/simple-visualization/test/DartTestfile.txt b/plugins/processing/simple-visualization/test/DartTestfile.txt index 259dc883a27255ec3c2e1b1679e671b0845dbaf8..6c740d0539d95cde2a5d2f58422765fe50878057 100644 --- a/plugins/processing/simple-visualization/test/DartTestfile.txt +++ b/plugins/processing/simple-visualization/test/DartTestfile.txt @@ -1,6 +1,8 @@ validation_test_visualization(scenarios-tests Display-cue-image) validation_test_visualization(scenarios-tests ERP-plot) validation_test_visualization(scenarios-tests Multimodal-Graz-visualization) -validation_test_visualization(scenarios-tests Power-Spectrum) +if (NOT APPLE) + validation_test_visualization(scenarios-tests Power-Spectrum) + validation_test_visualization(scenarios-tests Topography) +endif() validation_test_visualization(scenarios-tests Simple-visualization) -validation_test_visualization(scenarios-tests Topography) diff --git a/plugins/processing/simple-visualization/test/scenarios-tests/ERP-plot-input.csv b/plugins/processing/simple-visualization/test/scenarios-tests/ERP-plot-input.csv index eb61a724a116f63f7ab23303f97930ba8cd5f974..4be270f4533b56c9a9cb6acd05b5a5c99eb977fc 100644 --- a/plugins/processing/simple-visualization/test/scenarios-tests/ERP-plot-input.csv +++ b/plugins/processing/simple-visualization/test/scenarios-tests/ERP-plot-input.csv @@ -1414,4 +1414,4 @@ Time:64Hz,Epoch,Time signal,Event Id,Event Date,Event Duration 22.0625000000,176,-2.2588166571,,, 22.0781250000,176,-1.2929633223,,, 22.0937500000,176,-0.8987277677,,, -22.1093750000,176,-1.0353323697,,, \ No newline at end of file +22.1093750000,176,-1.0353323697,,, diff --git a/plugins/processing/simple-visualization/test/scenarios-tests/Multimodal-Graz-visualization.lua b/plugins/processing/simple-visualization/test/scenarios-tests/Multimodal-Graz-visualization.lua index 0fa06421e57ebf3ed6a562ab223bd5d4fbda976b..a9d5fc47d6e4e583fb3d0b8690e0b42a8ce9352b 100644 --- a/plugins/processing/simple-visualization/test/scenarios-tests/Multimodal-Graz-visualization.lua +++ b/plugins/processing/simple-visualization/test/scenarios-tests/Multimodal-Graz-visualization.lua @@ -70,7 +70,7 @@ function process(box) -- ends trial box:send_stimulation(1, OVTK_GDF_End_Of_Trial, t, 0) - t = t + math.random(end_of_trial_min_duration, end_of_trial_max_duration) + t = t + math.random(math.floor(end_of_trial_min_duration), math.ceil(end_of_trial_max_duration)) end diff --git a/plugins/processing/stimulation/CMakeLists.txt b/plugins/processing/stimulation/CMakeLists.txt index d3c6819ab5c71de68b68435c196b95a0fe1ca764..7219c2899c71dad6af7256d23bd06aaa2db6f9fd 100755 --- a/plugins/processing/stimulation/CMakeLists.txt +++ b/plugins/processing/stimulation/CMakeLists.txt @@ -11,7 +11,11 @@ target_link_libraries(${PROJECT_NAME} Boost::boost Boost::system Boost::thread - lua) + alut + vorbis + lua + gtk2 +) if(UNIX AND NOT APPLE) find_library(LIB_RT rt) @@ -32,8 +36,6 @@ set_target_properties(${PROJECT_NAME} PROPERTIES add_definitions(-DTARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines) include("FindOpenViBEModuleTCPTagging") -include("FindThirdPartyGTK") -include("FindThirdPartyOpenAL") # --------------------------------- # Finds standard library winmm @@ -50,6 +52,9 @@ if(WIN32) endif(LIB_STANDARD_MODULE_WINMM) endif(WIN32) +file(COPY share/ DESTINATION ${BUILD_DATADIR}/plugins/stimulation) +file(COPY box-tutorials DESTINATION ${BUILD_DATADIR}/scenarios) + # ----------------------------- # Install files # ----------------------------- diff --git a/plugins/processing/stimulation/src/box-algorithms/CBoxAlgorithmOpenALSoundPlayer.cpp b/plugins/processing/stimulation/src/box-algorithms/CBoxAlgorithmOpenALSoundPlayer.cpp index 8620c67c29b5523e4f491749d258623416183c2a..c2cb5bc0315f9df703273886b84cd50e50e177a4 100644 --- a/plugins/processing/stimulation/src/box-algorithms/CBoxAlgorithmOpenALSoundPlayer.cpp +++ b/plugins/processing/stimulation/src/box-algorithms/CBoxAlgorithmOpenALSoundPlayer.cpp @@ -206,7 +206,7 @@ bool CBoxAlgorithmOpenALSoundPlayer::OpenSoundFile() #if defined TARGET_OS_Windows if (ov_fopen(const_cast<char*>(m_filename.toASCIIString()), &m_oggVorbisStream.Stream) < 0) -#elif defined TARGET_OS_Linux +#elif defined TARGET_OS_Linux || defined TARGET_OS_MacOS if((m_oggVorbisStream.File = fopen((const char *)m_filename, "rb")) == nullptr) { this->getLogManager() << Kernel::LogLevel_Error << "Can't open file "<<m_filename<<": IO error\n."; @@ -327,7 +327,8 @@ bool CBoxAlgorithmOpenALSoundPlayer::StopSound(const bool forwardStim) } -#endif //TARGET_HAS_ThirdPartyOpenAL } // namespace Stimulation } // namespace Plugins } // namespace OpenViBE + +#endif //TARGET_HAS_ThirdPartyOpenAL diff --git a/plugins/processing/stimulation/src/box-algorithms/CKeyboardStimulator.hpp b/plugins/processing/stimulation/src/box-algorithms/CKeyboardStimulator.hpp index 55ba7ce232f53f895a1c5f0722abc70a4b7f64b1..f81e9ce004a51dc5689481b924fb2871559e1ccd 100644 --- a/plugins/processing/stimulation/src/box-algorithms/CKeyboardStimulator.hpp +++ b/plugins/processing/stimulation/src/box-algorithms/CKeyboardStimulator.hpp @@ -69,7 +69,7 @@ protected: GtkWidget* m_widget = nullptr; - typedef struct + typedef struct SKey { uint64_t press; uint64_t release; diff --git a/plugins/processing/stimulation/src/box-algorithms/adaptation/CBoxAlgorithmStimulationFilter.hpp b/plugins/processing/stimulation/src/box-algorithms/adaptation/CBoxAlgorithmStimulationFilter.hpp index 737e4247b4397d5e8eb0fba5f8d14115f2e5eb68..f0e793d57893d07bdddec8485354e1580582e21c 100644 --- a/plugins/processing/stimulation/src/box-algorithms/adaptation/CBoxAlgorithmStimulationFilter.hpp +++ b/plugins/processing/stimulation/src/box-algorithms/adaptation/CBoxAlgorithmStimulationFilter.hpp @@ -50,7 +50,7 @@ protected: Kernel::TParameterHandler<CStimulationSet*> ip_stimSet; Kernel::TParameterHandler<CMemoryBuffer*> op_buffer; - typedef struct + typedef struct SRule { uint64_t action; uint64_t startStimID; diff --git a/plugins/processing/stimulation/test/DartTestfile.txt b/plugins/processing/stimulation/test/DartTestfile.txt index 1fea97256c860d75730c3a184fbe16b7465a20f7..f15cdd648642b18c350196d98050ce5dcd956eef 100644 --- a/plugins/processing/stimulation/test/DartTestfile.txt +++ b/plugins/processing/stimulation/test/DartTestfile.txt @@ -10,11 +10,9 @@ validation_test_without_comparison(scenarios-tests Run-Command) #basics definitions needed here IF(WIN32) SET(EXT cmd) - SET(OS_FLAGS "--no-pause") SET(OS_SUFFIX "") ELSE() SET(EXT sh) - SET(OS_FLAGS "") SET(OS_SUFFIX "-linux") ENDIF() @@ -26,7 +24,7 @@ ENDIF() SET(TEST_NAME run-command-with-spaces) SET(SCENARIO_TO_TEST "${TEST_NAME}.xml") ADD_TEST(clean_${TEST_NAME} "${CMAKE_COMMAND}" "-E" "remove" "-f" "${TEST_NAME}.txt") -ADD_TEST(run_${TEST_NAME} "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--invisible" "--no-session-management" "-d" "EXT" "${EXT}" "-d" "OUTFILE" "${TEST_NAME}.txt" "--play" ${SCENARIO_TO_TEST}) +ADD_TEST(run_${TEST_NAME} "$ENV{OV_BINARY_PATH}/openvibe-designer" "--invisible" "--no-session-management" "-d" "EXT" "${EXT}" "-d" "OUTFILE" "${TEST_NAME}.txt" "--play" ${SCENARIO_TO_TEST}) ADD_TEST(compare_${TEST_NAME} "git" "diff" "--no-index" "--ignore-space-at-eol" "${TEST_NAME}${OS_SUFFIX}.ref.txt" "${TEST_NAME}.txt") ## add some properties that help to debug diff --git a/plugins/processing/streaming/CMakeLists.txt b/plugins/processing/streaming/CMakeLists.txt index ea3a11eb4e901c96c997508a7d0717d4ecdf3f4c..d1d8cb4e8be5d8e7e31bd9f3443d977acfa603af 100644 --- a/plugins/processing/streaming/CMakeLists.txt +++ b/plugins/processing/streaming/CMakeLists.txt @@ -16,6 +16,8 @@ set_target_properties(${PROJECT_NAME} PROPERTIES add_definitions(-DTARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines) +file(COPY box-tutorials DESTINATION ${BUILD_DATADIR}/scenarios/) + # ----------------------------- # Install files # ----------------------------- diff --git a/plugins/processing/tools/CMakeLists.txt b/plugins/processing/tools/CMakeLists.txt index 42ec5e0a0dcfdff40bb11b6e137c3f180bb52bac..e8db2ba658a75ce5d00206dcbedd136c10df26a3 100644 --- a/plugins/processing/tools/CMakeLists.txt +++ b/plugins/processing/tools/CMakeLists.txt @@ -7,7 +7,9 @@ target_link_libraries(${PROJECT_NAME} openvibe openvibe-common openvibe-toolkit - openvibe-module-system) + openvibe-module-system + gtk2 +) set_target_properties(${PROJECT_NAME} PROPERTIES VERSION ${PROJECT_VERSION} @@ -18,9 +20,10 @@ set_target_properties(${PROJECT_NAME} PROPERTIES add_definitions(-DTARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines) # --------------------------------- -include("FindThirdPartyGTK") include("FindThirdPartyX11") +file(COPY share/ DESTINATION ${BUILD_DATADIR}/plugins/tools) + # ----------------------------- # Install files # ----------------------------- @@ -29,4 +32,4 @@ install(TARGETS ${PROJECT_NAME} LIBRARY DESTINATION ${DIST_LIBDIR} ARCHIVE DESTINATION ${DIST_LIBDIR}) -install(DIRECTORY share/ DESTINATION ${DIST_DATADIR}/openvibe/plugins/tools) \ No newline at end of file +install(DIRECTORY share/ DESTINATION ${DIST_DATADIR}/openvibe/plugins/tools) diff --git a/plugins/processing/tools/src/box-algorithms/CBoxAlgorithmMouseTracking.cpp b/plugins/processing/tools/src/box-algorithms/CBoxAlgorithmMouseTracking.cpp index 3206b3cf78ab4d664c021f271e5698dfebcf0f7b..81728447bc51ed9aeb740cc0ebc0f6510923fd38 100644 --- a/plugins/processing/tools/src/box-algorithms/CBoxAlgorithmMouseTracking.cpp +++ b/plugins/processing/tools/src/box-algorithms/CBoxAlgorithmMouseTracking.cpp @@ -171,7 +171,7 @@ void MotionEventHandler(GtkWidget* /*widget*/, const GdkEventMotion* motion, gpo box->m_MouseY = double(motion->y); } -#endif } // namespace Tools } // namespace Plugins } // namespace OpenViBE +#endif diff --git a/scripts/linux-dep-helpers/linux-compile-itpp.pl b/scripts/linux-dep-helpers/linux-compile-itpp.pl deleted file mode 100644 index 93c011eb8eb34156fdefd8657f2fb428cfe45f97..0000000000000000000000000000000000000000 --- a/scripts/linux-dep-helpers/linux-compile-itpp.pl +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bin/perl - -# Intended to be run from linux-install_dependencies.pl -# -# Variables are wrt that parent scope -# - -# Installation of packages not available in the apt database or PPA -# ITPP installation - -if (!$no_install && $distribution eq 'Fedora') { -#if (1) { - - my $old_dir = Cwd::getcwd(); - - my $itpp_build_dir = $dependencies_dir . "/itpp-build"; - my $itppe_src_dir = $dependencies_arch_dir . "/itpp-external-3.0.0"; - my $itpp_src_dir = $dependencies_arch_dir . "/itpp-4.0.7"; - - if (! -e $itpp_build_dir) { - mkdir($itpp_build_dir) or die("Failed to create directory [$itpp_build_dir]"); - } - - # fetch the packages - chdir "$dependencies_arch_dir"; - if (! -e "itpp-external-3.0.0.tar.bz2") { - system('wget "http://openvibe.inria.fr/dependencies/linux-x86/itpp-external-3.0.0.tar.bz2"'); - ($CHILD_ERROR != 0) and die ("Could not download the itpp external sources [$CHILD_ERROR]"); - } - if (! -e $itppe_src_dir) { - system('tar -xjf "itpp-external-3.0.0.tar.bz2"'); - ($CHILD_ERROR != 0) and die ("Could not extract the itpp external archive"); - } - - if (! -e "itpp-4.0.7.tar.bz2") { - system('wget "http://openvibe.inria.fr/dependencies/linux-x86/itpp-4.0.7.tar.bz2"'); - ($CHILD_ERROR != 0) and die ("Could not download the itpp sources [$CHILD_ERROR]"); - } - if (! -e $itpp_src_dir) { - system('tar -xjf "itpp-4.0.7.tar.bz2"'); - ($CHILD_ERROR != 0) and die ("Could not extract the itpp archive"); - } - - # compile - - # external - print "Compiling itpp external ...\n"; - chdir $itppe_src_dir; - - system('sed -i "s/_EXT_ETIME/_INT_ETIME/g" patches/lapack-3.1.1-autotools.patch'); - system('sed -i "s/_EXT_ETIME/_INT_ETIME/g" src/lapack-lite-3.1.1/SRC/Makefile.in'); - system('sed -i "s/_EXT_ETIME/_INT_ETIME/g" src/lapack-lite-3.1.1/SRC/Makefile.am'); - - system("./configure --prefix=$dependencies_dir/ >$itpp_build_dir/itppe-configure.log 2>&1"); - system("make >$itpp_build_dir/itpp-external-build.log 2>&1"); - # Fix pkg-config before installing - system('sed -i "s/(prefix)/{prefix}/g" fftw-3.1.2/fftw3.pc'); - ($CHILD_ERROR != 0) and die("Failed to run make for itpp-external [$CHILD_ERROR]"); - system('make install'); - ($CHILD_ERROR != 0) and die("Failed to run make install for itpp-external [$CHILD_ERROR]"); - - # main pkg - print "Compiling itpp ...\n"; - chdir $itpp_src_dir; - - system("./configure --prefix=$dependencies_dir/ CPPFLAGS=\"-I$dependencies_dir/include\" LDFLAGS=\"-L$dependencies_dir/lib -L$dependencies_dir/lib64\" >$itpp_build_dir/itpp-configure.log 2>&1"); - system("make >$itpp_build_dir/itpp-build.log 2>&1"); - ($CHILD_ERROR != 0) and die("Failed to run make for itpp [$CHILD_ERROR]"); - system("make install"); - ($CHILD_ERROR != 0) and die("Failed to run make install for itpp [$CHILD_ERROR]"); - - chdir $old_dir -}; - diff --git a/scripts/linux-dep-helpers/linux-compile-lsl.pl b/scripts/linux-dep-helpers/linux-compile-lsl.pl deleted file mode 100644 index 30fd26607629742e75fe49803fd764b7308aa10e..0000000000000000000000000000000000000000 --- a/scripts/linux-dep-helpers/linux-compile-lsl.pl +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/perl - -# Intended to be run from linux-install_dependencies.pl -# -# Variables are wrt that parent scope -# - -# Installation of packages not available in the apt database or PPA -# LSL installation - -if (!$no_install) { - - my $old_dir = Cwd::getcwd(); - - my $lsl_src_dir = $dependencies_arch_dir . "/LSL"; - - # fetch the packages - chdir "$dependencies_arch_dir"; - if (! -e "liblsl-1.12.ov1-src.tar.bz2") { - system('wget "http://openvibe.inria.fr/dependencies/linux-x86/liblsl-1.12.ov1-src.tar.bz2"'); - ($CHILD_ERROR != 0) and die ("Could not download the lsl sources [$CHILD_ERROR]"); - } - if (! -e $lsl_src_dir) { - system('tar xjf "liblsl-1.12.ov1-src.tar.bz2"'); - ($CHILD_ERROR != 0) and die ("Could not extract the lsl archive"); - } - - # compile - - # external - print "Compiling lsl ...\n"; - - chdir($lsl_src_dir); - mkdir("liblsl/build"); - system("cd liblsl/build && cmake .. >cmake-liblsl.log 2>&1"); - system("cd liblsl/build && make >make-liblsl.log 2>&1"); - - mkdir("$dependencies_dir/lib"); - mkdir("$dependencies_dir/include"); - - system("cp liblsl/build/src/liblsl.so $dependencies_dir/lib"); - system("cp -R liblsl/include/* $dependencies_dir/include"); - - - chdir $old_dir -}; - diff --git a/scripts/linux-dependencies-fedora.txt b/scripts/linux-dependencies-fedora.txt deleted file mode 100644 index f172f693064057c5745f90a32c8ce778f07c0a9d..0000000000000000000000000000000000000000 --- a/scripts/linux-dependencies-fedora.txt +++ /dev/null @@ -1,19 +0,0 @@ -wget -automake -autoconf -unzip -gcc-gfortran -gsl-devel -readline-devel -libtool -libXaw-devel -pcre-devel -freeimage-devel -mesa-libGL-devel -freealut-devel -libvorbis-devel -ois-devel -sqlite2-devel -fftw-devel -python3-devel -python3-numpy diff --git a/scripts/linux-dependencies-ubuntu1404.txt b/scripts/linux-dependencies-ubuntu1404.txt deleted file mode 100644 index e96e6f2542fe2755f6f3dd9f2cd2ba80e204dbac..0000000000000000000000000000000000000000 --- a/scripts/linux-dependencies-ubuntu1404.txt +++ /dev/null @@ -1,32 +0,0 @@ -libboost-chrono1.54-dev -wget -doxygen -make -automake -autoconf -cmake -unzip -gcc -g++ -libgtk2.0-dev -libglade2-dev -gfortran -libgsl0-dev -libreadline-dev -libzzip-dev -libtool -libxaw7-dev -libpcre3-dev -libfreeimage-dev -libglu1-mesa-dev -libalut-dev -libvorbis-dev -libncurses5-dev -libois-dev -libitpp-dev -libsqlite0-dev -libfftw3-dev -python-dev -python-numpy -sqlite - diff --git a/scripts/linux-dependencies-ubuntu16_plus.txt b/scripts/linux-dependencies-ubuntu16_plus.txt deleted file mode 100644 index 74d5113ddbd04590c28d1825c7b529e086734c5a..0000000000000000000000000000000000000000 --- a/scripts/linux-dependencies-ubuntu16_plus.txt +++ /dev/null @@ -1,22 +0,0 @@ -wget -automake -autoconf -unzip -gfortran -libgsl-dev -libreadline-dev -libtool -libxaw7-dev -libpcre3-dev -libfreeimage-dev -libglu1-mesa-dev -libalut-dev -libvorbis-dev -libois-dev -libitpp-dev -libsqlite0-dev -libfftw3-dev -python-dev -python-numpy -sqlite - diff --git a/scripts/windows-dependencies-x64.txt b/scripts/windows-dependencies-x64.txt deleted file mode 100644 index 24671d6f6e911a10c449245d5699f335561df55f..0000000000000000000000000000000000000000 --- a/scripts/windows-dependencies-x64.txt +++ /dev/null @@ -1,18 +0,0 @@ -build/windows/freealut_1.1.0_x64_vc120.zip;freealut;1.1.0 -build/windows/gtk_2.24.31_x64_vc120_dev.zip;gtk;2.24.31 -build/windows/gtk_2.24.31_x64_vc120_runtime.zip;gtk;2.24.31 -build/windows/itpp_4.3.1_x64_vc120.zip;itpp;4.3.1 -build/windows/liblsl_1.12_x64.zip;liblsl;1.12 -build/windows/libogg_1.2.1_x64_vc120.zip;libogg;1.2.1 -build/windows/libvorbis_1.3.2_x64_vc120.zip;libvorbis;1.3.2 -build/windows/nsis_log_zip_access_2.51.zip;nsis_log_zip_access;2.51 -build/windows/openal_1.1_x64.zip;openal;1.1 -build/windows/pthread_2.9.1_x64_vc120_dev.zip;pthread;2.9.1 -build/windows/sdk_brainproducts_amplifier_x64.zip;sdk_brainproducts_amplifier;0.0.0 -build/windows/sdk_eemagine_eego_1.3.28.57162_x64.zip;sdk_eemagine_eego;1.3.28.57162 -build/windows/sdk_micromed_x64_vc120.zip;sdk_micromed;0.0.0 -build/windows/sdk_tmsi_x64.zip;sdk_tmsi;0.0.0 -build/windows/sdk_gtec_unicorn_x64.zip;sdk_gtec_unicorn;0.0.0 -build/windows/vcredist_x64_vc120.zip;vcredist;1.0 -build/windows/vcredist_x64_vc100.zip;vcredist_100;1.0 -build/windows/vcredist_x64_vc110.zip;vcredist_110;1.0 diff --git a/scripts/windows-dependencies-x86.txt b/scripts/windows-dependencies-x86.txt deleted file mode 100644 index 3c2829a4513ee9ad253c865a512723d90f3cf67a..0000000000000000000000000000000000000000 --- a/scripts/windows-dependencies-x86.txt +++ /dev/null @@ -1,22 +0,0 @@ -build/windows/freealut_1.1.0_x86_vc120.zip;freealut;1.1.0 -build/windows/gtk-2.22.1-dev.zip;gtk;2.22.1 -build/windows/gtk-2.22.1-runtime.zip;gtk;2.22.1 -build/windows/itpp_4.3.1_x86_vc120.zip;itpp;4.3.1 -build/windows/liblsl_1.12_x86.zip;liblsl;1.12 -build/windows/libogg_1.2.1_x86.zip;libogg;1.2.1 -build/windows/libvorbis_1.3.2_x86.zip;libvorbis;1.3.2 -build/windows/nsis_log_zip_access_2.51.zip;nsis_log_zip_access;2.51 -build/windows/openal_1.1_x86.zip;openal;1.1 -build/windows/pthread_2.9.1_x86_vc120_dev.zip;pthread;2.9.1 -build/windows/sdk_brainproducts_amplifier_x86.zip;sdk_brainproducts_amplifier;0.0.0 -build/windows/sdk_eemagine_eego_1.3.28.57162_x86.zip;sdk_eemagine_eego;1.3.28.57162 -build/windows/sdk_enobio3g_x86.zip;sdk_enobio3g;0.0.0 -build/windows/sdk_mcs_x86.zip;sdk_mcs;0.0.0 -build/windows/sdk_mensia_acquisition_driver_3.0.99_x86.zip;sdk_mensia_acquisition_driver;3.0.99 -build/windows/sdk_micromed_x86_vc120.zip;sdk_micromed;0.0.0 -build/windows/sdk_mitsar_x86.zip;sdk_mitsar;0.0.0 -build/windows/sdk_nexus_x86.zip;sdk_nexus;0.0.0 -build/windows/sdk_tmsi_x86.zip;sdk_tmsi;0.0.0 -build/windows/vcredist_x86_vc120.zip;vcredist;1.0 -build/windows/vcredist_x86_vc100.zip;vcredist_100;1.0 -build/windows/vcredist_x86_vc110.zip;vcredist_110;1.0 diff --git a/scripts/windows-dependencies.cmd-base b/scripts/windows-dependencies.cmd-base deleted file mode 100755 index 577517997b4c8cfd069c4b1eeb88240d2b5f4e5c..0000000000000000000000000000000000000000 --- a/scripts/windows-dependencies.cmd-base +++ /dev/null @@ -1,18 +0,0 @@ - -SET PATH=C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\\bin;%PATH% - -SET PATH=%dependencies_base%\gtk\bin;%PATH% -SET VRPNROOT=%dependencies_base%\vrpn -SET PATH=%VRPNROOT%\bin;%PATH% - -SET PATH=%dependencies_base%\vcredist_100\;%PATH% -SET PATH=%dependencies_base%\vcredist_110\;%PATH% -SET PATH=%dependencies_base%\vcredist\;%PATH% - -REM Apply user-provided Python2.7 paths if available -IF NOT !PYTHONHOME27!==!EMPTY! IF NOT !PYTHONPATH27!==!EMPTY! SET REPLACE_PYTHON=true -IF NOT !REPLACE_PYTHON!==!EMPTY! ( - SET "PYTHONHOME=%PYTHONHOME27%" - SET "PYTHONPATH=%PYTHONPATH27%" -) - diff --git a/scripts/windows-openvibe-x.x.x-setup.nsi.in b/scripts/windows-openvibe-x.x.x-setup.nsi.in index 7766dc6e52d49bf9aef6ad1f7b077bbd06f558ea..661271ad59de6e1300ce6332c9cffb6a295a9153 100644 --- a/scripts/windows-openvibe-x.x.x-setup.nsi.in +++ b/scripts/windows-openvibe-x.x.x-setup.nsi.in @@ -1,8 +1,3 @@ -; define a default for dep source directory -!ifndef DEPENDENCIES_DIR - !define DEPENDENCIES_DIR "@LIST_DEPENDENCIES_PATH@" -!endif - !define OV_VERSION "@PROJECT_VERSION@" !define OV_VERSION_SHORT "@PROJECT_VERSION_SHORT@" @@ -27,7 +22,6 @@ ;Default installation folder InstallDir "@ARCH_PROGFILES@\openvibe-${OV_VERSION}-@ARCH_BITS@bit" Var OLDINSTDIR - Var DIRECTX_MISSING ;Interface Settings @@ -132,56 +126,7 @@ Section "!OpenViBE" Section1 SetOutPath $INSTDIR WriteRegStr HKLM "SOFTWARE\${OV_REGKEY}" "InstallDir" "$INSTDIR" WriteUninstaller Uninstall.exe - - CreateDirectory "$INSTDIR\dependencies\arch" - StrCpy $DIRECTX_MISSING "false" - - SetOutPath "$INSTDIR\dependencies" - IfFileExists "$SYSDIR\d3dx9_43.dll" no_need_to_install_directx - NSISdl::download "https://download.microsoft.com/download/8/4/A/84A35BF1-DAFE-4AE8-82AF-AD2AE20B6B14/directx_Jun2010_redist.exe" "arch\directx-jun2010.exe" - Pop $R0 ; Get the return value - StrCmp $R0 "success" +4 - MessageBox MB_OK "Download failed: $R0$\nCheck your Internet connection and your firewall settings.$\nDirect X won't be installed and 3D functionalities won't be available...$\nYou can install DirectX later to enable 3D functionalities !" /SD IDOK - StrCpy $DIRECTX_MISSING "true" - Goto no_need_to_install_directx ; Quit - ExecWait '"arch\directx-jun2010.exe" /T:"$INSTDIR\tmp" /Q' - ExecWait '"$INSTDIR\tmp\DXSETUP.exe" /silent' - RMDir /r "$INSTDIR\tmp" -no_need_to_install_directx: - - ; This is the destination path where the zips will be copied to - SetOutPath "$INSTDIR\dependencies\arch" - ; The following source paths are relative to this .nsi script location - File "${DEPENDENCIES_DIR}\arch\build\windows\*runtime.zip" - File "${DEPENDENCIES_DIR}\arch\build\windows\pthread*.zip" - ; All vcredist packages extracted to the same folder - File "${DEPENDENCIES_DIR}\arch\build\windows\vcredist*.zip" - - ; The zips are extracted here by the installer - SetOutPath "$INSTDIR\dependencies" - - ; Extract all the zip archives - ; n.b. this thing will freeze on exec if there is no - or _ in the filename - ClearErrors - FindFirst $R0 $R1 "arch\*.zip" - ZipLoop: - IfErrors ZipDone - - ; find the base name, push to R2 - Push "$R1" - Call GetFirstStrPart - Pop "$R2" - - ZipDLL::extractall "arch\$R1" "$R2" - - ClearErrors - FindNext $R0 $R1 - Goto ZipLoop - ZipDone: - FindClose $R0 - - ; Zip extract hopefully done now - + SetOutPath "$INSTDIR" ; Export binaries File /nonfatal /r @CMAKE_INSTALL_PREFIX@\bin @@ -209,46 +154,14 @@ no_need_to_install_directx: FileClose $0 no_need_to_patch_3d_functionnality: - ; Overwrite the file that may be in share/, as it contains local definitions to the build machine - FileOpen $0 "$INSTDIR\bin\openvibe-set-env.cmd" w - FileWrite $0 "@echo off$\r$\n" - FileWrite $0 "$\r$\n" - - FileWrite $0 "$\r$\n" - FileWrite $0 "SET VRPNROOT=$INSTDIR\dependencies\vrpn$\r$\n" - FileWrite $0 "$\r$\n" - FileWrite $0 "SET PATH=$INSTDIR\dependencies\gtk\bin;%PATH%$\r$\n" - FileWrite $0 "SET PATH=%VRPNROOT%\bin;%PATH%$\r$\n" - FileWrite $0 "SET PATH=$INSTDIR\dependencies\pthread\lib;%PATH%$\r$\n" - FileWrite $0 "SET PATH=$INSTDIR\dependencies\vcredist\;%PATH%$\r$\n" - - FileWrite $0 "$\r$\n" - FileWrite $0 "REM Apply user-provided Python2.7 paths if available$\r$\n" - FileWrite $0 "IF NOT !PYTHONHOME27!==!EMPTY! IF NOT !PYTHONPATH27!==!EMPTY! SET REPLACE_PYTHON=true$\r$\n" - FileWrite $0 "IF NOT !REPLACE_PYTHON!==!EMPTY! ($\r$\n" - FileWrite $0 " SET $\"PYTHONHOME=%PYTHONHOME27%$\"$\r$\n" - FileWrite $0 " SET $\"PYTHONPATH=%PYTHONPATH27%$\"$\r$\n" - FileWrite $0 ")$\r$\n" - - FileClose $0 - - FileOpen $0 "$INSTDIR\dependencies\gtk\etc\gtk-2.0\gtkrc" w - FileWrite $0 "gtk-theme-name = $\"Redmond$\"$\r$\n" - FileWrite $0 "style $\"user-font$\"$\r$\n" - FileWrite $0 "{$\r$\n" - FileWrite $0 " font_name=$\"Sans 8$\"$\r$\n" - FileWrite $0 "}$\r$\n" - FileWrite $0 "widget_class $\"*$\" style $\"user-font$\"$\r$\n" - FileClose $0 - CreateDirectory "$SMPROGRAMS\${OV_NAME}" CreateDirectory "$SMPROGRAMS\${OV_NAME}\Developer tools" - CreateShortCut "$SMPROGRAMS\${OV_NAME}\Developer tools\OpenViBE ID Generator.lnk" "$INSTDIR\openvibe-id-generator.cmd" "" "%SystemRoot%\system32\shell32.dll" 57 - CreateShortCut "$SMPROGRAMS\${OV_NAME}\Developer tools\OpenViBE Plugin Inspector.lnk" "$INSTDIR\openvibe-plugin-inspector.cmd" "" "%SystemRoot%\system32\shell32.dll" 57 - CreateShortCut "$SMPROGRAMS\${OV_NAME}\Developer tools\OpenViBE Skeleton Generator.lnk" "$INSTDIR\openvibe-skeleton-generator.cmd" "" "%SystemRoot%\system32\shell32.dll" 57 - CreateShortCut "$SMPROGRAMS\${OV_NAME}\OpenViBE Designer @ARCH_BITS@bit.lnk" "$INSTDIR\openvibe-designer.cmd" "" "%SystemRoot%\system32\shell32.dll" 137 - CreateShortCut "$SMPROGRAMS\${OV_NAME}\OpenViBE Acquisition Server @ARCH_BITS@bit.lnk" "$INSTDIR\openvibe-acquisition-server.cmd" "" "%SystemRoot%\system32\shell32.dll" 18 - CreateShortCut "$SMPROGRAMS\${OV_NAME}\OpenViBE Tracker @ARCH_BITS@bit.lnk" "$INSTDIR\openvibe-tracker.cmd" "" "%SystemRoot%\system32\shell32.dll" 249 + CreateShortCut "$SMPROGRAMS\${OV_NAME}\Developer tools\OpenViBE ID Generator.lnk" "$INSTDIR\bin\openvibe-id-generator" "" "%SystemRoot%\system32\shell32.dll" 57 + CreateShortCut "$SMPROGRAMS\${OV_NAME}\Developer tools\OpenViBE Plugin Inspector.lnk" "$INSTDIR\bin\openvibe-plugin-inspector" "" "%SystemRoot%\system32\shell32.dll" 57 + CreateShortCut "$SMPROGRAMS\${OV_NAME}\Developer tools\OpenViBE Skeleton Generator.lnk" "$INSTDIR\bin\openvibe-skeleton-generator" "" "%SystemRoot%\system32\shell32.dll" 57 + CreateShortCut "$SMPROGRAMS\${OV_NAME}\OpenViBE Designer @ARCH_BITS@bit.lnk" "$INSTDIR\bin\openvibe-designer" "" "%SystemRoot%\system32\shell32.dll" 137 + CreateShortCut "$SMPROGRAMS\${OV_NAME}\OpenViBE Acquisition Server @ARCH_BITS@bit.lnk" "$INSTDIR\bin\openvibe-acquisition-server" "" "%SystemRoot%\system32\shell32.dll" 18 + CreateShortCut "$SMPROGRAMS\${OV_NAME}\OpenViBE Tracker @ARCH_BITS@bit.lnk" "$INSTDIR\bin\openvibe-tracker" "" "%SystemRoot%\system32\shell32.dll" 249 CreateShortCut "$SMPROGRAMS\${OV_NAME}\Uninstall.lnk" "$INSTDIR\Uninstall.exe" diff --git a/test/CTestTestfile.cmake b/test/CTestTestfile.cmake index 5bda521a5ee67674d013c9a899ab2978eea8c0ce..4468917787ecfe3da9887df12c9d10b4e077907a 100644 --- a/test/CTestTestfile.cmake +++ b/test/CTestTestfile.cmake @@ -3,15 +3,8 @@ # Executing "ctest -T Test" in the build folder should execute the tests automatically using this file. ################################################## -if(WIN32) - set(EXT cmd) - set(OS_FLAGS "--no-pause") -else() - set(EXT sh) - set(OS_FLAGS "") -endif() -set(ENV{OV_BINARY_PATH} "@DIST_ROOT@") +set(ENV{OV_BINARY_PATH} "@CMAKE_RUNTIME_OUTPUT_DIRECTORY@") set(OV_CONFIG_SUBDIR @OV_CONFIG_SUBDIR@) # This is used in the dart files set(CMAKE_COMMAND "@CMAKE_COMMAND@") if(WIN32) @@ -26,6 +19,9 @@ set(CTEST_SOURCE_DIRECTORY "@CMAKE_CURRENT_SOURCE_DIR@") # this is the folder where test scenarios can be run under set(ENV{OV_TEST_DEPLOY_PATH} "${CTEST_SOURCE_DIRECTORY}/local-tmp/test-deploy/") +# Regex to catch errors in logs when return code is ok +set (failRegex "\\[ *ERROR * \\]") + ################################################## # Function to factorise basic validation test with an output (Run a scenario and compare output csv with a ref) # How to use : validation_test(your-folder Your-Test-Name Comparison Extension-Of-Output Use-threshold-flag) folder can be "" @@ -42,11 +38,13 @@ function(validation_test TEST_PATH TEST_NAME COMPARE OUTPUT_EXT USE_THRESHOLD TH add_test(clean_${TEST_NAME} "${CMAKE_COMMAND}" "-E" "remove" "-f" "${TEST_FILE}-output.${OUTPUT_EXT}") endif(COMPARE) - add_test(run_${TEST_NAME} "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--no-session-management" "--invisible" "--play-fast" "${TEST_FILE}-test.xml") - + add_test(run_${TEST_NAME} "$ENV{OV_BINARY_PATH}/openvibe-designer" "--no-session-management" "--invisible" "--play-fast" "${TEST_FILE}-test.xml") + + set_tests_properties (TEST run_${TEST_NAME} DIRECTORY ${TEST_PATH} PROPERTIES FAIL_REGULAR_EXPRESSION "${failRegex}") + if(COMPARE) if(USE_THRESHOLD) - add_test(compare_${TEST_NAME} "$ENV{OV_BINARY_PATH}/threshold-comparison.${EXT}" ${OS_FLAGS} "${TEST_FILE}-output.${OUTPUT_EXT}" "${TEST_FILE}-ref.${OUTPUT_EXT}" ${THRESHOLD_VALUE}) + add_test(compare_${TEST_NAME} "$ENV{OV_BINARY_PATH}/threshold-comparison" "${TEST_FILE}-output.${OUTPUT_EXT}" "${TEST_FILE}-ref.${OUTPUT_EXT}" ${THRESHOLD_VALUE}) else() add_test(compare_${TEST_NAME} "git" "diff" "--no-index" "--ignore-space-change" "${TEST_FILE}-output.${OUTPUT_EXT}" "${TEST_FILE}-ref.${OUTPUT_EXT}") endif(USE_THRESHOLD) @@ -119,7 +117,8 @@ function(validation_test_visualization TEST_PATH TEST_NAME) set(TEST_FILE ${TEST_NAME}) endif() - add_test(run_${TEST_NAME} "$ENV{OV_BINARY_PATH}/openvibe-designer.${EXT}" ${OS_FLAGS} "--no-session-management" "--invisible" "--play" "${TEST_FILE}-test.xml") + add_test(run_${TEST_NAME} "$ENV{OV_BINARY_PATH}/openvibe-designer" "--no-session-management" "--invisible" "--play" "${TEST_FILE}-test.xml") + set_tests_properties(run_${TEST_NAME} PROPERTIES FAIL_REGULAR_EXPRESSION "${failRegex}") set_tests_properties(run_${TEST_NAME} PROPERTIES ATTACHED_FILES_ON_FAIL ${OV_CONFIG_SUBDIR}) endfunction()